YOLO中yaml文件解读
当我们使用yolo系列去做视觉方面的研究时,都会进行模型的训练,在yolo基础上进行模块的替换之后需要设置对应的yaml文件,但是yaml文件中的参数分别代表什么,应该如何调试是至关重要的。
参数解读
如下所示是yolov8的yaml文件中的backbone:
YOLOv8.0n backbone
backbone:
[from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
from: 表示该层的输入来源。它可以是一个整数,表示前一层的索引,或者是一个字符串,表示前一层的名称。这个参数用于指定该层的输入来自于哪一层。
-1表示该层的输入是上一层;
repeats:表示该层的重复次数。有些backbone网络的某些层会被堆叠多次,通过设置repeats参数来指定重复的次数。
modules:表示该层所使用的模块或组件的类型。可以是一个字符串,表示该层的类型,如"convolutional"(卷积层)、“maxpool”(最大池化层)等。
args比较重要:表示该层的其他参数,以字典的形式给出。这些参数包括卷积核大小、通道数、步幅、填充等,具体取决于该层所使用的模块类型。
举个例子:
如下图所示的Conv卷积的参数为[64,3,2],也就是说,这些参数在初始化Conv时将模块的形参进行了更新。
首先可以在YOLO的nn/modules/conv.py中找到如下图所示的Conv的代码:
我们首先需要了解,在模块初始化时,这些模块的参数的作用:
c1 :表示输入通道数,即输入特征图的深度或通道数。它决定了输入特征图的形状。
c2 :表示输出通道数,即卷积层中卷积核的数量,也是输出特征图的深度或通道数。它决定了输出特征图的形状。
k:表示卷积核的大小或尺寸。在这里,k 是一个整数,表示卷积核的高度和宽度相等。例如,k=3 表示使用一个 3x3 的卷积核。
s:表示卷积的步幅(stride),即卷积核在输入特征图上滑动的步长。默认情况下,步幅为 1,表示卷积核每次滑动一个像素。如果设置 s=2,则卷积核每次滑动两个像素。
p:表示卷积的填充(padding)。填充是在输入特征图周围添加额外的像素,以控制输出特征图的大小。p 可以是一个整数,表示在每个边缘添加相同数量的填充像素,也可以是一个元组 (p1, p2),其中 p1 表示在高度方向的填充数,p2 表示在宽度方向的填充数。默认情况下,没有填充。
g:表示分组卷积(group convolution)中的分组数。默认为 1,表示标准的卷积操作。当 g 大于 1 时,卷积核被分成 g 个子组,每个子组进行独立的卷积操作。分组卷积可以降低计算量,减少参数数量。
d:表示卷积操作的扩张(dilation)。扩张卷积是通过在卷积核元素之间添加间隔来增加感受野的。d 的默认值为 1,表示标准的卷积操作。当 d 大于 1 时,卷积核元素之间会有间隔。
之后,我们譬如再来讲字典[64,3,2]所传的参数,在传参数时,模块的c1表示当前层的输入,来源于上一层的输出,是不参与字典中的数据传输的,从c2这个形参开始,64代表c2 = 64, k = 3, s = 1;
一般的数据都是从c2开始依次传输。