当前进展

​ 上一个博客提到使用YOLOv4帧率较低,在windows10 GTX1650上帧率为15FPS,在Nvidia Xavier AGX上为5FPS,低的离谱,不过挺奇怪的,理论上应该AGX远超1650,当时我也没多想,可能是哪里出了问题…(不过我第一步任务是把代码跑通,接下来开始提速)

模型选择

​ 后来比较了一下,YOLOv5的准确性和速度都高于v4,tiny版本另说,v5和刚出没多久的v8属于同一家公司ultralytics,而且最适合商用,因此选择yolov5替代v4。v6、v7、v8和v5相比没有很大的改善。

​ yolov5 Github地址:https://github.com/ultralytics/yolov5

​ v5模型有较多版本,选择YOLOv5s作为测试模型。

官方代码

​ clone官方代码后,装指定的环境,官方推荐直接pip install -r requirements.txt安装必要的环境,但我不推荐这样,手动安装既能了解安装详细过程也能控制版本。建议先安装pytorch和Cudatoolkit。显卡驱动、cudatoolkit、pytorch、python的版本都要匹配,可在NVIDIA官网查询,然后再安装其他的依赖包。

​ 环境安装完后,根据官方的教程运行即可。

YOLOv5官方tensorrt

​ YOLOv5的官方Github下有部署tensorrt的教程,https://github.com/ultralytics/yolov5/issues/251,但是在使用pip安装tensorrt时,出现源内没有指定版本问题,我也懒得换源了,另外也想折腾折腾。

第三方教程

​ 在网上找到了使用tensorrt加速推理yolov5的视频,它是将模型.pt文件先转为.wts文件,然后再转为.engine文件,通过C++调用engine实现推理,或者编译生成dll动态库,通过python调用dll

具体实现:① YOLOv5官方Github下载v7.0源码和yolov5s.pt;② 下载Github第三方源码; ③ 将仓库中的gen_wts.py和刚才下载好的yolov5s.pt拷贝至yolov5 7.0的目录下,运行python gen_wts.py -w yolov5s.pt -o yolov5s.wts生成wts模型;④ OpenCV官网下载适用于Windows平台的3.4.6版本,配置opencv环境变量;⑤ tensorrt官网下载对应版本源码,将TensorRT/lib下所有lib复制cuda/v10.2/lib/x64下,将TensorRT/lib下所有dll复制到cuda/v10.2/bin下,将TensorRT/include下所有.h文件复制到cuda/v10.2/include下,添加tensorrt环境变量; ⑥ 编辑CMakeLists.txt,修改OpencvTensorrtdirent.h的目录,其中dirent.h在本仓库的include中,须绝对路径。修改arch=compute_75;code=sm_75,参考https://developer.nvidia.com/zh-cn/cuda-gpus;⑦ 第三方库下新建build存储编译结果,使用CMake,Configure -> Generate -> Open Project,Configure是配置使用的编译器和架构,Generate是make,生成编译结果,如果用VS IDE会生成.sln工程文件,open就可以打开。若出现报错,根据报错信息修改框中信息; ⑧ 打开yololayer.h文件,修改CLASS_NUM, INPUT_H, INPUT_Wrelease build生成exe;⑨ 用exe执行yolov5 -s yolov5s.wts yolov5s.engine s,s表示模型是s型,几/十几分钟后生成engine,直接用C++测试yolov5 -d yolov5s.engine ./pictures; ⑩ 在C++部署正确之后,尝试使用python部署。C++的代码预测只能通过文件夹内的图片,对于视频流或摄像头预测需要修改代码,且目前很多项目都是基于python语言完成,在刚才的C++工程中右键yolov5,点击属性,修改目标文件扩展名.dll,项目默认配置类型为动态库(.dll),重新编译生成.dll文件,然后用python调用动态库,直接运行第三方源码中的python_trt.py即可。

​ 参考:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5 https://github.com/Monday-Leo/Yolov5_Tensorrt_Win10

https://www.bilibili.com/video/BV113411J7nk?p=1

遇到的问题:

  1. 版本问题。TensorRT、Pytorch、Python、cudnn、Cuda、显卡驱动版本都需要满足要求
  2. Github仓库中的Branches和Tags区别
  3. 在使用CMake编译源码时,报错无法找到Cuda编译器,后来发现是我用的GCC8.2版本,不支持Cuda10.2,具体见stackoverflow,但是我并没有去安装低版本GCC(觉得麻烦),因为电脑上有VS2019的MSVC编译器,选择VS2019就可以
  4. 选择VS2019后仍然无法编译,报错could not find any instance of Visual Studio,找不到VS?网上找到了解决方案,另外还要用VS Installer安装英文语言!
  5. 但是当我打开VS Installer后显示更新,我没想就更新了,更新完后显示无法找到VS 2019?找了半天解决方案,在微软Feedback里看到可能我删了VS的缓存,我找了一下确实是这样…为了以后能愉快使用VS,我强制卸载了VS,重新安装,问题解决
  6. 再次使用CMake编译,报错Cmake error: No CUDA toolset found解决方案,CMake编译没问题
  7. 编译第三方源码时报错Could not locate zlibwapi.dll. Please make sure it is in your library path!解决方案
  8. Python3.9加载dll报错,解决方案

​ 全部解决后,写个opencv调用摄像头,推理模型,得到结果,实测GTX1650,yolov5s跑30-40帧(包含后处理)