YOLOv7论文部分解读【含自己的理解】

yolo终于又更新了!!看了一下yolov7的论文,然后把论文翻译以及自己的一些思考写了进去,这里还包含了我对论文中粗label和细label的详细解释【自己的理解】,其实就是借鉴了蒸馏思想。希望可以帮助到大家,肯定还有很多地方没有思考清楚,后面会不定时对该文进行补充更新。


目录

论文部分

2.相关工作方面:

模型重参数

模型缩放

3.网络结构

3.1扩展高效层聚合网络(Extended efficient layer aggregation networks)

3.2 针对串联模型的模型缩放

4.可训练的赠品礼包(bag-of-freebies)【这种freebies就是指训练与预测的解耦】

4.1卷积重参化 

4.2 Coarse for auxiliary and fine for lead loss

4.3其他的可训练“工具”

5.实验部分

5.1实验步骤

5.2基线网络

 5.3与其他流行网络的对比


论文部分

      论文开始指出yolov7已经超过了我们所熟知的目标检测网络,比如像YOLOV7-E6,在V100的GPU上速度达到56FPS,AP为55.9%,超越了基于transformer的目标检测网络SWINL Cascade-Mask RCNN,还有ConvNeXt-XL网络。YOLOV7还超过了YOLOR、YOLOX、YOLO5等等,反正就是超越了一切,就是牛。

论文也附上了源码:https:// github.com/WongKinYiu/yolov7

       接下来论文又继续说目标检测的一些应用方面的问题还有在边缘嵌入式上的算法开发,比如MCUNet、NanoDet都是在低功耗下在CPU上提升speed,还有YOLOX、YOLOR。如今大多数实时检测网络主要聚焦在高效的网络结构上(其实就是类似轻量化网络呗),像MobileNet、ShuffleNet、GhostNet网络等,这些主要是在CPU上,在GPU上有ResNet,DarkNet,DLA,CSPNet等去优化结构。而YOLOv7说是提出的方法与这些主流的网络是不同的。除了网络结构的优化以外,论文提到还将侧重于训练过程,这可能会增加训练期间的负担,但不会增加推理的负担,论文中将以上所述的提出的modules和一些优化方法称为可训练的bag-of-freebies.这个词其实在yolov4论文中也出现过。

        自模型重参数(model re-parameterization)动态标签匹配(dynamic label assignment)提出,目标检测训练在中也遇到了新的问题。在yolov7这篇论文中会针对遇到的问题也给出解决方案。论文中说到,可利用梯度传播路径(gradient propagation path)的概念分析了适用于不同网络层的模型重参数化策略,并提出了计划的重参数化模型。针对动态标签匹配(dynamic label assignment),当网络具有多个输出层的训练中会有新的问题,这个问题是如果针对不同分支的输出分配动态目标?针对这个问题,作者提出了一个新的标签匹配策略,该方法被称之为由粗到细的引导标签分配策略(coarse-to-fine lead guided label assignment)【不知道翻译的对不对】。

        文章的贡献可以总结为以下几点:

        (1)提出了几种可用于训练的方法,这些方法仅仅会增加训练上的负担用于提升model性能,而不会增加推理负担;

        (2)针对目标检测的发展,作者发现了两个问题(不过好在作者也提出了解决办法):①模型重参数如何高效替待原始模型;②针对不同的输出层,标签动态分配应该怎样分配;

        (3)作者针对目标检测可以更有效的利用参数和计算问题,提出了"扩展"(extend)和“复合缩放”(compound scaling);

        (4)提出的方法可以有效的减少40%参数量和50%的计算量,高精度高速度。

2.相关工作方面:

        目前比较先进的目标检测网络是yolo系列还有FCOS网络,通常来讲,先进的网络应该具有以下特性:(该论文主要从4,5,6入手)

                1.更快更有效的网络;

                2.更有效的特征集成方法;

                3.更准确的检测方法;

                4.更有鲁棒性的损失函数

                5.更有效的标签匹配方法;

                6.更有效的训练方法

模型重参数

