2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

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更新,对于图片长宽比过大导致目标检测失败修改,本来想偷懒直接放个图片的。

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

此篇除了第4点修改检测的代码修改,其他代码和第三篇中的一样!

内容

0、写在最前:

一、yolov5 6.0版本新增对opencv的支持

二、导出onnx模型

3.检查网络结构。

四、修改检测代码

一、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支持才行来着):

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

3.检查网络结构。

使用netron(www.netron.app)查看下修改onnx版本之后的网络模型,可以看到现在模型有4个输出1,output是另外三个输出的总输出,而另外三个就是之前模型的三个输出口(P3,P4,P5)。所以我们只需要遍历output这个输出口就可以(另外三个输出口是可以单独遍历获取数据,如果你只需要小目标,就可以只遍历P3输出口,中目标为P4输出口,而P5位大目标,但是并不建议这么做就是了,因为大中小并没有具体的区分,只是一个概念性的,实际上小目标也有可能在P4口被检测出来,而且概率比P3口还高也是有可能的。所以如果只需要检测小目标,还不如直接修改网络只要P3出口来的好一些)。

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

而输出口的形状由之前的[25200,85]变成了[1,25200,85],因为是一个batch size,所以在c++下面使用指针遍历的话可以不考虑这多出来的一个维度(c++下Mat.data指针会将三维和二维按行优先展开成一维指针,所以影响不大)。

四、修改检测代码

按照我前面三篇修改过的方法来说,应为新版本不需要再修改原来的common.py和yolo.py的代码,所以需要看下原来在yolo.py中被修改的部分做了些什么,然后需要对c++源码进行一些修改。

之前在models/yolo.py中的Detect类中的修改,会将红色框的部分注释掉,所以在c++的代码中这部分需要我们自己去计算,而现在不需要修改了,就要将这部分自己的计算去掉。

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

由于python的模型已经做了sigmoid的转换了,所以c++下面这部分去掉就可以了。按下面的位置修改下,原来的代码就可以使用了(注释部分的代码是原来的代码)。另外的代码请看

2021.09.02更新说明 c++下使用opencv部署yolov5模型 (三)_爱晚乏客游的博客-CSDN博客

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

测试程序结果:

2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)

完美运行!

总的来说,6.0版本完美的解决了opencv下读取onnx模型的痛点,不需要繁琐的去修改源码,将无法读取的网络层替换掉,可以很轻松的部署了。

贴个github链接吧,聊胜于无,想偷懒的同学可以直接下载文件了,不需要从上一篇复制了

https://github.com/UNeedCryDear/yolov5-opencv-dnn-cpp2021.11.01 c++下 opencv部署yolov5-6.0版本 (四)https://github.com/UNeedCryDear/yolov5-opencv-dnn-cpp

onnx测试模型:yolov5s.onnx-深度学习文档类资源-CSDN下载

目前是免费的,如果要收费,我再换一次

版权声明:本文为博主爱晚乏客游原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_34124780/article/details/121079317

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年2月17日
下一篇 2022年2月18日

相关推荐