YOLOv4的主要思想与YOLOv3基本上是一致的,只是在YOLOv3的基础上加了一些改进,目前YOLOv4的检测效果非常的好。

        主要的几点改进:

        1、主干特征提取网络的改进:由DarkNet53改进成CSPDarkNet53

        2、加强特征提取网络的改进:使用SPP和PANet结构

        3、数据增强方面的改进:使用Mosaic数据增强

        4、Loss方面的改进:使用CIOU作为回归Loss

        5、激活函数的改进:使用Mish激活函数

1、YOLOv4结构解析

        (1) 主干特征提取网络:CSPDarkNet-53

目标检测yolo项目 yolov4目标检测算法_算法


        我们可以看到CSPDarkNet53的输入图片大小是4164163,输出三种尺度的特征图:5252、2626、13*13。它与YOLOv3的DarkNet53有哪些区别呢??

        第一点:增加了CSPNet的结构:

        DarkNet53主要是由一些残差块堆叠而成,而CSPDarkNet53则是在其基础上增加了CSPNet的结构,可以看下图:

目标检测yolo项目 yolov4目标检测算法_目标检测yolo项目_02


        左图就是像YOLOv3一样做一些残差块的堆叠,右图则是增加了CSPNet的结构,也就是将原来的残差块的堆叠进行了一个拆分,拆成左右两个部分,主干部分继续进行原来的残差堆叠,另一部分则是像一个残差边,经过少量的处理就直接连到了最后。

        第二点:激活函数由原来的LeakyReLU改成Mish激活函数:

目标检测yolo项目 yolov4目标检测算法_深度学习_03


        (2) 加强特征提取网络:SPP、PANet

        我们可以看到SPP结构做的就是:对最后一个特征层,做不同尺度的最大值池化,然后再堆叠在一起。这样做的好处就是可以增加感受野,分离出显著的上下文特征。PANet结构的主要特点就是:特征的反复融合

2、改进

        (1) Mosaic数据增强

        优点:根据论文所说其拥有一个巨大的优点是丰富检测物体的背景!且在前向计算的时候一下子会计算四张图片的数据!做法:就是将四张图片拼接在一起

目标检测yolo项目 yolov4目标检测算法_深度学习_04


        每次读取四张图片—>分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好—>进行图片的组合和框的组合

        (2) 标签平滑

        标签平滑的思想:就是将标签进行一个平滑,原始的标签是0、1,在平滑后变成0.005(如果是二分类)、0.995,也就是说对分类准确做了一点惩罚,让模型不可以分类的太准确,太准确容易过拟合

        (3) CIOU

        主要的思想就是直接使用IOU来做回归优化Loss,CIOU就是一种非常优秀的想法。CIOU将目标与anchor之间的距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。

目标检测yolo项目 yolov4目标检测算法_算法_05


目标检测yolo项目 yolov4目标检测算法_计算机视觉_06


        (4) 学习率余弦退火衰减

        余弦退火衰减法,学习率会先上升再下降,这是退火优化法的思想。

        上升的时候使用线性上升,下降的时候模拟cos函数下降。执行多次。

目标检测yolo项目 yolov4目标检测算法_神经网络_07


        余弦退火衰减有几个比较必要的参数:

        1、learning_rate_base:学习率最高值。

        2、warmup_learning_rate:最开始的学习率。

        3、warmup_steps:多少步长后到达顶峰值。

        (5) loss的组成

        YOLOv4的Loss分成三部分:位置回归损失、置信度损失、分类损失

        位置回归损失:只计算负责预测物体的那些预测框

        置信度损失:计算负责预测物体的那些预测框(正样本)、计算不负责预测物体的那些预测框(负样本)

        分类损失:只计算负责预测物体的那些预测框

        那么如何找出负责预测物体的预测框??

        前面产生y_ture的时候,就已经找到了哪个特征层的哪个网格中的哪个anchor是负责预测物体的,所有在y_pred中找到相应的位置就可以了(正样本),那么剩下的y_pred中的预测框都是不负责预测的(负样本)

        这里还有一个问题就是负样本太多了,计算置信度损失的时候会出现正负样本不平衡的问题,那我们如何做??

        我们会计算每个预测框与真实框的IOU值,并且设定一个预测值,大于这个阈值的,我们就忽略它。这样在计算置信度的时候,当我们计算不负责预测物体的那些预测框(负样本)的置信度损失的时候,就可以筛选一部分负样本。也就是我们会首先筛选出那些不负责预测的预测框,然后从中再筛选出与真实框IOU小于阈值的那些框,来计算这个置信度损失。