0、写在最前:
此篇文章针对yolov5的6.0版本,4.0和5.0版本请看前面三篇的修改。
2022.02.18更新:
最新版的代码在windows下面导出onnx可能会失败,windows10下面请保证pandas>=1.4.0,或者注释掉export.py中的import pandas as pd(pandas的功能暂时未在export.py使用,win10下直接import版本低于1.4.0其他都不干,导出onnx就会失败,原因未知)
2021.12.6更新,增加摄像头和视频检测,需要将drawPred()中的inshow和waitkey注释掉。
VideoCapture cap(0); //视频检测将0改成视频地址
while (true) {
Mat fram;
cap >> fram;
vector<Output> result;
if (test.Detect(fram, net, result))
test.drawPred(fram, result, color);
imshow("detect output", fram);
if (waitKey(2)==27) break; //esc退出
}
cap.release();
destroyAllWindows();
2021.11.04更新,对于图片长宽比过大导致目标检测失败修改,本来想偷懒直接放个图片的。
此篇除了第4点修改检测的代码修改,其他代码和第三篇中的一样!
目录
一、yolov5 6.0版本新增对opencv的支持
最新的项目地址可以看下https://github.com/ultralytics/yolov5
二、导出onnx模型
导出onnx的时候需要修改参数,将opset默认值改成12,原来的默认值为13,我测试了opencv4.5.0和4.5.2两个版本,opencv都报错了,将之改成12即可读取。
在export.py中修改下参数(用命令行导出的请加上--opset 12,请注意不要带上dynamic参数,opencv对动态输入支持做的不好,应该是需要opencv4.5.3以上的版本,并且需要TBB支持才行来着):
三、查看网络结构。
使用netron(www.netron.app)查看下修改onnx版本之后的网络模型,可以看到现在模型有4个输出1,output是另外三个输出的总输出,而另外三个就是之前模型的三个输出口(P3,P4,P5)。所以我们只需要遍历output这个输出口就可以(另外三个输出口是可以单独遍历获取数据,如果你只需要小目标,就可以只遍历P3输出口,中目标为P4输出口,而P5位大目标,但是并不建议这么做就是了,因为大中小并没有具体的区分,只是一个概念性的,实际上小目标也有可能在P4口被检测出来,而且概率比P3口还高也是有可能的。所以如果只需要检测小目标,还不如直接修改网络只要P3出口来的好一些)。
而输出口的形状由之前的[25200,85]变成了[1,25200,85],因为是一个batch size,所以在c++下面使用指针遍历的话可以不考虑这多出来的一个维度(c++下Mat.data指针会将三维和二维按行优先展开成一维指针,所以影响不大)。
四、修改检测代码
按照我前面三篇修改过的方法来说,应为新版本不需要再修改原来的common.py和yolo.py的代码,所以需要看下原来在yolo.py中被修改的部分做了些什么,然后需要对c++源码进行一些修改。
之前在models/yolo.py中的Detect类中的修改,会将红色框的部分注释掉,所以在c++的代码中这部分需要我们自己去计算,而现在不需要修改了,就要将这部分自己的计算去掉。
由于python的模型已经做了sigmoid的转换了,所以c++下面这部分去掉就可以了。按下面的位置修改下,原来的代码就可以使用了(注释部分的代码是原来的代码)。另外的代码请看
2021.09.02更新说明 c++下使用opencv部署yolov5模型 (三)_爱晚乏客游的博客-CSDN博客
测试下程序结果:
完美运行!
总的来说,6.0版本完美的解决了opencv下读取onnx模型的痛点,不需要繁琐的去修改源码,将无法读取的网络层替换掉,可以很轻松的部署了。
贴个github链接吧,聊胜于无,想偷懒的同学可以直接下载文件了,不需要从上一篇复制了
onnx测试模型:yolov5s.onnx-深度学习文档类资源-CSDN下载
目前是免费的,有需要收费了说下我重新改下
版权声明:本文为CSDN博主「爱晚乏客游」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34124780/article/details/121079317
暂无评论