YoloV6----回顾

前期问题与解决策略

主要问题:

  • RepVGG的重参数化:重参数化是一种出色的技术,但在检测任务中尚未得到充分利用。我们还注意到,简单地对RepVGG块进行模型缩放变得不切实际,因为我们认为小型和大型网络之间的网络设计的一致性并非必要。对于小型网络来说,简单的单路径架构是更好的选择,但对于更大的模型,单路径架构的参数和计算成本呈指数增长,变得不可行。

  • 基于重参数化的检测器的量化:这类检测器的量化也需要精细处理,否则在训练和推理过程中,由于其异构配置,性能下降将难以应对。

  • 之前的工作:先前的工作往往较少关注实际部署,延迟通常在高成本机器如V100上进行比较。而在实际服务环境中存在硬件差距。通常,像Tesla T4这样的低功耗GPU成本更低,同时提供相当好的推理性能。

  • 高级领域特定策略:像标签分配和损失函数设计等高级领域特定策略需要考虑架构差异进行进一步验证。

  • 部署的调整:对于部署来说,我们可以容忍那些在不增加推理成本的情况下通过训练策略调整而提高准确性的方法,例如知识蒸馏。

主要改进:

  • 我们为YOLOv6引入了自蒸馏策略,既应用于分类任务,也应用于回归任务。同时,我们动态调整来自教师模型和标签的知识,以帮助学生模型在所有训练阶段更有效地学习知识。
  • 我们广泛验证了高级检测技术,如标签分配、损失函数和数据增强技术,并选择性地采用它们以进一步提升性能。
  • 我们利用RepOptimizer [2] 和通道级蒸馏 [36] 改革了检测的量化方案,从而实现了一个既快速又准确的检测器,COCO AP达到了43.3%,在批处理大小为32时的吞吐量为869 FPS。
网络设计

骨干网络 (Backbone): 与其他主流架构相比,我们发现RepVGG [3] 在小型网络中具备更强的特征表示能力,同时推理速度相似。然而,由于参数和计算成本的指数增长,RepVGG 难以扩展为更大的模型。在这方面,我们将 RepBlock [3] 作为小型网络的基本构建块。对于大型模型,我们修订了一个更高效的 CSP [43] 块,命名为 CSPStackRep Block。

颈部 (Neck): YOLOv6 的颈部采用了 PAN 拓扑结构 [24],继承了 YOLOv4 和 YOLOv5 的设计。我们通过 RepBlocks 或 CSPStackRep Blocks 来增强颈部结构,称之为 RepPAN。

头部 (Head): 我们简化了解耦头部(Decoupled Head),使其更高效,命名为高效解耦头部(Efficient Decoupled Head)。

标签分配

损失函数 (Loss Function): 主流的无锚点目标检测器的损失函数包括框回归损失和目标损失。我们对所有可用的技术系统性地进行了实验,最终选择 VariFocal Loss [50] 作为分类损失,SIoU [8] / GIoU [35] Loss 作为回归损失

工业实用改进

行业实用改进 (Industry-handy Improvements): 我们引入了额外的常见实践和技巧以提高性能,包括自蒸馏和更多的训练周期。对于自蒸馏,分类和框回归分别由教师模型进行监督。框回归的蒸馏得益于 DFL [20]。此外,通过余弦衰减动态调整来自软标签和硬标签的信息比例,这有助于学生模型在训练过程中的不同阶段选择性地获取知识。我们还解决了在评估过程中不添加额外灰色边框所导致的性能下降问题,并提供了一些补救措施。

量化与部署

量化与部署 (Quantization and Deployment): 为了解决量化重参数化模型时的性能下降问题,我们使用 RepOptimizer [2] 训练 YOLOv6 以获得适合 PTQ 的权重。我们进一步采用 QAT 和通道级蒸馏 [36] 以及图优化以追求极致性能。我们的量化 YOLOv6-S 实现了新的最先进水平,COCO AP 达到 42.3%,在批处理大小为 32 时的吞吐量为 869 FPS。

Network Designe

