需求
跑通了Python环境下的Yolov8,但是考虑到性能,想试试C++环境下的优化效果。
环境
Windows11
TensorRT8.6.1.6
CUDA 12.0
cudnn 8.9.7
opencv4.5.5
VS2019
参考目录
本次搭建主要参考以下博客和视频。第一个博客以下简称“博客1”,第二个视频简称“视频1”,第三个视频简称“视频2”。
win10下 yolov8 tensorrt模型部署_tensorrt-8.4.2.4-CSDN博客
【实战】win10下yolov8 tensorrt 部署_哔哩哔哩_bilibili
yolov8 tensorrt 部署自己训练的模型_哔哩哔哩_bilibili
步骤
之前已经安装了VS2019、CUDA12.0、cudnn 8.9.7,所以这几个模块安装略过。可参考博客1。
安装TensorRT
因为我本地安装的CUDA版本是12.0,所以我找了匹配的TensorRT的版本,装之前因为和上面博客中的版本不匹配,还担心后面是否能顺利跑起来,哈哈
解压,然后配置环境变量,根据自己实际路径,详细参考博客1,这里不再赘述。
安装OpenCV
下载地址:Releases - OpenCV
我选择的是与博客1中相同的版本。其他解压,配置环境变量参考博客1。
创建属性表
创建一个空工程,我这里起名testYoloV8。这里遇到一个小坑,其实怪自己英语水平差。我的VS2019是英文的,这个属性管理器窗口,我一顿找,先是按照View->Other Windows->Properties Window,打开发现和博客1的界面不一样。后来才发现,应该是View->Property Manager这个窗口。
按照博客1中配置好各个属性表,然后添加到工程中,最后长下面这样:
这里在创建TensorRT的属性表的时候,我把lib下面所有的lib都加进去了,怕新版本和之前的不一样。
下载YOLOV8 onnx,并转成trt
我先下载了博客1中提供的Yolov8的onnx文件,然后用trtexec.exe转成了对应的trt文件,具体命令参考博客1。
配置C++工程
在上面的testYoloV8工程中进行配置,参考视频1。配置完成后,build出现1个链接错误,
查看对应的函数splitToStringVec定义在TensorRT-8.6.1.6/samples/common中的sampleUtils.h sampleUtils.cpp中,然后就把这两个文件也加到资源文件中。在build,成功了!撒花~~~
测试
在工程中设置编译命令,成功!
--model=C:/YOLOV8/ThirdParty/yolov8n.trt --size=640 --batch_size=1 --img=E:/Work/YOLO/data/bus.jpg --show --savePath E:/
使用自己的训练模型
1 首先,把自己的pt模型文件转为onnx,遇到错误,
ImportError: DLL load failed while importing onnx_cpp2py_export: 动态链接库(DLL)初始化例程失败。
解决:参考文章
2 把上一步转的onnx转成trt,又遇到错误,
Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.
然后,按照网上说的安装onnx-simplifier,安装失败,
然后查看了下本地的onnx是1.16.2,卸载了这个版本,安装了1.16.1版本.
pip uninstall onnx
pip install onnx=1.16.1
安装成功后,重新把pt导出onnx格式。
再把onnx转成trt格式,参考博客1。
3 C++工程中使用自己的trt运行。
需要先按照视频2修改一些配置,主要是类别和颜色。重新build,然后添加debugging命令,运行就OK了。
结论
batch_size=1的时候,C++ TensorRT的环境下比Python环境下,GPU利用率降低5%左右,如果batch_size=8,GPU能降低50%。
感谢各位大佬,尤其感谢此次搭建环境主要参考的文章和视频的作者 韩师兄!