YOLO v5模型的yaml文件参数理解

YOLO v5模型的yaml文件参数理解

前言

最近在修改YOLO v5一些模型时候或者加入一些新的东西进去,发现YOLO v5的模型文件也需要我们非常熟悉,这样添加模块就不会出现错误.

一、YOLO v5网络配置文件

YOLO v5的配置文件为yaml类型,yolov5.yaml文件通过yolo.py解析文件配置模型的网络结构。yaml文件配置网络的好处是十分的方便不需要像YOLO v3的config设置网络一样进行叠加,只需要在yaml配置文件中的参数进行修改即可。然后我对YOLO v5的配置文件最近进行了梳理与应用。

1.模型深度与宽度

从github拉一下代码文件,数据集配置的文件在data文件目录下,YOLO v5模型的配置文件在models文件下,我们会看到四个YOLO v5模型的配置文件yolov5s.yaml、yolov5n.yaml、yolov5m.yaml、yolov5l.yaml,我就以yolov5s.yaml讲解一下模型配置文件的参数

nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

nc: 目标的类别数目,也是你数据集中类别标签的数目。
depth_multiple:模型深度(控制模块的数量),当模块的数量number不为1时,模块的数量= depth_multiple * number。
width_multiple:模型的宽度(控制卷积核的数量), 卷积核的数量= 数量*width_multiple

2. anchors

anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

YOLO v5已经在yolov5s.yaml预设好了输入图像为640*640分辨率对应的anchor尺寸,yolov5的anchor也是在大特征图上检测小目标,在小特征图上检测大目标。三个特征图,每个特征图上的格子有三种尺寸的anchor。
其实还可以随机生成3中的不同检测框,可以用一下代码来代替:

anchors: 3

二、网络结构部分

1.Backbone

backbone:
  # [from, number, module, args]                                 
  [[-1, 1, Conv, [64, 6, 2, 2]],                     # 0-P1/2      
   [-1, 1, Conv, [128, 3, 2]],                       # 1-P2/4      
   [-1, 3, C3, [128]],                               # 2          
   [-1, 1, Conv, [256, 3, 2]],                       # 3-P3/8      
   [-1, 6, C3, [256]],                               # 4           
   [-1, 1, Conv, [512, 3, 2]],                       # 5-P4/16     
   [-1, 9, C3, [512]],                               # 6           
   [-1, 1, Conv, [1024, 3, 2]],                      # 7-P5/32     
   [-1, 3, C3, [1024]],                              # 8          
   [-1, 1, SPPF, [1024, 5]],                         # 9           
  ]

[from, number, module, args]
from: 输入来自哪一层, -1表示输入来自上一层,-2代表输入上面两层,3代表输入来自第三层
number: 卷积核的数量,最终卷积核的数量需要乘以width_multiple
module: 模块名称,在backbone中模块名称分别有:Conv、C3、SPPF。
我们取其中的某一层来说明:

 [-1, 1, Conv, [128, 3, 2]],                       # 1-P2/4

后面注释语句中为 # 1-P2/4 说明该层是第一层
对于[-1, 1, Conv, [128, 3, 2]]这一层来说中的[from, number, module, args] 对应为
form: -1
number: 1
module: Conv
args: [128, 3, 2]
对于第0层来说,[-1, 1, Conv, [64, 6, 2, 2]]的模块参数args分析[64,6,2,2]会被解析成[3,32,6,2,2],接下来看看为什么解析成这样,64代表卷积核的数量,最终的卷积核数量要乘以width_multiple,也是就64*0.5=32(也就是本层输出的维度),6为卷积核大小,2位卷积核的步长。第一个解析成3(本层的输入维度)因为输入的图像是彩色的RGB3通道的。
其它层的解析参数也是这个道理,如果参数里没有卷积核的步长和大小就默认为1。于是我把其他层在代码中给注释出来,大家可以参考我的注释代码。

backbone:
  # [from, number, module, args]                                   [输入,输出,卷积核大小,步长]
  [[-1, 1, Conv, [64, 6, 2, 2]],                     # 0-P1/2      [3, 32, 6, 2, 2]
   [-1, 1, Conv, [128, 3, 2]],                       # 1-P2/4      [32, 64, 3, 2]     卷积核的数量=128*width_multiple=64
   [-1, 3, C3, [128]],                               # 2           [64, 64, 1]        最终的模块数量=3*depth_multiple=1
   [-1, 1, Conv, [256, 3, 2]],                       # 3-P3/8      [64, 128, 3, 2]
   [-1, 6, C3, [256]],                               # 4           [128, 128, 2 ]
   [-1, 1, Conv, [512, 3, 2]],                       # 5-P4/16     [128, 256, 3, 2]
   [-1, 9, C3, [512]],                               # 6           [256, 256, 3]
   [-1, 1, Conv, [1024, 3, 2]],                      # 7-P5/32     [256, 512, 3, 2]
   [-1, 3, C3, [1024]],                              # 8           [512, 512, 1]
   [-1, 1, SPPF, [1024, 5]],                         # 9           [512, 512, 5]
  ]

# YOLOv5 v6.0 head

2.head部分

head部分的参数解析可以参考backbone的代码注释,这里就不一一注释了。

总结

如果文章有不足之处,还需大家多多指点,自己也是刚入门不就YOLO v5,如果depth_multiple和 width_multiple 的大小进行修改,那么模块参数args分析中一些数值也需要修改,其实道理都是一样的。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年2月26日 上午10:30
下一篇 2023年2月26日 上午10:34

相关推荐