opencv dnn模块 示例(22) 目标检测 object_detection 之 yolov7

news2024/11/24 3:59:16

在YOLOv6 初版出来不久,YOLOv7就立马横空出世了。与YOLOv5、YOLOv6不同,YOLOv7是由YOLOv4团队的原班人马提出的(官方出品)。从论文的表上来看,目前YOLOv7无论是在实时性还是准确率上都已经超过了当时已知的所有目标检测算法。并且它在COCO数据集上达到了56.8%的AP。

文章目录

  • 1、YOLOv7介绍
    • 1.1、创新点
    • 1.2、详细设计
      • 1.2.1、聚合网络设计
      • 1.2.2、卷积重参化
      • 1.2.3、基于concatenate的模型缩放
      • 1.2.4、标签分配
      • 1.2.5、训练时的其它策略
    • 1.3、实验结果
  • 2、测试
    • 2.1、官方脚本测试
    • 2.2、opencv dnn测试
    • 2.3、测试统计
  • 3、Opencv dnn 批量推理

1、YOLOv7介绍

1.1、创新点

模型结构重参化和动态标签分配已经成为了目标检测领域中的主要优化方向。针对于结构重参化,作者
通过分析梯度的传播路径来为网络中的不同层进行结构重参化优化,并且提出了不同规划的模型结构重参化。在动态标签分配上,因为模型有多个输出层,所以在训练时就难以为不同的分支分配更好地动态目标。所以作者提出了一个新的动态标签分配办法:coarse-to-fine,即由粗到细引导标签分配的策略。

还提出了扩展和复合缩放的方式,通过这种方式可以更高效利用参数量和计算量。这样不仅可以减少大量参数,还可以提高推理速度以及检测精度。

并且设计了几个可以训练的bag-of-freebies。这样使得模型在不更改本身结构时,大大提高检测精度。

1.2、详细设计

1.2.1、聚合网络设计

为了增强网络的实时性检测,YOLOv7里使使用VoVNet的变体CSPVOVNet。不仅考虑模型的参数量、计算量、内存访问次数、输入输出的通道比、element-wise操作等方面分析参数的数量、计算量和计算密度,还分析了梯度的在模型中流动路径,通过这个来使得不同层的权重能够学习到更加多样化的特征。
在这里插入图片描述
还提出了基于ELAN的Extended-ELAN,也就是E-ELAN方法。通过高效长程注意力网络来控制梯度的最短最长路径,让更深的网络可以更加高效地学习和收敛。作者提出的E-ELAN使用expand、shuffle、merge cardinality来实现在不破坏原有梯度路径的情况下,提升网络的学习能力。无论梯度路径长度和大规模ELAN中计算块的堆叠数量如何,网络都能够达到稳定状态,但是倘若继续这样一直地堆叠这一些计算块下去,反而可能会破坏这种稳定的状态,从而导致降低参数的利用率。
在这里插入图片描述
在结构方面,E-ELAN只改变块本身的架构,对于过渡层的架构则没有改变,这边的调整策略是使用组卷积来扩展计算块的通道和基数,将对计算层的所有计算块应用相同的组参数和通道数,然后,对于每个计算块输出的特征图会根据设置的组参数g被随即打乱成g个组,之后再将它们连接在一起。注意到这个时候,每组特征图的通道数和原来架构中的通道数是一样的,最后,添加g组的特征图来执行合并基数。E-ELAN除了保持原有的ELAN设计架构外,还可以帮助其它组的计算块学习到更加多样化的特征。

1.2.2、卷积重参化

重参化技术是模型在推理时将多个模块合并成一个模块的方法,其实就是一种集成技术。常见的重参化技术有:

  • 一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的权重进行平均。
  • 一种是对不同迭代次数下模型权重进行加权平均。

然RepConv在VGG上取得了很不错的效果,但将它直接应用于ResNet和DenseNet或其他骨干网络时,它的精度却下降得很厉害。作者就是用梯度传播路径的方法来分析,因为RepConv结合了3×3卷积,1×1卷积,和在一个卷积层中的identity连接,可是这个identity破坏力ResNet的残差连接以及DenseNet的跨层连接,为不同的特征图提供了更多的梯度多样性。

因此,作者认为,在同时使用重参化卷积和残差连接或者跨层连接时,不应该存在identity连接,而且作者还分析重参数化的卷积应该如何与不同的网络结构相结合以及设计了不同的重参数化的卷积。
在这里插入图片描述

1.2.3、基于concatenate的模型缩放

模型缩放是调整模型的大小来生成不同尺度的模型,用于满足不同场景下的推理需求。如今的网络中,主要的缩放因子有input size、depth、width、stage,通过控制这些参数,模型的参数量、计算量、推理速度和精度都有一个很好的平衡。同时,网络架构搜索NAS技术也经常使用到。

