本文章记录在win10环境下用TensorRT推理YOLOv5.
例子来源于大佬的项目:https://github.com/wang-xinyu/tensorrtx,但此工程是在ubuntu上开发,在win10部署上不友好,故特作此贴。此贴致敬清华大佬王鑫宇,向王鑫宇学习!
本文所用的环境如下:
WIN 10
CUDA 10.2
CuDnn 7.6.5
TensorRT 7.2.3.4
OpenCV 4.3.0
VS 2019
本文不使用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.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
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即可,如下图所示。
TensorRT理论上可以直接推理ONNX和engine模型。
在使用TensorRT推理模型之前,一般都有模型转换的过程。
yolov5的模型转换:首先将.pt 转.wts ,再将.wts转.engine。
注意:转换yolov5模型时依赖yolov5的原工程 https://github.com/ultralytics/yolov5
,需要将yolov5的原工程下载到本地。
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八代,推理时间如下图。
推理效果图如下:
备注:本文借鉴了博客一和博客二。