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

0、写在最前:

----2022.10.10 更新yolov5-seg实例分割模型:

目前检测项目相关代码已经并入到分割项目中去了,下面的一些代码仅作为参考和理解使用,如果需要运行,请去github下载最新版本的代码,相较于本文章下面的代码,已经优化了很多使用方法。

2022.09.29更新 c++下面使用opencv部署yolov5和yolov7实例分割模型(六)_爱晚乏客游的博客-CSDN博客

 -----2022.07.25 更新了下yolov7的部署,有需要的自取

2022.07.25 C++下使用opencv部署yolov7模型(五)_爱晚乏客游的博客-CSDN博客

此篇文章针对yolov5的6.0版本,4.0和5.0版本请看前面三篇的修改。

2022.10.13 更新

有些人使用的是最新的torch1.12.x版本,在导出onnx的时候需要将do_constant_folding=True,这句换成false,否者dnn读取不了onnx文件,而onnxrutime可以,具体原因未知。

torch.onnx.export(
    model.cpu() if dynamic else model,  # --dynamic only compatible with cpu
    im.cpu() if dynamic else im,
    f,
    verbose=False,
    opset_version=opset,
    do_constant_folding=False,
    input_names=['images'],
    output_names=output_names,
    dynamic_axes=dynamic or None)

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点修改检测的代码修改,其他代码和第三篇中的一样!

目录

0、写在最前:

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

二、导出onnx模型

三、查看网络结构。

四、修改检测代码


一、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链接吧,聊胜于无,想偷懒的同学可以直接下载文件了,不需要从上一篇复制了

https://github.com/UNeedCryDear/yolov5-opencv-dnn-cppicon-default.png?t=N7T8https://github.com/UNeedCryDear/yolov5-opencv-dnn-cpp

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

目前是免费的,有需要收费了说下我重新改下

  • 51
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 184
    评论
要将yolov56.0版本转换为C++代码,你可以按照以下步骤进行操作: 1. 首先,从yolov5的GitHub仓库下载源代码。你可以使用以下命令克隆仓库: ``` git clone -b v6.0 https://github.com/ultralytics/yolov5.git ``` 2. 接下来,你需要下载yolov5的.pt模型文件。你可以从yolov5的发布页面下载模型文件,例如yolov5s.pt。 3. 下载完成后,将模型文件放置在yolov5源代码的根目录下。 4. 修改检测代码以适应C++环境。你可以根据需要修改代码,确保它能够在C++环境中运行。例如,你可能需要修改输出口的形状,将其从\[25200,85\]修改为\[1,25200,85\],以适应C++的指针遍历方式。同时,你还需要根据需要修改代码以支持视频流或摄像头预测。 5. 在C++环境中部署代码。你可以使用C++编译器编译修改后的代码,并运行生成的可执行文件进行预测。 请注意,以上步骤仅提供了一个大致的指导,具体的实现细节可能因环境和需求而有所不同。你可以参考yolov5的文档和示例代码,以及C++编程的相关知识,进行更详细的操作。 #### 引用[.reference_title] - *1* *3* [YOLOv5 Tensorrt Python/C++部署](https://blog.csdn.net/weixin_45747759/article/details/124076582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [2021.11.01 c++opencv部署yolov5-6.0版本 ()](https://blog.csdn.net/qq_34124780/article/details/121079317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 184
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值