opencv dnn模块 示例(21) 目标检测 object_detection 之 yolov6

news2024/11/24 21:02:54

文章目录

  • 1、YOLOv6介绍
    • 1.1、概述
    • 1.2、关键技术
      • 1.2.0、网络结构
      • 1.2.1、表征能力更强的 RepBi-PAN Neck 网络
      • 1.2.2、全新的锚点辅助训练(Anchor-Aided Training)策略
      • 1.2.3、无痛涨点的 DLD 解耦定位蒸馏策略
    • 1.3、总结
  • 2、测试
    • 2.1、官方项目测试
    • 2.2、opencv dnn测试
    • 2.3、测试统计

1、YOLOv6介绍

1.1、概述

2023年初,美团视觉智能部发布了 YOLOv6 3.0 版本,再一次将目标检测的综合性能推向新高。本次更新除了对 YOLOv6-N/S/M/L 模型进行全系列升级之外,还推出了大分辨率 P6 模型。其中,YOLOv6-L6 检测精度和速度超越 YOLOv7-E6E,取得当前实时目标检测榜单 SOTA。

YOLOv6 Github 传送门:github.com/meituan/YOLOv6,技术报告:YOLOv6 v3.0: A Full-Scale Reloading

yolov6 第一版发布于 2022年6月,截止到目前已经更新到4.0版本。
在这里插入图片描述

图1 YOLOv6 各尺寸模型与其他 YOLO 系列框架的性能对比图

在这里插入图片描述

表1 YOLOv6 各尺寸模型与其他 YOLO 系列框架的性能对比结果

注:YOLOv6 系列模型均在训练 300epoch 且不使用预训练模型或额外检测数据集下获得,“‡” 表示采用了自蒸馏算法,“*” 表示从官方代码库对发布模型进行重新测评的指标。以上速度指标均在 T4 TRT7.2 环境下测试。

1.2、关键技术

1.2.0、网络结构

Backbone:
在这里插入图片描述
受启发于RepVGG,作者设计了一个高效的重参数化骨架,称之为EfficientRep。对于小型模型,骨架的主要成分是Rep-Block,如图3a)所示;在推理阶段,RepBlock转化为RepConv,如图3b)所示。

与其他主流架构比较,作者发现RepVGG骨架在相似推理速度下,在小型网络中具有更多特征表征能力,尽管它比较难扩展到大模型由于参数和运算成本的爆炸增长。在这种情况下,作者采用RepBlock作为构建小型网络的构建模块;对于大型模型,作者改进了一个更有效的CSP块,即CSPStackRep Block。通常3*3卷积在硬件计算平台上被优化,因此在提升表征能力的同时也能提升推理速度。

但是,作者发现如果将模型进行扩展,将面临参数和计算陈本成指数级增长。为了获得更好的均衡,作者改进CSPStackRep Block,如图3c)所示。它吸取了CSP的优点,即Cross Stage partial连接,同时在训练阶段有RepVGG block构成,在推理阶段是RepConv构成。

在这里插入图片描述
Neck:

在实际中,多尺度的特征融合被证明是目标检测的一个关键的有效部分。作者采用PAN拓扑结构,与YOLOV4和V5一致。作者使用RepBlock增强颈部,构成Rep-PAN;

Head:
YOLOV5的检测头是一个耦合的检测头,其参数在分类和定位之间是共享的,它的同类如FCOS和YOLOX通过添加两个33的卷积来解耦两个分支以提升性能。

作者采用了混合通道策略来构建更高效的解耦头。作者只采用了一个33的卷积。检测头的宽度通过骨架和颈部的宽度乘积来决定,这个改进进一步减少运算以提升推理速度。作者简化了耦合的头部使其更加高效,称之为Efficient Decoupled Head。


v3.0 更新主要在 Neck 网络设计、训练和蒸馏策略等方面进行了创新和优化:

  • 设计了表征能力更强的可重参化双向融合 PAN(RepBi-PAN)Neck 网络;
  • 提出了全新的锚点辅助训练(Anchor-Aided Training)策略;
  • 提出了解耦定位蒸馏(Decoupled Location Distillation)策略以提升小模型的性能。

1.2.1、表征能力更强的 RepBi-PAN Neck 网络