一个单阶段目标检测器通常由以下部分组成:骨干网络(backbone)、颈部(neck)和头部(head)。

  1. 骨干网络 (Backbone)

    • 骨干网络主要决定了特征表示能力。
    • 由于骨干网络占据了较大部分的计算成本,它的设计对推理效率有着关键影响。
  2. 颈部 (Neck)

    • 颈部用于聚合低级物理特征和高级语义特征。
    • 它构建了所有层级的金字塔特征图(pyramid feature maps),以便于进一步处理。
  3. 头部 (Head)

    • 头部由多个卷积层组成,根据颈部组装的多级特征来预测最终的检测结果。
    • 根据结构,头部可以分为基于锚点(anchor-based)和无锚点(anchor-free),或者参数耦合头(parameter-coupled head)和参数解耦头(parameter-decoupled head)。

在YOLOv6中,基于硬件友好网络设计的原则 [3],我们提出了两个可重新参数化的缩放骨干网络和颈部,以适应不同大小的模型,并引入了一种使用混合通道策略的高效解耦头。YOLOv6的整体架构如图2所示

Backbone

此前研究表明,多分支网络往往能比单路径网络取得更好的分类性能,但通常会降低并行性,导致推理延迟增加。相反,像VGG 这样的简单单路径网络具有高并行性和较小的内存占用,能带来更高的推理效率。最近在RepVGG中,提出了一种结构重参数化方法,这种方法在训练时使用多分支拓扑结构,在推理时转换为简单架构,以实现更好的速度和准确性平衡。

RepVGG网络简介-CSDN博客

小型网络:EfficientRep。对于小型模型,骨干网络的主要组件是在训练阶段使用的RepBlock,如图3 (a)所示。在推理阶段,每个RepBlock转换为堆叠的3×3卷积层(称为RepConv),并使用ReLU激活函数,如图3 (b)所示。通常情况下,(3×3卷积在主流GPU和CPU上经过高度优化,具有更高的计算密度)。因此,EfficientRep骨干网络充分利用了硬件的计算能力,显著减少了推理延迟,同时增强了特征表示能力。

中型网络:我们对CSPStackRep Block进行了修订,以构建中型和大型网络的骨干网络。如图3 (c)所示,CSPStackRep Block由三个1×1卷积层和一个子块堆叠组成,每个子块包含两个RepVGG块 [3] 或RepConv(分别在训练或推理时使用),并带有残差连接。此外,还采用了跨阶段部分(CSP)连接,以在不增加过多计算成本的情况下提升性能。与CSPRepResStage [45]相比,它具有更简洁的结构,并在准确性和速度之间取得了平衡。

总结而言,YOLOv6的骨干网络设计通过借鉴多路径和单路径网络的优点,结合重参数化技术,达到了在不同规模模型中兼顾推理效率和检测准确性的目标。

Neck

在实际应用中,多尺度特征集成被证明是目标检测中的一个关键且有效的部分。我们采用了从YOLOv4 [1] 和YOLOv5 [10] 中修改的PAN拓扑结构作为我们检测颈部的基础。此外,我们将YOLOv5中使用的CSP-Block替换为RepBlock(用于小型模型)或CSPStackRep Block(用于大型模型),并相应调整其宽度和深度。YOLOv6的颈部被称为Rep-PAN。

Head

高效解耦头部 (Efficient Decoupled Head)

YOLOv5的检测头部是一个耦合头部,其中分类和定位分支之间共享参数。而在FCOS [41] 和YOLOX [7] 中,这两个分支被解耦,每个分支中引入了额外的两个3×3卷积层以提升性能

在YOLOv6中,我们采用了一种混合通道策略来构建更高效的解耦头部。具体来说,我们将中间的3×3卷积层数量减少到只有一个。头部的宽度通过骨干网络和颈部的宽度乘数进行联合缩放。这些修改进一步降低了计算成本,实现了更低的推理延迟。

Anchor-free

Anchor-free因其更好的泛化能力和解码预测结果的简便性而脱颖而出。这种方法显著减少了后处理的时间成本。无锚点检测器主要有两种类型:基于锚点的和基于关键点的。在YOLOv6中,我们采用了基于锚点的范式,其中框回归分支实际上预测的是锚点到边界框四边的距离。

Label Assignment 

标签分配在训练阶段负责为预定义的锚点(anchors)分配标签。之前的研究提出了多种标签分配策略,这些策略从简单的基于IoU的策略和内部真实值(inside ground-truth)方法 [41],到其他更复杂的方案 [5, 7, 18, 48, 51] 不等。

