毕业设计:嵌入式平台的目标检测-3
当前进展
上一个博客提到使用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
,修改Opencv、Tensorrt、dirent.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_W
,release 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
遇到的问题:
- 版本问题。TensorRT、Pytorch、Python、cudnn、Cuda、显卡驱动版本都需要满足要求
- Github仓库中的Branches和Tags区别
- 在使用CMake编译源码时,报错无法找到Cuda编译器,后来发现是我用的GCC8.2版本,不支持Cuda10.2,具体见stackoverflow,但是我并没有去安装低版本GCC(觉得麻烦),因为电脑上有VS2019的MSVC编译器,选择VS2019就可以
- 选择VS2019后仍然无法编译,报错
could not find any instance of Visual Studio
,找不到VS?网上找到了解决方案,另外还要用VS Installer安装英文语言! - 但是当我打开VS Installer后显示更新,我没想就更新了,更新完后显示无法找到VS 2019?找了半天解决方案,在微软Feedback里看到可能我删了VS的缓存,我找了一下确实是这样…为了以后能愉快使用VS,我强制卸载了VS,重新安装,问题解决
- 再次使用CMake编译,报错
Cmake error: No CUDA toolset found
,解决方案,CMake编译没问题 - 编译第三方源码时报错
Could not locate zlibwapi.dll. Please make sure it is in your library path!
,解决方案 - Python3.9加载dll报错,解决方案
全部解决后,写个opencv调用摄像头,推理模型,得到结果,实测GTX1650,yolov5s跑30-40帧(包含后处理)