国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

onnx模型轉(zhuǎn)engine并進(jìn)行推理全過程解析

這篇具有很好參考價值的文章主要介紹了onnx模型轉(zhuǎn)engine并進(jìn)行推理全過程解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

深度學(xué)習(xí)模型在訓(xùn)練好以后,下一步就是部署到不同的設(shè)備進(jìn)行測試,不同設(shè)備之間的轉(zhuǎn)換一般可以通過中間件ONNX進(jìn)行轉(zhuǎn)換,以達(dá)到不同平臺的通用。本文以模型轉(zhuǎn)為ONNX為起點,分析介紹ONNX轉(zhuǎn)為TensorRT Engine并進(jìn)行推理的整個流程鏈路。

1、ONNX序列化為TensorRT Engine

ONNX序列化為TRT模型的整個流程可以用下圖表示
onnx模型轉(zhuǎn)engine并進(jìn)行推理全過程解析
使用C++的API進(jìn)行開發(fā)時,需要引入頭文件NvInfer以及NvOnnxParser,C++的接口都是通過I開頭的的接口類定義的,如ILogger、IBuilder等。

#include “NvInfer.h”
#include “NvOnnxParser.h”

using namespace nvonnxparser;
using namespace nvinfer1;

1.1 創(chuàng)建builder

創(chuàng)建構(gòu)建器之前有兩種方式實例化ILogger:
1、引用tensorrtx的logging.h,使用其中的Logger

	#include "logging.h"
	
	static Logger gLogger;
	IBuilder* builder = createInferBuilder(gLogger);

2、繼承ILogger,實例化接口

	class Logger : public ILogger           
	{
	    void log(Severity severity, const char* msg) noexcept override
	    {
	        if (severity <= Severity::kWARNING)
	            std::cout << msg << std::endl;
	    }
	} logger;
 	IBuilder* builder = createInferBuilder(gLogger);

1.2 創(chuàng)建network

創(chuàng)建構(gòu)建器后,需要創(chuàng)建網(wǎng)絡(luò)定義來進(jìn)行模型優(yōu)化:

	INetworkDefinition *network = builder->createNetworkV2(0U); //是0U還是1u需視情況而定

1.3 創(chuàng)建parse解析器

創(chuàng)建onnx的解析器來進(jìn)行網(wǎng)絡(luò)定義的填充,并讀取模型文件并處理是否存在錯誤。

	IParser* parser = createParser(*network, gLogger);
	parser->parseFromFile(onnx_path, static_cast<int32_t>(ILogger::Severity::kWARNING));
	 for (int32_t i = 0; i < parser->getNbErrors(); ++i) 
    { 
        std::cout << parser->getError(i)->desc() << std::endl;
    }
    std::cout << "successfully parse the onnx model" << std::endl;

1.4 設(shè)置必要參數(shù)并創(chuàng)建Engine

    IBuilderConfig *config = builder->createBuilderConfig();
	builder->setMaxBatchSize(maxBatchSize);
    config->setMaxWorkspaceSize(1 << 20);
    
    auto profile = builder->createOptimizationProfile();
    auto input_tensor = network->getInput(0);
    auto input_dims = input_tensor->getDimensions();

    input_dims.d[0] = 1;
    profile->setDimensions(input_tensor->getName(), nvinfer1::OptProfileSelector::kMIN, input_dims);
    profile->setDimensions(input_tensor->getName(), nvinfer1::OptProfileSelector::kOPT, input_dims);
    input_dims.d[0] = batchSize;
    profile->setDimensions(input_tensor->getName(), nvinfer1::OptProfileSelector::kMAX, input_dims);
    config->addOptimizationProfile(profile);
#ifdef USE_FP16
    config->setFlag(BuilderFlag::kFP16);
#endif
#ifdef USE_INT8
    config->setFlag(BuilderFlag::kINT8);
#endif

1.5 創(chuàng)建Engine并序列化

	ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);
	assert(engine != nullptr);
	(*modelStream) = engine->serialize();
	assert(modelStream != nullptr);
	 std::ofstream p(engine_path, std::ios::binary);
    if (!p)
    {
        std::cerr << "could not open plan output file" << std::endl;
        return -1;
    }
    p.write(reinterpret_cast<const char*>(modelStream->data()), modelStream->size());
    modelStream->destroy();

