是一份关于YOLOv7的论文解读,首发于【GiantPandaCV】公众号,写的不是很好,望大佬们包涵!
2022年7月,YOLOv7来临,
论文链接:https://arxiv.org/abs/2207.02696
代码链接:https://github.com/WongKinYiu/yolov7
在v7论文挂出不到半天的时间,YOLOv3和YOLOv4的官网上均挂上了YOLOv7的链接和说明,由此看来大佬们都比较认可这款检测器:
官方版的YOLOv7相同体量下比YOLOv5精度更高,速度快120%(FPS),比 YOLOX 快180%(FPS),比 Dual-Swin-T 快1200%(FPS),比 ConvNext 快550%(FPS),比 SWIN-L快500%(FPS)。
在5FPS到160FPS的范围内,无论是速度或是精度,YOLOv7都超过了目前已知的检测器,并且在GPU V100上进行测试, 精度为56.8% AP的模型可达到30 FPS(batch=1)以上的检测速率,与此同时,这是目前唯一一款在如此高精度下仍能超过30FPS的检测器。
另外,YOLOv7所获得的成果不止于此,例如:
实时目标检测是计算机视觉中一个重要的课题,而运行实时检测器的计算设备通常是一些移动端CPU或GPU,以及由近几年由制造商研发的
神经处理单元(NPU)。上述提到的一些边缘设备针对不同的卷积结构有不同的加速效果,如普通卷积(npu/gpu)、深度卷积(cpu/npu)或MLP操(gpu/npu)。
近年来,模型结构重参化和动态标签分配已成为网络训练和目标检测中的重要优化方向。在本文中,作者提出一些已经发现的问题,例如:
本文做出的贡献如下:
目前最先进的实时探测器主要基于YOLO和FCOS,如果需要研发更先进的实时检测器,通常需要具备以下特征:
模型重参化策略在推理阶段将多个模块合并为一个计算模块,可以看作是一种集成技术(model ensemble,其实笔者觉得更像是一种基于feature的distillation),可以将其分为模块级集成和模型级集成两类。对于模型级重新参数化有两种常见的操作:
模块重参化是近年来一个比较流行的研究课题。这种方法在训练过程中将一个整体模块分割为多个相同或不同的模块分支,但在推理过程中将多个分支模块集成到一个完全等价的模块中。然而,并不是所有提出的重参化模块都可以完美地应用于不同的架构。考虑到这一点,作者开发了新的重参数化模块,并为各种架构设计了相关的应用程序策略。下图是作者使用重参化实现构建的多个module,按照分组数不同进行排列,为什么作者会选择32的分组数,应该搞过部署的佬们会清楚一些,模块参考:https://github.com/WongKinYiu/yolov7/blob/main/models/common.py~
模型缩放通过扩大或缩小baseline,使其适用于不同的计算设备。模型缩放方法通常包括不同的缩放因子,如:
从而在网络的参数量、计算量、推理速度和精度方面实现很好的权衡。网络架构搜索(NAS)也是目前常用的模型缩放方法之一。
在大多数关于设计高效网络的论文中,主要考虑的因素是参数量、计算量和计算密度。但从内存访存的角度出发出发,还可以分析输入/输出信道比、架构的分支数和元素级操作对网络推理速度的影响(shufflenet论文提出)。在执行模型缩放时还需考虑激活函数,即更多地考虑卷积层输出张量中的元素数量。
在体系结构方面,E-ELAN只改变了计算模块中的结构,而过渡层的结构则完全不变。作者的策略是利用分组卷积来扩展计算模块的通道和基数,将相同的group parameter和channel multiplier用于计算每一层中的所有模块。然后,将每个模块计算出的特征图根据设置的分组数打乱成G组,最后将它们连接在一起。此时,每一组特征图中的通道数将与原始体系结构中的通道数相同。最后,作者添加了G组特征来merge cardinality。除了维护原始的ELAN设计架构外,E-ELAN还可以指导不同的分组模块来学习更多样化的特性。(难以置信,要是在CPU上运行,分分钟可能爆)
缩放这个就不说了,和YOLOv5、Scale YOLOv4、YOLOX类似。要不就depth and width,要不就module scale,可参考scale yolov4的P4、P5、P5结构。
尽管RepConv在VGG上取得了优异的性能,但将它直接应用于ResNet和DenseNet或其他网络架构时,它的精度会显著降低。作者使用梯度传播路径来分析不同的重参化模块应该和哪些网络搭配使用。通过分析RepConv与不同架构的组合以及产生的性能,作者发现RepConv中的identity破坏了ResNet中的残差结构和DenseNet中的跨层连接,这为不同的特征图提供了梯度的多样性(题外话,之前在YOLOv5 Lite上做过此类实验,结果也是如此,因此v5Lite-g的模型也是砍掉了identity,但分析不出原因,作者也没给出具体的分析方案,此处蹲坑)。
基于上述原因,作者使用没有identity连接的RepConv结构。图4显示了作者在PlainNet和ResNet中使用的“计划型重参化卷积”的一个示例。
深度监督是一种常用于训练深度网络的技术,其主要概念是在网络的中间层增加额外的辅助头,以及以辅助损失为指导的浅层网络权重。即使对于像ResNet和DenseNet这样收敛效果好的网络结构,深度监督仍然可以显著提高模型在许多任务上的性能(这个和Nanodet Plus相似,按笔者理解可以当成是深层局部网络的ensemble,最后将辅助头和检测头的权重做融合)。图5(a)和(b)分别显示了“没有”和“有”深度监督的目标检测器架构,在本文中,作者将负责最终的输出头称为引导头,将用于辅助训练的头称为辅助头。
接下来讨论标签分配的问题。在过去,在深度网络的训练中,标签分配通常直接指的是ground truth,并根据给定的规则生成hard label(未经过softmax)。然而近年来,以目标检测为例,研究者经常利用网络预测的质量分布来结合ground truth,使用一些计算和优化方法来生成可靠的软标签(soft label)。例如,YOLO使用bounding box预测和ground truth的IoU作为软标签。
在本文中,作者将网络预测结果与ground truth一起考虑后再分配软标签的机制称为“标签分配器”。无论辅助头或引导头,都需要对目标进行深度监督。那么,‘’如何为辅助头和引导头合理分配软标签?”,这是作者需要考虑的问题。目前最常用的方法如图5(c)所示,即将辅助头和引导头分离,然后利用它们各自的预测结果和ground truth执行标签分配。
本文提出的方法是一种新的标签分配方法,通过引导头的预测来引导辅助头以及自身。换句话说,首先使用引导头的prediction作为指导,生成从粗到细的层次标签,分别用于辅助头和引导头的学习,具体可看图5(d)和(e)。
Lead head guided label assigner: 引导头引导“标签分配器”预测结果和ground truth进行计算,并通过优化(在utils/loss.py的SigmoidBin()函数中,传送门:https://github.com/WongKinYiu/yolov7/blob/main/utils/loss.py)生成软标签。这组软标签将作为辅助头和引导头的目标来训练模型。(之前写过一篇博客,【浅谈计算机视觉中的知识蒸馏】详细讲过soft label的好处)这样做的目的是使引导头具有较强的学习能力,由此产生的软标签更能代表源数据与目标之间的分布差异和相关性。此外,作者还可以将这种学习看作是一种广义上的余量学习。通过让较浅的辅助头直接学习引导头已经学习到的信息,引导头能更加专注于尚未学习到的残余信息。
Coarse-to-fine lead head guided label assigner: Coarse-to-fine引导头使用到了自身的prediction和ground truth来生成软标签,引导标签进行分配。然而,在这个过程中,作者生成了两组不同的软标签,即粗标签和细标签,其中细标签与引导头在标签分配器上生成的软标签相同,粗标签是通过降低正样本分配的约束,允许更多的网格作为正目标(可以看下FastestDet的label assigner,不单单只把gt中心点所在的网格当成候选目标,还把附近的三个也算进行去,增加正样本候选框的数量)。原因是一个辅助头的学习能力并不需要强大的引导头,为了避免丢失信息,作者将专注于优化样本召回的辅助头。对于引导头的输出,可以从查准率中过滤出高精度值的结果作为最终输出。然而,值得注意的是,如果粗标签的附加权重接近细标签的附加权重,则可能会在最终预测时产生错误的先验结果。
作者为边缘GPU、普通GPU和云GPU设计了三种模型,分别被称为YOLOv7-Tiny、YOLOv7和YOLOv7-W6。同时,还使用基本模型针对不同的服务需求进行缩放,并得到不同大小的模型。对于YOLOv7,可进行颈部缩放(module scale),并使用所提出的复合缩放方法对整个模型的深度和宽度进行缩放(depth and width scale),此方式获得了YOLOv7-X。对于YOLOv7-W6,使用提出的缩放方法得到了YOLOv7-E6和YOLOv7-D6。此外,在YOLOv7-E6使用了提出的E-ELAN,从而完成了YOLOv7-E6E。由于YOLOv7-tincy是一个面向边缘GPU架构的模型,因此它将使用ReLU作为激活函数。作为对于其他模型,使用SiLU作为激活函数。
选择当前先进的检测器YOLOR作为基线。在相同设置下,表1显示了本文提出的YOLOv7模型和其他模型的对比。从结果中可以看出:
本文将所提出的方法与通用GPU上或边缘GPU上最先进的的目标检测器进行了比较,结果如下表所示。
从表2可以看出所提出的方法具有最好的速度-精度均衡性:
表3显示了在使用不同的模型扩展策略进行放大时获得的结果。其中,本文提出的复合尺度方法将计算块的深度加大1.5倍,将过渡块的宽度扩大1.25倍。与只扩大宽度的方法进行比较,本文提出的方法可以在更少的参数和计算量下提高0.5%的AP。如果与只扩大深度的方法进行比较,只需要增加2.9%的参数量,增加1.2%的计算量,就可以提高0.2%的AP 。从表3的结果中可以看出,本文提出的复合缩放策略可以更有效地利用参数量和计算量。
为了验证本文所提出的模型重参数化的通用性,作者将其分别应用于基于concatenation的模型和基于residual的模型上进行验证。基于concatenation的模型和基于residual的模型分别为3个Block的ELAN和CSPDarknet。在基于concatenation的模型实验中,用RepConv替换了3个堆叠的ELAN中的3×3 卷积,详细配置如图6所示。
从表4所示的结果可以看到,所有更高的AP值都出现在参数化的模型中。在处理基于残差模型的实验中,由于原始dark block没有3×3的卷积块,作者另外设计了一种反向dark block,其体系结构如图7所示。
因为dark block和反向dark block的CSPDarknet具有完全相同的参数量和concat操作,所以比较起来相当公平。表5所示的实验结果完全证实了所提出的重参化策略对于residual的模型依旧有效。RepCSPResNet的设计也符合本文的设计模式。
在辅助头实验的辅助损失中,作者比较了引导头和辅助头的独立标签分配策略,同时也比较了所提出的引导型标签分配方法,在表6中显示了所有的比较结果。
在表7中,作者进一步分析了从粗到细的引导型标签分配策略对辅助头解码器的影响。也就是比较了引入/不引入上界约束的结果。从表中的数字来看,通过距离目标中心的大小来约束目标的上界可以获得更好的性能。
本文提出了一种新的实时检测器。在研究过程中,本文发现了重参化模块的替换问题和动态标签的分配问题。为了解决这一问题,提出了一种可训练的bag-of-freebies策略来提高目标检测的精度。基于此,本文开发的YOLOv7系列目标检测模型获得了最先进的结果。