开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
YOLOv4的两个bags的优化函数:在训练期间使用的“Bag of Freebies (BoF)”和在推理期间使用的“Bag of Specials (BoS)”
今天我们捡着一些经典的trick为大家讲解YOLOv4.
1.YOLOv4网络结构
图1-1 YOLOv4网络结构
1.1 backbone:CSP结构
- 增强CNN的学习能力
- 移除计算瓶颈
- 减少存储使用
图1-2 图1-1中DownSample结构
CSP结构正如YOLOv4中的DownSample结构,对输入的feature map先进行两次1×1卷积生成Part1和Part2,再将Part1输入n个ResBlock结构,最后将提取到的特征图与Part2在通道上拼接在一起,每经过DSPBlock结构,通道数会增加一倍。
1.2 Neck:SPP结构,PAN结构
1.2.1 SPP结构
SPP就是通过池化核为5×5,9×9,13×13,用padding填充的最大池化,最终仍然变成16×16大小,再concatenate起来。
图 1-3 SPP结构
SPPnet特点:
1.通过SPP获取不同感受野大小的三个特征图并拼接在一起,使经过SPP获取得到的特征图具有不同的感受野,特征图包含的信息更全面。
2.不管输入尺寸怎样,SPP最终可以产生固定大小的输出。
1.2.2 PAN结构
如图1-1中,YOLOv4中的PAN(Path Aggregation Network)结构从顶到底,将深层和浅层特征进行拼接,再将三种融合特征层从底到顶,将浅层融合特征层和深层融合特征层进行拼接(concatenate)。
add:直接将两个特征图对应像素相加,是resnet的融合方法,这种残差相加可以有效地减小因网络层数加深而导致的CNN网络退化问题。
但是add改变特征图像素值,并没有完全保留原本特征图信息,丢失了更多的细节信息。concat:将两个特征图在通道数方向叠加在一起,原特征图信息完全保留下来。
图1-4 YOLOv4中PAN结构是concatenate
图1-5 与FPN结构的对比
1.3 Head:YOLOv3
YOLOv4的检测头与YOLOv3一致。
2.YOLOv4 的其他小tricks
2.1 Mosaic数据增强
从数据集中随机选取4张图片,进行随机裁剪,缩放,色域变换等等,最后将四张图拼接在一起。
图2-1 Mosaic数据增强
Mosaic数据增强的优点:
- 丰富了检测物体的背景和小目标,提升了小目标的检测性能。
- 在计算
Batch Normalization的时候一次会计算四张图片的数据,使得mini-batch大小不需要很大,一个GPU就可以达到比较好的效果。
2.2 Mish激活函数
Mish是光滑的非单调激活函数,可定义为:
图2-2 Mish激活函数
2.3 Eliminate grid sesitivity
这一步通常是前12800次迭代进行Anchor到预测框的位置修正,后面的迭代不再修正,只进行预测框的confidence、类别、位置。(参考YOLOv2的损失函数)
在YOLOv2的Direct lacation predict中我们之前讨论过,对Anchor修正到预测框的函数进行了改进,用函数进行约束Anchor中心点的位置。
在YOLOv4中,作者认为如果目标的中心点位于grid的边角上,那么由于函数在(0,1)之间的,就不能取到0,1这两个数值,从而也无法来预测中心点的边角位置。
YOLOv4对这个函数进行了改进:
比较新的实现方法包括YOLOv5都将设置2
图 2-3 scale的y值可知范围约束在(-0.5,1.5),sigma的y值可知范围约束在(0,1)
2.4 CIoU LOSS
我们之前对于定位损失,参考YOLOv2中 。
YOLOv4用 代替了 loss。
=
指预测框与GT的最小闭包区域。
指预测框与GT的并集。
指GT与预测框之间中心点的距离。
指预测框与GT的最小闭包区域左上角到右下角的距离。
=
2.5 DIoU NMS
Head输出三个预测层的预测框,再经过NMS筛选。
DIoU NMS的处理步骤:
1.遍历图片中识别出目标的框。
2.按照每种类别对框单独分析:将A类别的框按照分数从大到小排序。
3.设A类最大概率的框为target,依此比较A类其他框与target的DIoU,如果计算结果>DIoU阈值,则框概率归0(被剔除)。直到扫描结束。
4.接着设次大概率的框为target,与3步骤一样(除了不去与3中的target计算DIoU)。
5.假如最终留下了2个框,那么对于计算机来说,这张图片可能出现了2个A物体。
6.接下来我们还要对剩下的79种类别进行上述操作。
7.最后,需要进行纵向跨类比较,因为该物体在A类和B类中可能都是较大的概率。
2.6 DropBlock
DropBlock和DropOut的作用是一样的,都是网络进行正则化,防止过拟合的手段。个人理解就是通过删掉参数来掩盖相应特征,从而防止过拟合。
DropOut:设定某层dropout比率,随机丢弃神经元(参数矩阵上的像素点)。
DropBlock:DropOut用在全连接层上,在卷积层上应用的意义不大,因为每个feature map的位置都有一个感受野范围,仅仅对单个像素位置进行DropOut不能降低feature map学习特征的范围,网络仍然可以通过该位置的相邻元素去学习语义信息。
因此引入DropBlock,对feature map某一连续块进行丢弃。
左图为DropOut,右图为DropBlock