【部署】TensorRT(二)TensorRT的C++接口

news/2024/11/15 7:28:09/

1.配置
qt的pro配置文件

#TensorRT
#头文件路径
INCLUDEPATH += /usr/include/x86_64-linux-gnu
#查找:sudo find / -name "NvInfer.h"#链接TensorRT的库文件
LIBS += -L/lib/x86_64-linux-gnu -lnvinfer
LIBS += -L/lib/x86_64-linux-gnu -lnvonnxparser
LIBS += -L/lib/x86_64-linux-gnu -lnvinfer_plugin
#查找方式ldconfig -p | grep libnvinfer

2.构建模型
【参考官网】https://developer.nvidia.com/zh-cn/blog/tensorrt-c-interface-cn/

void build_model()
{IBuilder* builder = createInferBuilder(logger);//【创建网络定义】uint32_t flag = 1U <<static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);INetworkDefinition* network = builder->createNetworkV2(flag);//【创建网络定义】IParser*  parser = createParser(*network, logger);const char* modelFile="";parser->parseFromFile(modelFile,static_cast<int32_t>(ILogger::Severity::kWARNING));for(int32_t i = 0; i < parser->getNbErrors(); ++i){std::cout << parser->getError(i)->desc() << std::endl;}//【构建配置】IBuilderConfig* config = builder->createBuilderConfig();config->setMemoryPoolLimit(MemoryPoolType::kWORKSPACE, 1U << 20);IHostMemory*  serializedModel = builder->buildSerializedNetwork(*network, *config);delete parser;delete network;delete config;delete builder;//【保存模型】....delete serializedModel;
}

2.1 构建模型
构建模型可以进一步细化

bool constructNetwork(nvinfer1::IBuilder *builder, nvinfer1::INetworkDefinition *network, nvinfer1::IBuilderConfig *config, nvonnxparser::IParser *parser)
{// 解析onnx文件if (!parser->parseFromFile(modelFile,static_cast<int32_t>(ILogger::Severity::kWARNING))){return false;}if (RUN_FP16){config->setFlag(nvinfer1::BuilderFlag::kFP16);}if (RUN_INT8){config->setFlag(nvinfer1::BuilderFlag::kINT8);}return true;
}

2.2 保存模型

	// 保存plan文件数据bool saveEngineFile(nvinfer1::IHostMemory *data){std::ofstream file;file.open(m_engine_file, std::ios::binary | std::ios::out);cout << "writing engine file..." << endl;file.write((const char *)data->data(), data->size());cout << "save engine file done" << endl;file.close();return true;}nvinfer1::ICudaEngine *m_engine;trt_model_stream = m_engine->serialize();nvinfer1::IHostMemory *data = builder->buildSerializedNetwork(*network,*config);saveEngineFile(data);

3.运行时
直接加载Engine

nvinfer1::ICudaEngine *m_engine;
bool loadEngineFromFile()
{int length = 0; // 记录data的长度std::unique_ptr<char[]> data = readEngineFile(length);nvinfer1::IRuntime *runtime = nvinfer1::createInferRuntime(sample::gLogger.getTRTLogger());m_engine = runtime->deserializeCudaEngine(data.get(), length);if (!m_engine){std::cout << "Failed to create engine" << std::endl;return false;}return true;
}

运行推理应该至少包含以下几步

  1. 创建nvinfer1::IExecutionContext
  2. 为输入和输出创建空间:用于后面宿主机和设备机数据的传递
  3. 推理:图片处理+数据传递+推理
  4. 后处理:后处理每种问题各不相同

3.2.1 创建nvinfer1

    nvinfer1::IExecutionContext *context = m_engine->createExecutionContext();assert(context != nullptr);

3.2.2 为输入和输出创建空间

