单位:台湾中科院信科所(王建尧)
ArXiv:https://arxiv.org/abs/2207.02696
Github:https://github.com/WongKinYiu/yolov7
导读:本该一天完成该论文的精读,愣是拖了三天;也算是在8月第一天完成,向军人精神致敬。YOLO系列的论文比较多,已经没有了刚出来时惊为天人的那种快感,该领域迭代速度快,内卷严重。读完本篇文章,最大的感受就是大小技巧一起卷。如果说YOLOv5是在结构上小改,那么YOLOv7是从头到脖子都在整改,重参数化、模型缩放、粗细标签结合。刚把v5版本解读完毕,又出一个v7版本,对我来说是不是好事吗?哎!
YOLOv7在5-160FPS范围的速度与精度超过了所有已知的目标检测器,在GPU V100上超过30FPS甚至更高速度的实时检测器中具有最高的56.8%检测精度。YOLOv7-E6取得了(V100,56FPS和55.9% AP),比基于Transformer的检测器Swin Cascade-Mask R-CNN(A100,9.2FPS和53.9%AP)速度上快了509%,精度上提升2%;比基于卷积的检测器ConvNeXt-XL Cascade-Mask R-CNN(A100 8.6FPS,55.2% AP)速度快551%倍,精度上提升0.7%;同样,YOLOv7在精度上超过了YOLOR、YOLOX、Scaled-YOLOv4、YOLOv5、DETR、Deformable DETR、DINO-5scale-R50、ViT-Adapter-B和很多其他的目标检测器。此外,作者仅使用MS COCO数据集上从头开始训练,而不使用其他数据集和预训练的权重。源代码已发布。
实时目标检测器是计算机视觉中一个非常重要的主题,因为它在视觉系统中扮演重要成分,例如,多目标追踪、自动驾驶、机器人、医学图像分析等。执行实时目标检测的计算装置通常是移动CPU或GPU,和各大厂商开发的神经处理单元NPU,如Apple神经引擎,Intel神经计算棒,Nvidia Jetson 边缘设备,Google边缘TPU,Qualcomm神经处理引擎,MediaTek AI处理单元,Kneron AI嵌入式都是NPUs。上述提到的边缘设备通过不同的操作来关注提速,如vanilla CNN,DW-CNN,MLP。本文中,作者提出的实时目标检测器希望能够同时支持移动GPU和从边缘到云端的GPU设备。
近些年,实时目标检测仍在针对不同的边缘设备而进行开发。例如,MCUNet和NanoDet专注于生产低功耗单芯片并提升边缘CPU的推理速度。而对于诸如YOLOX和YOLOR等方法专注在各种GPUs上提升推理速度。最近,实时目标检测器的发展关注高效架构的设计。对于能够在CPU上工作的实时目标检测器,它们的设计大多基于MobileNet、ShuffleNet和GhostNet。另一个主流是针对GPU而发展的,多数使用ResNet,DarkNet和DLA,然后使用CSPNet策略去优化架构。本篇文章提出的发展方向不同于当前主流的实时目标检测器。除了架构优化之外,作者提出的方法将专注训练过程的优化。作者的重点将放在一些优化的模块和优化方法上,他们可能会增加训练成本以提升目标检测的精度,但不会增加推理成本。作者将提出的模块和优化方法称为可训练的免费赠品。
Our focus will be on some optimized modules and optimization methods which may strengthen the training cost for improving the accuracy of object detection, but without increasing the inference cost. We call the proposed modules and optimization methods trainable bag-of-freebies.
最近,模型重参数化和动态标签分配已成为网络训练和目标检测的重要主题。主要是在上述概念提出之后,目标检测器的训练演变出很多新问题。作者将展示一些新的问题和设计解决方法。对于模型重参数化,作者用梯度传播路径的概念分析了适用于不同网络层的模型重参数化策略,并提出了有计划的重参数化策略。此外,作者发现使用动态标签分配技术时,具有多个输出层模型的训练会产生新问题,如“如何为不同分支的输出分配动态目标”。针对这个问题,作者提出一个新的标签分配方法,称为由粗到细的引导式标签分配。
本文贡献总结如下:
当前领先的实时目标检测器主要基于YOLO,FCOS。能够成为领先的实时目标检测器需要以下特征:
模型重参数化技术在推理阶段将多个计算模块合并为一个。模型重参数化技术可以看成是一种集成技术,我们可以将之分为两类:模型级别的集成,模块级别的集成。模型级别的重参数化有两个常见的做法来获取最终的推力模型。一种是用不同的训练数据训练多个相同的模型,然后对多个训练模型的参数进行加权平均。另一种是在不同迭代次数的模型权重进行加权平均。模块级别的重参数化是一种更流行的研究方法。这种方法在训练时将一个模块拆分为多个相同或不同的模块分支,在推理时将多个分支模块集成为一个完全等效的模块。然而,并非所有重参数化模块能够完美应用到不同架构上。考虑到这一点,作者开发了一种新的重参数化模块,并为不同架构设计了相关的应用策略。
模型缩放是一种放大或缩小已设计模型并使其适合不同计算设备的方法。模型缩放方法通常使用不同的缩放因子,例如分辨率(输入图像的大小),深度(层数),宽度(通道数)和阶段(特征金字塔的层数),在参数量、运算量、推理速度和精度之间的良好权衡。
网络架构搜索(network architecture search, NAS)是常用的模型缩放方法之一。NAS可以自动从搜索空间 搜索到合适的缩放因子,而不需定义过多复杂的规则。它的缺点是需要非常昂贵的计算来完成对模型缩放因子的搜索。在研究中,学者分析了缩放因子与参数量运算量之间的关系,试图直接估计一些规则从而获得模型缩放所需要的缩放因子。查阅文献,作者发现几乎所有模型缩放方法都独立分析单个缩放因子,甚至复合缩放类别中的方法也独立优化缩放因子。这是因为多数流行的NAS架构处理的比例因子不是很相关。作者观察到所有基于串联模型,如DenseNet或VoVNet,在当这些模型的深度被缩放时,将会改变某些层的输入宽度。由于所提出模型是采用串联的,作者得设计新的复合缩放方法。
Extended efficient layer aggregation networks
在多数关于设计高效架构的文献中,主要考虑因素无非是参数量、运算量和计算密度。从内存访问成本的特点出发,有文献分析了输入\输出通道比、架构分支数量、和逐元素相加对推理速度的影响。也有研究额外考虑激活功能,在执行模型缩放时,即更多考虑卷积层输出张亮的元素数量。
图2 b)中CSPVoVNet的设计是VoVNet的一个变体。除了考虑上述基本的设计问题外,CSPVoV还分析了梯度路径,以使不同层的权重能够学习更多样化的特征,这种梯度分析方法使得推理更快、更准确。
图2 c)中ELAN考虑如下设计策略,即如何设计高效网络?作者得出一个结论:通过控制最短的长梯度路径,一个更深的网络能够有效地学习与收敛。本文中作者提出扩展的ELAN,即E-ELAN,如图2 d)所示。
无论梯度路径长度和大规模ELAN中计算块的堆叠数量如何,它都达到了稳定状态。如果无限堆叠计算块,这种平衡状态会被打破,参数利用率会降低。E-ELAN使用扩展、洗牌(这里翻译成,打乱次序再组合)、合并基数来不断提升网络学习能力而不破快原始的梯度路径。在架构方面,E-ELAN只改变了计算块,而架构的传导层完全没有改变。作者的策略是使用组卷机去扩展计算块的通道和基数。作者将采用相同的组参数和通道乘数到每一个计算层的所有计算块上。然后,通过每个计算块计算的特征图将会根据设置的组参数g打乱成g个组,然后再串联到一起。此时,每组特征图的通道数与原始架构的通道数相同。最后,作者添加g组特征图来执行合并基数。除了保持原始的ELAN设计架构,E-ELAN还可以知道卷积块的不同组学习更多样的特征。
Model scaling for concatenation-based models
模型缩放的主要目的是调整模型的一些属性,产生不同尺度的模型以满足不同推理速度的要求。例如,EfficientNet的缩放模型考虑了宽度、深度和分辨率。至于scaled-YOLOv4,它是调整阶段的数量。有研究分析了当缩放宽度与深度时,原始卷积和组卷积在参数量和运算量上的影响,并以此设计了相应的模型缩放方法。以上方法主要用在PlainNet和ResNet等架构中,它们在执行扩容或缩容时,每一层的出入度都不会发生变化,因此,我们能够独立分析每个缩放因子对参数量和计算量的影响。但是,如果这些方法应用在基于串联的架构上,作者发现当在深度上执行扩充或缩放时,在串联计算模块后接上的传导层它的入度将会对应减少或增加,如图3所示。
从上述想先可以推断,对于基于串联的模型我们不能分开分析不同的缩放因子而是要一起考虑。拿扩充深度为例,这样的操作将会引起传导层的输入通道和输出通道之间的比例改变,这将导致模型的硬件使用量减少。因此,作者提出对应的复合模型缩放方法来应对串联模型。当我们缩放一个计算模块的深度时,必须还要计算该模块的输出通道的变化。然后,作者对传导层进行等量变化的宽度因子缩放。作者提出的复合缩放方法能够保持原始设计的属性,并能保持最佳结构。
图 3:基于串联的模型的模型缩放。从 (a) 到 (b),我们观察到当在基于串联的模型上执行深度缩放时,计算块的输出宽度也会增加。这种现象会导致后续传输层的输入宽度增加。因此,我们提出©,即对基于concatenation的模型进行模型缩放时,只需要对计算块中的深度进行缩放,其余的传输层进行相应的宽度缩放。
Trainable bag-of-freebies
尽管RepConv在VGG上获得优秀的表现,当我们直接将之应用到ResNet和DenseNet和其他架构上时,它的精度将会明显下降。作者使用梯度流传播路径去分析重参数化卷积如何结合不同的网络。作者同样设计了对应的重参数化卷积,即RepConv。
RepConv实际上将3×3,1×1,恒等连接结合到一个卷积层中。在分析RepConv和不同架构的组合与性能后,作者发现RepConv中的恒等连接破坏ResNet中的残差和DenseNet中的串联,而它们为不同特征图提供了梯度的多样性。基于以上原因,作者使用不带有恒等连接的RepConv,即RepConvN,去设计架构中的冲参数化卷积。在作者看来,当带有残差或串联的卷积层被重参数化卷积替代,应该不再有恒等映射。下图展示了作者在ResNet和PlainNet中设计的重参数化卷积,至于基于残差模型和串联模型的完整的重参数化卷积实验,将在腐蚀实验中学习。
Coarse for auxiliary and fine for lead loss
深度监督是一种常用于训练深度网络的技术。它的主要概念是添加额外的辅助头到网络的中间层,和浅层网络权值的辅助损失作为指导。甚至对于ResNet和DenseNet架构等通常收敛良好,深度监督仍然能显著提高模型在很多任务上的性能。图5分别展示没有、有深度监督两种情况下的目标检测架构。本文作者将对最终输出负责的头称为主导头,辅助训练的头称为辅助头。
与普通的模型(a)比较,模型(b)中的策略有额外的辅助头。
接着讨论标签分配的问题。过去在训练深度网络时,标签分配通常直接指向人工标注,并产生硬标签。但是最近,如果我们把目标检测作为一个例子,研究者经常使用网络输出的质量与分布的预测,然后与真实标注一起考虑,使用一些计算和优化方法去产生可靠的软标签。例如,YOLO使用预测的边界框与真实框之间的IoU作为目标的软标签。本文中,作者将这种考虑网络预测结果与真实标注,并分配软标签的机制为“标签分配者”。
无论辅助头还是主导头的情况如何,深度监督需要在目标上训练。在软标签分配相关的技术发展中,作者偶然发现一个新的衍生问题,即“如何分配软标签到辅助头和主导头”。据目前所知,还没有文献探索这个问题。当前最流行方法的结果如下图所示,就是将辅助头和主导头分开,然后使用他们自己的预测结果和真实标注去执行标签分配。
Figure 5: Coarse for auxiliary and fine for lead head label assigner. Compare with normal model (a), the schema in (b) has auxiliary head. Different from the usual independent label assigner ©, we propose (d) lead head guided label assigner and (e) coarse-to-fine lead head guided label assigner. The proposed label assigner is optimized by lead head prediction and the ground truth to get the labels of training lead head and auxiliary head at the same time. The detailed coarse-to-fine implementation method and constraint design details will be elaborated in Apendix.
标签分配器:由粗为辅助,精为主导。普通的独立标签分配器(c),作者提出主导头引导的标签分配器(d),和由粗到细的主导头引导的标签分配器。作者提出的标签分配器被主导头预测和真实标签优化,以获取同时训练主导头和辅助头的标签。在原文附件中作者详细展示了由粗到细的实现方法和约束设计细节。
而作者提出的方法是一种新的标签分配方法,通过主导头的预测来同时指导辅助头和主导头。也就是说,作者使用主导头预测作为一种辅导来生产从粗到细的分层标签,并被用于辅助头和主导头的学习。作者提出的两种方法分别如上图所示。
该方法主要基于主导头的预测结果与真实标签来计算的,通过优化过程会产生软标签。这组软标签将会用作辅助头和主导头的目标训练模型。这么做得理由是主导头有一个相对强的学习能力,因此它产生的软标签应该在源数据与目标之间的分布和关联上更有具有代表性。此外,作者将这样的学习方法当作某种泛化的残差学习。通过让浅层的辅助头直接学习主导头学习到的信息,主导头将会更加专注学习还没有学习到的残差信息。
该方法同样适用主导头的预测结果与真实标注去产生软标签。但是,在这个过程中,作者产生了两组不同的软标签,即粗标签与精标签,其中精标签与由主导头产生的软标签是一样的,而粗标签通过放宽正样本分配过程的约束而允许更多格子被当成正样本来生成粗标签。这么做的理由是辅助头的学习能力不如主导头强,为了避免需要学习的信息受到损失,作者将重点放在辅助头的召回率优化上。对于主导头的的输出,作者能够从高召回率结果中过滤高精度作为结果。但是,必须注意到如果粗标签的附加权重接近精标签,将会产生不良先验。因此,为了使这些这些额外生产的粗颗粒度的正样本格子影响更小,作者在解码器中设置了限制,使得它们不能完美地产生软标签。这种机制能够允许在学习过程中动态调整精细和粗糙标签的重要性,使得细标签的可优化上限始终高于粗标签。
作者还列举了一些可训练的免费包,主要是在训练过程中用到的技巧,包括:
作者使用 Microsoft COCO 数据集进行实验并验证目标检测方法。所有的实验都没有使用预训练模型。也就是说,所有模型都是从头开始训练的。在开发过程中,我们使用train 2017 set进行训练,然后使用val 2017 set进行验证和选择超参数。最后,我们展示了对象检测在 2017 年测试集上的性能,并将其与最先进的对象检测算法进行了比较。详细的训练参数设置在附录中描述。
由于YOLOv7-tiny是面向边缘GPU的架构,它采用弱ReLUctant作为激活函数;对于其他模型,作者采用SiLU作为激活函数。作者将在附录中详细描述每个模型的缩放因子。
作者采用以前版本的YOLOv5、YOLOX、YOLOR作为基线。表格对比YOLOv7系列模型与这些基线模型在相同设置下训练的结果。
从表格中发现:
作者也对比通用GPU和移动GPU下的领先目标检测器的性能,如图所示,可以发现作者提出的方法在速度-精度的均衡上达到最好: