原文
1.手动翻译;
2.个人感觉对建立知识体系有帮助。
虽然存在着许多提高CNN精度的大量的方法,但是需要在大型数据集上对这些方法的组合做实际的测试,才能在理论上证明这些方法的合理性。以下方法只能适用于某些模型,某些问题,或者某些小规模的数据集。而有些方法,如BN和残差,则适用于大多数的模型、任务和数据集。我们假设这些方法包括Weight-Residual-Connections(WRC),Cross-Stage-Partial-connections(CSP),Cross mini-Batch Normalization(CmBN),Self-adverarial-Training(SAT),和Mish-activation。我们使用了新方法:WRC,CSP,CmBN,SAT,Mish activation,Mosaic数据增强,CmBN,DropBlock正则化和CIoU loss,最后将这些方法组合得到了SOTA结果:在MS COCO数据集上精度为43.5% AP(65.7% AP50),在Tesla V100上~65FPS。源代码在https://github.com/AlexeyAB/darknet.
大部分的基于CNN的目标检测网络主要应用于推荐系统。举个例子,用城市摄像头寻找免费的停车场使用的是慢速高精度的模型,然而车辆碰撞检测使用的是高速低精度的模型。提高实时对象检测器的精度,不仅可以将其用于输出提示的推荐系统,还可以用于独立的流程管理和减少人工投入。运行在GPU上的实时的目标检测器允许以在可接受的价格进行大规模的应用。大多数的高精度的神经网路模型无法实时运行,并且需要很多GPU在较大的mini-batch下训练。我们通过创建一个在普通GPU上实时运行的CNN模型来解决这样的问题,而且对于该CNN的训练只需要一个普通GPU。
Fig1:YOLOv4和其他SOTA目标检测其对比。在性能相当的情况下,YOLOv4的运行速度比EfficientDet快一倍。将YOLOv3的AP和FPS分别提高了10%和12%。
本工作的主要目标是设计一个快速的目标检测器,并针对并行运算进行优化,而不是低计算量的理论指标(BFLOP
1)。我们希望设计好的模型是易于训练和使用的,比如说:任何人都能够使用一张普通的GPU来训练并且测试的时候能够达到实时、高精度、令人信服的检测结果,就如Fig1所示的结果那样。贡献如下:
Fig2:目标检测器
现代检测器一般由两部分组成,一个在ImageNet上预训练的backbone
(主干)和一个用于预测目标类别和边界框的head
。
对于运行在GPU平台上的目标检测器而言,backbone可能VGG,ResNet,ResNeXt或者DenseNet;而对于哪些运行在CPU平台的检测器而言,backbone可能是SqueezeNet,MobileNet,或者ShuffleNet。对于head部分,通常可以分为两类,one-stage和two-stage目标检测器。最具代表性的two-stage目标检测器是R-CNN系列,包含fast R-CNN,faster R-CNN,R-FCN,和Libra R-CNN。当然,将two-stage目标检测器变为anchor-free的目标检测器也是可行的。而对于one-stage目标检测器,最具代表性的是YOLO,SSD,和RetinaNet。最近几年,anchor-free的one-stage目标检测器也有研究,比如CenterNet,CornerNet,FCOS等。
最近几年提出的目标检测器通常在backbone和head之间插入几层网络,而这些层通常用于收集不同阶段的特征图,我们称这些层为检测器的neck
。通常情况下,一个neck由几个bottom-up路径和top-down2路径组成。使用这些机制的网络有FPN,PAN,BiFPN和NAS-FPN。
除了上述模型之外,一些研究者把重点放在直接建立一个新的骨干模型(DetNet、DetNAS)或新的整体模型(SpineNet、HitDetector)来进行目标检测。
总的来说,一个常规的目标检测器由如下部分组成:
数据增强,难例挖掘,软标签,损失函数
通常情况下,一个通常的目标检测是离线训练的。因此,研究者总是喜欢使用这些利用这一点优势开发出更好的训练方式,这些方式能够在不增加推理成本的前提下,是目标检测器获得更好的精度。我们将这些只会改变训练策略或者只会增加训练成本的方法为bag of freebies(赠品)。在目标检测中经常采用的且符合定义的是数据增强。数据增强的目的是提高输入图片的差异性(variability),从而使设计的目标检测模型在不同环境下有更高的鲁棒性。例如,**光度失真(photometric distortions )和几何变形(geometric distortions)**是两种常用的数据增强方法,它们有利于物体检测任务。在处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何变形,我们添加了随机缩放、裁剪、翻转和旋转。
上述提到的增强方法都是像素级别(pixel-wise)的调整,而且所有的被调整区域的像素信息都是保留了的。此外,一些从事数据增强的研究者把重点放在模拟物体遮挡上,他们已经在图像分类和目标检测方面取得了良好的效果。例如,随机擦除(random erase)
和CutOut
可以随机选择图像中的矩形区域,并填入一个随机的值或者零值。对于hide-and-seek4和grid mask4,它们随机或者均匀地在图片中选择复数的矩形区域,然后将矩形区域内的值全部置为0。相同的概念在特征图中也有体现,比如Dropout,DropConnect和DropBlock方法。
除此之外,一些研究者也提出一些将**多张图片一起使用(融合)**进行数据扩增。比如,Mixup
使用两张图片以不同的系数比进行相乘后叠加,让后调整系数来调整标签。对于CutMix5,它采用的方法是将一张图片中裁剪下来的矩形区域以另一张图片代替,通过调整裁剪区域来调整标签。
除了上面提到的方法,风格迁移GAN也可以用来进行数据增强,这种方法可以有效地降低CNN学习到地纹理偏差(texture bias)。
与上面提出的各种方法不同,其它的一些bag of freebies方法致力于解决数据集中语义分布可能存在的偏差问题。为了解决语义分布偏差问题,一个很重要的问题是数据集中不同类的不均衡问题,而这个问题通常是用two-stage中的负难例挖掘和在线难例挖掘解决的。然而对于one-stage的目标检测器来说并不适用,因为这些检测器属于dense prediction架构。因此,Lin等人提出了focal loss6来解决不同类之间的数据不均衡问题。
另一个非常重要的问题是不同类别之间的关联程度很难用one-hot这种硬性描述来表示,而这种表示经常用做标签。标签平滑(label smoothing)
技术将硬标签(hard label)转换为软标签(soft label)后进行训练,这样可以使模型鲁棒性更强。为了获得好的软标签,Islam等人引入了**知识蒸馏(knowledge distillation)**概念来设计一个标签细化网络(label refinement network)。
最后一个赠品包是边界框回归函数。传统的目标检测器使用的是均方差(MSE)损失函数来直接拟合bbox的中心点坐标和宽、高,比如 { x c e n t e r , y c e n t e r , w , h } \{x_{center},y_{center},w,h\} {xcenter,ycenter,w,h},或者左上角和右小角坐标 { x t o p _ l e f t , y t o p _ l e f , x b o t t o m _ r i g h t , y b o t t o m _ r i g h t } \{x_{top\_left},y_{top\_lef},x_{bottom\_right},y_{bottom\_right}\} {xtop_left,ytop_lef,xbottom_right,ybottom_right}。对于anchor-based方法,还得计算相应偏移量,比如 { x c e n t e r _ o f f s e t , y c e n t e r _ o f f s e t , w o f f s e t , h o f f s e t } \{x_{center\_offset},y_{center\_offset},w_{offset},h_{offset}\} {xcenter_offset,ycenter_offset,woffset,hoffset}和 { x t o p _ l e f t — _ o f f s e t , y t o p _ l e f _ o f f s e t , x b o t t o m _ r i g h t _ o f f s e t , y b o t t o m _ r i g h t _ o f f s e t } \{x_{top\_left—\_offset},y_{top\_lef\_offset},x_{bottom\_right\_offset},y_{bottom\_right\_offset}\} {xtop_left—_offset,ytop_lef_offset,xbottom_right_offset,ybottom_right_offset}。但是,如果直接估计bbox个点坐标值,相当于直接把这些点当作独立的变量,这将会割裂对象本身的完整性。为了更好地解决这个问题,一些研究人员最近提出了IoU loss,将预测的bbox区域与真实的bbox区域之间的覆盖率考虑在内。在计算IoU loss的过程中,通过计算与真值的IoI将会触发bbox的四个坐标点的计算,然后将生成的结果连接成一个值7。由于IoU是一种尺度不变的表示方法,它能够解决传统的方法计算 { x , y , w , h } \{x,y,w,h\} {x,y,w,h}的 l 1 l1 l1(MAE)和 l 2 l2 l2(MSE)损失时,损失随着尺度增加而变大的问题。
最近,一些研究者继续改善IoU损失。例如,GIoU8loss是除了考虑覆盖面积外,还考虑到了物体的形状和方向。它们提出找到能够同时覆盖真实bbox和预测的bbox的最小面积bbox,并以这个bbox作为分母来代替原来在IoU loss中使用的分母。至于DIoU loss9,它另外考虑了物体的中心距离。而CIoU loss10则同时考虑了重叠区域,中心点之间的距离和长宽比。CIoU可以在bbox回归问题上取得较好的收敛速度和精度。
如何提高感受野,注意力,特征融合,激活函数
对于那些只会增加一点前向成本但能显著地提高精度地plugin模块和后处理方法,我们称为’'bag of specials"。通常来说这些模块是为了增强模型中地某些属性,比如增大感受野,引入注意力机制,或者加强特征融合能力,等,而后处理方法则是对模型预测结果筛选地方法。
一般,能够提高感受野的模块有SPP,SPP和RFB。SPP模块起源于空间金字塔匹配(SPM),SPMs最初的方法是将特征图分割成若干个 d × d d×d d×d相等的块,其中 d d d可以是 { 1 , 2 , 3 , . . . } \{1,2,3,...\} {1,2,3,...},从而形成空间金字塔,然后提取词袋特征。SPP将SPM集成到CNN中,并使用最大池化操作代替词袋操作。由于He等人提出的SPP模块将输出一维特征向量,因此在完全卷积网络(FCN)中应用是不可行的。因此在YOLOv3的设计中,Redmon和Farhadi将SPP模块改进为 k × k k\times k k×k核最大池化输出concat,其中 k = { 1 , 5 , 9 , 13 } k=\{1,5,9,13\} k={1,5,9,13},且步长为111。在这种设计下,相对较大的 k × k k\times k k×k最大池化可以有效增加骨干网络的感受场。在增加改善后SPP模块的版本后,YOLOV3-608在MS COCO目标检测任务上提高了2.7%的AP50精度和只增加了0.5%的额外计算成本。ASPP模块和改进的SPP模块在操作上的区别主要由原来的 k × k k\times k k×k大小的卷积核,最大池化步长等于1变为了几个 3 × 3 3\times3 3×3大小卷积核,且空洞比例等于 k k k,且在空洞卷积操作中步长为1。RFB模块使用几个 k × k k\times k k×k大小的空洞卷积,空洞比等于 k k k,步长等于1,以获得比ASPP更全面的空间覆盖。RFB只需要额外花费7%的推理时间,就可以将MS COCO上的SSD的AP50提高5.7%
注意力模块主要分为通道注意力和点注意力,这两种注意力模型的代表分别是Squeeze-and-Excitation(SE)和空间注意力(SAM)模块。尽管SE模块能够体高ResNet50在ImageNet上分类任务的top-1精度1%,并且只会增加2%的计算成本,但是在GPU上,它通常会提高10%的推理时间,所以它更适用于部署在移动设备上。但是,对于SAM,它能够仅增加0.1%的额外计算成本就能提高ResNet50-SE 0.5%的top-1精度,最重要的是它不会对GPU的推理有任何的影响。
在特征融合方面,早期的做法是使用skip-connection或者hyper-colum12。因为像FPN这样的多尺度预测方法已经流行起来,许多整合了不同的特征金字塔的轻量级网络被提了出来,包括SFAM,ASFF和BiFPN13.SFAM的主要思想是利用SE模块对多尺度的concat后的特征图进行通道级别的重新加权。对于ASFF,它使用softmax作为给像素重新加权的值,然后将不同尺度的特征图融合到一起(and then adds feature maps of different scales )
在深度学习的研究中,有人把重点放在寻找好的激活函数上。一个好的激活函数可以使梯度更有效地传播,同时也不会造成太多额外的计算成本。2010年,Nair和Hinton提出ReLU,实质性地解决了传统tanh和sigmoid激活函数中经常遇到的梯度消失问题。随后,又提出了LReLU、PReLU、ReLU6、Scaled Exponential Linear Unit(SELU)、Swish、hard-Swish和Mish等,也都是用来解决梯度消失问题的。LReLU和PReLU的主要目的是解决当输出小于零时,ReLU的梯度为零的问题。至于ReLU6和hard-Swish则是专门为量化网络设计的。对于神经网络的自归一化,提出了SELU激活函数来满足目标。需要注意的是,Swish和Mish都是连续可微的激活函数14。
在基于深度学习的对象检测中,常用的后处理方法是NMS,它可以用来过滤那些对同一个对象预测效果不好的bbox,只保留响应较高的候选BBox。NMS改进的方式与优化目标函数的方法是一致的。NMS原始的方法没有考虑上下文信息,因此Girshick等在R-CNN中加入分类置信度得分作为参考,根据置信度得分的顺序,按照从高分到低分的顺序进行贪心NMS。至于Soft-NMS,它考虑了在贪心NMS中,物体的遮挡可能会导致IoU分数的置信度分数下降的问题。DIoU NMS提出者的思路是在软NMS的基础上,将中心点距离的信息加入到BBox筛选过程中。值得注意的是,由于以上的后处理方法都没有直接利用捕捉到的图像特征,所以后续在研究的anchor-free方法中,没有使用后处理。
基本的目标是提高在生产系统中网络的执行速度和优化并行计算,而不是低计算量的理论指标(BFLOP),我们提出了2种实时网络候选:
模型选择:感受野,层数,参数量
表1:对于图像分类任务,网络的参数量15
我们的目标是在输入网络的分辨率,卷积层数,参数量( f i f i l t e r s i z e 2 ∗ f i f i l t e r s ∗ c h a n n e l / g r o u p s ) fifilter size^2 * fifilters * channel / groups) fifiltersize2∗fifilters∗channel/groups))和输出层的数量( f i l t e r s filters filters)寻找到优化的均衡。比如,我们大量的研究显示CSPResNeXt50在ILSVRC2012(ImageNet)数据集上目标分类任务上比CSPDarknet53表现好得多。但是,相反地,CSPDarknet53在MS COCO数据集上目标检测任务比CSPResNeXt50表现好得多。
下一个目标是为提升感受野选择附加模块,并且从不同的骨干级别中选择最佳的参数聚合方法,用于不同级别的探测器:如FPN,PAN,ASFF,BiFPN。
一个对于分类任务最佳的模型不总是对检测器有用。与分类器相反,检测器需要以下条件:
假设性来讲,我们可以认为一个有大的感受场(有大量的 3 × 3 3\times3 3×3卷积)和大量参数的模型应该作为骨干网络。表1显示了CSPResNeXt50,CSPDarknet53和EfficientNet B3信息。CSPResNext50只含有16层 3 × 3 3\times3 3×3卷积,一个 425 × 425 425\times425 425×425的感受野和20.6M的参数。而CSPDarknet53含有29层 3 × 3 3\times3 3×3卷积,一个 725 × 725 725\times725 725×725感受野和27.6M参数。这一理论依据,加上我们的大量实验,表明CSPDarknet53神经网络是二者的最佳模型,应该作为探测器的骨干。
不同大小的感受野的影响如下:
我们在CSPDarknet53上增加了SPP块,因为它在显著增加感受野的同时几乎不会造成网络运行速度降低。我们使用PANet作为收集不同的级别骨干网络检测输出的方法,而不是像YOLOv3那种使用FPN的方式。
最后我们选择CSPDarknet53作为骨干网络,附加SPP模块,PANet作为路径聚合neck,和YOLOv3(anchor based)一样的head。
未来,我们计划大大扩展检测器的bag of freebies(BoF)内容,它们理论上可以解决一些问题、提高精度,并以实验的方式依次检测对每个特征的影响。
我们不使用跨GPU批量归一化(CGBN或SyncBN)或昂贵的专用设备。这使得任何人都可以在传统的图形处理器上重现我们最先进的成果,例如GTX 1080Ti或RTX 2080Ti。
激活,损失,数据增强,正则化,归一化,网络结构
对于目标检测任务的训练,一个CNN通常使用如下:
至于激活函数,由于PReLU和SELU更加难以训练,而ReLU6是专门为网络量化设计17,所以我们将上面的激活函数从候选列表中移除。在正则化方法中,发表Dropblock的人将他们的方法与其他方法进行了详细的比较,他们的正则化方法赢得了虚的。因此我们毫不犹豫地选择Dropblock18作为我们的正则化方法。至于归一化方法,由于我们专注于只使用单卡地GPU训练策略,所以syncBN不考虑。
数据增强方法
为了使探测器更加适合在单卡GPU上训练,我们使用了附加的模块,结果如下:
Mosaic是一种将4张图片混合在一起地一种新的数据增强方法,因此含有4张不同语义,而CutMix只混合了2张输入图片。这样,就可以检测到检测目标之外的普遍上下文信息。除此之外,BN层在同一层相当于计算量4张不同的图片激活统计,这显著的的降低了mini-batch大小。
fig3:Mosaic是一种新的数据增强方法
自对抗训练19也是一种新的数据增强技术,它使用在前向和后向两个阶段。在第一个阶段神经网络改变原始图片而不是网络权重,通过这种方式,网络对自身执行对抗攻击,改变原始图像以制造图像上没有所需对象的欺骗效果。第二阶段,神经网络以正常方式被训练来检测这个修改后的图像上的物体。
fig4:CmBN
CmBN是一种CBN20的修改版本,如图所示,它收集一个batch中的mini batch做统计。
我们将SAM从空间注意力变为了点注意力,接着将PAN的shortcut变为了cat,如图5,图6分别所示。
fig5:修改后的SAM
fig6:修改后的PAN
最后,YOLOv4使用的方法
在这块,我们将详细阐述YOLOV4的细节。
YOLOv4由下列组成:
YOLOv4使用了:
在Backbone上使用的BoF:CutMix和Mosaic数据增强,DropBlock正则化,类标签平滑(Class label smoothing)
在Backbone上使用的BoS:Mish激活,跨阶段部分连接(CSP),多输入残差连接加权(MiWRC)
在探测器上使用的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,自对抗训练,使用对单个ground truth用对各anchor来消除网格敏感性,余弦退火scheduler,最优超参数,随机训练形状
在探测器上使用的BoS:Mish激活,SPP块,SAM块,PAN路径聚合块,DIoU-NMS
在ImageNet(ILSVRC 2012val)分类数据集上面测试了不同训练提高技术,然后在MS COCO(test-dev 2017)数据集上测试了探测器的精度。不赘述
BFLOP=GFLOP=( (2.0 * l.n* l.size * l.size * l.c / l.groups) * l.out_h*l.out_w)/1000000000.)
↩︎
bottom-up:自底向上,PANet,可以将低层阶段的强的定位的特征传递上去;top-down:自定向下,FPN,将高层的语义特征传递下来。 ↩︎
不懂的话看fig2 ↩︎
Hide-and-Seek,HaS,将图像划分为若小块区域,然后随机删除。https://arxiv.org/pdf/1811.02545.pdf Grid Mask,通过生成一个和原图相同分辨率的类似格子的Mask,然后将该Mask与原图相乘得到一个图像。https://arxiv.org/pdf/2001.04086.pdf;这两个都是遮挡。 ↩︎ ↩︎
https://arxiv.org/pdf/1905.04899v2.pdf ↩︎
https://arxiv.org/pdf/1708.02002.pdf, focal loss是在标准交叉熵损失基础上修改的,这个函数可以通过减少易分类样本的权重使得模型在训练时更专注于难分类的样本。 ↩︎
原文:The IoU loss computing process will trigger theb calculation of the four coordinate points of the BBox by executing IoU with the ground truth, and then connecting the generated results into a whole code.个人理解为iou计算将计算4个坐标点整合了。 ↩︎
差 集 = 最 小 外 接 矩 形 − 并 集 , G I o U l o s s = 1 − ( I o U − ∣ 差 集 ∣ ∣ 最 小 外 接 矩 形 面 积 ∣ ) 差集=最小外接矩形-并集,GIoU\ loss=1-(IoU-\frac{|差集|}{|最小外接矩形面积|}) 差集=最小外接矩形−并集,GIoU loss=1−(IoU−∣最小外接矩形面积∣∣差集∣),缺点是在大框套小框的情况下会退化为IoU loss,G:Generalized ↩︎
D:Distance, D I O U l o s s = 1 − ( I O U − 两 个 中 心 点 的 距 离 最 小 外 接 矩 形 对 角 线 距 离 ) DIOU\ loss=1-(IOU-\frac{两个中心点的距离}{最小外接矩形对角线距离}) DIOU loss=1−(IOU−最小外接矩形对角线距离两个中心点的距离) ↩︎
C:Complete,多了一个通过两个bbox的对角线差值来衡量形状(长宽比)差别的项。https://github.com/Zzh-tju/CIoU ↩︎
大概意思是使用了宽度层面的不同的大小的卷积核,这些卷积核的感受野不同,从而达到空间金字塔池化的效果,最后将这些不同大小感受野的特征图concat起来。ASPP和RFB的做法都差不多 ↩︎
skip connetction,残差连接;hyper-column,超列,https://arxiv.org/pdf/1411.5752v2.pdfs ↩︎
SFAM(Scale-wise Feature Aggregation Module),尺度级别特征聚合模块,ASFF(adaptively spatial feature fusion),自适应空间特征融合https://arxiv.org/pdf/1911.09516.pdf,BiFPN(bi-directional feature pyramid network)双向特征金字塔。 ↩︎
公式中有 e x e^x ex这一项,这回使得函数连续可微,提供了很强的高纬度非线性能力。 ↩︎
FLOPs:浮点运算数,FLOPS:每秒浮点运算次数。 ↩︎
https://arxiv.org/pdf/1911.11929.pdf ↩︎
模型量化:https://pytorch.org/tutorials/advanced/static_quantization_tutorial.html ↩︎
dropblock以块地形式丢弃卷积核的信息。https://arxiv.org/pdf/1810.12890.pdf ↩︎
⭐️这一段不懂,。大概意思是网络分为生成图片阶段和对生成的图片进行检测的阶段。 ↩︎
CBN:https://arxiv.org/pdf/2002.05712.pdf, cross iteration BN,通过收集最近几次迭代信息来更新当前迭代时刻的均值和方差;按照图上来说,CmBN是4个mini batch更新一次,而CBN每次都会更新。 ↩︎
指用YOLOv3的head ↩︎