有效的多尺度特征融合网络对目标检测的效果尤为关键,特征金字塔网络 (FPN) 通过自上而下的路径来融合来自骨干网络不同 Stage 的输出特征以弥补网络学习过程中目标位置信息的损失。鉴于单向信息流传输的局限性,PANet 在 FPN 之上添加了一个额外的自底向上路径。BiFPN 为不同的输入特征引入了可学习的权重,并简化了 PAN 以实现更好的性能和更高的效率。PRB-FPN 通过具有双向融合的并行残差 FPN 结构来保留高质量的特征,以进行准确定位。

基于以上研究,论文提出了一个表征能力更强的可重参化双向融合 PAN(RepBi-PAN)Neck 网络。一般而言,骨干网络浅层特征分辨率高,具有丰富的空间信息,有利于目标检测中的定位任务。为了聚合浅层特征,常见的做法是在 FPN 中增加 P2 融合层以及一个额外的检测头,但这往往会带来较大的计算成本。

为了实现更好的精度和时延权衡,设计了一个双向联结(Birectional Concatenate, BiC)模块,在自上而下的传输路径中引入自底向上的信息流,使得浅层特征能以更高效的方式参与多尺度特征融合,进一步增强融合特征的表达能力。此模块能够帮助保留更准确的定位信号,这对于小物体的定位具有重要意义。

此外,对上一版本的 SimSPPF 模块进行了特征增强优化,以丰富特征图的表示能力。发现 YOLOv7 使用的 SPPCSPC 模块能够提升检测精度,但对网络推理速度的影响较大。于是我们对其进行了简化设计,在检测精度影响不大的情况下,大大提升了推理效率。同时,我们引入了可重参数化思想并对 Neck 网络的通道宽度和深度进行了相应的调整。最终 RepBi-PAN 网络结构如下图 2 所示:
在这里插入图片描述

图2 RepBi-PAN 网络结构图

在这里插入图片描述

表2 BiC 模块消融实验结果

从表2可以看到,在 YOLOv6-S/L 模型上,仅在 PAN 网络自上而下的传输路径引入 BiC 模块后,对推理速度影响保持在 4% 的情况下,检测精度分别提升 0.6% 和 0.4% AP。当我们尝试额外地在自底向上的信息流中将常规联结替换成 BiC 模块时,反而没有获得进一步正向的增益,因此我们仅在自上而下的路径中应用 BiC 模块。与此同时,我们还注意到,BiC 模块能够为小目标的检测精度带来 1.8% AP 的提升。

在这里插入图片描述

表3 不同的 SPP 模块对模型精度和速度的对比结果

在表 3 中,对不同的 SPP 模块对模型精度和速度影响做了实验对比,其中包括经过简化设计的 SPPF、SPPCSPC 和 CSPSPPF 模块。除此之外,还尝试了在骨干网络 C3、C4 和 C5 的输出特征后分别采用了 SimSPPF 模块以加强特征的聚合表达,在表中用 SimSPPF * 3表示。从实验结果来看,重复使用 SimSPPF 模块虽然增加了计算量,但并没有带来检测精度的进一步提升。

经简化设计的 SPPCSPC 模块对比 SimSPPF 模块 在 YOLOv6-N/S 模型上分别提升了 1.6% 和 0.3% AP,但对推理速度 FPS 降低约10%。而当将 SimSPPF 模块替换为优化后的 SimCSPSPPF 模块后,在 YOLOv6-N/S/M 模型上分别取得了1.1%/0.4%/0.1% 的精度增益,同时推理速度对比 SimSPPCSPC 模块有较大的提升。因此,为了更好的精度-效率权衡,在 YOLOv6-N/S 上采用 SimCSPSPPF 模块,而在 YOLOv6-M/L 上采用 SimSPPF 模块。

1.2.2、全新的锚点辅助训练(Anchor-Aided Training)策略

使用 YOLOv6-N 作为基线,对 Anchor-based 和 Anchor-free 范式的异同点进行了相关的实验和分析
在这里插入图片描述
YOLOv6-N 分别采用 Anchor-based 和 Anchor-free 训练范式时,模型的整体 mAP 几乎接近,但采用 Anchor-based 的模型在小、中、大目标上的 AP 指标会更高。从以上的实验可以得出结论:相比于 Anchor-free 范式,基于 Anchor-based 的模型存在额外的性能增益。

