亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用C++將yolov8 onnx格式轉(zhuǎn)化為tensorrt格式

 更新時(shí)間:2024年11月15日 09:31:22   作者:愛(ài)喝生椰的程序員  
這篇文章主要為大家詳細(xì)介紹了如何使用C++將yolov8 onnx格式轉(zhuǎn)化為tensorrt格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

我們使用TensorRT進(jìn)行加速推理時(shí),需要先將onnx格式轉(zhuǎn)化為tensorrt格式,以下是使用C++來(lái)進(jìn)行轉(zhuǎn)化代碼以及對(duì)應(yīng)的CMakeLists.txt文件

操作系統(tǒng):ubuntu20.04

C++代碼:

// main.cpp
#include <iostream>
#include <memory>
#include <fstream>
#include <assert.h>
#include "NvInfer.h"
#include "NvOnnxParser.h"
#include "common.h"

class Logger : public nvinfer1::ILogger{
    void log(Severity severity, const char* msg) noexcept override {
        // suppress info-level messages
        if (severity <= Severity::kWARNING)
            std::cout << msg << std::endl;
    }
} logger;


int main(int argc, char** argv){
    if(argc !=2){
        std::cerr << "usage: ./build [onnx_file_path]" <<std::endl;
        return -1;
    }

    // 獲取onnx文件路徑
    char* onnx_file_path = argv[1];

    //================1.創(chuàng)建builder====================
    auto builder = std::unique_ptr<nvinfer1::IBuilder>(nvinfer1::createInferBuilder(logger));
    if(!builder){
        std::cerr << "Failed to creater builder" <<std::endl;
        return -1;
    }

    //===============2.創(chuàng)建network=====================
    const auto explicitBatch= 1U <<static_cast<uint32_t>(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
    auto network = std::unique_ptr<nvinfer1::INetworkDefinition>(builder->createNetworkV2(explicitBatch));
    if (!network){
        std::cout << "Failed to create network" << std::endl;
        return -1;
    }

    // =============創(chuàng)建onnxparser用于解析onnx文件===========
    auto parser = std::unique_ptr<nvonnxparser::IParser>(nvonnxparser::createParser(*network, logger));
    // 調(diào)用onnxparser的parseFromFile方法解析onnx文件
    auto parsed = parser->parseFromFile(onnx_file_path, static_cast<int>(nvinfer1::ILogger::Severity::kWARNING));
    if (!parsed){
        std::cout << "Failed to parse onnx file" << std::endl;
        return -1;
    }
    // 配置網(wǎng)絡(luò)參數(shù)
    auto input = network->getInput(0);
    auto profile = builder->createOptimizationProfile();
    profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMIN, nvinfer1::Dims4{1, 3, 960, 960}); // 設(shè)置最小尺寸
    profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kOPT, nvinfer1::Dims4{1, 3, 960, 960}); // 設(shè)置最優(yōu)尺寸
    profile->setDimensions(input->getName(), nvinfer1::OptProfileSelector::kMAX, nvinfer1::Dims4{1, 3, 960, 960}); // 設(shè)置最大尺寸

    //==============創(chuàng)建config配置=====================
    auto config = std::unique_ptr<nvinfer1::IBuilderConfig>(builder->createBuilderConfig());
    if (!config){
        std::cout << "Failed to create config" << std::endl;
        return -1;
    }

    config->addOptimizationProfile(profile);
    // 設(shè)置精度,設(shè)置為FP16,設(shè)置為INT8需要額外calibrator 
    config->setFlag(nvinfer1::BuilderFlag::kFP16);
    // 設(shè)置最大batchsize
    builder->setMaxBatchSize(1);
    // 設(shè)置最大工作空間
    config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, 1 << 30);

    //創(chuàng)建流
    auto profileStream = samplesCommon::makeCudaStream();
    if(!profileStream){
        return -1;
    }
    config->setProfileStream(*profileStream);

    // ==========創(chuàng)建engine ==========
    auto plan = std::unique_ptr<nvinfer1::IHostMemory>(builder->buildSerializedNetwork(*network, *config));
    if (!plan){
        std::cout << "Failed to create engine" << std::endl;
        return -1;
    }

    // ========== 5. 序列化保存engine ==========
    std::ofstream engine_file("./yolov8x.engine", std::ios::binary);
    assert(engine_file.is_open() && "Failed to open engine file");
    engine_file.write((char *)plan->data(), plan->size());
    engine_file.close();

    std::cout << "Engine build success!" << std::endl;
    return 0;
}

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(TensorRT_Test LANGUAGES CXX CUDA)