SimOTA:OTA [6] 将目标检测中的标签分配视为一个最优传输问题。它从全局角度定义了每个真实目标的正/负训练样本。SimOTA [7] 是OTA [6] 的简化版本,减少了额外的超参数,同时保持了性能。SimOTA 在YOLOv6的早期版本中被用作标签分配方法。然而,实际上,我们发现引入SimOTA会减慢训练过程,并且不稳定的训练情况并不少见。因此,我们需要寻找SimOTA的替代方案。(YOLOX的方法)

任务对齐学习 (Task Alignment Learning, TAL)

任务对齐学习(TAL)最初由TOOD [5] 提出,在该方法中设计了一个统一的分类分数和预测框质量的度量。这个度量取代了IoU,用于分配目标标签。在一定程度上,缓解了任务(分类和框回归)不对齐的问题。TOOD的另一个主要贡献是关于任务对齐头(T-head)。T-head 堆叠卷积层以构建交互特征,在此基础上使用任务对齐预测器(TAP)。PP-YOLOE [45] 通过用轻量级的ESE注意力代替T-head中的层注意力,改进了T-head,形成了ET-head。然而,我们发现ET-head在我们的模型中会降低推理速度,并且没有带来准确性的提升。因此,我们保留了高效解耦头的设计。

此外,我们观察到TAL相比于SimOTA能够带来更多的性能提升,并且稳定了训练。因此,我们在YOLOv6中采用TAL作为默认的标签分配策略。

Loss Functions

分类损失的改进:

  1. 焦点损失 (Focal Loss) [22]

    • 传统交叉熵损失的问题在于,面对正负样本比例严重不平衡的情况时,容易受到多数类(负样本)的主导,导致模型难以关注少数类(正样本)。
    • 焦点损失通过引入一个调节因子(focusing parameter),使得模型在训练时更加关注难以分类的样本(即正样本和难负样本),从而有效解决了样本不平衡的问题。
  2. 质量焦点损失 (Quality Focal Loss, QFL) [20]

    • QFL 是在 Focal Loss 的基础上进行扩展,结合了分类分数和定位质量,解决了训练和推理过程中质量估计和分类应用不一致的问题。
    • 它引入了一个联合表示,将分类分数和框的定位质量结合起来,作为分类监督信号。这样,模型在训练时不仅考虑类别的置信度,还考虑预测框的定位精度。
  3. 变焦点损失 (VariFocal Loss, VFL) [50]

    • VFL 是基于 Focal Loss 的思想,但它对正负样本的处理是非对称的。具体而言,VFL 在处理正负样本时,分别考虑它们的重要性,针对不同样本施加不同程度的学习信号。
    • 这种非对称处理方式通过平衡正负样本的学习信号,有助于更好地引导模型在分类任务中提高性能。
  4. 多项式损失 (Poly Loss) [17]

    • Poly Loss 将常用的分类损失分解为一系列加权的多项式基底。通过在不同任务和数据集上调节多项式系数,它能够在分类性能上超越传统的交叉熵损失和焦点损失。
    • 该方法的优势在于,它能够灵活调整不同任务和数据集的损失曲线,适应性更强。

在 YOLOv6 的开发中,研究团队评估了上述这些先进的分类损失函数。经过广泛的实验和性能对比,最终选择了 VariFocal Loss (VFL) [50] 作为YOLOv6的默认分类损失函数。这一选择是基于 VFL 在平衡正负样本学习信号方面的有效性,以及它对提升模型分类性能的明显贡献。

Box Regression Loss

在YOLOv6的开发中,团队实验了GIoU、CIoU和SIoU等多种IoU系列损失函数:

  • SIoU 被应用于小型模型(YOLOv6-N 和 YOLOv6-T),因为它能够在不增加计算成本的情况下有效提升小模型的精度。
  • 对于其他模型,则使用了 GIoU

训练技巧

增加epoch和自蒸馏的方法在此不在赘述

Gray border of images

在YOLOv6的模型评估过程中,发现像YOLOv5和YOLOv7实现中的那样,在每张图像周围添加了一个半步幅的灰色边框。虽然这些灰色边框不会添加有用的信息,但它们确实有助于检测靠近图像边缘的物体。然而,这种处理显著降低了推理速度。