同时发现,YOLOv6 使用 TAL 进行标签分配时,其模型精度的稳定性与是否采用 ATSS 预热有较大关系。当不使用 ATSS 预热时,对同样参数配置的 YOLOv6-N 进行多次训练,模型精度最高可达35.9% mAP,最低至 35.3% mAP,相同模型会有 0.6% mAP 的差异。但当使用 ATSS 预热时,模型精度最高却只能到达 35.7% mAP。从实验结果可以分析得出,ATSS 的预热过程利用了 Anchor-based 的预设信息,进而达到稳定模型训练的目的,但也会在一定程度上限制网络的峰值能力,因此并不是一种最优的选择。

受到上述工作的启发,我们提出了基于锚点辅助训练(Anchor-Aided Training,AAT)策略。在网络训练过程中,同时融合 Anchor-based 和 Anchor-free 的两种训练范式,并对全阶段网络进行映射及优化,最终实现了Anchor 的统一,充分发挥了结合不同 Anchor 网络的各自优势,从而进一步提升了模型检测精度。之外,还提出灵活配置的训练策略,仅在训练过程中引入额外的辅助分支,在测试过程中不予使用。最终在不增加推理时间的情况下,提升网络精度,无痛涨点
在这里插入图片描述
采用 AAT 训练策略的消融实验结果如下表 5 所示。我们在 YOLOv6 的各尺寸模型上进行了实验,其中 YOLOv6-S 模型采用 AAT 策略后有 0.3% 的精度增益,而在 YOLOv6-M/L 模型上分别带来了0.5% 的精度增益。值得注意的是,YOLOv6-N/S/M 在小目标检测的精度指标得到了显着增强。
在这里插入图片描述

1.2.3、无痛涨点的 DLD 解耦定位蒸馏策略

基于解耦检测任务和蒸馏任务的 DLD(Decoupled Location Distillation)算法,在网络每一层的回归头上分别添加了额外的强化回归分支,在训练阶段,该分支同样会参与 IoU 损失的计算,并将其累加到最终的 Loss 中。

在目标检测的蒸馏任务中,LD 通过引入 DFL 分支,从而达到了在网络中对定位信息蒸馏的目的,弥补了 Logit Mimicking 方法无法使用定位蒸馏信息的不足。但是DFL 分支的添加,对于小模型速度的影响是很明显的,YOLOv6-N 的速度下降了 16.7%,YOLOv6-S 的速度下降了 5.2%。而在实际的工业应用当中,对于小模型速度的要求往往很高。因此,目前的蒸馏策略并不适合于工业落地。

针对这个问题,我们提出了基于解耦检测任务和蒸馏任务的 DLD(Decoupled Location Distillation)算法。DLD 算法会在网络每一层的回归头上分别添加了额外的强化回归分支,在训练阶段,该分支同样会参与 IoU 损失的计算,并将其累加到最终的 Loss 中。通过增加的额外的强化回归分支,可以对网络添加更多的额外约束,从而对网络进行更全面细致的优化。并且,DLD算法在对强化回归分支进行训练时,引入了分支蒸馏学习策略。
在这里插入图片描述

1.3、总结

从商业应用的角度,对YOLO开源目标检测器进行了深度的改进实验,从骨架模型的构建到检测头的解耦操作,从损失函数的选取到量化部署,始终保持了速度与精度的均衡优势。该YOLOv6是无锚检测器。

第三方的评价
当YOLOv7被大量报道,并被冠以“当前最快最强”的目标检测器时,YOLOv6最近版本已经在推理速度精度的均衡把YOLOv7打败,但YOLOV6引起一阵争议。

美团出品的YOLO模型“拿”其它家的技术,搞成一个超级“缝合怪”把V6的坑给占了。有人指出它虽然在速度和精度上取得了优势,但避开参数量的对比。但作者从商业应用角度出发,比起参数量和运算量的对比,更关注速度性能,无可厚非。

2、测试

使用的模型 yolov6m.pt 进行测试。

2.1、官方项目测试

修改yolov6/core/inferer.pyinfer()函数的代码,进行模型预热、显示时间的代码

    for i in range(0,5): self.model(img)         # 增加
                
    t1 = time.time()
    pred_results = self.model(img)
    det = non_max_suppression(pred_results, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)[0]
    t2 = time.time()

    print("img_src process time: ", t2-t1)       # 增加

