Yolov4
简介
论文原文:
YOLOV4是2020年AlexEY Bochkovskiy等人发表在CVPR上的一篇文章, 并不是Darknet的原始作者Joseph Redmon发表的, 但这个工作已经被Jose Redmon大佬认可了。如果将YOLOV4和原始的YOLOV3相比较确实有很大的提升, 但和Utralytics版的YOLOV3 SPP相比提升确实不大, 但毕竟Ultralytics的YOLOv3 SPP以及YOLOv5都没有发表过正式的论文, 所以这里先聊聊Alexey Bochkovskit的YOLOV4。
YOLOv4的亮点
阅读原论文,会发信啊作者就是将当年所有的常用技术罗列了一遍,然后做了一堆消融实验。网络结构
在论文3.4章节中介绍了YOLOV4网络的具体结构
Backbone: CSPDarknet53
Neck: SPP, PAN
Head: YOLOv3
相比之前的yolov3, 改进了以下Backbone, 在Darknet53中引入了CSP模块(来自CSPNet)。在Neck部分, 采用了SPP模块(Utralytics版的YOLOv3 SPP就使用到了)以及PAN模块(来自PANet), head部分使用的还是原来的检测头。
关于SSP(Spatial Pyramid Pooling)模块, SPP就是将特征层分别通过一个池化核大小为5×5, 9×9, 13×13的最大池化层, 最后在通道方向进行concat拼接在做进一步融合, 这样能够在一定程度上解决目标多尺度问题,如下图所示。
PAN(Path Aggregation Network)结构其实就是在FPN(从顶到底信息融合)的基础上加上了从底到顶的信息融合, 如下图所示。
但YOLOv4的PAN结构和原始论文的融合方式又略有差异, 如下图, 图(a)是原始论文的融合方式, 即特征层之间融合时是直接通过相加的方式进行融合的, 但在YOLOV4中是通过在通道方向concat拼接的方式进行融合的。
优化策略
这里直接说一下训练检测器时作者采用的一些方法。
Eliminate grid sensitivity
在原来的YOLOv3中, 关于计算预测目标中心坐标计算公式是:
其中, tx, ty分别是网络预测的目标中心x、y坐标偏移量(相对于网络的左上角)
cx, cy分别是对应网络左上角的x、y坐标
b_x = (\sigma(t_x) \cdot scale_{xy} - \frac{scale_{xy} - 1}{2}) + c_x
b_y = (\sigma(t_y) \cdot scale_{xy} - \frac{scale_{xy} - 1}{2}) + c_y
$$
通过引入这个系数, 网络的预测值能够达到0或者1。
Mosaic data augmentation
在数据预处理时阿静四张图片拼成一张图片, 增加学习样本的多样性。
IOU threshold(正样本匹配)
在yolov3中针对每一个GT都只分配了一个Anchor, 但在YOLOv4包括之前的YOLOv3 SPP以及YOLOv5中一个GT可以同时分配多个Anchor, 它们是直接使用Anchor模块与GT Boxes进行粗略匹配, 然后在定位到对应cell的对应Anchor。
针对某个预测特征层采用如下的三种Anchor模块AT 1, AT 2, AT 3
将每个GT Boxes与每个Anchor模板进行匹配(这里直接将GT和Anchor模板左上角对齐, 然后计算IoU
如果GT与某个Anchor模块的IoU大于给定的阈值, 则将GT分配给该Anchor模块, 如图中的AT 2
将GT投影到对应预测特征层上, 根据GT的中心点定位到对应的cell
则该cell对应的AT2为正样本
yolov4以及yolov5中关于匹配正样本的方法有些不同, 主要原因是引入了缩放因子scale_xy, 通过缩放后网络预测中心的偏移范围从原来的(0, 1)调整到了(-0.5, -1.5), 所以对于同一个GT Boxes可以分配更多的Anchor, 即正样本的数量多了。
将每个GT Boxes与每个Anchor模板进行匹配(这里直接将GT和Anchor模板左上角对齐, 然后计算IoU, 在yolov4中IoU的阈值设置的是0.213
如果GT与某个Anchor模板的IoU大于给定的阈值, 则将GT分配给改Anchor模板, 如图中的AT 2
将GT投影到对应预测特征层上, 根据GT的中心点定位到对应的cell(注意图中有三个对应的cell)
则这三个cell对应的AT2都为正样本
为什么图中的GT会定位到3个cell。刚刚说了网络预测中心点的偏移范围已经调整到了(-0.5, 1.5), 所以按理说只要Grid Cell左上角距离GT中心点在(-0.5, 1.5)范围内它们对应的Anchor都能回归到GT的位置上。在回过头看看上面的例子, GTx^center, GTy^center距离落入的Grid Cell左上角距离都小于0.5, 所以该Grid Cell上方的Cell以及左侧的Cell都满足条件, 即Cell左上角距离GT中心在(-0.5, 1.5)范围内。这样会让正样本的数量得到大量的扩充。但需要注意的是, yolov5源码中扩展cell时只会往上,下,左边,右边四个方向扩展,不会往左上, 右下, 左下, 右下方向扩展。
Optimizer Anchors
在yolov3中使用anchor模板
目标类型 | Anchors模板 |
---|---|
小尺度 | (10×13), (16×30), (33×23) |
中尺度 | (30×61), (62×45), (59×119) |
大尺度 | (116×90), (156×198), (373×326) |
在yolov4中针对512×512尺度采用的anchor模板
目标类型 | Anchors模板 |
---|---|
小尺度 | (12×16), (19×36), (40×23) |
中尺度 | (36×75), (76×55), (72×146) |
大尺度 | (142×110), (192×243), (459×401) |
CIoU(定位损失)
在yolov3中定位损失采用的是MSE损失, 但在yolov4中采用的是CIoU损失。
CSPDarjnet53网络结构
CSPDarknet53就是将CSP结构融入了Darknet53中。CSP结构是在CSPNet(Cross Stage Partial Network)论文中提出的, CSP作者说在目标检测任务中使用了CSP结构有如下好处:
- Strengthening learning ability of a CNN
- Removing computational bottlenecks
- Reducing memroy costs
即减少网络的计算量以及对显存的占用, 同时保证网络的能力不变或者略微提升。 CSP结构的思想参考原论文绘制的CSPDenseNet, 进入每个stage(一般在下采样后)先将数据划分成两部分, 如下图所示的Part1和Part2。但具体怎么划分呢, 在CSPNet中直接按照通道均分, 但在YOLOv4网络中通过两个1x1的卷积层来实现的。在Part2后跟一堆Blocks然后再通过1×1的卷积层(图中的Transition)。接着将两个分支的信息在通道方向进行Concat拼接, 最后通过1×1的卷积层进一步融合(图中的Transition)。
接下来详细分析CSPDarknet53网络的结构, 图中
k表示卷积核的大小, s代表步距, c代表通过该模块输出的特征层channels, 注意CSPDarknet53 Backbone中所有的激活函数都是Mish激活函数。
yolov4网络结构
如下图为yolov4网络结构