【TensorRT】基于C#调用TensorRT 部署Yolov5模型 - 上篇:构建TensorRTSharp

本文介绍了如何在C#中利用TensorRTSharp动态链接库来部署Yolov5模型。首先创建C++接口实现文件,配置项目属性,编写C++代码,包括推理引擎结构体、ONNX模型转换、初始化模型、创建GPU缓冲区、配置输入数据、模型推理、读取结果等步骤。接着,构建模块定义文件生成dll文件,供C#调用。整个过程详细解释了TensorRT在C#环境中的应用流程。

  NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK,可为深度学习推理应用提供低延迟和高吞吐量。详细安装方式参考以下博客: NVIDIA TensorRT 安装 (Windows C++)
在这里插入图片描述
  前文中已经介绍了在C++中利用TensorRT 部署Yolov5模型,但在实际应用中,经常会出现在C#中部署模型的需求,目前TensorRT无法直接在C#调用函数接口实现模型部署,此处利用动态链接库功能,构建TensorRTSharp,实现C#部署模型。

1. 构建TensorRTSharp

1.1 创建动态链接库项目

1.1.1 新建TensorRT接口实现文件

  右击解决方案,选择添加新建项目,添加一个C++空项目,将C++项目命名为:cpp_tensorrt_api。进入项目后,右击源文件,选择添加→新建项→C++文件(cpp),进行的文件的添加。具体操作如所示。

1.1.2 配置C++项目属性

  右击项目,点击属性,进入到属性设置,此处需要设置项目的配置类型包含目录、库目录以及附加依赖项,本次项目选择Release模式下运行,因此以Release情况进行配置。
(1)设置常规属性
  进入属性设置后,在最上面,将配置改为Release,平台改为x64。
常规设置下,点击输出目录,将输出位置设置为< $(SolutionDir)dll_import/tensorrt >,即将生成文件放置在项目文件夹下的dll文件夹下;其次将目标文件名修改为:tensorrtsharp;最后将配置类型改为:动态库(.dll),让其生成dll文件。
(2)配置附加包
  此处需要使用TensorRT与OpenCV两个外部依赖包,因此需要配置相关设置,具体操作方式按照在C++中利用TensorRT 部署Yolov5模型配置C++项目部分。

1.2 编写C++代码

1.2.1 推理引擎结构体

  Logger是TensorRT工具套件用于创建IBuilder、IRuntime或IRefitter实例的记录器,该类中log()方法未进行实例化,因此需要将其实例化,重写该类中的log()方法。

class Logger : public nvinfer1::ILogger{
	void log(Severity severity, const char* message)  noexcept{
		if (severity != Severity::kINFO)
			std::cout << message << std::endl;
	}
} gLogger;

  为了实现模型推理能在各个接口中传递推理的相关配置信息,所以将相关重要类或结构体整合到NvinferStruct结构体中,如下:

typedef struct tensorRT_nvinfer {
	Logger logger;
	nvinfer1::IRuntime* runtime;
	nvinfer1::ICudaEngine* engine;
	nvinfer1::IExecutionContext* context;
	cudaStream_t stream;
	void** data_buffer;
} NvinferStruct;

IRuntime为TensorRT反序列化引擎,允许对序列化的功能上不安全的引擎进行反序列化,该类中deserializeCudaEngine()方法可以重构本地保存的模型推理文件;IcudaEngine为创建的网络上执行推理的引擎,保存了网络模型的相关信息; IExecutionContext为用于模型推理的上下文,是最终执行推理类;cudaStream_tCUDA stream标志,主要用于后面在GPU显存上传输数据使用;data_buffer为GPU显存输入/输出缓冲内存位置,用于在显存上读取和输入数据。

1.2.2 接口方法规划

  TensorRT进行模型推理,一般需要十个步骤,主要是:初始化Logger对象、创建反序列化引擎、读取本地推理模型并初始化推理引擎、创建用于推理上下文、创建GPU显存输入/输出缓冲区、准备输入数据、将输入数据从内存加载到显存、执行推理计算以、从显存读取推理结果到内存和处理推理计算结果。我们根据原有的十个步骤,对步骤进行重新整合,并根据推理步骤,调整方法接口。
  对于方法接口,主要设置为:推理引擎初始化、创建GPU显存输入/输出缓冲区、加载图片输入数据到缓冲区、模型推理、读取推理结果数据以及删除内存地址六个接口,目前 TensorRT模型推理接口只允许图片输入,暂不支持其他数据的配置。

1.2.3 ONNX模型转换

  TensorRT几乎可以支持所有常用的深度学习框架,对于caffe和TensorFlow来说,TensorRT可以直接解析他们的网络模型;对于caffe2,pytorch,mxnet,chainer,CNTK等框架则是首先要将模型转为 ONNX 的通用深度学习模型,然后对ONNX模型做解析。目前TensorRT主要是在更新的是ONNX模型转换,通过内

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椒颜皮皮虾྅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值