模型重参数化技术在推理阶段将多个计算模块合并为一个。可以将模型重参数技术视为一种集成技术(can be regarded as an ensemble technique)。主要分为两类,模块集成和模型集成。为了获得最终的推理模型,模型级重参数有两种常见的做法,一种是用不同的训练数据训练多个相同的模型,然后平均多个训练模型的权重。另一种是对不同迭代次数下(就是不同epoch下)的模型权重进行加权平均。模块集成在整个训练期间将一个模块拆分为多个相同的或者不同的模块分支,并在推理期间将多个分支模块集成为完全等效的模块。然而,并不是所有提出的重参数化模块都可以完美地应用于不同的结构。鉴于此,作者开发了新的重参数化模块,并为各种架构设计了相关的应用策略。

模型缩放

模型缩放是一种放大缩小已设计模型并使其适合不同计算设备的方法【就是yolov5和yolox可以设置网络的宽度和深度】。比如在输入图像的分辨率、网络深度、网络宽度等,从而在网络参数量、计算、推理速度和准确性方面实现良好的权衡。网络结构搜索(NAS)是常用的模型扩展方法之一,NAS可以从搜索空间自动搜索合适的缩放因子(scaling factors),但是这也有缺点,就是需要花费“昂贵”的计算量去完成模型缩放因子的搜索。有些研究人员分析了缩放因子与参数和操作数量之间的关系,试图直接估计一些规则,从而获得模型缩放所需的缩放因子。如DenseNet或VoVNet,在缩放此类模型的深度时,会改变某些层的输入宽度。

3.网络结构

3.1扩展高效层聚合网络(Extended efficient layer aggregation networks)

一般针对高效网络结构,主要考虑参数量计算量以及计算密度。从内存访问成本角度来看,网络的输入输出,通道,网络的分支结构等都会影响神经网络的推理速度。同时也有人考虑了卷积层输出张量的数量。图2中的(b)CSPVoVNet是VoVNet的变体,CSPVoVNet除了考虑前面所说的基本设计问题,同时为了使不同层的权重能够学习更多不同的特征,也考虑了梯度路径。(c)图是ELAN网络,该网络得出了一个结论:通过控制最短最长梯度路径,深层网络可以有效地学习和收敛。而本文则是在ELAN的基础上提出了E-ELAN,主要的结构如图(d)。

YOLOv7论文部分解读【含自己的理解】_第1张图片

 图2

除了保持原来ELAN的设计架构外,E-ELAN还可以引导不同的计算块组来学习更多样化的特性。作者提出采用分组卷积(group convolution)去对通道和基数(cardinality)进行扩展。将对计算层的所有计算块(computational blocks)应用相同的组参数和通道乘法器(channel multiplier)。然后,每个计算块计算出的特征映射将根据设置的分组参数g被shuffled为g组,然后将它们连接在一起。此时,每组特征图中的通道数将为与原始架构中的通道数相同【这里说的此时,指的是经过分组卷积后再拼接后的总通道数】。除了保持原始ELAN设计架构外,E-ELAN还可以引导不同的计算块组学习更多不同的特征。

3.2 针对串联模型的模型缩放

模型缩放的主要目的是调整模型的某些属性,并生成不同比例的模型,以满足不同推理速度的需要【像V5和YOLOX】。上述方法主要用于PlainNet或ResNet等体系结构。当这些架构执行放大或缩小时,每层的入度和出度【in-degree and out-degree】都不会改变【这里的入度和出度没懂什么意思,指网络的输入和输出?】,因此可以独立分析每个比例因子对参数和计算。然而,如果将这些方法应用于基于串联的架构,我们会发现当对深度进行放大或缩小时,紧接在基于连接的计算块之后的平移层(translation layer)的入度将减小或增加,如图3(a)和(b)所示。

YOLOv7论文部分解读【含自己的理解】_第2张图片

从图中可以看出,当对模型深度加深的时候,网络的宽度也改变了。这种现象将导致后续传输层的输入宽度增加。所以作者提出了(c)中的网络。在执行模型缩放时,只需要缩放计算块中的深度,传输层的其余部分则使用相应的宽度缩放。

其实这里的缩放是和yolov5、yolox一样的,直接用这个去理解这部分内容即可。就是可以针对不同的应用场景,选择不同深度和宽度的模型来使模型表现尽可能的好。

4.可训练的赠品礼包(bag-of-freebies)【这种freebies就是指训练与预测的解耦】

