YOLOv4的主要思想与YOLOv3基本上是一致的,只是在YOLOv3的基础上加了一些改进,目前YOLOv4的检测效果非常的好。
主要的几点改进:
1、主干特征提取网络的改进:由DarkNet53改进成CSPDarkNet53
2、加强特征提取网络的改进:使用SPP和PANet结构
3、数据增强方面的改进:使用Mosaic数据增强
4、Loss方面的改进:使用CIOU作为回归Loss
5、**函数的改进:使用Mish**函数
1、YOLOv4结构解析
(1) 主干特征提取网络:CSPDarkNet-53
我们可以看到CSPDarkNet53的输入图片大小是4164163,输出三种尺度的特征图:5252、2626、13*13。它与YOLOv3的DarkNet53有哪些区别呢??
第一点:增加了CSPNet的结构:
DarkNet53主要是由一些残差块堆叠而成,而CSPDarkNet53则是在其基础上增加了CSPNet的结构,可以看下图:
左图就是像YOLOv3一样做一些残差块的堆叠,右图则是增加了CSPNet的结构,也就是将原来的残差块的堆叠进行了一个拆分,拆成左右两个部分,主*分继续进行原来的残差堆叠,另一部分则是像一个残差边,经过少量的处理就直接连到了最后。
第二点:**函数由原来的LeakyReLU改成Mish**函数:
(2) 加强特征提取网络:SPP、PANet
我们可以看到SPP结构做的就是:对最后一个特征层,做不同尺度的最大值池化,然后再堆叠在一起。这样做的好处就是可以增加感受野,分离出显著的上下文特征。PANet结构的主要特点就是:特征的反复融合
2、改进
(1) Mosaic数据增强
优点:根据论文所说其拥有一个巨大的优点是丰富检测物体的背景!且在前向计算的时候一下子会计算四张图片的数据!做法:就是将四张图片拼接在一起
每次读取四张图片—>分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好—>进行图片的组合和框的组合
(2) 标签平滑
标签平滑的思想:就是将标签进行一个平滑,原始的标签是0、1,在平滑后变成0.005(如果是二分类)、0.995,也就是说对分类准确做了一点惩罚,让模型不可以分类的太准确,太准确容易过拟合
(3) CIOU
主要的思想就是直接使用IOU来做回归优化Loss,CIOU就是一种非常优秀的想法。CIOU将目标与anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。
(4) 学习率余弦退火衰减
余弦退火衰减法,学习率会先上升再下降,这是退火优化法的思想。
上升的时候使用线性上升,下降的时候模拟cos函数下降。执行多次。
余弦退火衰减有几个比较必要的参数:
1、learning_rate_base:学习率最高值。
2、warmup_learning_rate:最开始的学习率。
3、warmup_steps:多少步长后到达顶峰值。
(5) loss的组成
YOLOv4的Loss分成三部分:位置回归损失、置信度损失、分类损失
位置回归损失:只计算负责预测物体的那些预测框
置信度损失:计算负责预测物体的那些预测框(正样本)、计算不负责预测物体的那些预测框(负样本)
分类损失:只计算负责预测物体的那些预测框
那么如何找出负责预测物体的预测框??
前面产生y_ture的时候,就已经找到了哪个特征层的哪个网格中的哪个anchor是负责预测物体的,所有在y_pred中找到相应的位置就可以了(正样本),那么剩下的y_pred中的预测框都是不负责预测的(负样本)
这里还有一个问题就是负样本太多了,计算置信度损失的时候会出现正负样本不平衡的问题,那我们如何做??
我们会计算每个预测框与真实框的IOU值,并且设定一个预测值,大于这个阈值的,我们就忽略它。这样在计算置信度的时候,当我们计算不负责预测物体的那些预测框(负样本)的置信度损失的时候,就可以筛选一部分负样本。也就是我们会首先筛选出那些不负责预测的预测框,然后从中再筛选出与真实框IOU小于阈值的那些框,来计算这个置信度损失。