论文:Yolov4: Optimal Speed and Accuracy of Object Detection
https://arxiv.org/pdf/1804.02767.pdf
代码:GitHub - Tianxiaomo/pytorch-YOLOv4: PyTorch ,ONNX and TensorRT implementation of YOLOv4
作者:Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao
发布时间 :CVPR, 2020
优缺点/总结
优点
- 对于同样的精度,YOLOv4更快(FPS);对于同样的速度,YOLOv4更准(AP)
- 论文中总结了各种Tricks,可以选择合适的Tricks来提高自己的检测器性能,灵活组合
缺点
模型的改进
- 提出了一种高效而强大的目标检测模型,使用 1080Ti 或 2080Ti 就能训练出超快、准确的目标检测器。
- 在检测器训练过程中,验证了最先进的一些研究成果对目标检测器的影响。
- 改进了 SOTA 方法,使其更有效、更适合单 GPU 训练。
解决的问题
- 将近几年关于深度学习领域最新研究的tricks移植到Yolov4中做验证测试,将Yolov3的精度提高了不少
模型
主要结构分为四个模块:输入端、Backbone主干网络、Neck、Prediction
- 输入端:训练时对输入图像进行处理,包括Mosaic数据增强、cmBN、SAT自对抗训练
- Backbone主干网络:CSPDarknet53、Mish激活函数、Dropblock
- Neck:在Backbone和输出层之间插入的结构,包括SPP模块、FPN+PAN结构
- Prediction:输出层的锚框机制与yolov3相同,改进了训练时的损失函数CIOU_Loss以及nms变成DIOU_nms
结构
- CBM:Yolo v4网络结构中的最小组件,其由Conv+ BN + Mish激活函数组成。
- CBL:Yolo v4网络结构中的最小组件,其由Conv+ BN + Leaky relu激活函数组成。
- Res unit:残差组件,借鉴ResNet网络中的残差结构,让网络可以构建的更深。
- CSPX:借鉴CSPNet网络结构,由三个CBM卷积层和X个Res unint模块Concat组成。
- SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
- Concat:张量拼接,会扩充两个张量的维度
- Add:张量相加,张量直接相加,不会扩充维度
输入端
Mosaic数据增强
采用4张图片,随机缩放,随即裁剪、随机排布的方式进行拼接,解决数据集中小、中、大目标占比不均衡的问题
- 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
- 减少GPU:Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
Backbone主干网络
CSPDarknet53
- 包含5个CSP模块,输入图像608 * 608,特征图的变化规律:608 -- 304 -- 152 -- 76 -- 38 -- 19,最终得到大小为19 * 19的特征图
- CSP模块(Cross Stage Paritial Network)
-
- 认为推理计算过高的原因是由于网络优化中的梯度信息重复导致
- 将基础层的特征映射划分为两部分,通过跨阶段层次结构将他们合并
- 减少计算量的同时可以保证准确率
- Backbone采用CSPDarknet53的优点
-
- 增强CNN的学习能力,使得在轻量化的同时保持准确性
- 降低计算瓶颈
- 降低内存成本
Mish激活函数
- Backbone中采用Mish激活函数
- 和Leaky_relu激活函数对比(后面的网络还是使用的Leaky_relu激活函数)
Dropblock
- 缓解过拟合的一种正则化方式
- 传统的Dropout:随即删除减少神经元的数量,使网络变得更简单
- Dropblock
-
- Dropblock研究者认为卷积层对于Dropout这种随机丢弃并不敏感,卷积+激活+池化层这三层连用可以使卷积层从相邻的激活单元学习到相同的信息
- Dropblock将整个局部区域进行删减丢弃
- 借鉴cutout数据增强,cutout是将输入图像的部分区域清零,而Dropblock是将cutout应用到每个特征图,并不是用固定的比率归零,而是在训练时以一个小的比率开始,随着训练过程线性增加比率
-
-
- 优点一:Dropblock的效果优于Cutout
- 优点二:Cutout只能作用于输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上
- 优点三:Dropblock可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和Cutout相比都有更精细的改进。
-
Neck
SPP模块
- 在Backbone主干网络之后,使用k={1 * 1,5 * 5,9 * 9,13 * 13}的最大池化方式,将不同尺度的特征图进行Concat操作
- SPP模块与单纯使用k * k最大池化的方式对比,更有效地增加主干特征的接受范围,显著的分离了最重要的上下文特征
FPN+PAN
- FPN结构,自顶向下,将高层的特征信息通过上采样的方式进行传递融合
- PAN结构,自下向上,将底层的位置信息通过下采样的方式进行传递融合
- FPN层自顶向下传递强语义特征,PAN层自底向上传递强定位特征
- PAN结构中两个特征图结合采用的是concat操作,特征图融合后张量发生了变化
Prediction
Loss函数
目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成,回归损失函数的发展由Smooth L1 Loss -- IoU Loss(2016) -- GIoU Loss(2019) -- DIoU Loss(2020) -- CIoU Loss(2020)
- IoU Loss
-
- 存在问题
-
-
- 无法优化两个框不相交的情况
- 无法区分两者相交情况的不同
-
- GIoU Loss
-
- 存在问题
-
-
- 退化成了IoU,无法区分相对位置关系
-
- DIoU Loss
-
- DIoU Loss考虑了重叠面积和中心点距离,没有考虑长宽比
- CIoU Loss
-
- 在DIoU Loss的基础上增加一个影响因子,将预测框和目标框的长宽比都考虑进去
-
- 总结四种Loss函数:
-
- IOU_Loss:主要考虑检测框和目标框重叠面积。
- GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
- DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
- CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
NMS
- 采用DIoU NMS的方式,将计算IoU的部分替换为DIoU
- 在重叠目标的检测中,DIoU的效果优于传统的nms
Tricks
1、Label Smoothing平滑
Label Smoothing平滑就是将标签进行一个平滑,原始的标签是0、1,在平滑后变成0.005(如果是二分类)、0.995,也就是说对分类准确做了一点惩罚,让模型不可以分类的太准确,太准确容易过拟合。
2、学习率余弦退火衰减
余弦退火衰减法,学习率会先上升再下降,上升的时候使用线性上升,下降的时候模拟cos函数下降。
Prediction
Objective Function/Loss Function
Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些
- CIoU Loss
-
- 在DIoU Loss的基础上增加一个影响因子,将预测框和目标框的长宽比都考虑进去
-