最开始入坑深度学习的时候是从yolov5版本开始,虽然会使用,但是不能理解作者为什么要使用这些方法,对底层源码和结构并不了解,所以又从头开始把v1-v4每个版本的论文和源码都详细阅读一遍,最后总结一下v4的方法吧,这个版本几乎把当年所有优秀顶会的论文方法都容纳进来了,像SAM注意力机制和sppnet等方法,非常建议大家把这篇论文认真阅读一下,后期会总结v7,v8的源码和论文讲解,v6建议大家直接跳过,和v5内容很相似,看v5就足够了;
【yolov1:背景介绍与算法精讲】
【yolo9000:Better, Faster, Stronger的目标检测网络】
【YOLOv3:算法与论文详细解读】
YOLOV4
1、整体概述
- 虽然作者换了,但是运用到前3个版本的精髓
- 细节上的改进,并没有大的改动
- 将别人好的内容都添加进来
2、贡献解读
- 比较亲民,不需要很高的设备,单GPU就能训练很好
- 两大核心方法,从数据层面和网络设计层面
- 消融实验,融合2020年所有好的方法
- 全部实验单GPU就能完成
3、数据增强策略
1、Bag of freebies(BOF)
- 只增加训练成本,但是能显著提高精度,并不影响推理速度
- 数据增强:调整亮度、对比度、色调、随机缩放、剪切、翻转、旋转
- 网络正则化的方法: Dropout、Dropblock等
- 类别不平衡,损失函数设计
数据增强
(1)mosaic data augmentation
方法很简单,参考CutMix论文方法,然后将四张图像拼接成一张进行训练,也就是分别对4张图片作旋转、色调等数据增强操作,最后拼接到一张图片,间接的增加了batch_size。
mixup是将两张图片透明50%叠加
cuout将图片去掉某一块内容
(2)random Erase
🐏用随机值或训练集的平均像素值替换图像的区域:随机遮盖
(3)Hide and Seek
根据概率设置随机隐藏一些区域
(4)Self-adversarial-training(SAT)
输入图片的时候通过引入噪音点来增加识别难度
4、DropBlock与标签平滑
(1)DropBlock
之前的dropout是随机选择点进行消除,如图(b),现在吃掉某一个区域如图(c)
(2)Label Smoothing
神经网络最大的缺点就是容易过拟合,所以将原来很绝对的图片标签,进行平滑偏移
例如原来猫狗标签为 (0,1)太过于绝对 使用一些方法进行标签平滑,例如: [0,1]x(1-0.1)+0.1/2 = [0.05,0.95]
使用之前,会发现数据非常接近,过拟合比较严重,分界线不明显;使用之后效果分析(右图):簇间更分离簇内更紧密
5、损失函数问题
(1)IOU损失
定义:1-IOU 表示真实框与预测框之间的差异
(2)产生的问题
1、预测框与真实框之间不相交的时候,IOU=0,无法进行梯度计算
2、相同的IOU反映不出实际预测框与真实框之间的情况,如下:
(3)解决办法
引入GIOU
公式:当两个框距离越远,|C-两框并集|值越大
引入了最小封闭形状C (可以把A,B包含在内)
GIOU解决了不重叠情况下,也就是IOU=0的情况,也能让训练继续进行下去;
但是重叠的情况依旧无法判断,如下:
引入DIOU
公式
- 其中分子计算预测框与真实框的中心点欧式距离d
- 分母是能覆盖预测框与真实框的最小BOX的对角线长度C
- 当两个框重叠的时候,欧式距离为0
计算结果:
6、CIOU函数
YOLOv4使用的是CIOU损失,损失函数必须考虑三个几何因素: 重叠面积,中心点距离,长宽比
和前面两种损失函数相比,多了一个长宽比因素
公式:
7、NMS细节改进
(1)DIOU-NMS
和BOF不同的是:NMS需要对预测框进行判断,所以肯定会影响我们的推理速度
之前使用NMS来决定是否删除一个框,现在改用DIOU-NMS
不仅考虑了loU的值还考虑了两个Box中心点之间的距离
其中M表示高置信度候选框,Bi就是遍历各个框跟置信度高的重合情况
公式:也就是在原有的NMS上添加一个DIOU
(2)soft-NMS
和DIOU-NMS相比,是没那么严格的NMS,即使没有达到阈值也会进行第二次判断,例如下面这个图片,上边框都在同一高度,如果使用DIOU-NMS,可能会把绿色的框删除掉,但是soft-nms会判断它属于另外一匹马,保留该框
8、SPP与CSP网络结构
BOS(Bag of specials)
- 增加稍许推断代价,但可以提高模型精度的方法
- 网终细节部分加入了很多改进,引入了各种能让特征提取更好的方法
- 注意力机制,网络细节设计,特征金字塔等
SPPNet(Spatial Pyramid Pooling)
V3中为了更好满足不同输入大小,训练的时候要改变输入数据的大小
SPP作用:1、增加感受野;2、最大池化来满足最终输入特征一致即可,将特征图pooling成相同大小,最后将相同大小特征图堆叠到一起;
如下图:图片输入之后将不同大小特征图maxpooling成相同size大小,最后将特征图连接在一起。
CSPNet(Cross Stage Partial Network)
🏵️每一个输入特征图,按照特征图的channel维度拆分成两部分,一份正常走网络,另一份直接concat到这个特征的输出,这样可以节省更多的时间,而且精度并没有下降;
9、SAM注意力机制模块
CBAM定义:卷积带了一个注意力机制,既有channel,也有位置的
注意力机制:在图像处理中,注意力机制可以帮助模型在处理图像时,选择关注图像中的重要部分。例如,通过引入空间注意力机制,模型可以根据图像的内容自动确定关注的区域,而不是简单地对整个图像进行处理。这种机制可以提高图像处理任务的精度和效率。
例如:一个32x32x256特征图,通过channel attention module划分为200,50,6三个不同的类,每块权重值都不一样,将权重值乘在特征图当中,重要部分特征图的权重值会大;同理:将空间位置也添加注意力机制,不同的位置,它的重要程度不一样;
SAM:不再有channel的注意力机制,而是只有空间注意力机制,这样会更加容易计算
YOLOV4注意力机制改进
(a)是原始的SAM,需要经过最大池化和平均池化,再经过卷积和sigmoid分配权重,最后加权相乘
(b)改进后只需要经过一层卷积和sigmoid
10、PAN模块解读
先了解FPN
思想:自顶向下的模型,将高层的特征传下来,与中层和底层进行特征融合,p5、p4、p3、p2是融合后的特征
问题:(1)如何自下向上将底层特征与高层特征融合?(2)网络可能有很多层,从底层走到高,再从高走到底,按照原路径走非常影响效率,这个路径该如何走?
PAN(Path Aggregation Network)
解决思路:
(1)引入了自底向上的路径,使得底层信息更容易传到顶部
(2)再引入一条线路,也就是如图p2—>N2这条线路,并且还是一个捷径,红色的没准走个100层(Resnet),绿色的线路只用走几层就到了
V4中PAN特征融合方法
传统的PAN特征融合使用的是addition加法运算,v4中使用的是拼接操作,将部分特征拼接成一块
11、激活函数与整体架构
Mish激活函数
Relu函数在x负半轴特征设置为0,太过于绝对,Mish更加符合实际情况,但是会增加计算量,效果会有一定的提升。
公式:
消除网格敏感性eliminate grid sensitivity
这个比较好理解,坐标回归预测值都在0-1之间(网格的相对位置),如果在grid边界怎么表示?
从图像可以看出sigmoid函数很难达到1和0,需要非常大的数值才可以达到边界。
为了缓解这种情况可以在激活函数前加上一个系数(大于1的),让坐标更容易达到1,方法如下:
整体架构
它采用了一种基于卷积神经网络的端到端的架构。整体架构可以分为三个主要组件:主干网络、特征金字塔网络和预测头。
1、主干网络:YOLOv4使用了一个强大的主干网络作为特征提取器。主干网络通常使用预训练的卷积神经网络,如Darknet-53等,来提取输入图像的特征。这些特征将被传递到接下来的组件中进行进一步处理。
2、特征金字塔网络:特征金字塔网络用于处理来自主干网络的特征,并提取多尺度的特征。这样可以在不同尺度上检测目标,从而提高检测的准确性。YOLOv4使用了一个特殊的特征金字塔网络,称为SPP(Spatial Pyramid Pooling),它可以在不同尺度上提取特征,并将它们融合在一起。
3、预测头:预测头是YOLOv4的最后一部分,用于预测目标的位置和类别。它根据特征金字塔网络输出的特征图进行预测。YOLOv4使用了一种称为YOLOv3的预测头结构,该结构包括多个不同尺度上的预测层。每个预测层预测一组边界框的位置和类别,并使用锚框来调整预测结果。
总的来说,YOLOv4的整体架构通过主干网络提取特征,特征金字塔网络提取多尺度的特征,并使用预测头进行目标的位置和类别预测。这种端到端的设计使得YOLOv4在目标检测任务中具有较高的准确性和实时性能。