这里需要插入一下RepConv结构图,方便进一步了解YOLOv7网络结构。该结构是采用了VGG风格进行搭建的,采用了重参数化技术,因此叫RepVGG。(A)是ResNet结构,最上面的部分的identity采用了1 * 1卷积,而RepVGG大体结构与ResNet相似,(b)图中只是展示了5个stages中的一个,网络在每个stage开始的时候,与ResNet一样,均会有一个3 * 3步长为2的下采样,同时也有一个1 * 1 的identity,在后三层卷积中不仅有1*1的identity,还有一个无卷积的直接进行特征融合的identity。但是!在测试阶段,会把这些连接全部去掉,就变成了一个单一的VGG结构,这种操作也被称为训练与预测的解耦合

YOLOv7论文部分解读【含自己的理解】_第3张图片


4.1卷积重参化 

RepConv在VGG上的表现非常不错,但当把该卷积应用于ResNet、DenseNet和其他网络结构时,准确率会有所下降。作者利用梯度传播路径去进行分析,如何将卷积重参应用到不同的网络中。RepConv实际上将3×3卷积1×1卷积与本身连接组合在一个卷积层中。但是作者发现,RepConv中的identity connection会破坏ResNet和DenseNet结构。因此,作者在卷积重参化的结构设计中,剔除了RepConv中的identity connection。

YOLOv7论文部分解读【含自己的理解】_第4张图片

4.2 Coarse for auxiliary and fine for lead loss

(这个标题就是在说辅助head用粗soft label,lead head用细soft label,下面会解释什么是粗和细label【只是个人理解】)

深度监督技术常常用来做深层网络的训练,它主要是在网络中间部分添加了额外辅助头(extra auxiliary head),并用辅助损失指导的浅层训练。深度监督技术可以很明显的提升诸如ResNet、DenseNet网络性能。

YOLOv7论文部分解读【含自己的理解】_第5张图片

 上面的(a)图中正常的网络,【大概看看这个网络结构,像不像之前的yolo系列,8x、16x、32x分别是从backbone出来的,最后有三个head进行检测】。(b)中的结构是有辅助头的【auxiliary head】,即在FPN三个特征层上采样中用添加的这个辅助头。(c)为通常的独立标签匹配结构【这个结构就是每个head输出与ground truth匹配后的结果(后面说的soft label过程),再与head的输出之间建立损失函数,同时也能看出辅助head和正常的head之间没有联系,是独立的】,(d)是作者提出的一个lead head指导匹配结构,与(c)不同的是,将head与辅助head之间产生了联系,在保留原有head匹配结构下,将head与GT label匹配后的输出直接与辅助头直接建立了损失函数。(e)图是一个由粗到细的lead head指导标签匹配(coarse-to-fine lead head guided label assigner)。在本文中,将负责最终输出的head称为lead head,用于辅助训练的head称为辅助head。

        在过去的时候神经网络训练中,标签匹配通常采用直接与ground truth进行匹配然后产生hard label【有hard label就会有soft label,有些论文中也称为hard target,其实这也是借鉴了知识蒸馏的思想,hard指代是就是,不是就是不是,标签形式:(1,2,3...)或(0,1,0,0...)[意思就是要么是猫要么是狗],而soft是以概率的形式来表示。可理解为对标签的平滑也即软化,比如像[0.6,0.4],意思就是有60%的概率是猫,40%的概率是狗,就好像不会给你非常明确的回答】。现今的研究者中,经常会将网络输出的数据分布【数据分布就是数据概率】通过一定的优化方法等与ground truth进行匹配生成soft label【经过softmax的或者sigmod输出其实就是一种soft label】。作者也举出了例子,比如YOLO中是将预测的bbox与ground truth间的IOU作为soft labl(因为得出来的这个值就是两个box的重叠程度)。"label assigner"指的是将所有预测结果与ground truth生成的iou后的soft label。

        在soft label的研究当中,作者也发现了新的问题,“如何给辅助head和lead head分配soft label?”作者也给出了方法,这个就是上面提到的图(d)、(e),通过lead head预测去指导辅助head和lead head间的标签匹配问题。

        lead head指导标签匹配(这一部分也即是细soft label)利用lead head的输出结果与ground truth匹配的结果(IOU得到的soft label),会通过生成的soft label进行训练过程的优化。这些得到的soft label会被会被用作辅助head与lead head的训练,这是因为lead head具有很牛的学习能力,所以从它当中得到的soft label在数据集的数据分布中更具有代表性。此外,可以将上述方法视为一种残差学习【应该是说(d)与(e)的结果有些像残差块的结结构一样】【Furthermore, we can view such learning as a kind of generalized residual learning.】。让浅层的辅助head去学习lead head中的东西【好了,这里我知道他在说啥了,这个作者就是将知识蒸馏中的思想搬到这了,然后给这个过程起名叫lead head指导学习】

        由粗到细的lead head指导标签匹配(Coarse-to-fine lead head guided label assigner)同样使用了lead head的预测结果与ground truth生成soft label。只不过这里用到了两种soft label。一种是粗soft label,一种是细soft label【什么叫粗label,什么叫细label,我在这里给大家解释一下看看能不能理解,首先是细label,网络最终输出的三个head是lead head,会将这部分的预测结果与ground truth生成soft label,网络会觉得这个soft label得到是数据分布更接近真实的数据分布,训练得到的内容更加“细致”再来说说粗label,辅助lead由于是从中间网络部分得到的,他的预测效果肯定是没有深层网络lead head提取到的数据或者特征更细致,所以辅助lead部分的内容是比较“粗糙”的,在训练过程中,会将lead head与ground truth的soft label当成一个全新的ground truth,然后与辅助head之间建立损失函数,说白了,就是让辅助head的预测结果也“近似”为lead head】。作者将会在目标检测任务中去优化辅助head的找回率(recall),这样可以避免训练中一些信息的丢失。对于lead head的输出,作者提到将会从高召回率的结果中去过滤高精度(precision)结果并作为最终的输出【这个操作感觉应该就是去除一些易分类样本,关注困难样本一些,提升性能】。不过也需要注意的是,如果粗label非常接近与细label,可能会产生不好的结果【这里我猜测有两个方面,一是过拟合,二是可能会印象到深层网络效果】,为此作者在解决这个问题的时候,会在解码部分加以限制,对于一些多余的粗正样本(也是正样本,就是涵盖信息没lead head多而已)则不会让其产生soft label。

