YOLOv4由Alexey Bochkovskiy等人于2020年提出,论文名为:《YOLOv4: Optimal Speed and Accuracy of Object Detection》,论文见:https://arxiv.org/pdf/2004.10934 ,GitHub Code:https://github.com/AlexeyAB/darknet
以下内容主要来自论文:
据说有大量特征(features)可以提高卷积神经网络(CNN)的准确性。需要在大型数据集上对这些特征的组合进行实际测试,并对结果进行理论论证(theoretical justification)。某些特征专门针对某些模型和某些问题进行操作,或者仅针对小规模数据集;而某些功能,例如批量归一化(batch-normalization)和残差连接(residual-connections),适用于大多数模型、任务和数据集。我们假设此类通用特征包括加权残差连接(WRC, Weighted-Residual-Connections)、跨阶段部分连接(CSP, Cross-Stage-Partial-connections)、跨小批量归一化(CmBN, Cross mini-Batch Normalization)、自对抗训练(SAT, Self-adversarial-training)和Mish激活。我们使用新功能:WRC、CSP、CmBN、SAT、Mish激活、Mosaic数据增强、CmBN、DropBlock正则化和CIoU损失,并将其中一些功能结合起来以实现最先进的结果。
1.我们的贡献总结如下:
(1).我们开发了一个高效且强大的目标检测模型。它使得每个人都可以使用1080 Ti或2080 Ti GPU来训练超快速且准确的目标检测器,如下图所示:
(2).我们在检测器训练期间验证了最先进的Bag-of-Freebies和Bag-of-Specials目标检测方法的影响。
(3).我们修改最先进的方法,使其更加高效并适合单GPU训练,包括CBN、PAN、SAM等。
2.相关工作:
(1).Object detection models:现代检测器通常由两部分组成:在ImageNet上预先训练的主干网络(Backbone)和用于预测目标的类别和边界框的头部(Head)。对于那些在GPU平台上运行的检测器,它们的主干网络可以是VGG、ResNet、ResNeXt或DenseNet。对于那些运行在CPU平台上的检测器,它们的主干网络可以是SqueezeNet、MobileNet或ShuffleNet。对于头部,通常分为两种,即单阶段目标检测器和两阶段目标检测器(one-stage object detector and two-stage object detector)。最具代表性的两阶段目标检测器是R-CNN系列,包括fast R-CNN、faster R-CNN、R-FCN和Libra R-CNN。还可以使两阶段目标检测器成为无锚(anchor-free)目标检测器,例如RepPoints。对于单阶段目标检测器,最有代表性的模型是YOLO、SSD和RetinaNet。近年来,开发了无锚的单阶段检测器。这类检测器有CenterNet、CornerNet、FCOS等。近年来发展的目标检测器经常在Backbone和Head之间插入一些层,这些层通常用于收集不同阶段的特征图。我们可以将其称为目标检测器的颈部(Neck)。通常,颈部由多个自下而上(bottom-up)的路径和多个自上而下(top-down)的路径组成。配备该机制的网络包括特征金字塔网络(FPN, Feature Pyramid Network)、路径聚合网络(PAN, Path Aggregation Network)、BiFPN和NAS-FPN。除了上述模型之外,一些研究人员将重点放在直接构建新的主干网络(DetNet、DetNAS)或新的整体模型(SpineNet、HitDetector)用于目标检测。
综上所述,一个普通的目标检测器是由以下部分组成:
1). Input: Image, Patches, Image Pyramid
2). Backbones: VGG16, ResNet-50, SpineNet, EfficientNet-B0/B7, CSPResNeXt50, CSPDarknet53
3). Neck:
A. Additional blocks: SPP, ASPP, RFB, SAM
B. Path-aggregation blocks: FPN, PAN, NAS-FPN, Fully-connected FPN, BiFPN, ASFF, SFAM
4). Heads:
A. Dense Prediction(one-stage):
a. RPN, SSD, YOLO, RetinaNet(anchor based)
b. CornerNet, CenterNet, MatrixNet, FCOS(anchor free)
B. Sparse Prediction(two-stage):
a.Faster R-CNN, R-FCN, Mask RCNN(anchor based)
b.RepPoints(anchor free)
(2).Bag of freebies:通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。我们将这些仅改变训练策略或仅增加训练成本的方法称为"免费赠品袋(bag of freebies)"。目标检测方法经常采用并满足赠品包定义(definition of bag of freebies)的方法是数据增强(data augmentation)。数据增强的目的是增加输入图像的可变性(variability),使得设计的目标检测模型对从不同环境获得的图像具有更高的鲁棒性。例如,光度畸变(photometric distortions)和几何畸变(geometric distortions)是两种常用的数据增强方法,它们肯定有利于目标检测任务。在处理光度失真(photometric distortion)时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何变形,我们添加随机缩放、裁剪、翻转和旋转。
上面提到的数据增强方法都是逐像素(pixel-wise)调整,调整区域的所有原始像素信息都被保留。此外,一些从事数据增强的研究人员将重点放在模拟目标遮挡问题上。他们在图像分类和目标检测方面取得了良好的成果。例如,随机擦除(random erase)和CutOut可以随机选择图像中的矩形区域并填充随机值或补零值。至于捉迷藏(hide-and-seek)和网格蒙版(grid mask),它们随机或均匀地选择图像中的多个矩形区域并将其替换为全零。如果类似的概念应用于特征图,则有DropOut、DropConnect和DropBlock方法。此外,一些研究人员提出了使用多个图像一起进行数据增强的方法。例如,MixUp使用两张图像以不同的系数比例相乘叠加,然后用这些叠加的比例调整标签(label)。至于CutMix,它是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法之外,风格迁移GAN也被用于数据增强,这样的使用可以有效减少CNN学习到的纹理偏差(texture bias)。
与上面提出的各种方法不同,其他一些bag of freebies方法致力于解决数据集中的语义分布(semantic distribution)可能存在偏差(bias)的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类别之间存在数据不平衡的问题,而这个问题往往通过两阶段目标检测器中的硬负例(hard negative example,指的是那些虽然被标记为负样本,但与正样本非常相似,以至于模型很难将其与正样本区分开来的样本)挖掘或在线硬例(hard example,难以正确分类的样本)挖掘来解决。但示例挖掘(example mining)方法不适用于单阶段目标检测器,因为这种检测器属于密集预测架构(dense prediction architecture)。因此林等人提出焦点损失(focal loss)来处理各个类别之间存在的数据不平衡问题。另一个非常重要的问题是,很难用one-hot硬编码表示(one-hot hard representation, one-hot是指一种编码方式,其中只有一个位(bit)是1,其余所有位都是0,这种编码方式常用于表示分类问题的标签或某些分类特征的编码)来表达不同类别之间的关联程度的关系。在执行标记时经常使用这种表示方案。标签平滑(label smoothing)是将硬标签转换为软标签进行训练,可以使模型更加鲁棒。为了获得更好的软标签,Islam等人引入知识蒸馏(knowledge distillation)的概念来设计标签细化网络(label refinement network)。
最后一袋免费赠品(bag of freebies)是边界框(BBox)回归的目标函数。传统的目标检测器通常使用均方误差(MSE, Mean Square Error)直接对BBox的中心点坐标和高宽进行回归。对于基于锚(anchor-based)的方法,就是估计相应的偏移量。然而,直接估计BBox各点的坐标值,是将这些点视为自变量(independent variables),而实际上并没有考虑目标本身的完整性。为了更好地处理这个问题,一些研究人员最近提出了IoU损失,它考虑了预测BBox区域和真实BBox区域的覆盖范围。IoU损失计算过程将通过与ground truth执行IoU来触发BBox的四个坐标点的计算,然后将生成的结果连接成整个代码(whole code)。由于IoU是尺度不变的表示,它可以解决传统方法计算{x,y,w,h}的l1或l2损失时,损失会随着尺度而增大的问题。最近,一些研究人员不断改进IoU损失。例如,GIoU损失除了覆盖范围(coverage area)之外还包括目标的形状和方向。他们提出寻找能够同时覆盖预测BBox和ground truth BBox的最小面积BBox,并用这个BBox作为分母来代替原来在IoU损失中使用的分母。对于DIoU loss,它还额外考虑了目标中心的距离,而CIoU loss则同时考虑了重叠区域、中心点之间的距离和长宽比。CIoU在BBox回归问题上可以取得更好的收敛速度和精度。
(3).Bag of specials:对于那些只增加少量推理成本但可以显着提高目标检测准确性的插件模块和后处理方法(plugin modules and post-processing methods),我们将其称为"bag of specials"。一般来说,这些插件模块是为了增强模型中的某些属性,比如扩大感受野(enlarging receptive field)、引入注意力机制(introducing attention mechanism)、或者加强特征整合能力等,而后处理是一种筛选模型预测结果的方法。
可用于增强感受野的常见模块有SPP、ASPP和RFB。SPP模块起源于空间金字塔匹配(SPM, Spatial Pyramid Matching),SPM最初的方法是将特征图分割成几个d*d相等的块,其中d可以是{1,2,3,...},从而形成空间金字塔(spatial pyramid),然后提取词袋特征(bag-of-word features)。SPP将SPM集成到CNN中,并使用 max-pooling操作代替bag-of-word操作。由于He等人提出了SPP模块,会输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3的设计中,Redmon和Farhadi将SPP模块改进为内核大小为k*k的max-pooling输出的串联(concatenation),其中k={1,5,9,13},stride等于1。在此设计下,相对较大的k*k max-pooling有效地增加了主干网络特征的感受野。ASPP模块和改进的SPP模块在操作上的区别主要是从原来的k*k核大小、stride等于1的max-pooling到几个3*3的核大小、膨胀比(dilated ratio)等于k、stride等于1的扩张卷积运算。RFB模块是利用多个k*k核的扩张卷积(dilated convolutions),扩张比等于k,步长等于1,以获得比ASPP更全面的空间覆盖(spatial coverage)。
目标检测中经常使用的注意力模块主要分为通道注意力和点注意力(channel-wise attention and point-wise attention),这两种注意力模型的代表分别是挤压和激励(SE,Squeeze-and-Excitation)和空间注意力模块(SAM,Spatial Attention Module)。
在特征集成(feature integration)方面,早期的实践是使用跳跃连接或超列(skip connection or hyper-column)将低级物理特征集成到高级语义特征。随着FPN等多尺度预测方法的流行,人们提出了许多集成不同特征金字塔的轻量级模块。此类模块包括SFAM、ASFF和BiFPN。SFAM的主要思想是使用SE模块对多尺度级联特征图执行通道重加权。至于ASFF,它使用softmax作为逐点(point-wise)级别重新加权,然后添加不同尺度的特征图。在BiFPN中,提出了多输入加权残差连接来执行尺度级重新加权,然后添加不同尺度的特征图。
在深度学习的研究中,一些人把重点放在寻找好的激活函数上(activation function)。一个好的激活函数可以让梯度更高效地传播,同时不会造成太多额外的计算成本。2010年,Nair和Hinton提出ReLU,从本质上解决了传统tanh和sigmoid激活函数中经常遇到的梯度消失问题。随后,LReLU、PReLU、ReLU6、Scaled Exponential Linear Unit(SELU)、Swish、hard-Swish和Mish等也被提出来解决梯度消失问题。LReLU和PReLU的主要目的是解决ReLU在输出小于零时梯度为零的问题。至于ReLU6和hard-Swish,它们是专门为量化网络(quantization network)设计的。为了对神经网络进行自归一化,提出了SELU激活函数来满足该目标。需要注意的一点是Swish和Mish都是连续可微的激活函数。
基于深度学习的目标检测中常用的后处理(post-processing)方法是NMS,它可以用来过滤那些对同一目标预测效果不好的BBox,只保留响应较高的候选BBox。 NMS尝试改进的方式与优化目标函数的方法是一致的。NMS提出的原始方法没有考虑上下文信息,因此Girshick等人在R-CNN中添加类别置信度分数作为参考,并根据置信度分数的顺序,按照从高分到低分的顺序进行贪婪(greedy)NMS。对于soft NMS,它考虑了具有IoU分数的贪婪NMS中目标的遮挡可能导致置信度分数下降的问题。DIoU NMS开发者的思路是在soft NMS的基础上,将中心点距离的信息加入到BBox筛选过程中。值得一提的是,由于上述后处理方法都没有直接引用捕获的图像特征,因此在后续开发anchor-free方法时不再需要进行后处理。
3.方法:基本目标是神经网络在生产系统中的快速运行速度和并行计算的优化,而不是低计算量理论指标(BFLOP)。我们提出了两种实时神经网络选项:
对于GPU,我们在卷积层中使用少量组(1 - 8):CSPResNeXt50/CSPDarknet53
对于VPU,我们使用分组卷积,但我们避免使用Squeeze-and-excitement(SE)块,具体来说,这包括以下模型:EfficientNet-lite/MixNet/GhostNet/MobileNetV3
(1).Selection of architecture:我们的目标是在输入网络分辨率、卷积层数量、参数数量(filter_size * filter_size * filters * channel / groups)和层输出(filters)数量之间找到最佳平衡。例如,我们的大量研究表明,在ILSVRC2012(ImageNet)数据集上的目标分类方面,CSPResNext50比CSPDarknet53要好得多。然而,相反,在MS COCO数据集上检测目标方面,CSPDarknet53比CSPResNext50更好。
下一个目标是选择额外的块来增加感受野,以及针对不同检测器级别的不同主干网络级别的参数聚合(aggregation)的最佳方法:例如:FPN、PAN、ASFF、BiFPN。
对于分类而言最佳的参考模型并不总是对于检测器来说是最佳的。与分类器相比,检测器需要以下内容:
1).更高的输入网络尺寸(分辨率)----用于检测多个小尺寸目标
2).更多层----更高的感受野来覆盖更大的输入网络
3).更多参数----使模型具有更大的能力来检测单个图像中不同尺寸的多个目标
不同大小的感受野的影响总结如下:
1).取决于目标大小----允许查看整个目标
2).取决于网络大小----允许查看目标周围的上下文
3).超出网络大小----增加图像点(image point)与最终激活之间的连接数
我们在CSPDarknet53上添加了SPP块,因为它显着增加了感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度。我们使用PANet作为不同检测器级别的不同骨干网络级别的参数聚合方法,而不是YOLOv3中使用的FPN。
最后,我们选择CSPDarknet53作为主干网络、SPP作为附加模块、PANet路径聚合(path-aggregation)作为Neck和YOLOv3(基于锚点)作为Head作为YOLOv4的架构。
未来我们计划大幅扩展检测器的Bag of Freebies(BoF)内容,理论上可以解决一些问题并提高检测器的精度,并以实验方式依次检查每个特征的影响。
我们不使用跨GPU批量归一化(CGBN或SyncBN)或昂贵的专用设备。这使得任何人都可以在传统的图形处理器上重现我们最先进的结果,例如GTX 1080Ti或RTX 2080Ti。
(2).Selection of BoF and BoS:为了改进目标检测训练,CNN通常使用以下内容:
1).Activations: ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish
2).Bounding box regression loss: MSE, IoU, GIoU, CIoU, DIoU
3).Data augmentation: CutOut, MixUp, CutMix
4).Regularization method: DropOut, DropPath, Spatial DropOut, or DropBlock
5).Normalization of the network activations by their mean and variance: Batch Normalization(BN), Cross-GPU Batch Normalization(CGBN or SyncBN), Filter Response Normalization(FRN), or Cross-Iteration Batch Normalization(CBN)
6).Skip-connections: Residual connections, Weighted residual connections, Multi-input weighted residual connections, or Cross stage partial connections(CSP)
至于训练激活函数,由于PReLU和SELU训练起来比较困难,而ReLU6是专门为量化网络(quantization network)设计的,因此我们从候选列表中删除了上述激活函数。在正则化(reqularization)的方法中,发表DropBlock的人将他们的方法与其他方法进行了详细的比较,他们的正则化方法胜出很多。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。至于归一化方法的选择,由于我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。
(3).Additional improvements:为了使设计的检测器更适合在单GPU上训练,我们做了如下额外的设计和改进:
1).我们引入了一种新的数据增强(data augmentation)方法:Mosaic, and Self-Adversarial Training(SAT)
2).我们在应用遗传算法时选择最佳超参数(hyper-parameters)
3).我们修改了一些现有的方法,使我们的设计适合高效的训练和检测----modified SAM, modified PAN, and Cross mini-Batch Normalization(CmBN)
Mosaic代表了一种新的数据增强方法,如下图所示:混合了4幅训练图像。因此,4个不同的上下文被混合,而CutMix仅混合2幅输入图像。这允许检测正常上下文之外的目标。此外,批量归一化还计算每层4幅不同图像的激活统计数据。这显著减少了对large mini-batch size的需求。
自我对抗训练(SAT, Self-Adversarial Training)也代表了一种新的数据增强技术,可在2个前向和反向传播阶段(forward backward stages)运行。在第一阶段,神经网络改变原始图像而不是网络权重。通过这种方式,神经网络对自身执行对抗性攻击(adversarial attack),改变(altering)原始图像以造成图像上没有所需目标的欺骗(deception)。在第二阶段,训练神经网络以正常方式检测修改后的图像上的目标。
CmBN代表CBN的修改版本,如下图所示:这仅收集单个批次内的小批次之间的统计信息。
我们将SAM从空间注意力修改为点注意力(from spatial-wise attention to pointwise attention),并将PAN的快捷连接(shortcut connection)替换为串联,分别如下图所示:
(4).YOLOv4:
1).组成:
A.Backbone: CSPDarknet53
B.Neck: SPP, PAN
C.Head: YOLOv3
2).使用:
A.用于主干网络的Bag of Freebies(BoF):CutMix和Mosaic数据增强、DropBlock正则化、类标签平滑。
B.用于主干网络的Bag of Specials(BoS):Mish激活、跨阶段部分连接(CSP)、多输入加权残差连接(MiWRC)。
C.用于检测器的BoF:CIoU-loss、CmBN、DropBlock正则化、Mosaic数据增强、自对抗训练、消除网格敏感性、对单个ground truth使用多个锚点、余弦退火调度器(Cosine annealing scheduler)、最优超参数、随机训练shapes。
D.用于检测器的BoS:Mish激活、SPP块、SAM块、PAN路径聚合块、DIoU-NMS。
YOLOv4配置文件:https://github.com/AlexeyAB/darknet/blob/master/cfg/yolov4.cfg
GitHub:https://github.com/fengbingchun/NN_Test