YOLO—You Only Look Once学习笔记4
YOLOV4学习笔记
最近项目需要认真学习yolo神经网络,因此将学习过程记录下来。
参考博客1:https://zhuanlan.zhihu.com/p/143747206
前言
YOLOV1-V4的论文链接
1.YOLOV1:https://arxiv.org/abs/1506.02640
2.YOLOV2:https://arxiv.org/abs/1612.08242
3.YOLOV3:https://arxiv.org/abs/1804.02767
4.YOLOV4:https://arxiv.org/abs/2004.10934
5.YOLO官方Github地址:https://github.com/AlexeyAB/darknet
6.YOLO官网:https://pjreddie.com/
YOLOV4
摘要
YOLO的原作者Joseph Redmon等人只将YOLO网络更新到了YOLOV3,YOLOV4以及YOLOV5等网络均不是Joseph Redmon等人提出的。但是可以参考YOLOV4以及YOLOV5的网络结构设计,提出符合自己要求的网络结构。
YOLOv4的检测速度比EfficientDet快两倍,性能相当。将YOLOv3的AP和FPS分别提高10%和12%,具体性能对比可见下图:
一、YOLOV4整体网络结构设计
如下图所示分别为YOLOV3(1)和YOLOV4(2)的整体网络结构对比,可以看出YOLOV4整体上和YOLOV3相差不大,YOLOV4在YOLOV3的基础上,在很多细节方面进行了创新:
- 各种先进算法集成的创新,比如不同领域发表的最新论文的tricks,集成到YOLOV4(原博客缺少降采样过程)的算法中,却发现有出乎意料的改进
为了更加清晰地分析YOLOV4的结构,将YOLOV4的整体结构分为四个模块来分析:
1.1输入端
Yolov4对训练时的输入端进行改进,使得训练在单张GPU上也能有不错的成绩,最大的改进点是数据增强Mosaic。
在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀,在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些,因此数据增强Mosaic采用的思路:
- 丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好
- 作者考虑到很多人可能只有一个GPU,因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
1.2BackBone
1.2.1CSPDarknet53网络
CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。
- CBM网络采用了Mish**函数,网络后面仍然采用Leaky_relu**函数。
- Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19,每个CSP网络中的残差组件个数和Darknet53个数保持一致。
- 采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
1.2.1Mish**函数
Mish**函数和Leaky_relu**函数的对比图如下图所示:
- 作者实验测试时,使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish**函数的TOP-1和TOP-5的精度比没有使用时都略高一些,因此在设计Yolov4目标检测任务时,主干网络Backbone还是使用Mish**函数。
1.3 Neck
在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck。相当于目标检测网络的颈部,也是非常关键的。
1.3.1SPP模块
在CSPDarknet53网络后,经过3次CBL之后进行SPP操作。在SPP模块中,使用k={1×1,5×5,9×9,13×13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。
采用SPP模块的方式,比单纯的使用k*k最大池化的方式,更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征,在COCO目标检测任务中,以0.5%的额外计算代价将AP50增加了2.7%,因此Yolov4中也采用了SPP模块。
1.3.2 FPN模块和PAN模块
在YOLOV3网络中,采用了FPN结构进行了信息的传递融合,得到进行预测的特征图。
在Yolov4中Neck这部分除了使用FPN外,还在此基础上使用了PAN结构。
- FPN层自顶向下传达强语义特征,而PAN则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合进一步提高特征提取的能力。
1.4 Prediction
1.4.1 训练时的损失函数
Bounding Box Regeression的Loss近些年的发展过程是:IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)。YOLO初代选择了IOU_Loss,但是Yolov4选择了CIOU_Loss。
- IOU_Loss:IOU的loss其实很简单,主要是交集/并集,但其实也存在两个问题:(1)当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近;(2)状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同;
- GIOU_Loss:差集的方式,如下图1;但是如下图2的三种状态,GIOU值也都是相同的,无法区分相对位置关系。
- DIOU_Loss:考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。但是DIOU_Loss的缺陷在于没有考虑长宽比,如下图2的三种状态,DIOU值也都是相同的,无法区分相对位置关系。
- CIOU_Loss:和DIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去:
- 因此Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些。
1.4.2 NMS的改变
Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,YOLOV4将其中计算IOU的部分替换成DIOU的方式。(CIOU_Loss的影响因子包含groundtruth标注框的信息,在实际预测时并不存在)
实际效果对比:中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。
YOLOV4-Tiny
可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。
网页版链接:netron可视化工具
在网页版中打开yolov4-tiny.cfg文件,即可看到对应的网络架构:共38层。
同时,在darknet运行时我们可以看出yolov4-tiny网络的具体输出:
结合两者可以得到yolov4-tiny可视化的结构图:
- 和yolov3-tiny网络类似,网络有两个尺度的向量输出:26×26×255以及13×13×255。
- yolov4-tiny网络没有采用YOLOV4网络的Mish**函数。
- yolov4-tiny网络保留了YOLOV4网络中的CSP网络结构来增强输出特征。
- yolov4-tiny网络中加入了池化层进行降采样。
- yolov4-tiny网络有FPN的上采样过程,但是为了减少运算去掉了YOLOV4网路中的PAN降采样的过程。
总体而言,在网络结构方面,yolov4-tiny相对于yolov3-tiny的提升在于保留了残差网络和CSP网络结构,其余均没有太大变化。