int nbBindings = m_engine->getNbBindings();
assert(nbBindings == 2); // 输入和输出,一共是2个// 为输入和输出创建空间
void *buffers[2];                 // 待创建的空间  为指针数组
std::vector<int64_t> buffer_size; // 要创建的空间大小
buffer_size.resize(nbBindings);
for (int i = 0; i < nbBindings; i++)
{nvinfer1::Dims dims = m_engine->getBindingDimensions(i);    // (3, 224, 224)  (1000)nvinfer1::DataType dtype = m_engine->getBindingDataType(i); // 0, 0 也就是两个都是kFloat类型// std::cout << static_cast<int>(dtype) << endl;int64_t total_size = volume(dims) * 1 * getElementSize(dtype);buffer_size[i] = total_size;CHECK(cudaMalloc(&buffers[i], total_size));
}

3.2.3 推理

// 将输入传递到GPUCHECK(cudaMemcpyAsync(buffers[0], cur_input.data(), buffer_size[0], cudaMemcpyHostToDevice, stream));// 异步执行t_start = std::chrono::high_resolution_clock::now();context->enqueueV2(&buffers[0],stream,nullptr);// 输出传回给CPUCHECK(cudaMemcpyAsync(out, buffers[1], buffer_size[1], cudaMemcpyDeviceToHost, stream));cudaStreamSynchronize(stream);

http://www.ppmy.cn/news/533941.html

相关文章

快速测温数字电子体温计应用方案开发

CS7193_T16E是带LCD显示的1位小数数字电子体温计电路。可以通过外部PIN脚&#xff0c;选择摄氏度显示&#xff08;℃&#xff09;或者华氏度显示&#xff08;℉&#xff09;&#xff0c;并通过开关按键完成单位切换。它还包括了测试模式&#xff0c;自动关闭电源和报警功能等。…

【PCBA方案】快速测温体温计方案

一、快速体温计方案介绍 电子体温计由温度传感器&#xff0c;液晶显示器&#xff0c;纽扣电池&#xff0c;专用集成电路及其他电子元器件组成。能快速准确地测量人体体温&#xff0c;与传统的水银玻璃体温计相比&#xff0c;具有读数方便&#xff0c;测量时间短&#xff0c;测量…

用arduino和热敏电阻做电子体温计

由于需要做一个睡眠质量监测的小东西&#xff08;体温三轴&#xff09;&#xff0c;所以需要测量体温&#xff0c;然而把电路搭好之后才发现 ds18b20根本就不能测体温。。也是醉。。而且普通的热敏电阻也干不了这活。 因此又买了 专门测体温的热敏电阻&#xff0c;某宝上有&am…

智能蓝牙体温计方案设计与开发

随着各类电子测温设备的快速发展&#xff0c;比如电子耳温枪&#xff0c;红外电子体温计等&#xff0c;电子温度计的可靠性得到了进一步的提高&#xff0c;测量也比较准确&#xff0c;国内的一些大型综合性医院已经开始尝试使用电子温度计来替代传统的水银温度计进行初步的体温…

PCBA方案——蓝牙电子体温计方案

蓝牙体温计方案的工作原理利用了温度传感器输出电信号&#xff0c;直接输出数字信号或者再将电流信号(模拟信号)转换成能够被内部集成的电路识别的数字信号&#xff0c;然后通过显示器(如液晶、数码管、LED矩阵等)显示以数字形式的温度&#xff0c;能记录、读取被测温度的最高值…

基于单片机开发的快速体温计方案

快速体温计的工作原理利用了温度传感器输出电信号&#xff0c;直接输出数字信号或者再将电流信号(模拟信号)转换成能够被内部集成的电路识别的数字信号&#xff0c;然后通过显示器(如液晶、数码管、LED矩阵等)显示以数字形式的温度&#xff0c;能记录、读取被测温度的最高值。一…

【LeetCode热题100】打卡第26天:最大矩形

文章目录 最大矩形⛅前言&#x1f512;题目&#x1f511;题解 最大矩形 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数…

IO、存储、文件系统的简单介绍

目录 一.什么是IO 第一类:存储器IO 第二类:设备IO 二.存储 三:文件系统 总结 一.什么是IO I(input):放入数据 O(output):取出数据 所以我们平时说的IO,实际上就是放入数据和存储数据的意思 在这里,我们一般将IO又分为两大类 第一类:存储器IO 这类IO主要针对的是计算机中…