简介
YOLOv4是YOLO之父Joseph Redmon宣布退出计算机视觉的研究之后推出的YOLO系列算法,其作者Alexey Bochkovskiy也参与了YOLO之前系列算法,《YOLOV4: Optimal Speed and Accuracy of Object Detection》,其主要贡献在于对近些年CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化,组合出一个精度与速度兼备的结构。
框架原理
检测器通用结构
一个目标检测器总是由下列几个部分组成:
- input:图像,图像金字塔等
- backbone:VGG16,Resnet-50,ResNeXt-101,Darknet53
- neck:FPN,PANet,Bi-FPN
- dense prediction:Dense Prediction:RPN,YOLO,SSD,RetinaNet,FCOS
- sparse prediction:Faster RCNN,Fast RCNN,R-CNN
two-stage的结构会比one-stage多出一个sparse prediction的步骤,也就是区域建议后的再次预测过程,这也就是为什么yolo很像是faster rcnn的rpn。
YOLOv4结构
YOLOv4的结构和YOLOv3很类似,下图是YOLOv3的,首先YOLOv4换了backbone,由Darknet53换成了CSPDarknet53,Neck的部分修改比较大,dense prediction的部分保持不变,但是由于前面两个部分都修改了,所以最后三个特征图的尺寸略有变化。
backbone
CSPDarknet53是Darknet53结合了CSPNet,CSPNet实际上是基于Densnet的思想,复制基础层的特征映射图,通过dense block发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。
- 增强 CNN 的学习能力,使得在轻量化的同时保持准确性;
- 降低计算瓶颈;
- 降低内存成本。
neck
目标检测器由特征提取中的 backbone 和用于目标检测的 head 组成。 为了检测不同尺度的目标,将使用具有不同空间分辨率特征图生成层次结构。为了丰富输入到 head 的信息,来自自底向上和自顶向下的相邻特征映射按元素方式相加或连接在一起,然后作为 head 的输入。因此,head 输入将包含自底向上的丰富空间信息和自顶向下的丰富语义信息。我们将这一部分称为 neck。
SPP
SPP即为空间金字塔池化操作,开始的时候是为了在two-stage结构中统一不同的区域建议到相同的维度,但是在YOLOv4中作者将其用于增加主干网络的感受野,显著的分离最重要的上下文特征。 YOLOv4 的作者在使用 608 * 608 大小的图像进行测试时发现,在 COCO 目标检测任务中,以 0.5% 的额外计算代价将 AP50 增加了 2.7%。
PAN
YOLOv3中天然的存在fpn,其实就是原来的neck部分,像上图中的红框内,把它转一下,其实就是个类似FPN的结构:
而PAN, 是在FPN的基础上引入了一条捷径(绿色路径), 这种捷径连接使细粒度的局部信息可用于顶层。
而YOLOv4的PAN在这个基础上又加了一些修改,其实就是把PAN的加操作换成了拼接操作,这个和YOLOv3是一致的。
bag of tricks
Mosaic
Mosaic 是一种数据增强方法,将 4 张训练图像组合成一张进行训练,这增强样本的丰富程度。另外,每个 mini-batch 包含大量的图像(是原来 mini-batch 所包含图像数量的 4 倍),因此,在估计均值和方差时减少了对 large mini-batch sizes 的需求。
Mish
YOLOv4 的骨干网络中都使用了 Mish 激活函数,而其他部分则使用 Leaky_ReLU 函数。Mish 是光滑的非单调激活函数。
CIoU loos
YOLOv4使用CIoU loss,CIoU就是在DIoU的基础上增加了检测框尺度的loss,增加了长和宽的loss,这样预测框就会更加的符合真实框。