作者还发现使用concatenate模型时,不能单独地分析缩放因子的影响,还必须结合通道数的变化一起分析,因为在这过程中会导致输入通道和输出通道的比例会发生变化,从而导致模型的硬件使用率降低。还提出了一种复合缩放方法,这样不仅可以保持模型在初始设计时的特性还可以保持性能最佳时的结构。

在这里插入图片描述

1.2.4、标签分配

但近年来,需要研究者会利用网络的推理结果来结合GT,去生成一些软标签,如IOU。在YOLOv7中,有辅助头也有引导头,在训练时,它们二者都需要得到监督。因此,需要考虑如何为辅助头和引导头进行标签分配。因此在这里,作者提出了一种新的标签分配方法,是以引导头为主,通过引导头的推理来指引辅助头和自身的学习。
在这里插入图片描述
使用引导头的推理结果作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习。为了使那些超粗的正网格影响更小,会在解码器中设置限制,来使超粗的正网格无法完美地产生软标签。通过以上的机制,允许在学习过程中动态调整细标签和粗标签的重要性,使细标签的始终优于粗标签。
在这里插入图片描述

1.2.5、训练时的其它策略

  • Batch Normalization:
    即将Batch Normalization层直接连接到卷积层中。这样可以在推理时将Batch Normalization的均值和方差直接融合到卷积层的偏差和权重中。

  • YOLOR中结合隐性知识和卷积特征图的加法和乘法方法
    在YOLOR中,它认为隐式知识可以在推理时通过预计算步骤被简化为向量。然后再把这个向量和前一个或后一个卷积层的偏差和权重融合在一起。

  • EMA:
    EMA是一种在mean teacher中使用的技术,在系统中使用EMA模型纯粹作为最终的推理模型。EMA可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,这里可以取得平滑的作用。如果取n步的平均,就能使得模型更加得鲁棒。

1.3、实验结果

作者为边缘GPU、普通GPU、高性能云GPU三种不同场景设计了三种模型,分别是YOLOv7-Tiny、YOLOv7和YOLOv7-W6。并且通过论文中的复合缩放方法,对整个模型的深度、宽度进行缩放,得到了YOLOv7-X、YOLOv7-E6和YOLOv7-D6。以及在YOLOv7-E6基础上使用了E-ELAN技术来获得YOLOv7-E6E。
在这里插入图片描述

可以看到以下和其他目标检测器的速度、精度对比结果。
在这里插入图片描述

2、测试

以模型 YOLOv7.pt 为例进行测试 下载链接

2.1、官方脚本测试

使用默认脚本参数,设置--device 0使用GPU加速对目录中的所有图片进行推理。代码中当使用GPU加速时,提前进行了warmup。

(yolo_pytorch) E:\DeepLearning\yolov7>python detect.py --weights yolov7.pt --source inference/images --device 0
Namespace(weights=['yolov7.pt'], source='inference/images', img_size=640, conf_thres=0.25, iou_thres=0.45, device='0', view_img=False, save_txt=False, save_conf=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='exp', exist_ok=False, no_trace=False)
YOLOR  v0.1-122-g3b41c2c torch 1.13.1+cu117 CUDA:0 (NVIDIA GeForce GTX 1080 Ti, 11263.75MB)

Fusing layers...
RepConv.fuse_repvgg_block
RepConv.fuse_repvgg_block
RepConv.fuse_repvgg_block
Model Summary: 306 layers, 36905341 parameters, 6652669 gradients
 Convert model to Traced-model...
 traced_script_module saved!
 model is traced!

D:\Python\anaconda3\envs\yolo_pytorch\lib\site-packages\torch\functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\native\TensorShape.cpp:3191.)
  return _VF.meshgrid(tensors, **kwargs)  # type: ignore[attr-defined]