2、讀取序列化后TensorRT Engine 并進(jìn)行推理

onnx轉(zhuǎn)換為engine并序列化后,可以減少構(gòu)建和優(yōu)化模型的時間,如下圖所示,從序列化的engine讀取開始完成整個推理過程。
onnx模型轉(zhuǎn)engine并進(jìn)行推理全過程解析

2.1 反序列化engine

讀取序列化的模型,存放在trtModelstream中。

    size_t size{ 0 };
    std::ifstream file(engine_path, std::ios::binary);
    if (file.good()) {
        file.seekg(0, file.end);
        size = file.tellg();
        file.seekg(0, file.beg);
        trtModelStream = new char[size];
        assert(trtModelStream);
        file.read(trtModelStream, size);
        file.close();

2.2 創(chuàng)建runtime

通過logger創(chuàng)建runtime

 	IRuntime* runtime = createInferRuntime(gLogger);
    assert(runtime != nullptr);

2.3 創(chuàng)建engine

通過runtime解析trtModelstream,創(chuàng)建engine

    ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size, nullptr);
    assert(engine != nullptr);

2.4 創(chuàng)建context

    IExecutionContext* context = engine->createExecutionContext();
    assert(context != nullptr);
    runtime->destroy();

2.5 前處理+前向推理+后處理

前處理

float* input_data = (float*)malloc(3 * input_h * input_w * sizeof(float));
int ImgCount = InputImage.size();
    for (int b = 0; b < ImgCount; b++) {
        cv::Mat img = InputImage.at(b);
        int w = img.cols;
        int h = img.rows;
        int i = 0;
        for (int row = 0; row < h; ++row) {
            uchar* uc_pixel = img.data + row * img.step;
            for (int col = 0; col < input_w; ++col) {
                input_data[b * 3 * input_h * input_w + i] = (float)uc_pixel[2] / 255.0;
                input_data[b * 3 * input_h * input_w + i + input_h * input_w] = (float)uc_pixel[1] / 255.0;
                input_data[b * 3 * input_h * input_w + i + 2 * input_h * input_w] = (float)uc_pixel[0] / 255.0;
                uc_pixel += 3;
                ++i;
            }
        }

    }

前向推理

void doInference()
{
    const ICudaEngine& engine = context.getEngine();
    // Pointers to input and output device buffers to pass to engine.
    // Engine requires exactly IEngine::getNbBindings() number of buffers.
    //assert(engine.getNbBindings() == 2);
    void* buffers[2];
    // In order to bind the buffers, we need to know the names of the input and output tensors.
    // Note that indices are guaranteed to be less than IEngine::getNbBindings()
    const int inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME);
    const int outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);
    //const int inputIndex = 0;
    //const int outputIndex = 1;
    // Create GPU buffers on device
    cudaMalloc(&buffers[inputIndex], batchSize * 3 * input_h * input_w * sizeof(float));
    cudaMalloc(&buffers[outputIndex], batchSize * output_size * sizeof(float));
    // Create stream
    cudaStream_t stream;
    CHECK(cudaStreamCreate(&stream));
    // DMA input batch data to device, infer on the batch asynchronously, and DMA output back to host
    CHECK(cudaMemcpyAsync(buffers[inputIndex], input, batchSize * 3 *input_h * input_w * sizeof(float), cudaMemcpyHostToDevice, stream));
    context.enqueue(batchSize, buffers, stream, nullptr);
    CHECK(cudaMemcpyAsync(output, buffers[outputIndex], batchSize * output_size * sizeof(float), cudaMemcpyDeviceToHost, stream));
    cudaStreamSynchronize(stream);
    // Release stream and buffers
    cudaStreamDestroy(stream);
    CHECK(cudaFree(buffers[inputIndex]));
    CHECK(cudaFree(buffers[outputIndex]));

后處理
以LPRNet為例

    std::vector<int> preds;
    std::cout << std::endl;
    for (int i = 0; i < 18; i++) {
        int maxj = 0;
        for (int j = 0; j < 68; j++) {
            if (prob[i + 18 * j] > prob[i + 18 * maxj]) maxj = j;
        }
        preds.push_back(maxj);
    }
    int pre_c = preds[0];
    std::vector<int> no_repeat_blank_label;
    for (auto c: preds) {
        if (c == pre_c || c == 68 - 1) {
            if (c == 68 - 1) pre_c = c;
            continue;
        }
        no_repeat_blank_label.push_back(c);
        pre_c = c;
    }
    std::string str;
    for (auto v: no_repeat_blank_label) {
        str += alphabet[v];
    }

