文章目录[隐藏]
1、网络结构图
(1)输入端 :Mosaic数据增强、自适应锚框计算、自适应图片缩放
(2)Backbone :Focus结构,CSP结构
(3)Neck :FPN+PAN结构
(4)Prediction :GIOU_Loss
(1)输入端
Mosiac数据增强
自适应锚框计算
在Yolo算法中,针对不同的数据集,都会有初始设定长宽的锚框。在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算两者差距,再反向更新,迭代网络参数。
在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。
但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。
当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。
自适应图片缩放
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。比如Yolo算法中常用416416,608608等尺寸,缩放后仍然会保持原来的长宽比,只是对缺少的部分用黑边或者灰边填充,使用letterbox函数。
作者认为,在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。
因此在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
注意,由于yolo网络经过5次下采样后,缩减为32倍,因为要保证图片尺寸为32的倍数。
(2)backbone
Focus结构
比如上图的切片示意图,443的图像切片后变成2212的特征图。
以Yolov5s的结构为例,原始6086083的图像输入Focus结构,采用切片操作,先变成30430412的特征图,再经过一次32个卷积核的卷积操作,最终变成30430432的特征图。
YOLOv5s在focus中最后使用32个卷积核,而剩下m,l,x逐渐增多。
CSP结构
Yolov5与Yolov4不同点在于,Yolov4中只有主干网络使用了CSP结构。
而Yolov5中设计了两种CSP 结构,以Yolov5s网络为例,CSP1_X 结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中 。
(3)Neck
Yolov5的Neck和Yolov4中一样,都采用FPN+PAN的结构。
Yolov5和Yolov4的不同点在于,Yolov4的Neck结构中,采用的都是普通的卷积操作。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,加强网络特征融合的能力。
(4)输出端
ciou_loss
diou_nms
它对于一些遮挡重叠的目标 ,确实会有一些改进。
2、YOLOv5的四种网络结构
Yolov5代码中的四种网络,和之前的Yolov3,Yolov4中的cfg文件不同,都是以yaml的形式来呈现。
(1)Yolov5s.yaml
(2)Yolov5m.yaml
(3)Yolov5l.yaml
(4)Yolov5x.yaml
而且四个文件的内容基本上都是一样的,只有最上方的depth_multiple和width_multiple两个参数不同,来进行控制网络的深度和宽度 。四种结构的yaml文件中,下方的网络架构代码都是一样的。
(1)不同的网络深度
需要注意的是,四种网络结构中每个CSP结构的深度都是不同的。
以yolov5s为例,第一个CSP1中,使用了1个残差组件,因此是CSP1_1。而在Yolov5m中,则增加了网络的深度,在第一个CSP1中,使用了2个残差组件,因此是CSP1_2。
(2)如何利用代码控制深度
控制四种网络结构的核心代码是yolo.py中下面的代码,存在两个变量,n和gd 。我们再将n和gd带入计算,看每种网络的变化结果。
下面是对该公式的说明:
以YOLOv5s为例,它的depth_multiple=0.33 ,即gd=0.33 ,而n则由上面红色框中的信息获得,是number那一列,分别是3,9, 9。
代入公式的,gd=0.33,带入(2)中的计算代码,结果n=1。因此第一个CSP1结构内只有1个残差组件,即CSP1_1。
第二个CSP1结构中,n等于第二个数值9,而gd=0.33,带入(2)中计算,结果n=3,因此第二个CSP1结构中有3个残差组件,即CSP1_3。
(3)YOLOv5的网络宽度(即卷积核的个数,也即特征图的厚度)
如上图表格中所示,四种yolov5结构在不同阶段的卷积核的数量都是不一样的,因此也直接影响卷积后特征图的第三维度,即厚度 ,表示为网络的宽度 。
以Yolov5s结构为例,第一个Focus结构中,最后卷积操作时,卷积核的数量是32个,因此经过Focus结构,特征图的大小变成30430432。
(4)如何利用代码控制宽度
在yolov5的代码中,控制宽度的核心代码是yolo.py文件里面的这一行:
它所调用的子函数make_divisible的功能是:
这里以YOLOv5s为例,
它的width_multiple=0.5 ,即gw=0.5 。
以第一个卷积下采样为例,即Focus结构中下面的卷积操作。按照上面Backbone的信息,我们知道Focus中,标准的c2=64,而gw=0.5,代入(4)中的计算公式,最后的结果=32。即Yolov5s的Focus结构中,卷积下采样操作的卷积核数量为32个。再计算后面的第二个卷积下采样操作,标准c2的值=128,gw=0.5,代入(4)中公式,最后的结果=64,也是正确的。
版权声明:本文为CSDN博主「weixin_43981952」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43981952/article/details/121277028
暂无评论