set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CXX_STANDARD 14)

# 添加頭文件路徑 cuda tensorRT
include_directories(/usr/local/cuda-11.8/include)
include_directories(/xxx/tensorRT/TensorRT-8.6.1.6/include)
include_directories(/xxx/tensorRT/TensorRT-8.6.1.6/samples/common/)

# 添加庫(kù)文件
link_directories(/usr/local/cuda-11.8/lib64)
link_directories(/xxx/tensorRT/TensorRT-8.6.1.6/lib)

add_executable(build main.cpp)
target_link_libraries(build nvinfer nvonnxparser cudart)

注意:

在CMakeLists.txt中cuda及TensorRT的頭文件和庫(kù)文件路徑需要改成自己的

使用方法:

以yolov8為例,使用cmake編譯好后會(huì)生成build可執(zhí)行文件,執(zhí)行以下命令即可等待生成yolov8x.engine文件

./build <onnx_path>

到此這篇關(guān)于使用C++將yolov8 onnx格式轉(zhuǎn)化為tensorrt格式的文章就介紹到這了,更多相關(guān)C++ yolov8 onnx轉(zhuǎn)tensorrt內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中const和復(fù)合類(lèi)型

    C++ 中const和復(fù)合類(lèi)型

    本文給大家講述的是C++ 中比較難理解的const和復(fù)合類(lèi)型,結(jié)合自己的一些經(jīng)驗(yàn),分享給大家,希望大家能夠喜歡。
    2016-02-02
  • C++實(shí)現(xiàn)LeetCode(48.旋轉(zhuǎn)圖像)

    C++實(shí)現(xiàn)LeetCode(48.旋轉(zhuǎn)圖像)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(48.旋轉(zhuǎn)圖像),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言 將字符串逆序輸出的實(shí)例

    C語(yǔ)言 將字符串逆序輸出的實(shí)例

    這篇文章主要介紹了C語(yǔ)言將字符串逆序輸出的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • c語(yǔ)言左移和右移的示例詳解

    c語(yǔ)言左移和右移的示例詳解

    這篇文章主要介紹了c語(yǔ)言左移和右移的示例詳解,移位操作符的兩個(gè)操作數(shù)必須是整型的。整個(gè)移位表達(dá)式的值的類(lèi)型也是整型的,而且,左移位操作符與右移位操作符的運(yùn)算并不對(duì)稱(chēng)。
    2020-07-07
  • 簡(jiǎn)介C/C++預(yù)處理器的一些工作

    簡(jiǎn)介C/C++預(yù)處理器的一些工作

    這篇文章主要介紹了C/C++預(yù)處理器的一些工作,有助于理解編譯器底層的工作流程,需要的朋友可以參考下
    2015-07-07
  • c++中std::placeholders的使用方法

    c++中std::placeholders的使用方法

    std::placeholders?是 C++ 標(biāo)準(zhǔn)庫(kù)中的一個(gè)工具,用于在函數(shù)對(duì)象綁定時(shí)創(chuàng)建占位符,本文就來(lái)詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • C++實(shí)現(xiàn)合并排序的方法

    C++實(shí)現(xiàn)合并排序的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)合并排序的方法,實(shí)例分析了合并排序的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低
    2023-02-02
  • C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解

    C++計(jì)算任意兩個(gè)日期天數(shù)差的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)任意兩個(gè)日期天數(shù)差,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-02-02

最新評(píng)論