最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

我們使用TensorRT進行加速推理時,需要先將onnx格式轉(zhuǎn)化為tensorrt格式,以下是使用C++來進行轉(zhuǎn)化代碼以及對應(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/)

# 添加庫文件
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的頭文件和庫文件路徑需要改成自己的

使用方法:

以yolov8為例,使用cmake編譯好后會生成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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++六大默認成員函數(shù)的實現(xiàn)

    C++六大默認成員函數(shù)的實現(xiàn)

    C++中的六大默認成員函數(shù)包括默認構(gòu)造函數(shù)、默認析構(gòu)函數(shù)、默認拷貝構(gòu)造函數(shù)、默認拷貝賦值運算符、移動構(gòu)造函數(shù)和移動賦值運算符,本文就來介紹一下這些函數(shù)的使用,感興趣的可以了解一下
    2025-02-02
  • C++ 先對數(shù)組排序,在進行折半查找

    C++ 先對數(shù)組排序,在進行折半查找

    以下小編就為大家介紹兩種實現(xiàn)方法。第一種方法是,選擇排序法+循環(huán)折半查找法。第二種方法是,冒泡排序法+遞歸折半查找法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++實現(xiàn)聊天程序

    C++實現(xiàn)聊天程序

    這篇文章主要為大家詳細介紹了C++實現(xiàn)類似QQ聊天程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++段錯誤(Segmentation fault)快速定位的解決方法

    C++段錯誤(Segmentation fault)快速定位的解決方法

    寫過C++的朋友都知道,有時候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時,經(jīng)常會遇到跑崩潰的情況,但是在終端只會報Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯誤的快速定位,需要的朋友可以參考下
    2024-07-07
  • C++無符號整數(shù)溢出問題解析

    C++無符號整數(shù)溢出問題解析

    這篇文章主要介紹了C++無符號整數(shù)溢出探究,本文主要探討C/C++中無符號整數(shù)超過范圍后的計算問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C++ 開發(fā)之實現(xiàn)操作符重載的實例

    C++ 開發(fā)之實現(xiàn)操作符重載的實例

    這篇文章主要介紹了C++ 開發(fā)之實現(xiàn)操作符重載的實例的相關(guān)資料,這里附有實例代碼和實現(xiàn)效果圖幫助大家參考實踐,需要的朋友可以參考下
    2017-07-07
  • C++中new和delete的介紹

    C++中new和delete的介紹

    今天小編就為大家分享一篇關(guān)于C++中new和delete的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • VS編譯出現(xiàn)MSB3073命令的解決方案

    VS編譯出現(xiàn)MSB3073命令的解決方案

    =error MSB3073是Visual Studio編譯器報出的錯誤,本文主要介紹了VS編譯出現(xiàn)MSB3073命令的解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • VS中scanf函數(shù)報錯問題的幾種解決方法

    VS中scanf函數(shù)報錯問題的幾種解決方法

    本文主要介紹了VS中scanf函數(shù)報錯問題的幾種解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • c++ 判斷是64位還是32位系統(tǒng)的實例

    c++ 判斷是64位還是32位系統(tǒng)的實例

    這篇文章主要介紹了c++ 判斷是64位還是32位系統(tǒng)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

德庆县| 大连市| 东阿县| 连州市| 金寨县| 蓬莱市| 河西区| 普格县| 拜泉县| 合山市| 玛曲县| 新余市| 玉树县| 岳阳市| 内黄县| 蓬安县| 延川县| 定日县| 白朗县| 云梦县| 郧西县| 济源市| 莲花县| 上饶县| 获嘉县| 洪湖市| 阳朔县| 措美县| 新泰市| 广东省| 太谷县| 左云县| 马龙县| 北宁市| 玉树县| 广丰县| 府谷县| 张家川| 阜南县| 阜新| 临颍县|