以上是利用TensorRT C++ API進(jìn)行ONNX構(gòu)建trt engine,并進(jìn)行推理的全過程解析,基本所有的onnx轉(zhuǎn)化為TRT模型進(jìn)行推理都包含在以上方式中,僅此記錄。

–END–文章來源地址http://www.zghlxwxcb.cn/news/detail-461964.html

到了這里,關(guān)于onnx模型轉(zhuǎn)engine并進(jìn)行推理全過程解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MATLAB導(dǎo)入Solidworks機器人模型全過程

    MATLAB導(dǎo)入Solidworks機器人模型全過程

    版本:MATLAB2019a、Solidworks2022(Win11系統(tǒng)必須要下2022版(含)之后的) 機器人模型:埃斯頓機器人(ER20-1780-F) 步驟1:打開模型。將機器人模型 (可在官網(wǎng)下載)(ER20-1780-F)在Solidworks打開,打開文件的類型是.SLDASM為文件后綴。(如圖1所示) 圖1 步驟2:建立關(guān)節(jié)坐標(biāo)系。在

    2024年02月07日
    瀏覽(79)
  • 位置環(huán)速度環(huán)串級位置式PID實現(xiàn)全過程解析(詳細(xì))

    位置環(huán)速度環(huán)串級位置式PID實現(xiàn)全過程解析(詳細(xì))

    電機型號:MD36N行星減速電機_AB兩相光電編碼器霍爾編碼器 電機參數(shù): 單片機型號:STM32F429IG,keil 程序最終功能:串級位置式PID反復(fù)調(diào)節(jié)電機,使得電機可以在一定范圍內(nèi)精準(zhǔn)任意停靠在某個位置,比如電機控制目標(biāo)在圓形軌道轉(zhuǎn)動,就可以實現(xiàn)在固定角度的位置停靠,四

    2023年04月08日
    瀏覽(20)
  • opencv-python學(xué)習(xí)筆記(十一):HOG+SVM進(jìn)行行人檢測全過程

    opencv-python學(xué)習(xí)筆記(十一):HOG+SVM進(jìn)行行人檢測全過程

    本次是接著python-opencv學(xué)習(xí)筆記(七):滑動窗口與圖像金字塔 一起在實驗樓所做實驗,為啥中間隔了四篇才接著發(fā)出來,主因是我發(fā)文比較隨意(懶),當(dāng)時這部分并沒有總結(jié)完,至少我感覺我看的相關(guān)資料還不夠多,整體理解不深,另外就是項目需求,在做很多其它的東

    2024年02月05日
    瀏覽(21)
  • python使用onnx模型進(jìn)行推理

    我們可以看到基于YoloV7訓(xùn)練的cfg有兩種yaml文件,一個是training文件夾,一個是deploy文件夾,這兩種文件夾有啥不一樣呢??? 大家可以看下下面別人的issuse,,記住這個很關(guān)鍵,就是你選擇哪個yaml訓(xùn)練對你后面導(dǎo)出的onnx是很關(guān)鍵的,后面我們會說到。 1、training中的yaml文件

    2024年02月12日
    瀏覽(18)
  • 使用Pyecharts進(jìn)行全國水質(zhì)TDS地圖可視化全過程2:使用Power Query 進(jìn)行百萬行級別數(shù)據(jù)匹配

    使用Pyecharts進(jìn)行全國水質(zhì)TDS地圖可視化全過程2:使用Power Query 進(jìn)行百萬行級別數(shù)據(jù)匹配

    簡介:本文介紹使用Excel? Power Query進(jìn)行數(shù)據(jù)匹配。利用這種方式,可以在幾分鐘內(nèi)完成百萬級別數(shù)據(jù)量的匹配。 在TDS可視化地圖項目中,我們的原始數(shù)據(jù)沒有TDS和具體安裝地址的對應(yīng),我們需要通過機器條碼去匹配安裝臺賬的地址。 這個數(shù)據(jù)量很大,有多大?我們截取的時

    2024年02月05日
    瀏覽(21)
  • TensorRT 推理 (onnx->engine)

    TensorRT 推理 (onnx->engine)

    測試使用:【W(wǎng)in10+cuda11.0+cudnn8.2.1+TensorRT8.2.5.1】 關(guān)于安裝 一、模型轉(zhuǎn)換 onnx2trt 方法1:使用wang-xinyu/tensorrtx部署yolov5方法:https://wangsp.blog.csdn.net/article/details/121718501 方法2:使用tensorRT轉(zhuǎn)成engine 方法3:使用C++ onnx_tensorrt將onnx轉(zhuǎn)為trt 的推理engine 參考 【python 方法參考】 方法4:

    2023年04月08日
    瀏覽(16)
  • 2020年數(shù)維杯數(shù)學(xué)建模C題 垃圾轉(zhuǎn)運優(yōu)化模型設(shè)計求解全過程文檔及程序

    2020年數(shù)維杯數(shù)學(xué)建模C題 垃圾轉(zhuǎn)運優(yōu)化模型設(shè)計求解全過程文檔及程序

    原題再現(xiàn): ?? 隨著我國人口的不斷增加及城鎮(zhèn)化進(jìn)程的快速推進(jìn),城市面臨了眾多公共管理方面的難題。如生活垃圾、廢氣廢水及排泄物等等的處理問題。截止2019年底我國擁有十多個千萬規(guī)模以上的大型城市,城鎮(zhèn)人口數(shù)量達(dá)到了8.48億人。 ?? 數(shù)據(jù)統(tǒng)計結(jié)果表明我國的

    2024年02月07日
    瀏覽(25)
  • yolov5訓(xùn)練pt模型并轉(zhuǎn)換為rknn模型,部署在RK3588開發(fā)板上——從訓(xùn)練到部署全過程

    yolov5訓(xùn)練pt模型并轉(zhuǎn)換為rknn模型,部署在RK3588開發(fā)板上——從訓(xùn)練到部署全過程

    目錄 一、任務(wù)介紹 二、實驗過程 2.1 使用正確版本的yolov5進(jìn)行訓(xùn)練(平臺:x86機器windows系統(tǒng)) 2.2 best.pt轉(zhuǎn)換為best.onnx(平臺:x86機器window系統(tǒng)) 2.3 best.onnx轉(zhuǎn)換為best.rknn(平臺:x86機器Linux系統(tǒng)) 2.3.1 環(huán)境準(zhǔn)備和工具包安裝 2.3.2 onnx轉(zhuǎn)換為rknn 2.4 RK3588部署rknn實現(xiàn)NPU加速(平臺:

    2024年02月03日
    瀏覽(23)
  • C++使用onnxruntime/opencv對onnx模型進(jìn)行推理(附代碼)

    C++使用onnxruntime/opencv對onnx模型進(jìn)行推理(附代碼)

    結(jié)果: current image classification : French bulldog, possible : 16.17 對兩張圖片同時進(jìn)行推理 current image classification : French bulldog, possible : 16.17 current image class ification : hare, possible : 8.47 https://download.csdn.net/download/qq_44747572/87810859 https://blog.csdn.net/qq_44747572/article/details/131631153

    2024年02月05日
    瀏覽(28)
  • 2015年亞太杯APMCM數(shù)學(xué)建模大賽B題城市公共交通服務(wù)水平動態(tài)評價模型求解全過程文檔及程序

    2015年亞太杯APMCM數(shù)學(xué)建模大賽B題城市公共交通服務(wù)水平動態(tài)評價模型求解全過程文檔及程序

    原題再現(xiàn) ?? 城市公共交通服務(wù)評價是城市公共交通系統(tǒng)建設(shè)和提高公共交通運營效率的重要組成部分。對于公交企業(yè),管理和規(guī)劃部門,傳統(tǒng)公交車站、線路和換乘樞紐的規(guī)劃數(shù)據(jù)只是基于主管部門收集的統(tǒng)計數(shù)據(jù)和人工盤點。 ?? 在自動采集技術(shù)日益發(fā)展的今天,如果

    2024年02月07日
    瀏覽(83)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包