基于C#调用TensorRT 部署Yolov5模型
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_t为CUDA 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模型转换,通过内

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

被折叠的 条评论
为什么被折叠?



