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

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

实战教程目录

  • 1. 项目工程环境
  • 2. VS的环境配置
  • 3. YOLOV5工程编译问题
  • 4.模型转换与推理

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
实战教程:win10环境下用TensorRT推理YOLOv5_第1张图片

2.1 配置头文件
将TensorRT的头文件、OpenCV的头文件、CUDA的头文件分别配置到VS的包含目录中,如下图所示。
实战教程:win10环境下用TensorRT推理YOLOv5_第2张图片
2.2 配置库目录
将TensorRT的库目录、OpenCV的库目录、CUDA的库目录分别配置到VS的库目录中,如下图所示。
实战教程:win10环境下用TensorRT推理YOLOv5_第3张图片
2.3配置链接库
将TensorRT的链接库、OpenCV的链接库、CUDA的链接库分别配置到VS的附加依赖项中,如下图所示。
实战教程:win10环境下用TensorRT推理YOLOv5_第4张图片
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”即可,如下图所示。
实战教程:win10环境下用TensorRT推理YOLOv5_第5张图片

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

实战教程:win10环境下用TensorRT推理YOLOv5_第6张图片

3.3 cu文件的处理
wang-xinyu的yolov5工程中有cu文件,需要单独用CUDA编译,具体操作为:
右键项目 → 生成依赖项 → 生成自定义 → 勾选“CUDA 10.2”,如下图所示:
如果你在“生成自定义”中找不到CUDA,可以看参考这篇博客
实战教程:win10环境下用TensorRT推理YOLOv5_第7张图片

对yololayer.cu和preprocess.cu文件单独执行如下操作:右键点击cu文件,选择属性,再选择CUDA C/C++
实战教程:win10环境下用TensorRT推理YOLOv5_第8张图片
3.4 xxx
此时你去编译项目,会出现“YoloPluginCreator::mFC" may not be initialized”的报错,笔者在网上寻找答案,找到的答案是在cmakefiles.txt 增加add_definitions(-DAPI_EXPORTS),但是本文不依赖cmkake,因此只需要在macros.h文件中添加#define API_EXPORTS即可,如下图所示。
实战教程:win10环境下用TensorRT推理YOLOv5_第9张图片

4.模型转换与推理

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的原工程下,如下图所示:
实战教程:win10环境下用TensorRT推理YOLOv5_第10张图片

在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八代,推理时间如下图。
在这里插入图片描述
推理效果图如下:
实战教程:win10环境下用TensorRT推理YOLOv5_第11张图片

备注:本文借鉴了博客一和博客二。

你可能感兴趣的:(c++,tensorrt,yolov5,计算机视觉,深度学习,tensorrt,yolov5,c++)