实战教程:win10环境下用TensorRT推理YOLOv5

本文章记录在win10环境下用TensorRT推理YOLOv5.
例子来源于大佬的项目:https://github.com/wang-xinyu/tensorrtx,但此工程是在ubuntu上开发,在win10部署上不友好,故特作此贴。此贴致敬清华大佬王鑫宇,向王鑫宇学习![0]

1. 项目工程环境

本文使用的环境如下:

WIN 10
CUDA 10.2
CuDnn 7.6.5
TensorRT 7.2.3.4
OpenCV 4.3.0
VS 2019

2. VS的环境配置

本文不使用cmake建立VS工程,而是自己手动建立VS工程。
因此在配置VS环境之前,需要自己建立一个新的VS工程,并将yolov5下的头文件和源文件添加到VS中,如下图所示。
注意:cu文件时用cuda

2.1 配置头文件
将TensorRT的头文件、OpenCV的头文件、CUDA的头文件分别配置到VS的包含目录中,如下图所示。

2.2 配置库目录
将TensorRT的库目录、OpenCV的库目录、CUDA的库目录分别配置到VS的库目录中,如下图所示。

2.3配置链接库
将TensorRT的链接库、OpenCV的链接库、CUDA的链接库分别配置到VS的附加依赖项中,如下图所示。

CUDA的链接库如下:

cublas.lib
cublasLt.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cudnn.lib
cudnn64_8.lib
cudnn_adv_infer.lib
cudnn_adv_infer64_8.lib
cudnn_adv_train.lib
cudnn_adv_train64_8.lib
cudnn_cnn_infer.lib
cudnn_cnn_infer64_8.lib
cudnn_cnn_train.lib
cudnn_cnn_train64_8.lib
cudnn_ops_infer.lib
cudnn_ops_infer64_8.lib
cudnn_ops_train.lib
cudnn_ops_train64_8.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusolverMg.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvgraph.lib
nvjpeg.lib
nvml.lib
nvrtc.lib
OpenCL.lib

TensorRT的链接库如下:

nvparsers.lib
nvonnxparser.lib
nvinfer_plugin.lib
nvinfer.lib

OpenCV的链接库如下:

opencv_world430.lib

3. YOLOV5工程编译问题

3.1 dirent.h的问题
项目工程依赖头文件“dirent.h”,但dirent.h是ubuntu系统中的系统文件,windows系统没有。直接编译会出现如下错误:“dirent.h”: No such file or directory

没关系,只需要将 https://gitcode.net/mirrors/tronkko/dirent/-/tree/master/include下载下本地,将dirent.h直接放在工程目录下即可。同时将utils.h中的#include 改为#include “dirent.h”即可,如下图所示。
[0]

3.2 std::max和std::min的问题
在预处理定义中添加:NOMINMAX

同时,可能会有错误C4996 ‘localtime’: This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
别担心,在预处理定义中添加:_CRT_SECURE_NO_WARNINGS

3.3 cu文件的处理
wang-xinyu的yolov5工程中有cu文件,需要单独用CUDA编译,具体操作为:
右键项目 → 生成依赖项 → 生成自定义 → 勾选“CUDA 10.2”,如下图所示:
如果你在“生成自定义”中找不到CUDA,可以看本博客的第五部分。

对yololayer.cu和preprocess.cu文件单独执行如下操作:右键点击cu文件,选择属性,再选择CUDA C/C++

3.4 xxx
此时你去编译项目,会出现“YoloPluginCreator::mFC” may not be initialized”的报错,笔者在网上寻找答案,找到的答案是在cmakefiles.txt 增加add_definitions(-DAPI_EXPORTS),但是本文不依赖cmkake,因此只需要在macros.h文件中添加#define API_EXPORTS即可,如下图所示。

4.模型转换与推理

TensorRT理论上可以直接推理ONNX和engine模型。
在使用TensorRT推理模型之前,一般都有模型转换的过程。

yolov5的模型转换:首先将.pt 转.wts ,再将.wts转.engine。

注意:转换yolov5模型时依赖yolov5的原工程 https://github.com/ultralytics/yolov5
,需要将yolov5的原工程下载到本地。[0]

https://github.com/wang-xinyu/tensorrtx 的yolov5工程下有脚本文件gen_wts.py,将gen_wts.py放到yolov5的原工程下,如下图所示:

在yolov5的原工程下,执行如下脚本,得到yolov5s.wts模型文件。

python gen_wts.py -w yolov5s.pt

把下载的yolov5.wts放在编译生成的release目录,运行下面的命令产生yolov5s.engine文件。

yolov5_tensorrt.exe -s yolov5s.wts yolov5s.engine s

模型推断:

yolov5_tensorrt.exe -d yolov5s.engine ./image_dir

GPU为英伟达GTX 1060,CPU为Intel i7八代,推理时间如下图。

推理效果图如下:

注:本文取材于博客 1 和博客 2。[0][1]

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月6日
下一篇 2022年5月7日

相关推荐