测试如下

>python tools\infer.py --weights=weights/yolov6m.pt --source=data/images/bus.jpg --yaml=data/coco.yaml --img-size 640 640 --device cpu

在这里插入图片描述

切换到 GPU 的代码 --device 0 测试结果
在这里插入图片描述

2.2、opencv dnn测试

首先导出onnx模型,脚本为

python deploy\ONNX\export_onnx.py --weights weights\yolov6m.pt --img 640 --batch 1 --simplify

由于网络输出结果与 yolov5、yolor一致(见前面博客代码),复用之前的代码测试,python脚本默认预处理将原图等比缩放调整到640*640,使用之前的测试图片,识别置信度都是100%,有点离谱;

另外,不进行等比缩放调整 bool letterBoxForSquare = false;,竟然将楼房阳台上的自行车识别出来了,又强的离谱了。

在这里插入图片描述

2.3、测试统计

python(CPU):393ms
python(GPU):25ms

opencv dnn(CPU):350ms
opencv dnn(GPU):35ms

openvino(CPU):337ms
onnxruntime(GPU):31ms
TensorRT:15ms

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

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

相关文章

View绘制流程

在子线程中不能更新UI的前提是不触发 checkThread ,逐步委托给mParent检查线程 onCreate加载contentView 进行draw onStart onResume 可能也没有完成测量流程 setContentView: public abstract void setContentView(LayoutRes int resId); Activity 是由ActivityThread类中…

Linux友人帐之网络编程基础DNS服务器

一、DNS服务器 1.1概述 DNS(Domain Name System)是一种分布式系统,用于将域名映射到IP地址。它是互联网上的基础设施之一,作为一种网络协议,它将域名转换为对应的IP地址。DNS的主要功能是将易于记忆的域名转换为计算机…

Brave Game(博弈论巴什博弈)

Problem - 1846 #include<bits/stdc.h> using namespace std; int t,n,m; signed main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n%(m1)0) puts("second");else puts("first");}return 0; }

【带头学C++】----- 三、指针章 ---- 3.7 数组指针

3.7 数组指针 1.数组指针的概述 数组指针是一个指向数组的指针变量&#xff0c;是用来保存数组元素的地址。在C/C中&#xff0c;数组名代表了数组的首地址&#xff0c;可以被解释为一个指向数组第一个元素的指针。因此&#xff0c;一个指向数组的指针可以通过数组名来获…

安达发|APS智能优化排产软件的优先级应用

在制造业中&#xff0c;订单排产是一个重要的环节&#xff0c;它直接影响到生产效率、交货期和客户满意度。为了提高订单排产的效率和准确性&#xff0c;许多企业开始采用APS&#xff08;高级计划与排产&#xff09;智能优化排产软件。APS软件可以根据企业的生产资源、订单需求…

人大女王大学金融硕士项目——披星戴月走过的路,一定可以繁花满地

道路是曲折的&#xff0c;前途是光明的&#xff0c;在路上多花点时间到达才更有意义&#xff0c;作为身经百炼的职场人士&#xff0c;也难免遇到瓶颈期。这个时候&#xff0c;如果不改变自己&#xff0c;就很容易陷入焦虑。而在职读研便是一个很好的方式&#xff0c;一遍学习&a…

未来架构:无服务器计算和容器的融合

文章目录 无服务器计算&#xff1a;构建和扩展应用的新方式优势&#xff1a;示例代码&#xff1a; 容器技术&#xff1a;实现跨环境一致性优势&#xff1a;示例代码&#xff1a; 无服务器与容器的融合优势&#xff1a;示例代码&#xff1a; 未来架构的挑战和展望结论 &#x1f…

全球250米年度城区范围产品数据

简介 全球250米年度城区范围产品&#xff08;MGUP&#xff09;基于现有的城区产品CCI-LC、MCD12Q1和GlobeCover产品经样本清洗自动化得到可靠的多时序城区样本。前言 – 人工智能教程 将全球划分为5格网使用随机森林分类器对2001-2018年进行全球城区范围制图。经时空后处理后&…

