前面刚刚学过了YOLO以及YOLOv2神经网络的架构原理,不过要学还是要学最新的网络,YOLOv3,乃至YOLOv5都是在YOLO网络的基础进一步改进而来,这篇博客是基于《YOLOv3: An Incremental Improvement》和《YOLOv4: Optimal Speed and Accuracy of Object Detection》,以及结合一些网上的解读来写的,主要是个人的一些理解。
YOLOv3与YOLO9000一样,采用维度簇作为anchor box来预测bounding box。
YOLOv3使用逻辑回归预测每个bounding box对象得分,每个grid cell都会预测多个不同size的bounding box,v1中是2个,v2是5个,v3是3个,但是3个预测框里只有与真实框(ground truth)重合度最高的那个,才是真正用来预测对象的bounding box,这个重合度阈值作者定义为0.5
原先都是单标签分类,即网络层上使用softmax层来进行单标签多分类,但是YOLOv2中作者就提到了多标签分类的WordTree方法,所以他们改用了多标签多分类的逻辑回归层替代softmax层。逻辑回归层主要用到sigmod函数。
YOLOv3预测3中不同size的box,从金字塔网络相似的概念下提取不同尺度的特征信息,在YOLOv2中,他们是通过连接passthrough层来获取2626的feature map,而在YOLOv3中则是采用了类似FPN的做法,再融合了2626和52*52两个feature map。
说回上文,为什么YOLOv3又减少了每个grid cell预测的bounding box数量,其实是因为实际上增多了太多。 YOLOv2是融合特征,但是只在1313的feature map上进行bounding box的预测,而YOLOv3在3个size的feature map上分别预测,也就是YOLOv2的预测数量是13135=845,而YOLOv3的预测数量是(1313+2626+5252)*3=10647,不得不减少。
每个bounding box是(4+1+80)个参数(四个框参数,一个对象参数,80个种类参数)。
bounding box的先验预测仍然使用K-means聚类来实现,随意选择9个集群和3个scale,然后在不同scale上均匀地划分集群。
是的他们又改了新的网络,所以说神经网络的发展是真的快,这次Joseph等人采用的是YOLOv2用的DarkNet-19的同族,DarkNet-53,包含53个卷积层。
Joseph等人指出DarkNet-53甚至比ResNet-101或ResNet-152效率更高,实现了每秒最高的浮点运算。这意味着该网络结构更好地利用了GPU,使其评估更有效,运行速度更快。
DarkNet-53有几个特点,一是全卷积,不再使用pooling层来压缩图像,二是引入了ResNet的residual结构,降低了网络加深带来的训练难度。DarkNet-53只是特征提取层,multi-scale的特征融合和预测支路并没有在该网络结构中体现。
YOLOv4比YOLOv3是更大的突破,可以说在速度和精度上都做到了第一梯队,碾压同济。
作者简介了他们在YOLOv4设计过程中提出的一些调优手段:
加权残差连接(WRC);跨阶段部分连接(CSP);跨小批量标准化(CmBN);自对抗训练(SAT);Mish激活;马赛克数据增强;CmBN;DropBlock正则化;CIOU Loss等
经过一系列的调优,最终在Tesla V100上达到了43.5%的AP。YOLOv4实现了真正的可以让每个人都使用1080Ti或2080TiGPU来训练一个快速且准确的目标检测器。
作者对现有目标检测算法进行了总结,如上图。目标检测器都可以划分为如下结构,不过不同算法的设计与改进重点不同:
Input:输入,图片、补丁或图像金字塔;
Backbones:网络骨干,主要指特征提取网络,如VGG16等,可以在ImageNet上进行预训练;
Neck:指特征提取网络和预测网络之间的插入层,这些层通常用于收集不同阶段的特征图。通常,Neck由多条自下而上的路径和多条自上而下的路径组成,具有这种机制的网络包括特征金字塔网络FPN、路径聚合网络PAN、BiFPN和NAS-FPN等。
Head:指可以用来预测物体类别和边框的部分,一般可以分为单阶段目标检测算法和双阶段目标检测算法。最具代表性的双阶段目标检测算法是RCNN系列,包括fast RCNN、Faster RCNN、R-FCN、Libra RCNN。
单阶段的目标检测算法最具代表性的就是YOLO、SSD和RetinaNet,以及一些无锚式检测算法,如CenterNet、CornerNet、FCOS等。
除了上述模型外,也有一些研究人员把重点放在了直接构建一个新的主干(DetNet、DetNAS)或一个新的整体模型(SpineNet、HitDetector)用于目标检测。
虽然不太懂作者为啥要取了这个名字,不过他们确实把这章称为免费赠品包,这一章主要指只改变培训策略或只增加培训成本的方法,比如常用的数据增强,主要用于在离线训练阶段提高精度。
数据增强的目的是增加输入图像的可变性,提高系统在不同环境下的鲁棒性,光度畸变和几何畸变是两种最常用的数据增强方法。
光度畸变主要包含亮度、对比度、色调、饱和度和噪声的调整,几何畸变则主要包含随机缩放、剪切、翻转和旋转等。这些都属于像素级的调整。
还有一些研究把重点放在了模拟物体遮挡问题上,例如random erase和cut out,hide-and-seek和grid mask等。此外,还有一些研究将多幅图像一起进行数据增强,例如MixUp将两张图乡使用不同系数比例相乘叠加,然后根据叠加比例调整标签,CutMix则是将图像裁剪后覆盖到其他图像上。
语义分布偏差问题是不同类别之间存在数据不平衡的问题,这一问题通常通过双阶段目标检测算法中的困难否定例挖掘(hard negative example mining)或在线难例挖掘(online hard example mining)。
但是实例挖掘并不适用单阶段目标检测器,因为这类检测器属于密集预测体系结构。
传统的目标检测器使用均方误差(MSE)直接执行中心点坐标以及BBox(Bounding Box)宽高的回归,或者左上角点和右下角点的回归。基于锚点的方法是估计相应的偏移量,但是,直接估计的BBox每个点的坐标值是将这些点视作了独立变量,没有考虑对象本身的完整性。
于是有研究提出了IoU Loss,将预测的BBox区域与ground truth BBox区域的重合度纳入考虑。IoU Loss的计算过程将通过计算预测BBox与ground truth BBox的IoU,触发计算BBox四个坐标点。
由于IoU是尺度不变的表示法,可以解决传统方法计算{x,y,w,h}时的随尺度增大的损失。他们提出寻找最小的BBox,同时覆盖预测BBox和ground truth BBox,利用这个BBox为分母,代替原来用于计算IoU损失的分布。DIoU损失考虑物体中心的距离,CIoU则同时考虑了重叠面积、中心点之间的距离和长宽比。CIoU可以在BBox回归问题上取得较好的收敛速度和精度。
特殊包指的是一些插件模块和后处理方法,只增加少量推理成本,但能够显著提高目标检测的准确性。
一般来说,这些插件是为了增强模型中的某些属性,比如扩大接受野、引入注意机制、增强特征整合能力等,后处理则是对模型预测结果进行筛选的一种方法。
常用的增强感受野的模块有SPP、ASPP和RFB。SPP模块源于空间金字塔匹配(Spatial Pyramid Matching,SPM),SPMs的原始方法是将feature map分割成几个 d × d d\times d d×d的区块,其中 d d d可以是1,2,3……,从而形成金字塔,进而提取词袋特征。
SPP将SPM集成到CNN中,使用max-pooling操作而不是bag-of-word操作。YOLOv3加入了升级版的SPP模块,在MS COCO目标检测任务上提升了2.7%的 A P 50 AP_{50} AP50,但是增加了0.5%的额外计算负担。
目标检测中常用的attention module主要分为channel-wise attention和point-wise attention,这两种attention module的代表分别是SE(Squeeze-and-Excitation)和SAM(Spatial Attention Module)。
SE module能够在提高ImageNet的图像分类任务top-1正确率1%的同时仅提高2%的计算负担,但是在GPU上它会增加10%的计算时间,所以更适合用于移动设备。
SAM只需要0.1%的额外计算就能提高ResNet50-SE 0.5%的top-1正确率,而且不会影响GPU运行速度。
早期的做法是使用跳跃连接或超列来将低级物理特征集成到高级语义特征中。
随着FPN等多尺度预测方法六星,人们提出许多集成不同特征金字塔的轻量级模型。
也有人重点研究寻找一个好的激活函数,一个好的激活函数可以促使梯度更有效地传播,同时不会造成太多额外的计算成本。
2010年,Nair和Hinton提出了ReLU,根本上解决了传统的tanh和sigmoid激活函数中经常遇到的梯度消失问题。随后,LRReLU、PRReLU、ReLU6等等激活函数也被提出。LRReLU和PRReLU是为了解决当输出小于零时ReLU梯度为零的问题。ReLU6和hard-Swish则是专门为量化网络设计的。SELU则是为了对神经网络进行自归一化。
NMS是常用的后处理方法之一,用于过滤那些预测不好的BBox,只保留响应较高的候选BBox。NMS试图改进的方法与优化目标函数的方法是一致的。
原始的NMS方法没有考虑上下文信息,因此Girshick等人参考R-CNN加入分类置信度,并根据置信度的顺序,按照从高到低的顺序运行greedy NMS。对于soft NMS,考虑对象遮挡问题可能导致带有IoU评分的greedy NMS置信度下降的问题。
基础目的是提高神经网络在生产系统中的运行速度和并行计算优化,而不是低计算量的理论指标(BFLOP)。作者提出了两种实时神经网络选择:
GPU使用了卷积层数较少的网络:CSPResNeXt50/CSPDarknet53
VPU使用分组卷积,但是避免使用SE模块,具体来说包括以下模型:EfficientNet-lite/MixNet/GhostNet/MobileNetV3
结构选择的目标是贼输入网络分辨率、卷积层数、参数数(滤波器尺寸2filterschannel/groups)和输出层数(滤波器)之间找到最佳的平衡。
作者通过大量研究表明,在ILSVRC2012(ImageNet)数据集上的对象分类方面,CSPResNext50比CSPDarknet53要好得多。但是在MS COCO数据集上进行目标检测方面,CSPDarkNet53比CSPResNext50要好。
下一个目标是选择额外的块来增加接受场,并从不同的骨干级别对不同的检测器级别进行参数聚合的最佳方法,例如FPN、PAN、ASFF、BiFPN。
最适合分类的参考模型并不总是最适合检测器的。与分类器不同,检测器需要以下条件:
更高的输入网络大小(分辨率)-用于检测多个小型对象
更多的层次-为了一个更高的接受野,以覆盖扩大的输入网络
更多的参数-为更大的容量的模型,以在单张图片上检测多个不同大小的目标
假设可以选择一个接受野尺寸较大( 3 × 3 3\times3 3×3的卷积层数较大)和参数数量较大的模型作为body。实验表明,CSPDarknet53神经网络作为检测器的body更优。
不同大小的感受野的影响归纳如下:
根据对象大小-能够查看整个对象
根据网络size-能够查看对象周围的内容
超出网络size-增加图像点和最终激活之间的连接数量
作者在CSPDarknet53上添加SPP块,因为它显著增大了接受野,分离出最重要的纹理信息,而且几乎不会损失运行速度。再使用PANet作为不同骨干级别对不同检测器级别的参数聚合方法,而不是YOLOv3中使用的FPN。
最后,选择了CSPDarknet53作为body,SPP作为附加模块,PANet路径聚合作为neck,YOLOv3(anchor based)作为head,共同构建了YOLOv4。
CNN通常用以下方法来改进目标检测训练:
(1)激活函数:ReLU,leaky-ReLU,parametric-ReLU,ReLU6,SELU,Swish,Mish
(2)BBox回归损失:MSE,IoU,GIoU,CIoU,DIoU
(3)数据增强:CutOut,MixUp,CutMix
(4)正则化方法:DropOut,DropPath,Spatial DropOut,DropBlock
(5)通过其均值和方差对网络激活进行标准化
(6)跳跃连接:残差连接,加权残差连接,多输入加权残差连接,跨阶段部分连接
训练激活函数方面,PReLU和SELU训练比较困难,而ReLU6是专门为量化网络设计的,因此从优化候选列表中排除。在正则化的方法上,使用了DropBlock作为正则化方法。
为了使设计的检测器更适合在单个GPU上训练,作者还做了一些额外的改进:
(1)引入了一种新的数据增强拼接方法和自对抗训练;
(2)在应用遗传算法时,选择了最优超参数;
(3)修改了一些现有的方法,是设计更适合高效训练和检测-modified SAM,modified PAN,Cross mini-Batch Normalization(CmBN)。
Mosaic是一种新的混合训练图像的数据增强方法,可以混合四种不同的纹理。这使得系统能够检测超过正常纹理的对象。此外,批归一化计算每一层上4个不同图像的激活统计。这大大减少了对小型批量的需求。
自对抗训练(SAT)也代表了一种新的数据增强技术,在两个前向后向阶段操作。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己实施了一种对抗性的攻击,改变原始图像,制造出图像上没有想要的物体的假象。第二阶段,训练神经网络以正常的方式检测修改后的图像上的目标。
上面讲了一堆,最后到底YOLOv4到底是怎样的构成呢?
YOLOv4的组成:
(1)Backbone:CSPDarknet53
(2)Neck:SPP,PAN
(3)Head:YOLOv3
YOLOv4使用的优化手段:
(1)BoF for backbone:CutMix,马赛克数据增强,DropBlock正则化,类标签平滑
(2)BoS for backbone:Mish激活,跨阶段部分连接(CSP),多输入加权残差连接(MiWRC)
(3)BoF for detector:CIoU-loss,CmBN,DropBlock正则化,马赛克数据增强,自对抗训练,消除网格敏感性,使用多个锚定义一个真实物体,Cosine annealing scheduler,最优超参数,随机训练形状
(4)BoS for detector:Mish激活,SPP-block,SAM-block,PAN path-aggregation block,DIoU-NMS