@wanghuijiao
2021-08-06T17:24:36.000000Z
字数 6911
阅读 917
论文阅读 YOLOv4: Optimal Speed and Accuracy of Object Detection
学习笔记
0. 前言
相关资料:
论文基本信息
- 领域:目标检测
- 作者单位:Alexey Bochkovskiy
- 发表时间:2020
- 一句话总结
- 尝试了近20种不同领域的策略,让YOLOv4的模型在YOLOv3的基础上提升了10个百分点,但速度却几乎没有损失,是当时的SOTA。
1. 要解决什么问题
- 保持YOLOv3速度的基础上,做到精度更高,高了10个百分点!
2. 用了什么方法
2.1 YOLOv4网络结构
- 与YOLOv3相比多了CSP结构和PAN结构,但YOLOv4对各个子结构都进行了改进。YOLOv4的结构如下图:
图片参考自知乎-江大白
YOLOv4的五个组件:
- CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
- CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
- Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
- CSPX:借鉴CSPNet网络结构,由卷积层和X个Res unint模块Concate组成。
- SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
其他基础操作:
- Concat:张量拼接,维度会扩充,对应于cfg文件中的route操作。
- add:张量相加,不会扩充维度,对应于cfg文件中的shortcut操作。
2.2 YOLOv4的各项优化
2.2.1 输入端创新
- 1)Mosaic数据增强
- Mosaic是什么?
- 采用4张图片随机缩放、随机裁剪、随机排布的方式进行拼接。
- 为什么要拼接?
- 小目标AP(小于32×32)一般比中目标(32×32~96×96)和大目标(大于96×96)低很多,COCO虽然包含大量(占总量41.4%)小目标但分布不均匀(只有52.3%的图片包含小目标)。
- 优点?
- 丰富数据集:随机缩放后增加了很多小目标,且随机分布再拼接,让网络鲁棒性更好。
- 减少GPU:相比于普通的数据增强,Mosaic增强训练时,直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
- 2)CmBN
- 是什么?
-
- 上图表达的是三种不同的BN方式,理解的时候应该从左往右看,BN是对当前mini-batch进行归一化。CBN是对当前以及当前往前数3个mini-batch的结果进行归一化。而本文提出的CmBN则是仅仅在这个Batch中进行累积。
- 评价
- 在消融实验中,CmBN要比BN高出不到一个百分点。感觉影响不是很大,暂不研究。
- 3) SAT自对抗训练
- 是什么?
- 自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。
- 第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象。
- 第二阶段,对修改后的图像进行正常的目标检测。
- 评价
2.2.2 BackBone创新
1)CSPDarknet53
- 是什么?
- CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。
- 为什么要用CSPNet?
- CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此,YOLOv4采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
- 优点?
- 一:增强CNN的学习能力,使得在轻量化的同时保持准确性。
- 二:降低计算瓶颈
- 三:降低内存成本
2)Mish激活函数
- Mish与Leaky_relu图形对比。
- 为什么?
- Yolov4作者实验测试时,使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些。因此在设计Yolov4目标检测任务时,主干网络Backbone还是使用Mish激活函数。
- 相比其他激活函数,Mish优点原理分析?
- YOLOv4在哪些部分用了Mish?
- Backbone中使用了Mish,后面的网络还是用的leaky_relu。
3)Dropblock
- 是什么?
- Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式。Dropout是:随机删除减少神经元的数量,使网络变得更简单。而Dropblock则是将整个局部区域丢弃。效果对比如下图:
- 为什么?
- Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以上图中Dropblock的研究者则干脆整个局部区域进行删减丢弃。这种方式其实是借鉴2017年的cutout数据增强的方式,cutout是将输入图像的部分区域清零,而Dropblock则是将Cutout应用到每一个特征图。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。
- 与Cutout对比,Dropblock优点 ?
- 一:效果更优
- 二:Cutout只能作用于输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上。
- 三:Dropblock可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和Cutout相比都有更精细的改进。
2.2.3 Neck创新
- 在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck。相当于目标检测网络的颈部,也是非常关键的。Yolov4的Neck结构主要采用了SPP模块、FPN+PAN的方式。
1)SPP 模块
- 是什么?
- YOLOv4沿用了YOLOv3的SPP模块,其组成如下图,作者使用k={1*1,5*5,9*9,13*13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。(这里最大池化采用padding操作,移动的步长为1,比如13×13的输入特征图,使用5×5大小的池化核池化,padding=2,因此池化后的特征图仍然是13×13大小。)
- 为什么?
- Yolov4的作者在使用608*608大小的图像进行测试时发现,在COCO目标检测任务中,以0.5%的额外计算代价将AP50增加了2.7%,因此Yolov4中也采用了SPP模块。
- 优点?
- 采用SPP模块的方式,比单纯的使用k*k最大池化的方式,更有效的增加主干特征的接收范围,显著分离了最重要的上下文特征。
2)FPN+PAN
是什么?
- 如下图是YOLOv4的FPN+PAN结构,FPN输入是YOLOv4的Backbone输出的不同尺寸的特征图(19*19*255,38*38*255,76*76*255),中间FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。FPN后面添加了一个自底向上的特征金字塔,其中包含两个PAN结构。这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征(?如何证明?),两两联手,从不同的主干层对不同的检测层进行参数聚合。
- FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。
图片参考自知乎-江大白
- 为什么?
- 优点?
- 注意一:
- Yolov3的FPN层输出的三个大小不一的特征图①②③直接进行预测。但Yolov4的FPN层,只使用最后的一个76*76特征图①,而经过两次PAN结构,输出预测的特征图②和③。
- 这里的不同也体现在cfg文件中,这一点有很多同学之前不太明白,比如Yolov3.cfg最后的三个Yolo层
- 第一个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。
- 第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。
- 第三个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。
- 而Yolov4.cfg则恰恰相反
- 第一个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box。
- 第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box。
- 第三个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box。
- 注意点二:
- 原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat(route)操作,特征图融合后的尺寸发生了变化。
- 此处查看YOLOv4可视化netron网络结构图
2.2.4 Prediction 创新
a. CIOU_loss
- 目标检测任务的损失函数一般由Classification Loss(分类损失函数) 和Bounding Box Regeression Loss(回归损失函数)两部分构成。
- Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020), 下面将从最常用的IOU_Loss开始,进行对比拆解分析,看下Yolov4为啥要选择CIOU_Loss。
- 1) IOU_Loss
- IOU Loss 主要是交集和并集,但存在两个问题:
-
- 如上图,问题1:即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
- 问题2:即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。因此2019年出现了GIOU_Loss来进行改进。
- 2) GIOU_Loss
-
- 可以看到右图GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬。
- GIOU_Loss 的不足:
- 问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。
基于这个问题,2020年的AAAI又提出了DIOU_Loss。
- 3) DIOU_Loss
- 好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。针对IOU和GIOU存在的问题,作者从两个方面进行考虑.
- 一:如何最小化预测框和目标框之间的归一化距离?
- 二:如何在预测框和目标框重叠时,回归的更准确?
- 针对第一个问题,提出了DIOU_Loss(Distance_IOU_Loss)
- DIOU_Loss考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。但就像前面好的目标框回归函数所说的,没有考虑到长宽比。
- 比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。针对这个问题,又提出了CIOU_Loss
4) CIOU_Loss
- CIOU_Loss和DIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。
- 其中v是衡量长宽比一致性的参数,我们也可以定义为:
这样CIOU_Loss就将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了。
5) 综合的看下各个Loss函数的不同点:
- IOU_Loss:主要考虑检测框和目标框重叠面积。
- GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
- DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
- CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
- Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些。
b. DIOU_nms
- Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,Yolov4则借鉴上面D/CIOU loss的论文。将其中计算IOU的部分替换成DIOU的方式:再来看下实际的案例
- 在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。
- 注意:有读者会有疑问,这里为什么不用CIOU_nms,而用DIOU_nms?
- 答:因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。
3. 效果如何
- Yolov4对Yolov3的各个部分都进行了改进优化,下面丢上作者的算法对比图。
- Yolov4 主要带来了 3 点新贡献:
-(1)提出了一种高效而强大的目标检测模型,使用 1080Ti 或 2080Ti 就能训练出超快、准确的目标检测器。
-(2)在检测器训练过程中,验证了最先进的一些研究成果对目标检测器的影响。
-(3)改进了 SOTA 方法,使其更有效、更适合单 GPU 训练。
- 总体来说,YOLOv4的论文称的上良心之作,将近几年关于深度学习领域最新研究的tricks移植到Yolov4中做验证测试,将Yolov3的精度提高了不少。虽然没有全新的创新,但很多改进之处都值得借鉴,借用Yolov4作者的总结。
4. 还存在什么问题&有什么可以借鉴
- 还存在的问题?
- 可以借鉴的地方?
- 计划深入研究数据增强相关代码实现,并尝试在人体形态数据集上训练YOLOv4上的效果。
- 对于backbone、neck和损失函数的各种作用需要进一步学习相关原理,横向对比各种具体的模型选择和操作。