记一次,kettle执行JOB的一个BUG,linux下环境表输入(查询)卡住问题,windows环境下执行正常。

问题 采集数据&#xff0c;linux下执行JOB时。 发现表输入卡在&#xff0c;查询卡住&#xff0c;如图&#xff0c;11:37:19、11:37:42、 11:42:56 分别在40000、60000行的时候卡住&#xff0c;23s、5分14s。 拿出sql到pl/sql上查询&#xff0c;并查看执行计划&#xff0c;均…

盘点10月Sui生态发展,了解Sui的近期成长历程!

10月是Web3的Uptober&#xff0c;整个行业在经历了深度的低潮期后迎来了一些回暖。Sui也紧跟行业脚步&#xff0c;举办了各类生态活动&#xff0c;包括Quset 3游戏主题的奖励活动、DeFi和zklogin专题Workshop & AMA、多平台发布的线上教育内容以及持续的科普文章输出。此外…

SPSS二项分布检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

多测师肖sir___app测试_001

app测试 一、app测试分为两大类 app手工测试&#xff08;讲&#xff09; app自动化测试&#xff08;讲&#xff09; &#xff08;1&#xff09;手工app测试&#xff1f; 就是通过手点击app上的应用&#xff0c;cs架构上 &#xff08;2&#xff09;app自动化测试&#xff1f; 通…

*LEEDCODE 73矩阵置零

![在这里插入代码片](https://img-blog.csdnimg.cn/ab1d7d4b9d5046d8900de430249be3bf.png)1 0 0 替换两个列表 2 记录时 0 0 已经是半改好的状态

整理10个地推拉新app接单平台,免费一手推广渠道平台干货分享

1. 聚量推客&#xff1a; “聚量推客”汇聚了众多市场上有的和没有的地推网推拉新接单项目&#xff0c;目前比较火热&#xff0c;我们做地推和网推从业者如果长期在这行业去做推广可以使用这个平台&#xff0c;价格高数据也好&#xff0c;大部分拉新项目也都是官签一手资源 一…

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;mysql5.7&#xff0c;HBuilder X&#xff0c;vscode&#xff08;webstorm&#xff09; 技术说明&#xff1a; nodejs express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示轮播图&am…

shell脚本的一些测试和笔记总结

目录 1、cat <<EOF2、echo -e3、$#、 $、 $* 、 $?4、测试的demo 1、cat <<EOF cat命令表示查看&#xff0c;而cat <<EOF命令表示将进行输入&#xff0c;直到以EOF终止符来结束输入&#xff08;最后的新行&#xff09;。EOF必须写在一行的头部&#xff0c;…

2023李宏毅机器学习HW05样例代码中文注释版

这里只是 2023 李宏毅机器学习 HW05 样例代码的中文注释版的分享&#xff0c;下面的内容绝大部分是样例代码&#xff0c;补充了小部分函数的功能解释&#xff0c;没有做函数功能上的修改&#xff0c;是 Simple baseline 版本。 notebook 代码下载: [EN] [ZH] 文章目录 作业描述…

为什么CDN要部署全球节点 有什么好处

当今互联网时代&#xff0c;CDN&#xff08;内容分发网络&#xff09;已经成为网络加速的重要工具。CDN通过分布式节点在全球范围内分发内容&#xff0c;从而提高网站和应用的性能&#xff0c;减少延迟&#xff0c;降低带宽成本&#xff0c;增强用户体验。本文将探讨CDN加速的好…

浪涌保护器,漏电保护器和空气开关的区别

地凯科技浪涌保护器 浪涌保护器&#xff0c;也叫防雷器或过电压保护器&#xff0c;是一种为各种电子设备、仪器仪表、通讯线路提供安全防护的电子装置。它主要用于限制过电压和泄放浪涌电流。 浪涌是指瞬间超出稳定值的峰值&#xff0c;包括浪涌电压和浪涌电流。供电系统的浪…

进击的代码之路:如何培养解决问题的架构思维?

目录 一、拓宽知识面 二、学习设计原则与模式 三、培养系统思维 四、注重可扩展性 五、多角度思考 六、实践经验总结 七、团队协作与交流 培养解决问题的架构思维是每位开发者在成长过程中都需要掌握的重要能力之一。架构思维不仅可以帮助我们更好地理解和解决复杂的技…