4 persons, 1 bus, 1 tie, Done. (28.0ms) Inference, (4.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\bus.jpg
1 bicycle, 1 car, 1 truck, 1 dog, Done. (22.0ms) Inference, (1.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\dog.jpg
5 horses, Done. (20.0ms) Inference, (1.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\horses.jpg
2 persons, 1 tie, 1 cake, Done. (21.0ms) Inference, (2.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\image1.jpg
2 persons, 1 sports ball, Done. (19.0ms) Inference, (1.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\image2.jpg
1 dog, 1 horse, Done. (18.0ms) Inference, (2.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\image3.jpg
3 persons, 1 tie, Done. (17.0ms) Inference, (1.0ms) NMS
 The image with the result is saved in: runs\detect\exp19\zidane.jpg
Done. (0.759s)

对于图片bus.jpg 的推理耗时为28ms。切换为CPU时,耗时增大到 770ms。

2.2、opencv dnn测试

导出 onnx 模型:

  • 类似yolov4,三个尺度输出
    三个尺度输出分别为 [1,3,80,80,85]、 [1,3,40,40,85]、 [1,3,20,20,85]
    python export.py --weights yolov7.pt --simplify --img-size 640 640 --max-wh 640
    
  • grid导出,三个尺度输出进行合并
    合并输出结果 [38080 + 34040 + 32020, 85] = [25200, 85]
    python export.py --weights yolov7.pt --grid --simplify --img-size 640 640 --max-wh 640
    
  • end2end
    根据指定参数,添加NMS输出的结果
    python export.py --weights yolov7.pt --grid --end2end --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640 --max-wh 640
    

使用Netron上看上述三个脚本生成的onnx文件模型结构

****
这里为了方便,使用 --grid 导出的模型,直接复用前面 yolov5、yolor、yolov6的代码,识别置信度比yolov6低一些。
在这里插入图片描述

另外,官方在yolov5he yolov6的基础上,提供了 anchor free 的模型文件 yolov7-u6.pt。

2.3、测试统计

python(CPU):797ms
python(GPU):28ms

opencv dnn(CPU):890ms
opencv dnn(GPU):28ms

后面测试包含 预处理+推理+后处理
openvino(CPU):409ms
onnxruntime(GPU):31ms
TensorRT:21ms

end2end模型的测试:
onnxruntime(CPU):460ms
onnxruntime(GPU):32ms
TensorRT:14ms

3、Opencv dnn 批量推理

当使用如下代码进行简单的批量推理时

auto inputImgs = std::vector<cv::Mat>{modelInput, modelInput, modelInput};
blobFromImages(inputImgs, blob, scale, cv::Size2f(inpWidth, inpHeight), mean, swapRB, false);
net.setInput(blob);
net.forward(outs, outNames);

报错如下:

[ERROR:0@4.559] global net_impl.cpp:1172 cv::dnn::dnn4_v20230620::Net::Impl::getLayerShapesRecursively     input[0] = [ 3 1 3 9 80 80 ]
[ERROR:0@4.560] global net_impl.cpp:1182 cv::dnn::dnn4_v20230620::Net::Impl::getLayerShapesRecursively Exception message: OpenCV(4.8.0) D:\opencv\opencv4.8.0\sources\modules\dnn\src\layers\permute_layer.cpp:162: error: (-215:Assertion failed) (int)_numAxes == inputs[0].size() in function 'cv::dnn::PermuteLayerImpl::getMemoryShapes'

yolov7要是实现批量推理,需要增加参数 --dynamic-batch,完成命令为

python export.py --weights runs\train\yolov7-custom3\weights\best.pt --grid --simplify --img-size 640 640 --max-wh 640 --dynamic-batch

这里使用训练模型的类别数为4,因此常规一张图一推理的维度为 [1,25200, 9],按照常识,输入为[1x3,640,640]时,输出应该为[1x3,25200,9],但是实际为 [1, 25200x3, 9] = [1, 75600, 9],查看 转换都后onnx模型,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例

【二叉树】如何构建一个包含大量随机数节点的二叉树测试用例 前言一、案例准备二、自动生成随机二叉树工具类&#xff08;TreegenerateUtils&#xff09;三、如何调用随机二叉树工具类&#xff08;TreegenerateUtils&#xff09;&#xff1f; 前言 今天笔者在测试有关二叉树的…

打开ps提示,计算机中丢失d3dcompiler_47.dll怎么解决?

“d3dcompiler_47.dll丢失5个解决办法”。相信很多同事在工作或者娱乐的过程中&#xff0c;都遇到过这个错误提示。那么&#xff0c;究竟什么是d3dcompiler_47.dll文件&#xff1f;为什么会丢失呢&#xff1f;又该如何解决这个问题呢&#xff1f;接下来&#xff0c;我将为大家详…

财税服务展示预约小程序的作用是什么

财税财政往往困扰着很多公司&#xff0c;尤其是公司里没有相应职员或工作压力大的情况下&#xff0c;不少商家就会寻找代理记账、审计服务、会计代理等服务的机构。 对财政服务代理机构&#xff08;会计公司&#xff09;来说&#xff0c;市场企业多而广&#xff0c;理论上来说…

yolov5 利用Labelimg对图片进行标注

首先打开yolov5-master&#xff0c;在data文件中新建一个文件夹来存放你需要跑的数据&#xff0c;例如我这次跑的是羽毛球&#xff0c;文件把文件取名为badminton。使用其他文件夹例如images也可以&#xff0c;就是跑多了以后不好整理&#xff0c;然后点击 选中刚刚你存放数据的…

【算法 | 数论 No.1】AcWing1246. 等差数列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

c: struct sort descending and ascending in windows and Ubuntu

/*** file StudentStructSort.h* author geovindu,Geovin Du,涂聚文 (geovindu163.com)* ide: vscode c11,c17 Ubuntu 22.4* brief 结构体排序示例* date 2023-11-05* version 0.1* copyright geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants**/#ifnd…

easyexcel==省市区三级联动

省市区三级联动&#xff0c;不选前面的就没法选后面的 package com.example.demoeasyexcel.jilian2; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import org.apache.poi.ss.use…

​软考-高级-系统架构设计师教程(清华第2版)【第2章 计算机系统基础知识-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第2章 计算机系统基础知识-思维导图】 课本里章节里所有蓝色字体的思维导图

MySQL | 查询接口性能调优、编码方式不一致导致索引失效

背景 最近业务反馈&#xff0c;列表查询速度过慢&#xff0c;需要优化。 到正式环境系统去验证&#xff0c;发现没筛选任何条件的情况下&#xff0c;查询需要三十多秒&#xff0c;而筛选了条件之后需要13秒。急需优化。 先说结论&#xff1a;连表用的字段编码方式不一致导致索…

【异常----finally和自定义异常】

文章目录 finally练习问题 异常的处理流程【异常处理流程总结】自定义异常类 finally 有些特定的代码&#xff0c;不论程序是否发生异常&#xff0c;都需要执行&#xff0c;比如程序中打开的资源&#xff1a;在程序正常或者异常退出时&#xff0c;必须要对资源进进行回收。另外…

Halcon Variable Inspect 安装失败

版本 Visual Studio 2022Halcon 20.11 找到Halcon 扩展文件 输入CMD 经过下面博客所示步骤&#xff0c;修改Visual Studio 对应版本 Halcon Variable Inspect 安装失败 替换成功&#xff01;

混淆矩阵和相应参数详解

如果一个模型在能够尽量捕获少数类的情况下&#xff0c;还能够尽量对多数类判断正确&#xff0c;则这个模型就非常优秀了。为了评估这样的能力&#xff0c;我们将引入新的模型评估指标&#xff1a;混淆矩阵和ROC曲线。 上面是混淆矩阵。接下来我们结合图像解释一下准确率&#…

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件&#xff0c;添加对应的代码&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本&#xff1b; &#xff08;2&#xff09;超出的部分隐藏&#xff1b; &#xff08;3&#xff09;文字用省略号来替代省略的部分&#xf…

Python+reuqests自动化接口测试

1.最近自己在摸索Pythonreuqests自动化接口测试&#xff0c;要实现某个功能&#xff0c;首先自己得有清晰的逻辑思路&#xff01;这样效率才会很快&#xff01; 思路--1.通过python读取Excel中的接口用例&#xff0c;2.通过python的函数调用&#xff0c;get/Post 进行测试&…

制造企业如何做好进销存管理工作?

本文你将了解&#xff1a;什么是进销存管理系统&#xff1f;国内制造信息化的发展现状如何&#xff1f;进销存管理系统的功能有哪些&#xff1f; 接下来搭建进销存管理系统教学中用到的图片和系统都来自简道云的进销存管理系统 这也是我们公司目前正在用的进销存管理系统&…

2023.11.10联测总结

T 1 T1 T1求的是有多少个区间的异或和是 k k k的因子&#xff0c; n , k ≤ 1 0 5 n,k \leq 10^5 n,k≤105。 这道题用前缀和维护一下&#xff0c;暴力枚举所有区间就有 80 80 80分。 有一瞬间想过枚举因数&#xff0c;但是脑抽以为要 O ( n ) \mathcal O(n) O(n)枚举&#x…

Python最基础的五个部分代码,零基础也能轻松看懂。

文章目录 前言一、表达式二、赋值语句三、引用四、分支语句五、循环语句关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼…

大数据-之LibrA数据库系统告警处理(ALM-12036 license文件即将过期)

告警解释 系统每天零点检查一次当前系统中的license文件&#xff0c;如果当前时间距离过期时间不足60天&#xff0c;则license文件即将过期&#xff0c;产生该告警。 当重新导入一个正常license&#xff0c;告警恢复。 说明&#xff1a; 如果当前集群使用节点数小于等于10节…

软件测试之测试分类(按照测试对象分类,按照测试对象划分)

目录 按照测试对象分类 1.可靠性测试 2.容错性测试 3.安装卸载测试 4.内存泄漏测试 5.弱网测试 按照是否查看代码划分 面试题&#xff1a;那种测试方法用到最多&#xff1f; 按照测试对象分类 关于测试对象分类中的各个测试&#xff0c;在此前已经发表过了&#xff0c…

面试字节测开岗失败后,被面试官在朋友圈吐槽了......(心累)

在和朋友吃夜宵的时候&#xff0c;朋友向我吐槽说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬 印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f; 非…