YOLOv4: Optimal Speed and Accuracy of Object Detection
原文链接:
[2004.10934] YOLOv4: Optimal Speed and Accuracy of Object Detection (arxiv.org)
Abstract 摘要
学界有大量的声称能够提升CNN的方法,在大量数据集中对这些改进方法进行验证,以及对他们进行理论证明是很有必要的。这些方法中有的只针对特定的情况有效,而有的则有很强的泛用型,这些能够应用在大部分场景的改进方法(如批量归一化、残差连接)值得我们关注。
YOLOv4采用了带权残差连接(WRC:Weighted-Residual-Connections)、跨阶段部分连接(CSP:Cross-Stage-Partial-connections)、跨小批次归一化(CmBN:Cross mini-Batch Normalization)、自对抗训练(SAT:Self-adversarial-training)、Mish激活函数(Mish-activation),镶嵌数据增强(Mosaic data augmentation)、DropBlock正则化(DropBlock)、CIoU loss多种改进方法。
作者着重于设计一个CNN能够在传统GPU上满足实时检测的运行速度,并且能够仅在以一个传统的GPU上完成训练。
YOLOv4高效的同时足够轻量化,能够在1080Ti、2080Ti的显卡配置下快速部署训练和运行。
作者在训练过程中验证了当时流行的多种BoF、BoS方法,并对他们进行了一些改进使其在单GPU训练中表现更出色。
Object detection models 物体检测模型
现代的检测器通常由两部分组成,一是在数据集上进行预训练的躯干组件(backbone),以及一个用于预测边框和分类的头部组件(head)。而近些年的研究发展趋向于在这两个组件之间添加一些层次用于收集不同阶段的特征图,我们称之为颈部组件(neck)。通常颈部组件由数个上采样通道和下采样通道组成。
现有检测模型分类一览图
Bag of freebies BoF
研究人员希望能够利用更好的训练方法来在不增加推断成本的基础上提升模型的检测效果。我们将这些仅改变训练策略或仅增加训练成本,而不增加推断成本就能取得更好表现的改进方法称为bag of freebies
BOF中最典型的就是数据增强。
几何畸形
Random Scaling 随机缩放
Random Cropping 随机裁剪
Random Flipping 随机翻转
Random Rotating 随机旋转
随机翻转和随机旋转的区别在于,随机翻转是通常对输入图片以某个轴进行翻转,随机旋转是随输入图片进行顺时针角度旋转。
Random Erase 随机擦除
Random Erase称为随机擦除,随机选择一个区域,采用随机值进行覆盖,所选区域一定在图像内。把物体遮挡一部分也能被正确识别分类,这样就迫使网络利用局部数据进行训练识别,增大了训练难度,一定程度提高模型的泛化能力
CutOut
随机选择一个固定大小的正方形区域,像素值全部用0填充即可,但为了避免0填充对训练数据有影响,需要对训练数据进行归一化处理,norm到0,但需要注意的是,随机选择的区域可能不在图像内,也就是说正方形区域可能只有部分处理图像内,因而模拟了任意形状的擦除操作
Hide-and-Seek
将图像切分成S*S网络,每个网络使用一定概率进行遮挡,从而模拟Random Erase和CutOut的效果。但是遮挡值设置为何值比较关键,采用整个数据集的均值影响最小.
GridMASK
结构化drop操作,例如均匀分布地删除正方形区域,并且通过控制密度和size参数,来达到平衡,密度就是正方形个数,size就是正方形大小。
Dropout
在训练过程中随机丢弃一些神经元,丢弃的神经元输出变为0
DropConnect
在训练过程中吧神经元的输入权值按照概率变为0
Dropblock
单单对某一个像素进行dropout并不能降低特征图学习的特征范围,DropBlock的做法就是一块一块的像素地随意丢弃,迫使网络去学习到更加鲁棒的特征。
将多张图片融合到一起的数据增强操作
Mixup
Mixup就是将两张图片采用比例混合,label也按照比例混合。
CutMix
CutMix是CutOut和Mixup的结合,将图片的一部分区域擦除并随机填充训练集中的其他数据区域像素值
Mosaic
Mosaic数据增强是YOLOv4的创新点,也是CutMix的拓展,CutMix是混合两张图,Mosaic数据增强是混合了四张具有不同语义信息的图片,可以让检测器检测出超乎常规语境的目标,增强鲁棒性,并减少对大的mini-batch的依赖
Style Transfer GAN
CNN训练学习到的实际是纹理特征(texture bias)而不是形状特征,这与人类的认知相反,因而通过gan引入风格化的ImageNet数据集,平衡纹理和形状偏置,提高模型的泛化能力。
以上数据增强的方法都是希望能够消除数据集中样本分布的不均匀导致的偏差。在分步式(two-stage)的物体检测模型中,我们通常使用难例挖掘(hard negative example mining)或是在线难例挖掘(Online Hard Example Mining)的改进方法,而这个方法不适用于单步式(one-stage)的物体检测。针对集成式的物体检测,我们有如下方法:
Focal loss
核心思想是降低易分类样本的下降的损失,让网络关注困难的、错分的样本。类别之间无关联
Label smoothing
对one-hot的label进行soft操作,相当于对label也添加了噪声,如[0 1]的one-hot编码,经过label smooth变成[0.05 0.95],常用于防止模型过拟合,让模型也能关注概率较低的类别
知识蒸馏(knowledge distillation)
用于获得更好的soft Label
在做检测边框回归(BBox regression)时,可以预测边框的直接坐标信息,也可以预测相对坐标偏置信息,传统的方法是使用均方误差(Mean Square Error),但这种方法将坐标信息分离而不能考虑到图形的整体,于是提出了IOU loss,在后续的改进中又出现了GIOU、DIOU、CIOU,他们的优缺点比较如下图所示。
IOU、GIOU、DIOU、CIOU优缺点比较
目前CIOU是在检测框回归问题中取得最快收敛速度的方法。
Bag of specials BoS
我们将需要小幅增加推断代价,但能够显著提升检测效果的插件模快和后处理方法称为bag of specials。总的来说,这些插件模块是用来增强模型的某一特定属性的。
SPPNet
SPPNet称为空间金字塔池化网络,为了让网络适应不同尺度的图像输入,避免对图像进行裁剪和缩放,导致位置信息的丢失。由于卷积层在面对不同尺度的输入图像时,会生成大小不一样的特征图,会对网络的训练带来较大的麻烦,因而SPPNet就通过将卷积层最后一层的池化层替换为金字塔池化层,固定输入的特征向量的大小。
ASPP
ASPP称为空洞空间金字塔池化网络,其实就是把特征图通过以不同采样率的空洞卷积并行采样,对每个采样率提取到的特征在不同的分支中进一步处理后融合从而产生最后的结果
RFB
RFB的每个分支上使用不同尺度的常规卷积 + 虫洞卷积,通过常规卷积的不同卷积核尺度来模拟pRFs中的不同感受野,各个分支上通过各自dilated conv所得到的离心率,来模拟pRF的尺度与离心率的比例,其实就是为了模拟人类的视觉感知模式。
特征图的每个位置以及每张不同的特征图,对检测结果的重要程度可能都不同,特征图上包含猫的轮廓形状纹理信息的位置,肯定比背景信息重要,因而怎么在特征图中添加权重信息,让网络能自动学习调整权重信息,就是注意力机制所需要解决的问题。
SE
SENet的思路就是想对每张特征图添加权重,并让网络自动学习调整权重信息.
具体操作:其实就是对C张大小为H × W的特征图(总维度就是 C × H × W)进行全局平均池化,也就是上图的Global pooling操作,然后输出就是C张大小为1 × 1的特征图(总维度是C × 1 × 1),跟着全连接层,全连接层主要是为了减少通道数量,r的大小关系到通道压缩比例,文中r取了16,就是把通道数缩小到原来的1/16,然后进行ReLU激活,再通过全连接层将通道数恢复到C,经过Sigmoid激活后(维度为C × 1 × 1)直接与C张大小为H×W的特征图相乘,这样就可以理解为每张特征图都被添加了权重信息。
SAM
CBAM就是为了解决在特征图内部空间位置添加权重问题提出来的注意力机制模型,它分成了两部分,一个是CAM(Channel Attention Module,通道注意力模块),另一个是SAM(Spatial Attention Module,空间注意力模块)
Modified SAM(point-wise attention)
Modified SAM是YOLOv4的一个创新点,称为像素注意力机制,它的思路也非常简单,就是把SAM模块的池化层全部去除,对C×H×W的特征图进行1×1卷积(既没有降通道也没有升通道),得到C×H×W的输出特征图,然后使用Sigmoid激活,再与原来的C×H×W进行像素点相乘
早期的特征融合方法包括跳级跨连(skip connection)或者超列计算(hyper-column)的方法,将低分辨率、强语义特征与高分辨率、弱语义特征的不同层信息级联在一起,随着多尺度下预测生成的方法(如FPN)流行开来,更多类似的方法涌现,如SFAM、ASFF、BiFPN
选择一个更好的激活函数可以在不额外增加太多计算量的同时,让梯度传递更高效。在传统的tanh和sigmoid激活函数后,ReLU解决了梯度消减的问题。后续提出了LReLU,PReLU,ReLU6,Scaled Exponential Linear Unit (SELU),Swish,hard-Swish,以及Mish等函数。其中LReLU和PReLU的提出解决了ReLU在输入小于0是梯度为0的问题。ReLU6和hard-Swish是针对量化网络提出的,SELU是针对自归一化网络提出的,而Swish和Mish是连续可微的激活函数。
基于深度学习的检测模型通常使用非极大抑制(NMS)的方法来去除重复预测和不良预测,后续也提出了greedy NMS、soft NMS、DIOU NMS的方法作为改进。而值得说明的是,这些方法都是针对有锚框的模型而设计的,对于无锚框模型则不需要使用这些方法。
为了在受限的生产环境下,达到尽可能高效的运行效果,作者针对不同环境推荐了两种神经网络的选择:
在GPU环境下:使用CSPResNeXt50、CSPDarknet53
在VPU环境下:使用EfficientNet-lite、MixNet、GhostNet 、MobileNetV3
作者目标是在网络分辨率、卷积层数、参数规模和输出层数之间找到最佳均衡。
好的检测器需要具有如下特征:
更高的网络输入分辨率:以更好的检测小物体
更多卷积层:让模型在高分辨率输入的情况下获得更广阔的感受野
更多的参数:让模型在应对多物体检测和不同输入尺寸时有更好的兼容性
根据分析,CSPDarknet53以其大感受野和大参数规模被认为是最佳的躯干组件(backbone)模型
同时作者发现SPP模块能够在几乎不减慢模型运行速度的情况下,显著的增大感受野、整合上下文特征。使用PANet取代YOLOv3中的FPN可以更好的将backbone的不同层的参数进行整合。
最后,YOLOv4选择CSPDarknet53作为backbone躯干组件,SPP最为附加模块,PANet作为颈部通道整合组件,以及YOLOv3中的基于锚框的头部组件。
物体检测CNN中常用组件
其中DropBlock远优于同类其他方法
为了让YOLOv4适应单一GPU的训练环境,作者做出了如下改进:
引入了新的数据增强方法:镶嵌数据增强(Mosaic)、自对抗训练(SAT:Self-Adeversarial-Traing)
利用遗传算法选出了最佳的超参
修改了一些现有的方法(包括SAM、PAN、CmBN),使他们更适应YOLOv4
Mosaic不同与CutMix,将四个输入图片进行镶嵌,提高模型泛化能力的同时,增大了单次训练的携带信息量从而显著减小了对单批次(batch size)的大小需求。
自对抗训练会由输入生成无待检测物体的背景图片,并将生成的背景图片作为额外的输入。
跨小批量归一化(CmBN:Cross mini-Batch Normalization)不同于CBN,之收集一个划分好的小批量内输出进行归一化处理。
作者也将SAM从空间维度的注意力机制改写成点维度的注意力,并将PAN中的加性捷径替换为串联
YOLOv4中针对SAM的改进示意图
YOLOv4中针对PAN的改进示意图
YOLOv4中使用的组件一览
YOLOv4比当时现有的其他检测模型都要更快更准,并且足够轻量化能够在8-16G显存的传统GPU上部署训练,这使得YOLOv4有很大的应用推广空间。作者在文中证明了集成式的基于锚框的检测模型(one-stage anchor-based detector)的可行性,也证明了当时现有的许多改进方法的可行性,这些改进方法也可以应用于分类以及更多的后续研究中。