最近在修改YOLO v5一些模型时候或者加入一些新的东西进去,发现YOLO v5的模型文件也需要我们非常熟悉,这样添加模块就不会出现错误.
YOLO v5的配置文件为yaml类型,yolov5.yaml文件通过yolo.py解析文件配置模型的网络结构。yaml文件配置网络的好处是十分的方便不需要像YOLO v3的config设置网络一样进行叠加,只需要在yaml配置文件中的参数进行修改即可。然后我对YOLO v5的配置文件最近进行了梳理与应用。
从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
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
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
head部分的参数解析可以参考backbone的代码注释,这里就不一一注释了。
如果文章有不足之处,还需大家多多指点,自己也是刚入门不就YOLO v5,如果depth_multiple和 width_multiple 的大小进行修改,那么模块参数args分析中一些数值也需要修改,其实道理都是一样的。