文章目录[隐藏]
一、与yoloV4相比,yoloV5的改进
- 输入端:在模型训练阶段,使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放
- 基准网络:使用了FOCUS结构和CSP结构
- Neck网络:在Backbone和最后的Head输出层之间插入FPN_PAN结构
- Head输出层:训练时的损失函数GIOU_Loss,预测筛选框的DIOU_nns
二、yoloV5结构框架
CBL:CBL模块是由Conv+BN+Leaky_relu激活函数组成
Res unit:借鉴ResNet中的残差结构,用来构建深层网络,CBM是残差模块中的子模块
CSP1_X:借鉴CSPNet网络结构,由CBL,Res unit,卷积层,Concate组成
CSP2_X:借鉴CSPNet网络结构,由卷积层积X个Res unit模块Concate组成
FOCUS:将多个slice结果Concate起来,将其送入CBL模块中
SPP:采用1x1,5x5,9x9和13x13的最大池化方式,进行多尺度融合
三、Mosaic数据增强
CutMix:将2张图进行拼接
Mosaic:在CutMix基础上进行改进,采用4张图片,按照随机缩放,随机裁剪和随机排布的方式进行拼接
优点:将几张图组合成一张图,不仅可以丰富数据集,极大的提升网络训练速度,降低模型内存
四、自适应锚框计算(可选)
在yolo系列算法中,针对不同的数据集,都需要设定特定长宽的锚点框。在网络训练阶段,模型在初始阶段,模型在初始锚点框的基础上输出对应的预测框,计算其与GT框之间的差距,并执行反向更新操作,从而更新整个网络的参数,因此设定初始锚点框是比较关键的一环。
在yoloV3和yoloV4中,训练不同的数据集,都是通过单独的程序运行来获得初始锚点框。而在yoloV5中将此功能嵌入到代码中,每次训练,根据数据集的名称自适应的计算出最佳的锚点框,用户可以根据自己的需求将功能关闭或者打开,指令为:
parser.add_argument("-nuautoanchor", action='store_true', help='disable autoancher check') # 如果需要打开,只需要在训练代码时增加'-nuautoanchor'选项即可
五、自适应图片放缩
yolo中常用图片尺寸:416x416, 608x608
存在问题:实际图片长宽比例不同,放缩填充后可能填充过多造成冗余
在yoloV5中,设原图长x宽=800x600,放缩过程如下:
计算黑边填充数值:
- 计算需要填充黑边宽度:104
- yoloV5执行5次下采样:2^5=32,对该数值取模:104%32=8
- 将填充区域分散到两边:8/2=4
六、FOCUS结构
FOCUS模块在yoloV5中是在图片进入backbone前,对图片进行切片操作,具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了4张图片,四张图片互补,长的差不多,但是没有信息丢失,这样使得W,H信息就集中到了通道空间,输入通道扩充了4倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
以yoloV5为例,原始的640x640x3的图像输入FOCUS结构,采用切片操作,先变成320x320x12的特征图,再经过一次卷积操作,最终变成320x320x32的特征图。
七、CSP结构
yoloV4中,借鉴了CSPNet的设计思路,尽在主干网络中设计了CSP结构。
yoloV5设计了两种CSP结构,以yoloV5为例:
- CSP1_X结构应用于Backbone主干网络中
- CSP2_X结构应用于Neck网络中
CSP结构介绍:
CSPNet和PRN都是一个思想,将feature map拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate。
从实验结果来看,分类问题中,使用CSPNet可以降低计算量,但是准确率提升很小;在目标检测问题中,使用CSPNet作为Backbone带来的提升比较大,可以有效增强CNN的学习能力,同时也降低了计算量。
以下是将CSPNet融入ResNet的结构图:
八、采用FPN+PAN结构
yoloV5的Neck仍采用了FPN+PAN结构,但是在它的基础上做了一些改进操作,yoloV4的Neck结构中,采用的都是普通的卷积操作,而yoloV5的Neck中,采用CSPNet设计的CSP2结构,从而加强了网络特征融合能力。以下是yoloV4和yoloV5的Neck网络的具体细节:
通过比较可以发现:
- 灰色区域,yoloV5不仅利用CSP结构代替部分CBL模块,而且去掉了下方的CBL模块
- 绿色区域,yoloV5不仅将Concate操作之后的CBL模块更换为CSP模块,而且更换了另一个CBL模块的位置
- 蓝色区域,yoloV5中将原始的CBL模块更换为CSP模块
九、采用GIoU_Loss做Bounding box的损失函数
目标检测任务的损失函数一般由分类损失函数和回归损失函数构成,回归损失函数的发展过程主要包括:最原始的Smooth L1 Loss函数、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函数。
-
IoU Loss:即预测框与GT框之间的交集/预测框与GT框之间的并集。这种损失存在一些问题:
(1)如状态1所示,当预测框和GT框不相交时,即IoU=0,此时无法反映两个框之间的距离,此时该损失函数不可导,即IoU Loss无法优化两个框不相交的情况。(2)如状态2和状态3所示,当两个预测框大小相同时,那么这两个IoU也相同,IoU Loss无法区分两者相交这种情况。
-
GIoU Loss:为了解决以上的问题,GIoU损失应运而生,GIoU Loss中增加了相交尺度的衡量方式,缓解了单纯IoU Loss时存在的一些问题。
但是这种方法并不能完全解决这种问题,仍然存在着其他的问题。具体的问题如下所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIoU值也都是相同的,这时GIoU退化成了IoU,无法区分相对位置关系。 -
DIoU Loss:针对IoU和GIoU损失所存在的问题,DIoU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIoU Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIoU Loss的收敛速度更快一些。
如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按照DIoU Loss的计算公式,三者的值都是相同的。为了解决这个问题,CIoU Loss产生了。
-
CIoU Loss:在DIoU Loss的基础上增加了一个影响因子,将预测框和GT框的长宽也考虑进来。计算方法如下:将GT框的重叠面积、中心点距离和长宽比全部考虑进来。
版权声明:本文为CSDN博主「易水潇潇666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40373651/article/details/121501699
暂无评论