4.3其他的可训练“工具”

        (1)用到了BN层,其目的是在推理阶段将BN层的均值方差集成到卷积层的偏差和权重中【这里应该就是说的在推理阶段将BN层和卷积层融合,YOLOX也有用到】。(2)YOLOR中的隐式知识(Implicit knowledge)与卷积特征映射相结合的加法和乘法方式【YOLOR论文我没细看,这里我就硬翻译了】:通过在推理阶段进行预计算,可以将YOLOR中的隐式知识简化为向量。该向量可以与之前或后续卷积层的偏差和权重相结合。(3)EMA模型(这个YOLOX也有用到)

5.实验部分

5.1实验步骤

        yolov7是在COCO数据集上训练并测试的,没有用预训练模型,完全从头开始,并且也和其他流行网络对比,训练过程中的详细参数在原论文的附录中有。

        作者针对边缘GPU、普通GPU和云端GPU分别设计了三种网络,yolov7-tiny、yolov7、yolov7-W6。同时也针对这些basic model可以在不同需求上进行缩放【和yolov5一样】。对于YOLOv7在neck部分进行了缩放,可以对完整的模型在深度和宽度上进行缩放,比如放大后的叫YOLOv7-X。对于YOLOv7-W6的缩放,将会得到YOLOv7-E6与YOLOV7-D6。采用了E-ELAN的YOLOv7-E6将会得到YOLOv7-E6E网络。YOLOV7-tiny是在边缘GPU使用,采用了Leaky ReLU激活函数,其他模型是采用的SiLU激活函数。

5.2基线网络

选择了以前YOLO系列和YOLOR与YOLOV7做对比,训练中的设置是一样的。【这里详细数值我就不说了,反正就知道牛就行了】

YOLOv7论文部分解读【含自己的理解】_第6张图片

 5.3与其他流行网络的对比

【具体数值也不说了,就是厉害就行】不过要提一句的是,这里用的分辨率是640或者1280,使用letterbox对图像进行resize的。

YOLOv7论文部分解读【含自己的理解】_第7张图片

 后面一些实验上面的东西这里就不再叙述了,都是一些消融实验的对比,有兴趣的可以去看看,或者哪天我可能也会把这部分在详细说说。


       

 论文中有些地方肯定会有翻译不周全的地方,同时也有一些地方也还没思考清楚,后面我在详细看代码的时候会再进行解析,不定时更新,也欢迎大家讨论。

你可能感兴趣的:(深度学习,人工智能,目标检测)