在前文我们介绍了YOLO-V1~V3版本都做了哪些事,本文我们继续介绍YOLO-V4版本。
YOLO的作者在发表完V3之后,发现YOLO产品被美国军方应用到了很多军事战争当中,这是他所不希望看见的,因此宣布不再继续研究。
但历史和科技总是随时间不断发展,一个人的力量总是渺小的,后来的学者们“前赴后继”,继往圣之绝学,续写、补全着YOLO这本功法。
一、YOLO-V4
YOLO-V4的贡献:
亲民,单GPU就能训练的非常好,接下来很多小模块都是这个出发点
两大核心方法,从数据层面和网络设计层面来进行改善
消融实验,感觉能做的都让他给做了(凝当年百家之长),工作量不轻
全部实验都是单GPU完成,不用太担心设备了
1.1 Bag of freebies(BOF)
只增加训练成本,但是能显著提高精度,并不影响推理速度
数据增强:调整亮度、对比度、色调、随机缩放、剪切、翻转、旋转
网络正则化的方法:Dropout、Dropblock等
类别不平衡,损失函数设计
1.1.1 数据增强
Mosaic data augmentation方法
一种数据增强的方法,参考CutMix然后四张图像拼接成一张进行训练;
所参考的CutMix:
上图展示CutMix中提到的融合、裁剪、裁剪拼接
V4作者参考该方法,将四张图像拼接成一张进行训练
具有以下优点
丰富一张图上的信息
增强后一张图上包含四张图的信息,减少了对大batch_size的依赖
通常小目标的检测效果要比大目标差,将四张图放到一张图中,相当于变相扩充了数据集中小目标的样本数量。
当然在数据增强时还用了一些其它方法,如
用随机值或训练集的平均像素值替换图像的区域
根据概率设置随机隐藏一些补丁
引入噪音点等
1.1.2 DropBlock与标签平滑方法
DropBlock
之前的dropout是随机选择点去掉(随机杀死一些神经元),如下图b
现在是直接去掉整个区域,dropblock。
这样做就好比去掉了图片中狗的眼睛/耳朵/鼻子或者是大半个头。
显然相比去掉一些点提升了更大的难度让计算机去好好学。
标签平滑 Label Smoothing
神经网络最大的缺点就是容易过拟合,以猫狗分类0/1标签为例,这里进行平滑处理:
其中0.1为自己指定,2为类别个数
效果:右图,使用后簇内更加紧密,簇间更加分离(过拟合的话就会很近)
1.1.3 CIOU损失函数定义
IOU损失:从之前的学习中我们得知IOU是干嘛的,即真实框和预测框的重叠程度,一般IOU损失计算时直接1-IOU,有时也会使用下图右下角公式
但是使用IOU损失会面临一些问题
如果两框没有相交则IOU=0无法梯度计算,
相同的IOU却反映不出实际情况到底咋样,如以下三图IOU相同,但重叠情况却不同。
GIOU损失
引入了最小封闭形状C(C可以把A、B包含在内,即下图C把两框都框起来了。)
这样在在不重叠情况下能让预测框尽可能朝着真实框前进(以真实框为准,C越接近真实框越好)。
但是重叠的话又完了,以下情况结果是相同的。
DIOU损失
其中分子计算预测框与真实框的中心点欧式距离d
分母是能覆盖预测框与真实框的最小BOX的对角线长度c
直接优化距离,速度更快,并解决GIOU问题
CIOU损失
损失函数必须考虑三个几何因素:重叠面积,中心点距离,长宽比,其中α可以当做权重参数 。
1.1.4 NMS细节改进
(其实这个并不属于BOF,而是属于后面BOS,因为涉及到计算了肯定会影响速度。这里为了知识点的连贯性放在一起说。)
DIOU-NMS
之前使用NMS来决定是否删除一个框,现在改用DIOU-NMS
不仅考虑了IoU的值,还考虑了两个Box中心点之间的距离
其中M表示高置信度候选框,Bi就是遍历各个框跟置信度高的重合情况
SOTF-NMS
"做人留一面日好相见",柔和一点的NMS,更改分数而且直接剔除
意思是之前高度重叠的,就要置信度最大的,别的都剔除。
上图中红色绿色框重叠了,但实际框起来的是两匹马,不应该去掉。
这里选用的方法就是降低置信度,如绿框是0.8,给它降低0.3分,然后通过阈值去筛选。
1.2 Bag of specials(BOS)
增加稍许推断代价,但可以提高模型精度的方法
网络细节部分加入了很多改进,引入了各种能让特征提取更好的方法
注意力机制,网络细节设计,特征金字塔等,你能想到的全有
读这一篇相当于把当年来部分优秀的论文又过了一遍
1.2.1 SPP与CSP网络结构
SPPNet(Spatial Pyramid Pooling)
V3中为了更好满足不同输入大小,训练的时候要改变输入数据的大小
SPP其实就是用最大池化控制大小,来满足最终输入特征一致即可。
CSPNet(Cross Stage Partial Network)
每一个block按照特征图的channel维度拆分成两部分
一份正常走网络,另一份直接concat到这个block的输出
意思是把输入的特征图切成两份,一份继续按照之前的路走(去卷积、block等),另一份直接拿过去和前面那份走完之后的结果进行concat。
这样算是减少特征图的深度(实际上并没有影响到精度),加快计算速度。
1.2.2 SAM注意力机制模块
注意力机制:
简单来说就是比如这里这句话:“小明今天开心地踢了一个绿色的皮球”,这句话的关键词/重要的部分是 "小明踢球",其他的次要,次次要。我们把注意力放在这些重要的上面,即分配一些权重。
这是语言/NLP中,图片中也是一样的,比如猫狗识别,我记得猫有胡须狗没有,可以把注意力放在胡须上。又或者说图片有前景和背景,我们应该把注意力放在更重要的前景里。
所参考的CBAM介绍
比如我们得到32*32*512的256个特征图,那就给这256个特征图经过操作得到它们的重要程度/分配权重(channel attention),之后再把权重乘到原始特征图中去。
此外除了看哪个特征图重要,还要看特征图里的哪个点/哪部分重要(spatial attention),即给每个特征图每个位置/像素点/grid cell分配权重,乘进去。
V4中参考CBAM,不过V4中用的是SAM,只有spatial attention也就是空间的注意力机制。
YOLOV4中的Spatial attention module
在原始SAM(a)做了点修改(b),之前是最大池化和平均池化后拼在一起然后后再卷积,这里直接卷积,更快。
1.2.3 PAN模块
下图是FAN,它是一种自顶向下的模式,将高层特征传下来,各层间进行特征融合、3*3卷积得到P2、P3、P4、P5等特征。
但这样好像只有一条路(特征只从高层向底层传递),能不能来个双向的呢?
于是,PAN登场
PAN(Path Aggregation Network)
引入了自底向上的路径,使得底层信息更容易传到顶部
并且还是一个捷径,红色的线没准走个100层(走的Resnet层数),绿色的线几层(橙色那几层,走的P后面延申的路)就到了。
YOLO-V4中在PAN上做了点修改,PAN中融合特征时使用的是加法(矩阵+矩阵),而YOLO-V4中则是拼接。虽然特征多了一些但是会提升一些精度。
1.2.4 激活函数
YOLO-V4中并非使用的是ReLU,而是Mish。
Mish
不一棒子全给"打死",给个改过自新的机会。
Relu有点太绝对了,Mish更符合实际
虽然计算量确实增加了,效果会提升一点
在网络的初期,因为一开始是高斯随机的数,特征值在前面有负的可以理解,ReLU直接就去掉了,而Mish给了点机会,当然只挽留一定范围内的。
1.2.5 eliminate grid sensitivity
最终预测回归值的时候,还不是它真正的坐标,而是相对这个网格的位置,坐标回归值的预测都在0-1之间,但此时在grid边界怎么办?
此时我们想要取到0或1,就需要无穷大的数
为了缓解这种情况可以在激活函数前乘上 一个系数(大于1的),即放大结果。
1.3 整体网络架构
架构图如下:
输入、卷积、BN、Mish;然后SPP进行最大池化控制大小,来满足最终输入特征一致;
右边是PAN,特征图高底层特征双向拼接。
最右边的Yolo Head和V3一样。不同尺度的特征检测器。