原始题目 | YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications |
---|---|
中文名称 | YOLOv6: 一个面向工业应用的单阶段目标检测框架 |
发表时间 | 2022年9月7日 |
平台 | arXiv |
来源 | 美团 |
文章链接 | https://arxiv.org/abs/2209.02976 |
开源代码 | https://github.com/meituan/YOLOv6/blob/main/README_cn.md |
多年来,YOLO系列一直是高效物体检测的事实上的工业级标准。YOLO社区以压倒性的优势丰富了它在众多硬件平台和丰富场景中的应用。在这份技术报告中,我们努力把它的极限推到一个新的水平,以坚定不移的心态向工业应用迈进。考虑到现实环境中对速度和 accuracy 的不同要求,我们广泛地研究了来自工业界或学术界的最新的物体检测进展。具体来说,我们大量吸收了最近的 网络设计、训练策略、测试技术、量化和优化方法的思想。在此基础上,我们整合了我们的想法和实践,建立了一套不同规模的 可部署(deployment-ready) 的网络,以适应各种的使用情况。在 YOLO 作者的慷慨许可下,我们将其命名为 YOLOv6 。我们也表示热烈欢迎用户和贡献者的进一步改进。对于性能的表现,我们的 YOLOv6-N 在 COCO数据集 上达到了 35.9% 的AP,在 NVIDIA Tesla T4 GPU 上的吞吐量为 1234 FPS。YOLOv6-S 以 495 FPS的速度达到了 43.5%的 AP,超过了其他相同规模的主流检测器(YOLOv5-S、YOLOX-S 和 PPYOLOE-S )。我们 YOLOv6-S 的量化版本 甚至在 869 FPS 时带来了新的最先进的 43.3%AP。此外,YOLOv6-M/L 也比其他具有类似推理速度的检测器取得了更好的 accuracy 表现(即49.5%/52.3%)。我们仔细进行了实验来验证每个组件的有效性。
不得不说,美团的作者生怕被喷,说 YOLOv6 只是一篇技术报告,还说自己得到 YOLO 作者同意才起的这个名。
简而言之,考虑到持续的工业需求,本文介绍了 YOLOv6 的当前形式,仔细检查了迄今为止目标检测器组件的所有进展,同时灌输我们的思想和实践。结果在 accuracy 和速度上都优于现有的其他实时检测器。为了方便工业部署,还为 YOLOv6 提供了一种定制的量化方法,呈现了一个 永远快速的(ever-fast) 开箱即用的检测器。我们衷心感谢学术界和工业界的杰出想法和努力。未来,我们将继续扩大该项目,以满足更高的标准和更苛刻的场景。
YOLO 系列一直是工业应用中最受欢迎的检测框架,因为它在速度和 accuracy 之间有很好的平衡。YOLO 系列的开创性工作是 YOLOv1-3[32-34],它开辟了one-stage检测器的新道路,并在后来进行了大幅改进。YOLOv4[1] 将检测框架重组为几个独立的部分(backbone, neck and head),并在当时验证了 bag-of-freebies 和 bag-of-specials,设计了一个适合在单个GPU上训练的框架。目前,YOLOv5[10]、YOLOX[7]、PP-YOLOE[44]和 YOLOv7[42]都是可以部署的高效检测器的竞争候选者。不同尺寸的模型通常是通过缩放技术获得的。
在这份报告中,我们从经验上观察到几个重要的因素,促使我们重新装修YOLO框架:
(1) 来自 RepVGG[3] 的 Reparameterization 是一种优越的技术,在检测中还没有得到很好的利用。我们还注意到,RepVGG块的简单模型扩展变得不切实际(simple model scaling for RepVGG blocks becomes impractical),为此我们认为小网络和大网络之间网络设计的优雅一致性是不必要的。对于小型网络来说,普通的单路径架构是一个较好的选择,但对于大型模型来说,参数的指数增长和单路径架构的计算成本使其不可行;
(2) Reparameterization-based 检测器的 量化 也需要细致的处理,否则在训练和推理过程中,由于其异质配置(heterogeneous configuration)导致的性能下降将是难以处理的。
(3) 以前的工作[7, 10, 42, 44]往往不太注意部署,其延迟通常是在 V100 这样的高成本机器上进行比较。当涉及到真正的服务环境时,存在着硬件差距。通常情况下,像 Tesla T4 这样的低功耗 GPU 成本较低,并提供相当好的推理性能。
(4) 考虑到架构上的差异,先进的特定领域策略,如标签分配和损失函数设计,需要进一步验证;
(5) 对于部署,我们可以容忍训练策略的调整,以提高 accuracy 性能,但不增加推理成本,如 知识蒸馏。
考虑到上述观察,我们带来了 YOLOv6 的诞生,它在 accuracy 和速度方面完成了迄今为止的最佳权衡。我们在 图1 中展示了 YOLOv6 与其他同行在类似规模下的比较。为了在不降低性能的情况下提高推理速度,我们研究了最先进的量化方法,包括 训练后量化(post-training quantization (PTQ))和量化感知训练(quantization-aware training (QAT)),并将其纳入 YOLOv6 ,以实现 可部署(deployment-ready) 网络的目标。
量化感知训练其实就是在训练中量化。整个这么恶心的词。
我们将 YOLOv6 的主要方面总结如下:
标签分配、损失函数和数据增强技术
的先进检测技术,并有选择地采用它们来进一步提升性能。YOLOv6 的重新设计由以下部分组成,网络设计、标签分配、损失函数、数据增强、适合工业界的改进,以及量化和部署
:
网络设计:
标签的分配:
我们通过大量的实验评估了最近在 YOLOv6 上的标签分配策略[5, 7, 18, 48, 51]的进展,结果表明 TAL[5]
更加有效和训练友好。
损失函数:
主流 anchor-free 目标检测器的损失函数包含: classification loss,box regression loss and object loss。 对于每个损失,我们用所有可用的技术进行了系统的实验,最后选择 VariFocal损失[50] 作为我们的分类损失,SIoU[8]/GIoU[35]损失作为我们的回归损失。
适合工业界的改进:
我们引入了更多常见的做法和技巧来提高性能,包括自蒸馏( self-distillation )和更多的训练 epochs。对于自蒸馏,分类和回归都分别由教师模型进行监督。 得益于 DFL
[20] , box regression 的精馏成为可能。此外,软标签和硬标签的信息比例通过余弦衰减动态下降,这有助于学生在训练过程中的不同阶段选择性地获取知识。此外,我们还遇到了在评估时不添加额外的灰边而导致性能受损的问题,对此我们提供了一些补救措施。
量化和部署:
为了解决 reparameterization-based 模型量化时的性能下降问题,我们用 RepOptimizer[2] 训练 YOLOv6 ,以获得 PTQ 友好的权重。我们进一步采用 QAT 与t通道级精馏[36]和图优化来追求极致的性能。我们的 量化YOLOv6-S 以 42.3% 的 AP 和 869 FPS 的吞吐量(batch size=32)达到了一个新的 state of the art 。
一个单阶段目标检测器一般由以下部分组成:backbone、neck和head。
在 YOLOv6 中,基于硬件友好型网络设计的原则[3],我们提出了两个可扩展的可重新参数化的 backbones 和 necks,以适应不同规模的模型,以及一个高效的混合通道策略的解耦头。YOLOv6的整体结构如 图2 所示。
如上所述,backbone 网络的设计对检测模型的有效性和效率有很大影响。以前的研究表明,多分支网络[13, 14, 38, 39]往往能比单路径网络[15, 37]取得更好的分类性能,但往往伴随着并行性的降低,导致推理延迟的增加。相反,像 VGG[37] 这样的普通单路径网络具有高并行性和较少内存占用的优势,导致更高的推理效率。最近在 RepVGG[3] 中,提出了一种结构上的 re-parameterization 方法,将训练时的多分支拓扑结构与推理时的普通结构解耦,以实现更好的 速度-accuracy 权衡。
受上述工作的启发, 我们设计了一个高效的 re-parameterizable backbone 网, 命名为 EfficientRep
. 对于小型模型, backbone 网络的主要组成部分是训练阶段的 Rep-Block , 如图 3(a) 所示。 在推理阶段,每个 RepBlock 被转换为具有 ReLU激活函数 的 3×3 卷积层(表示为 RepConv )的堆叠,如 图3(b) 所示。通常情况下,3×3 卷积在主流的 GPU 和 CPU 上被高度优化,它享有更高的计算密度。因此,EfficientRep Backbone 充分地利用了硬件的计算能力,使推理的延迟大大降低,同时提高了表示能力。
然而,我们注意到,随着模型容量的进一步扩大,单路径简单网络的计算成本和参数数量呈指数级增长。为了在 计算负担 和 accuracy 之间实现更好的权衡,我们修改了一个 CSPStackRep Block 来构建大中型网络的 backbone 。如 图3© 所示,CSPStackRep Block 由 三个1×1的卷积层 和一个由 两个 RepVGG blocks[3] 或 RepConv(分别在 训练 或 推理 时)组成的堆栈子块与一个 残差(residual) 连接组成。此外,还采用了一个跨阶段部分(cross stage partial (CSP))连接来提高性能,而没有过多的计算成本。与 CSPRepResStage[45] 相比,它有一个更简洁的外观,并考虑了 accuracy 和速度之间的平衡。
在实践中,多尺度的特征整合(integration)已被证明是目标检测的一个关键和有效的部分[9, 21, 24, 40]。我们采用 YOLOv4[1]和YOLOv5[10] 中修改的 PAN拓扑结构[24] 作为我们检测 Neck 的基础。此外,我们用 RepBlock(用于小模型)或 CSPStackRep Block(用于大模型)取代 YOLOv5 中使用的 CSPBlock ,并相应调整宽度和深度。YOLOv6的 Neck 被表示为 Rep-PAN 。
高效的解耦头
YOLOv5 的检测头是一个耦合头,其参数在分类和定位分支之间共享,而其在 FCOS[41] 和 YOLOX[7] 中的对应的部分则 将这两个分支解耦 ,并且在每个分支中引入额外的 两个3×3卷积层 以提高性能。
在 YOLOv6 中,我们采用一个 混合通道策略(hybrid-channel) 来建立一个更有效的解耦头。具体来说,我们将 中间的 3×3卷积层 的数量减少到只有一个 。head 的宽度由 backbone 和 neck 的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。
Anchor-free
Anchor-free 检测器因其更好的泛化能力和解码预测结果的简单性而脱颖而出。其后期处理的时间成本大大降低。有两种类型的 Anchor-free 检测器:anchor point-based [7, 41]和 keypoint-based[16, 46, 53]。在 YOLOv6 中,我们采用了 anchor point-based 的范式,其 box regression 分支实际上预测了从 anchor point 到 bounding boxes 四边的距离。
标签分配 负责在 训练阶段 将标签分配给预定义的 anchors 。以前的工作提出了各种标签分配策略,从 简单的IoU-based 策略
和 inside ground-truth
方法[FCOS:41]到其他更复杂的方案[5, 7, 18, 48, 51]。
inside ground-truth 的意思估计是 FCOS 论文中说的把标注框内的特征点作为正样本的意思。
SimOTA
OTA
[6] 认为物体检测中的标签分配是一个最优传输问题。它从全局的角度为每个 ground-truth 目标 定义了 正/负的训练样本。SimOTA
[7]是 OTA[6]的简化版本,它减少了额外的超参数并保持了性能。在YOLOv6 的早期版本中,SimOTA 被用作标签分配方法。然而,在实践中,我们发现引入 SimOTA 会减慢训练过程。而且,陷入不稳定的训练也并不罕见。因此,我们渴望有一个替代 SimOTA 的方法。
任务对齐学习
任务对齐学习
(Task Alignment Learning (TAL))最早是在 TOOD
[5]中提出的,其中设计了一个统一的分类分数和预测框质量的指标。IoU 被这个指标所取代,用于分配对象标签。在一定程度上,任务(classification and box regression)不一致的问题得到了缓解。
TOOD
的另一个主要贡献是关于任务对齐的头(task-aligned head (T-head))。T-head
堆叠卷积层以建立交互式特征,在此基础上使用任务对齐预测器(Task-Aligned Predictor (TAP
))。PP-YOLOE
[45] 改进了 T-head,用轻量级的 ESE注意力
取代了 T-head 中的层注意力,形成 ET-head。然而,我们发现 ET-head 在我们的模型中会降低推理速度,而且没有 accuracy 的提高。因此,我们保留了 Efficient 解耦头
的设计。
此外,我们观察到 TAL 比 SimOTA 能带来更多的性能提升,并且能稳定训练。因此,我们在 YOLOv6 中采用 TAL 作为默认的标签分配策略。
物体检测包含两个子任务:分类和定位,对应于两个损失函数:分类损失和回归损失。对于每个子任务,近年来都有各种损失函数出现。在本节中,我们将介绍这些损失函数,并描述我们如何为YOLOv6选择最佳的损失函数。
提高分类器的性能是优化检测器的一个关键部分。
Focal Loss
[22]修改了传统的 cross-entropy 损失,以解决正负样本之间或难易样本之间类别不平衡的问题。
为了解决训练和推理之间 质量估计和分类 的不一致使用问题,Quality Focal Loss (QFL) [20]进一步扩展了 Focal Loss,对 分类分数 和 分类监督的定位质量 进行联合表示。
而 VariFocal Loss(VFL)[50] 则源于 Focal Loss[22],但它对正负样本的处理是不对称的。通过考虑正负样本的不同重要程度,它平衡了来自两个样本的学习信号。
Poly Loss[17]将常用的分类损失分解为一系列的加权多项式基数。它在不同的任务和数据集上调整多项式系数,通过实验证明它比 Cross-entropy 损失和 Focal Loss更好。
我们在 YOLOv6 上评估了所有这些高级分类损失,最终采用了 VFL
[50]。
回归损失提供了精确定位 bounding boxes 的重要学习信号。L1 损失
是早期工作中最初的回归损失。逐渐地,各种精心设计的回归损失涌现出来,如 IoU系列损失
[8, 11, 35, 47, 52, 52] 和概率损失
[20]。
IoU-系列损失
IoU 损失
[47]将预测框的四个边界作为一个整体单位进行回归。它被证明是有效的,因为它与评价指标一致。IoU有很多变体,如 GIoU[35]、DIoU[52]、CIoU[52]、α-IoU[11]和 SIoU[8]
等,形成相关损失函数。在这项工作中,我们用 GIoU、CIoU和SIoU 进行实验。而 SIoU 被应用于 YOLOv6-N 和YOLOv6-T,而其他的则使用 GIoU。
概率损失
Distribution Focal Loss(DFL)
[20] 将 box 定位的潜在(underlying)连续(continuous)分布简化为离散的(discretized)概率分布。它考虑了数据的模糊性(ambiguity)和不确定性,而没有引入任何其他强的先验因素,这有助于提高 box 的定位精度,特别是当 ground-truth boxes 的边界模糊时。
在 DFL 的基础上,DFLv2 [19]开发了一个轻量级的子网络,以利用 分布统计和 实际定位质量 之间的密切关联,这进一步提高了检测性能。然而,DFL通常比一般的目标框回归多输出 17 倍的回归值,导致了大量的开销(substantial overhead.)。额外的计算成本大大阻碍了小模型的训练。而DFLv2 由于有了额外的子网络,进一步增加了计算负担。
在我们的实验中,DFLv2 在我们的模型上带来了与 DFL 相似的性能增益。因此,我们 只在YOLOv6-M/L 中采用 DFL 。实验细节可以可在第 3.3.3 节中找到。
object 损失最早是在 FCOS[41] 中提出的,用于降低低质量 bounding boxes 的得分,以便在后期处理中过滤掉它们。
它也被用于 YOLOX[7],以加速收敛并提高网络精度。
作为一个像 FCOS 和 YOLOX 一样的 anchor-free 框架,我们已经在 YOLOv6 中尝试了 object loss。不太幸运的是,它并没有带来很多好的效果。详细情况在 第3节 中给出。
下面的技巧是可以在实际操作中使用的。它们并不是为了进行公平的比较,而是在没有太多繁琐努力的情况下稳定地产生性能增益。
经验结果表明,随着训练时间的增加,检测器的性能也在不断进步。我们将训练时间从 300 epochs 延长到 400 epochs ,以达到一个 更好的收敛性。
为了进一步提高模型的准确性,同时不引入太多的额外计算成本,我们应用 经典的知识蒸馏 技术,使 教师的预测 和学生的预测 之间的 KL-散度 最小。我们把 老师限定为学生本身,但进行了预训练,因此我们称之为自蒸馏。请注意,KL-散度 通常被用来衡量数据分布之间的差异。然而,在目标检测中有两个子任务,其中只有分类任务可以直接利用 基于KL-散度 的知识蒸馏。幸亏 DFL损失 [20]的存在,我们也可以在 box regression 上执行它。知识蒸馏 损失 可以被表述为:
公式1
其中 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 是 box 回归预测。现在,总体损失函数被表述为:
公式2
其中 L d e t L_{det} Ldet 是用 预测和标签计算 的 检测损失。引入超参数 α 是为了平衡两种损失。在训练的早期阶段,教师的软标签更容易学习。随着训练的继续,学生的表现将与教师相匹配,因此硬标签将更多地帮助学生。在此基础上,我们对 α 应用 余弦权重衰减(cosine weight decay) 来动态调整来自硬标签 和 来自教师的软标签的信息。我们进行了详细的实验来验证 YOLOv6 的自蒸馏的效果,这将在第3节讨论。
我们注意到,在评价 YOLOv5[10]和YOLOv7[42] 的实现中的模型性能时,每个图像周围都有一个 半截(half-stride) 灰色的边框。虽然没有增加有用的信息,但它有助于检测图像边缘附近的物体。这个技巧也适用于YOLOv6。
然而,这些额外的灰色像素显然会降低推理速度。没有灰色边界,YOLOv6的性能就会下降,这也是[10, 42]的情况。
我们推测,这个问题与Mosaic 增强中的灰边填充有关[1, 10]。
为了验证,我们进行了在 最后一个 epochs 中关闭 马赛克增强 的实验[7](又称淡化策略 fade strategy)。在这方面,我们改变了灰色边框的面积,并将带有灰色边框的图像直接调整为目标图像的大小。结合这两种策略,我们的模型可以在不降低推理速度的情况下保持甚至提高性能。
还不是很懂,需要看代码怎么实现的。
对于工业部署来说,通常的做法是采用 量化 来进一步加快运行时间,而不会对性能造成很大影响。训练后量化(Post-training quantization
(PTQ))直接对模型进行量化,只需要一个小的校准(calibration)集。
而量化感知训练(quantization-aware training (QAT))通过访问训练集来进一步提高性能,通常与 蒸馏 联合使用。然而,由于在 YOLOv6 中大量使用 re-parameterization blocks ,以前的 PTQ 技术无法产生高性能,而在 训练和推理过程 中,当涉及到匹配 假量化器(fake quantizers)时,很难 包含(incorporate)QAT。我们在这里展示了 部署过程中的缺陷和解决方法。
RepOptimizer[2] 在每个优化步骤提出 梯度重新参数化( gradient re-parameterization)。该技术也很好地解决了 基于重参数化模型的量化问题。因此,我们以这种方式重构 YOLOv6 的 re-parameterization blocks,并用 RepOptimizer 训练它以获得 PTQ 友好的权重。特征图的分布大大变窄(如 图4,更多见 B.1),这大大有利于量化过程,结果见 第 3.5.1 节。
通过将 量化敏感操作部分 转换为 浮点数计算,进一步提高了 PTQ 的性能。为了获得敏感度分布,常用的度量指标有 均方误差(MSE)、信噪比(SNR)和余弦相似度(cosine similarity)(mean-square error (MSE), signal-noise ratio (SNR) and cosine similarity)。通常,为了进行比较,人们可以选择 输出特征图 (在某个层的激活之后) 来计算这些指标,包括 量化 和 不量化。作为一种替代方案,也可以通过切换 特定层[29]的量化开关 来计算 验证 AP。
我们在使用 RepOptimizer 训练的 YOLOv6-S 模型上计算所有这些指标,并选择 前6个(top-6)敏感层以 float 形式运行。灵敏度分析的完整图表见 B.2。
在 PTQ 不足的情况下,本文建议引入 量化感知训练(QAT) 来提高量化性能。为了解决训练和推理过程中 假量化器 的不一致问题,有必要在 RepOptimizer 的基础上构建 QAT。此外,在 YOLOv6 框架下采用了 通道级蒸馏[36](后称为 CW Distill),如图5所示。这也是一种自蒸馏方法,在FP32-precision 中,教师网络就是学生本身。参见第3.5.1节中的实验。
https://blog.csdn.net/guanshanjushi2/article/details/127284381