灰色边框的问题与解决策略

  1. 灰色边框的影响

    • 性能提升:在图像边缘添加灰色边框可以帮助检测边缘附近的物体,提高检测的全面性。
    • 推理速度下降:灰色边框的额外像素会增加推理的计算负担,从而降低模型的推理速度。
  2. Mosaic数据增强的影响

    • 观察到问题可能与Mosaic数据增强中的灰色边框填充有关。Mosaic增强将图像分割成多个部分并拼接,可能导致边缘物体的检测不准确。
  3. 解决方案

    • 关闭Mosaic增强:在训练的最后几个周期中关闭Mosaic增强(即使用fade策略),有助于解决灰色边框带来的问题。
    • 调整灰色边框区域:减少灰色边框的面积,并将图像直接调整到目标图像大小。这可以减少灰色边框对推理速度的影响,同时保持或甚至提升模型性能。

通过这两种策略的结合,可以在不损害推理速度的情况下保持或提升模型性能。这种调整确保了YOLOv6在实际应用中的高效性和有效性

在工业部署中,为了进一步加快运行时间而不显著影响性能,通常会采用量化(quantization)。YOLOv6的量化和部署策略涉及以下几个方面:

量化方法

  1. 后训练量化(PTQ)

    • 定义:后训练量化是在训练完成后对模型进行量化,只需使用少量的校准数据集。
    • 问题:由于YOLOv6中大量使用了重新参数化(re-parameterization)块,传统的PTQ技术在高性能模型上效果不佳。
  2. 量化感知训练(QAT)

    • 定义:量化感知训练在训练过程中引入量化噪声,使得模型能够更好地适应量化过程。通常与知识蒸馏(distillation)一起使用。
    • 问题:由于重新参数化块的特殊性质,训练和推理中的伪量化器(fake quantizers)匹配困难,QAT的实施变得复杂。

解决方案

重新参数化优化器(RepOptimizer)

  • 定义:RepOptimizer提出了在每次优化步骤中进行梯度重新参数化。这种技术有效地解决了重新参数化模型的量化问题。
  • 实施:我们将YOLOv6中的重新参数化块重新构建为RepOptimizer优化器,并使用它来训练模型,以获得适合PTQ的权重。
  • 效果:这种方法显著缩小了特征图的分布(如图4所示,详细信息见B.1),这大大有利于量化过程,从而提高了量化后的模型性能。详细结果可以在第3.5.1节中找到。

通过这些优化措施,YOLOv6在量化过程中能够保持高性能,并在实际应用中提高了推理效率。

敏感性分析

为了进一步提升后训练量化(PTQ)的性能,我们通过将量化敏感的操作部分转换为浮点计算来优化模型。在进行敏感性分析时,常用的指标包括均方误差(MSE)、信噪比(SNR)和余弦相似度(Cosine Similarity)。以下是具体实现步骤:

  1. 指标计算

    • 均方误差(MSE):用于测量量化前后特征图的差异。量化后的特征图与原始浮点特征图之间的均方误差越小,说明量化对模型性能的影响越小。
    • 信噪比(SNR):衡量信号质量的指标,用于评估量化操作对特征图的影响。SNR越高,说明量化对模型的影响越小。
    • 余弦相似度:用于测量量化前后特征图的相似度。通过计算量化前后特征图之间的余弦相似度来评估量化对模型输出的影响。
  2. 量化敏感层的选择

    • 计算方法:选择YOLOv6-S模型的输出特征图(在特定层的激活后)来计算上述指标,比较量化前后的特征图。
    • 验证方法:另一种方法是通过切换特定层的量化开关,计算验证集上的平均精度(AP),以评估量化对性能的影响。
  3. 实施方案

    • 敏感层选择:我们计算了YOLOv6-S模型在使用RepOptimizer训练后的所有指标,并选取了最敏感的前6层以浮点形式运行。这些敏感层在量化过程中表现出较大的性能波动,因此被保留为浮点计算,以最小化量化对整体模型性能的影响。
  4. 结果

    • 敏感性分析图表:可以在附录B.2中找到完整的敏感性分析图表,这些图表展示了量化敏感层的详细信息及其对模型性能的影响。

通过这种敏感性分析,我们能够识别出对量化最敏感的层,并通过将这些层保留为浮点计算来优化量化后的模型性能,从而提升YOLOv6的实际应用效果。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值