目标检测——YOLOv6算法解读

论文:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7)

作者:Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo Zhang, Yufei Liang, Linyuan Zhou, Xiaoming Xu, Xiangxiang Chu, Xiaoming Wei, Xiaolin Wei

链接:https://arxiv.org/abs/2209.02976

代码:https://github.com/meituan/YOLOv6


YOLO系列算法解读:
YOLOv1通俗易懂版解读SSD算法解读YOLOv2算法解读YOLOv3算法解读YOLOv4算法解读YOLOv5算法解读YOLOR算法解读YOLOX算法解读YOLOv6算法解读YOLOv7算法解读

PP-YOLO系列算法解读:
PP-YOLO算法解读PP-YOLOv2算法解读PP-PicoDet算法解读PP-YOLOE算法解读PP-YOLOE-R算法解读


文章目录

  • 1、算法概述
  • 2、YOLOv6细节
    • [2.1 网络设计](#2.1 网络设计)
    • [2.2 标签分配](#2.2 标签分配)
    • [2.3 损失函数](#2.3 损失函数)
    • [2.4 适应工业界的改进](#2.4 适应工业界的改进)
    • [2.5 量化和部署](#2.5 量化和部署)
  • 3、实验

1、算法概述

YOLOv6出自美团基础研发平台/视觉智能部研发团队,出于以下几个出发点,考虑对YOLO系列检测算法进行改进;1、RepVGG论文思想还未应用到检测网络,于是考虑对检测网络进行重参数化设计;2、基于重参数化的检测器的量化也需要细致的处理,否则难以处理由于其在训练和推理过程中的异构配置而导致的性能下降;3、更关注模型部署时的推理速度;4、对于更特定的优化策略比如标签分配和损失函数设计,需要进一步验证考虑到架构差异性;5、对于部署,我们可以容忍训练策略的调整,以提高准确性性能,但不会增加推理成本,例如知识蒸馏。基于以上5点因素,作者提出YOLOv6,为了在不降低性能的情况下提高推理速度,作者研究了最先进的量化方法,包括训练后量化(PTQ)和量化感知训练(QAT),并将它们应用于YOLOv6中,以实现可部署网络的目标。用TensorRT量化后的速度对比如下图所示:

总之,YOLOv6的贡献如下:

(1)、为不同场景应用定制不同规模的模型,小模型以普通的单路径主干为特征,而大模型建立在高效的多分支块上;

(2)、加入了自蒸馏策略,同时执行了分类任务和回归任务;

(3)、融合了各种先进tricks,如:标签分配检测技术、损失函数和数据增强技术;

(4)、在RepOptimizer和通道蒸馏的帮助下优化了检测器的量化方案。


2、YOLOv6细节

YOLOv6的重新设计包括以下部分:网络设计、标签分配、损失函数、数据增强、行业方便的改进以及量化和部署。整体YOLOv6网络结构如下:

2.1 网络设计

Backbone

与其他主流架构相比,作者发现RepVGG骨干网络具备和小型网络一样的推理速度,但是提取到的特征更丰富,性价比很高,但是由于参数和计算成本的爆炸性增长,它很难被缩放以获得更大的模型。所以作者把RepBlock作为小型网络的子模块;对于大型模型,作者基于现在的CSP模块进行改进得到了CSPStackRep模块。如下图所示为RepBlock和CSPStackRep的结构图:

基于以上改进,作者得到了高效的重参数主干网络EfficientRep,如下图所示:

相比于 YOLOv5 采用的 CSP-Backbone,该 Backbone 能够高效利用硬件(如 GPU)算力的同时,还具有较强的表征能力。作者将Backbone中stride=2的普通Conv层替换成了stride=2的RepConv层。同时,将原始的CSP-Block都重新设计为RepBlock,其中RepBlock的第一个RepConv会做channel维度的变换和对齐。另外,作者还将原始的SPPF优化设计为更加高效的 SimSPPF。

Neck

YOLOv6也和v4/v5一样采用了PAN结构,不同的是,作者用RepBlocks(N/S)或CSPStackRep(M/L)对CSPBlock进行了替换,同时对整体 Neck 中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力,命名为Rep-PAN,结构如下图所示:

Head

像FCOS和YOLOX一样,也是解耦了分类和回归任务,但它们都在每个分支中引入额外的两个3x3卷积层用于提取任务特征;在YOLOv6中,作者采用混合通道策略,将3x3卷积层简化到只使用一个,检测头的宽度由骨干和颈部的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。使其更加高效,命名为Efficient Decoupled Head。

Anchor-free

基于anchor-free的检测算法由于其泛化性能好和解码预测简单而减少了后处理成本。目前有两类anchor-free方式,基于锚点和基于关键点的方式,YOLOv6采用基于锚点的方式,其回归分支实际上预测了从锚点到box四边的距离。

2.2 标签分配

标签分配负责在训练阶段将标签分配给预定义的锚。早期都是采用比较简单的方式,根据gt框与预定义锚框的iou大小来判断,现在有了比较复杂的动态匹配策略,如SimOTA和TAL。YOLOv6早期版本采用SimOTA分配策略,但是,在实践中,作者发现引入SimOTA将减缓训练过程,而且经常陷入不稳定训练的情况。因此,YOLOv6后期采用TAL的方式,因为高效又训练友好。

SimOTA

OTA将目标检测中的标签分配问题视为最佳传输问题,它从全局角度考虑预测框与真实标签的匹配的最优问题,从而对每个真实标签对象定义正负样本预测框。而SimOTA是OTA的简化版本,减少了额外的超参数但依然保持了其性能。SimOTA的分配标签步骤为:

(1)、计算成对预测框与真值框代价,由分类及回归loss构成

(2)、计算真值框与前k个预测框IoU,其和为Dynamic k;因此对于不同真值框,其Dynamic k存在差异

(3)、最后选择代价最小的前Dynamic k个预测框作为正样本

TAL(Task alignment learning,任务对齐学习)

任务对齐学习的匹配标签方式最早由TOOD检测算法提出,该算法设计了一个统一的分类分数和预测框质量的指标用来替换传统的IoU度量方式。这在一定程度上,使得分类任务和回归任务的不一致性得到了缓解。其匹配标签的步骤为:

(1)、在各个特征层计算gt与预测框IoU及与分类得分乘积作为score,进行分类检测任务对齐

(2)、对于每个gt选择top-k个最大的score对应bbox

(3)、选取bbox所使用anchor的中心落在gt内的为正样本

(4)、若一个anchor box对应多个gt,则选择gt与预测框IoU最大那个预测框对应anchor负责该gt

2.3 损失函数

主流的anchor-free检测算法的损失函数包括分类损失、回归损失和object损失;作者通过系统的实验,最终确定分类损失采用VAriFocal Loss,回归损失采用SIou/GIoU。

Classification Loss

Focal Loss对传统的交叉熵损失进行了改进,解决了正样本与负样本、难样本与易样本之间的类不平衡问题。为了解决训练和推理在质量估计和分类使用上不一致的问题,quality Focal Loss (QFL)进一步扩展了Focal Loss,将分类分数和定位质量联合表示,用于分类中的监督。VariFocal Loss(VFL)也对Focal Loss进行改进,它对正负样本的处理是不对称的,通过考虑正负样本的不同重要程度,平衡了正负样本的学习信号。Poly Loss将常用的分类损失分解为一系列的加权多项式基数。它在不同的任务和数据集上调整多项式系数,通过实验证明它比交叉熵损失和Focal Loss更好。

通过一系列实验,YOLOv6的分类损失最终采用VAriFocal Loss。

Box Regression Loss

边框回归损失在边界框定位学习中充当着重要角色,早期是采用L1损失,后来就涌现出IoU系列损失和probability loss。

IoU损失将预测框的四个边界作为一个整体单位进行回归。它被证明是有效的,因为它与评价指标一致。IoU有很多变体,比如:GIoU、DIoU、CIoU、α-IoU、SIoU通过实验,作者在YOLOv6-N和YOLOv6-T中采用SIoU,剩余网络结构则采用GIoU。

Distribution Focal Loss(DFL)将连续分布的box位置简化为离散的概率分布。它考虑了数据的模糊性和不确定性,而没有引入任何其他强的先验因素,这有助于提高box的定位精度,特别是当ground-truth boxes模糊时。在DFL的基础上,DFLv2开发了一个轻量级的子网络,以利用分布统计和实际定位质量之间的密切关联,这进一步提高了检测性能。然而,DFL通常比一般的目标框回归多输出17倍的回归值,导致了大量的开销。额外的计算成本大大阻碍了小模型的训练。而DFLv2由于有了额外的子网络,进一步增加了计算负担。通过实验表明,DFLv2在YOLOv6中带来了与DFL相似的增益效果,因此,作者只在YOLOv6-M/L中采用DFL。

Object Loss

FCOS检测算法首次提出了对象损失,以降低低质量边界框的分数,以便在后处理中过滤掉它们。YOLOX也利用它加速收敛并提升网络性能。在YOLOv6中,作者也尝试加入对象损失,但是没起到正面效果。

2.4 适应工业界的改进

作者尝试了其他常见的做法和技巧来提高性能,包括自蒸馏和更多的迭代epoch。对于自蒸馏,分类和回归都分别由教师模型进行监督。回归的蒸馏是由于DFL而实现的。此外,软标签和硬标签的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。

更多迭代次数,300增加到400epoch

自蒸馏

为了进一步提高模型的准确性,同时不引入太多的额外计算成本,作者应用经典的知识蒸馏技术,使教师和学生的预测之间的KL散度最小。教师模型限定为学生模型本身,但是经过了预先训练的,所以可以称之为自蒸馏的学习方式。KL散度通常被用来衡量数据分布之间的差异。然而,在目标检测中有两个子任务,其中只有分类任务可以直接利用基于KL散度的知识提炼。由于DFL损失的存在,我们也可以在box回归上执行它。知识蒸馏损失可以用公式表述为:

总的损失可以表述为:

L~det~代表检测网络自身损失,L~KD~代表蒸馏损失,α用于平衡两者损失。

图像灰度边界

在YOLOv5和YOLOv7的实现中,在评估模型性能时,每个图像周围都放置了半截灰色边界。虽然没有添加有用的信息,但它有助于检测图像边缘附近的物体。这个技巧也适用于YOLOv6。但是,额外的灰度边界会降低推理速度,但是不要又会降低精度,作者猜测是mosaic增加中引入灰度填充的原因造成的,所以,在训练过程中,在最后一轮,关闭了马赛克增强。最终使得减少了灰色边界面积的情况下,不掉点。

2.5 量化和部署

为了解决基于重新参数化的模型量化时的性能下降问题,我们用RepOptimizer训练YOLOv6,以获得PTQ友好的权重,使得其特征的分布是非常狭窄的,能够有利于量化,如下图所示:

PTQ的实验结果如下:

通过将量化敏感操作部分转换为浮点计算,进一步提高了PTQ的性能。

为防止PTQ不足,作者引入QAT(训练中量化),保证训练推理一致,作者同样使用RepOptimizer,此外使用channel-wise蒸馏,如图所示:

QAT的实验结果如下:


3、实验

实验设置:作者使用与YOLOv5相同的优化器与学习率下降策略,并且也使用warmup、EMA、以及mosaic/mixup数据增强手段。在COCO2017训练集上训练模型,在COCO2017验证集上评估模型准确性。作者的模型均在8卡A100gpu上训练完成,在Tesla T4 GPU以TensorRT形式就行测试。

与现今其他检测算法进行比较

其余消融实验:略

参考文章:https://tech.meituan.com/2022/06/23/yolov6-a-fast-and-accurate-target-detection-framework-is-opening-source.html

相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
Swift社区7 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman7 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年8 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨8 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna8 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun9 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥9 小时前
c++中mystring运算符重载
开发语言·c++·算法
trueEve10 小时前
SQL,力扣题目1369,获取最近第二次的活动
算法·leetcode·职场和发展
天若有情67310 小时前
c++框架设计展示---提高开发效率!
java·c++·算法