论文地址:https://arxiv.org/pdf/2209.02976
代码地址:https://github.com/meituan/YOLOv6
多年来,YOLO
系列一直是高效目标检测的行业标准。 YOLO
社区蓬勃发展,丰富了其在众多硬件平台和丰富场景中的使用。在这份技术报告力求将其极限推向新的高度,以坚定不移的行业应用心态向前迈进。
考虑到真实环境中对速度和准确性的不同要求,作者广泛研究了来自工业界或学术界的最新目标检测进展。具体来说,从最近的网络设计、训练策略、测试技术、量化和优化方法中大量吸收了一些想法。最重要的是,整合思想和实践,构建了一套不同规模的部署网络,以适应多样化的用例。
在 YOLO
作者的慷慨许可下,作者将其命名为 YOLOv6
。作者也热烈欢迎用户和贡献者进一步增强。YOLOv6-N
在 NVIDIA Tesla T4 GPU
上以 1234 FPS 的吞吐量在 COCO
数据集上达到 35.9% 的 AP。 YOLOv6-S
以 495 FPS 的速度达到 43.5% 的 AP,优于同规模的其他主流检测器(YOLOv5-S
、YOLOX-S
和 PPYOLOE-S
)。
YOLOv6-S
量化版本甚至带来了 869 FPS 的最新 43.3% AP。此外,与具有相似推理速度的其他检测器相比,YOLOv6-M/L
还实现了更好的准确度性能(即 49.5%/52.3%)。
YOLO
系列因其在速度和准确性之间的出色平衡而成为工业应用中最流行的检测框架。 YOLO
系列的开创性作品是YOLOv1-3
,随着后期的实质性改进,开创了单阶段检测器的新路。 YOLOv4
将检测框架重组为几个独立的部分(backbone
、neck
和 head
),并验证了当时的 bag-of-freebies
和 bag-of-specials
,设计了一个适合在单 GPU
上训练的框架。目前,YOLOv5
、YOLOX
、PPYOLOE
和 YOLOv7
都是高效检测器部署的竞争候选者。不同大小的模型通常通过缩放技术获得。
在本报告中,作者凭经验观察了几个促使更新 YOLO
框架的重要因素:
RepVGG
的重参化是一种高级技术,尚未在检测中得到很好的利用。作者还注意到 RepVGG Block
的简单模型缩放变得不切实际,为此作者认为小型和大型网络之间的网络设计的优雅一致性是不必要的。普通的单路径架构对于小型网络是更好的选择,但对于较大的模型,参数的指数增长和单路径架构的计算成本使其不可行;
基于重参化的检测器的量化也需要细致处理,否则由于其在训练和推理过程中的异构配置,将难以处理性能下降。
以前的工作往往不太关注部署,其延迟通常在 V100 等高成本机器上进行比较。在实际服务环境方面存在硬件差距。通常,像 Tesla T4 这样的低功耗 GPU 成本更低,并且提供相当好的推理性能。
考虑到架构差异,标签分配和损失函数设计等高级特定领域策略需要进一步验证;
对于部署,可以容忍训练策略的调整,提高准确度性能但不增加推理成本,例如知识蒸馏。
考虑到上述观察,带来了 YOLOv6
的诞生,它在准确性和速度方面实现了迄今为止最好的权衡。在图 1 中展示了 YOLOv6
与其他类似规模的同行的比较。为了在不大幅降低性能的情况下提高推理速度,研究了包括训练后量化 (PTQ
) 和量化感知训练 (QAT
) 在内的尖端量化方法,并将它们纳入 YOLOv6
以实现部署就绪网络的目标。
将 YOLOv6
的主要方面总结如下:
针对不同场景中的工业应用重新设计了一系列不同规模的网络。不同规模的架构各不相同,以实现最佳的速度和准确性权衡,其中小型模型具有简单的单路径主干,大型模型建立在高效的多分支块上。
为 YOLOv6
注入了一种self-distillation
策略,在分类任务和回归任务上都执行。同时,动态调整来自教师和标签的知识,以帮助学生模型在所有训练阶段更有效地学习知识。
广泛验证标签分配、损失函数和数据增强技术的先进检测技术,并有选择地采用它们以进一步提高性能。
在 RepOptimizer
和通道蒸馏的帮助下改进了检测的量化方案,这带来了具有 43.3% 的 COCO AP 和 869 FPS 的吞吐量的快速准确的检测器,批量大小为 32。
YOLOv6
的改造设计包括以下组件,网络设计、标签分配、损失函数、数据增强、行业便利改进以及量化和部署:
Backbone
:与其他主流架构相比, RepVGG
主干在相似的推理速度下在小型网络中具有更强的特征表示能力,但由于参数和计算成本的爆炸式增长,它很难扩展以获得更大的模型。在这方面,将 RepBlock
作为小型网络的构建块。对于大型模型,修改了一个更高效的 CSP Block
,名为 CSPStackRep
块。
Neck
:YOLOv6 的 Neck
采用 YOLOv4
和 YOLOv5
之后的 PAN
。使用 RepBlocks
或 CSPStackRep Blocks
增强 Neck
以获得 Rep-PAN
。
Head
:简化了 Decoupled Head
,使其更高效,称为Efficient Decoupled Head
。
通过大量实验评估了 YOLOv6
上标签分配策略的最新进展,结果表明 TAL
更有效且对训练更友好。
主流的Anchor-Free
检测器的损失函数包括分类损失、框回归损失和目标损失。对于每个损失,用所有可用的技术系统地对其进行试验,最后选择 VariFocal Loss
分类损失,SIoU
/GIoU
损失作为回归损失。
引入了额外的常见实践和技巧来提高性能,包括self-distillation
和更多的训练时期。对于self-distillation
,分类和框回归分别由教师模型监督。多亏了 DFL
使得框回归的蒸馏成为可能。此外,来自Soft Label和Hard Label的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。此外,作者遇到了性能受损的问题,而在评估时没有添加额外的灰色边框,为此提供了一些补救措施。
为了解决量化基于重参化模型的性能下降问题,使用 RepOptimizer
训练 YOLOv6
以获得对 PTQ
友好的权重。进一步采用 QAT
和通道蒸馏和图优化来追求极致性能。量化 YOLOv6-S
达到了最新的技术水平,AP 为 42.3%,吞吐量为 869 FPS(batch size=32)。
单阶段目标检测器一般由以下部分组成:Backbone
、Neck
和Head
。Backbone
主要决定特征表示能力,同时,它的设计对推理效率有至关重要的影响,因为它承载了很大一部分计算成本。Neck
用于将低层次的物理特征与高层次的语义特征进行聚合,然后构建各个层次的金字塔特征图。Head
由几个卷积层组成,它根据Neck
融合的多级特征预测最终检测结果。从结构的角度来看,它可以分为Anchor-Base
和Anchor-Free
,或者更确切地说是参数耦合Head
和参数解耦Head
。
在 YOLOv6
中,基于硬件友好的网络设计原则,提出了两个可缩放的可重参数Backbone
和Neck
以适应不同大小的模型,以及一个具有混合通道策略的高效解耦Head
。 YOLOv6
的整体架构如图 2 所示。
如上所述,Backbone
网络的设计对检测模型的有效性和效率有很大的影响。以前,已经表明多分支网络通常可以比单路径网络实现更好的分类性能,但它通常伴随着并行度的降低并导致推理延迟的增加。相反,像 VGG
这样的普通单路径网络具有高并行性和更少内存占用的优势,从而带来更高的推理效率。最近在 RepVGG
中,提出了一种结构重参化方法,将训练时多分支拓扑与推理时普通架构解耦,以实现更好的速度-准确度权衡。
受上述工作的启发,设计了一个高效的可重参化Backbone
,表示为 EfficientRep
。对于小型模型,Backbone
的主要组成部分是训练阶段的 RepBlock
,如图 3(a)所示。并且每个 RepBlock
在推理阶段被转换为具有 ReLU
激活函数的 3×3 卷积层(表示为 RepConv
)的堆栈,如图 3(b)所示。通常,3×3 卷积在主流 GPU
和 CPU
上进行了高度优化,并且具有更高的计算密度。因此,EfficientRep Backbone
充分利用了硬件的计算能力,在显着降低推理延迟的同时增强了表示能力。
然而,作者注意到随着模型容量的进一步扩大,单路径普通网络中的计算成本和参数数量呈指数增长。为了在计算负担和准确性之间取得更好的平衡,修改了一个 CSPStackRep Block
来构建中型和大型网络的Backbone
。如图 3© 所示,CSPStackRep Block
由3个 1×1 卷积层和一堆子块组成,该子块由两个 RepVGG Block
或 RepConv
(分别在训练或推理时)和一个残差连接组成。此外,采用跨级部分(CSP
)连接来提高性能,而不会产生过多的计算成本。与 CSPRepResStage
相比,它的外观更加简洁,并考虑了准确性和速度之间的平衡。
在实践中,多尺度的特征集成已被证明是目标检测的关键和有效部分。 采用来自 YOLOv4
和 YOLOv5
的修改后的 PAN 拓扑
作为检测Neck
的基础。 此外,将 YOLOv5
中使用的 CSPBlock
替换为 RepBlock
(适用于小型模型)或 CSPStackRep Block
(适用于大型模型),并相应调整宽度和深度。 YOLOv6
的Neck
表示为 Rep-PAN
。
YOLOv5
的检测头是一个耦合Head
,在分类和定位分支之间共享参数,而 FCOS
和 YOLOX
中的检测头将两个分支解耦,并且在每个分支中引入了额外的两个 3×3 卷积层以提高性能。
在 YOLOv6
中采用混合通道策略来构建更高效的解耦Head
。 具体来说,将中间 3×3 卷积层的数量减少到只有一个。 头部的宽度由Backbone
和Neck
的宽度乘数共同缩放。 这些修改进一步降低了计算成本,以实现更低的推理延迟。
Anchor-free
检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。 其后处理的时间成本大大降低。 有两种类型的Anchor-free
检测器:基于Anchor
和基于关键点。 在 YOLOv6
中,我们采用了基于Anchor
点的范式,其框回归分支实际上预测了Anchor
点到边界框4个边的距离。
标签分配负责在训练阶段为预定义的Anchor
分配标签。以前的工作已经提出了各种标签分配策略,从简单的基于 IoU
的策略和内部真实方法到其他更复杂的方案。
SimOTA OTA
将目标检测中的标签分配视为最佳传输问题。它从全局角度为每个真实对象定义了正/负训练样本。 SimOTA
是 OTA
的简化版本,它减少了额外的超参数并保持了性能。在 YOLOv6
的早期版本中使用 SimOTA
作为标签分配方法。然而,在实践中,作者发现引入 SimOTA
会减慢训练过程。而且陷入不稳定训练的情况并不少见。因此,希望更换 SimOTA
。
任务对齐学习任务对齐学习(Task Alignment Learning
,TAL)最早是在TOOD
中提出的,其中设计了一个分类分数和预测框质量的统一度量。 IoU
被这个指标替换以分配对象标签。在一定程度上缓解了任务错位(分类和框回归)的问题。 TOOD
的另一个主要贡献是关于任务对齐的头部(T-head
)。 T-head
堆叠卷积层以构建交互式特征,在其之上使用任务对齐预测器 (TAP)。 PP-YOLOE
改进了 T-head
,将 T-head
中的 layer attention
替换为轻量级的 ESE attention
,形成 ET-head
。然而,我们发现 ET-head
会降低模型中的推理速度,并且没有准确度增益。因此,保留了高效解耦头的设计。
此外,作者观察到 TAL
可以带来比 SimOTA
更多的性能提升并稳定训练。因此,采用 TAL
作为 YOLOv6
中的默认标签分配策略。
提高分类器的性能是优化检测器的关键部分。 Focal Loss
修改了传统的交叉熵损失,以解决正负样本之间或难易样本之间的类别不平衡问题。为了解决训练和推理之间质量估计和分类的不一致使用,Quality Focal Loss
(QFL
)进一步扩展了Focal Loss
,联合表示分类分数和分类监督的定位质量。而 VariFocal Loss
(VFL
) 源于 Focal Loss
,但它不对称地对待正样本和负样本。通过考虑不同重要性的正负样本,它平衡了来自两个样本的学习信号。 Poly Loss
将常用的分类损失分解为一系列加权多项式基。它在不同的任务和数据集上调整多项式系数,通过实验证明比交叉熵损失和Focal Loss
损失更好。
在 YOLOv6
上评估所有这些高级分类损失,最终采用 VFL
。
框回归损失提供了精确定位边界框的重要学习信号。 L1 Loss
是早期作品中的原始框回归损失。逐渐地,各种精心设计的框回归损失如雨后春笋般涌现,例如 IoU-series
损失和概率损失。
IoU-series Loss IoU loss
将预测框的四个边界作为一个整体进行回归。它已被证明是有效的,因为它与评估指标的一致性。 IoU
的变种有很多,如GIoU
、DIoU
、CIoU
、α-IoU
和SIoU
等,形成了相关的损失函数。我们在这项工作中对 GIoU
、CIoU
和 SIoU
进行了实验。并且SIoU
应用于YOLOv6-N
和YOLOv6-T
,而其他的则使用GIoU
。
Probability Loss Distribution Focal Loss
(DFL
) 将框位置的基本连续分布简化为离散化的概率分布。它在不引入任何其他强先验的情况下考虑了数据中的模糊性和不确定性,这有助于提高框定位精度,尤其是在ground-truth
框的边界模糊时。在 DFL
上,DFLv2
开发了一个轻量级的子网络,以利用分布统计数据与真实定位质量之间的密切相关性,进一步提高了检测性能。然而,DFL
输出的回归值通常比一般框回归多 17 倍,从而导致大量开销。额外的计算成本阻碍了小型模型的训练。而 DFLv2
由于额外的子网络,进一步增加了计算负担。在实验中,DFLv2
在模型上为 DFL
带来了类似的性能提升。因此,只在 YOLOv6-M/L
中采用 DFL
。
Object loss
最早是在 FCOS
中提出的,用于降低低质量边界框的得分,以便在后处理中将其过滤掉。 它还被用于 YOLOX
以加速收敛并提高网络精度。 作为像 FCOS
和 YOLOX
这样的Anchor-free
框架,在 YOLOv6
中尝试过 object loss
。 不幸的是,它并没有带来很多积极的影响。
经验结果表明,检测器的性能随着训练时间的增加而不断进步。 作者将训练持续时间从 300 个 epoch 延长到 400 个 epoch,以达到更好的收敛性。
为了在不引入太多额外计算成本的情况下进一步提高模型精度,应用了经典的知识蒸馏技术,最小化了教师和学生预测之间的 KL-divergence
。 将老师限制为学生本身,但经过预训练,因此称之为自我蒸馏。
请注意,KL-divergence
通常用于衡量数据分布之间的差异。 然而,目标检测中有两个子任务,其中只有分类任务可以直接利用基于 KL-divergence
的知识蒸馏。 由于 DFL
损失,也可以在框回归上执行它。 知识蒸馏损失可以表示为:
L K D = K L ( p t c l s ∥ p s c l s ) + K L ( p t r e g ∥ p s r e g ) L_{K D}=K L\left(p_{t}^{c l s} \| p_{s}^{c l s}\right)+K L\left(p_{t}^{r e g} \| p_{s}^{r e g}\right) LKD=KL(ptcls∥pscls)+KL(ptreg∥psreg)
其中 p t c l s p^{cls}_t ptcls 和 p s c l s p^{cls}_s pscls 分别是教师模型和学生模型的类预测,因此 p t r e g p^{reg}_t ptreg 和 p s r e g p^{reg}_s psreg 是框回归预测。 整体损失函数现在公式化为:
L total = L det + α L K D L_{\text {total }}=L_{\text {det }}+\alpha L_{K D} Ltotal =Ldet +αLKD
其中 L d e t L_{det} Ldet 是使用预测和标签计算的检测损失。 引入超参数α来平衡两个损失。 在训练的早期阶段,来自老师的软标签更容易学习。 随着训练的继续,学生的表现将与老师相匹配,因此硬标签将更多地帮助学生。 在此基础上,将余弦权重衰减应用于 α,以动态调整来自硬标签和来自教师的软标签的信息。
作者注意到在 YOLOv5
和 YOLOv7
的实现中评估模型性能时,每个图像周围都有一个半步长的灰色边框。 虽然没有添加有用的信息,但它有助于检测图像边缘附近的对象。 这个技巧也适用于 YOLOv6
。
然而,额外的灰色像素明显降低了推理速度。 没有灰色边框,YOLOv6
的性能会变差。 假设该问题与马赛克增强中的灰色边框填充有关。 进行了在最后一个时期关闭马赛克增强的实验(也称为淡入淡出策略)以进行验证。 对此,改变了灰色边框的区域,将带有灰色边框的图像直接调整为目标图像大小。 结合这两种策略,模型可以在不降低推理速度的情况下保持甚至提高性能。
对于工业部署,通常的做法是采用量化来进一步加快运行时间而不会对性能造成太大影响。 训练后量化(PTQ
)直接量化模型,只需要一个小的校准集。 而量化感知训练(QAT)通过访问训练集进一步提高了性能,这通常与蒸馏结合使用。 然而,由于在 YOLOv6
中大量使用了重参化块,以前的 PTQ
技术无法产生高性能,而在训练和推理期间在匹配假量化器时很难结合 QAT
。
RepOptimizer
在每个优化步骤提出梯度重参化。 该技术也很好地解决了基于重参化模型的量化问题。 因此,以这种方式重建 YOLOv6
的重参化块,并使用 RepOptimizer
对其进行训练以获得对 PTQ
友好的权重。 特征图的分布在很大程度上变窄了,这极大地有利于量化过程。
通过将量化敏感操作部分转换为浮点计算来进一步提高 PTQ
性能。 为了获得灵敏度分布,通常使用几个指标,均方误差 (MSE
)、信噪比 (SNR
) 和余弦相似度。 通常为了比较,可以选择输出特征图(在激活某个层之后)来计算这些带有和不带量化的指标。 作为替代方案,通过打开和关闭特定层的量化来计算验证 AP
也是可行的。
在使用 RepOptimizer
训练的 YOLOv6-S
模型上计算所有这些指标,并选择前 6 个敏感层以浮动运行。
如果 PTQ
不足,建议使用量化感知训练 (QAT
) 来提高量化性能。 为了解决训练和推理过程中假量化器不一致的问题,有必要在 RepOptimizer
上构建 QAT
。 此外,通道蒸馏(后来称为 CW Distill
)适用于 YOLOv6
框架,如图 5 所示。 这也是一种自我蒸馏方法,其中教师网络是 FP32 精度的学生本身。
[1] YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications