配置文件:github.com/ultralytics/

一、参数部分

这部分比较简单,以下是yolov5l的配置文件

# Parameters

nc: 80 # number of classes

depth_multiple: 1.0 # model depth multiple

width_multiple: 1.0 # layer channel 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

nc:类别数,你的类别有多少就填写多少。从1开始算起,不是0-14这样算。 depth_multiple:控制模型的深度。 width_multiple:控制卷积核的个数。

yolov5提供了s、m、l、x四种,所有的yaml文件都设置差不多,只有上面2和3的设置不同,作者团队很厉害,只需要修改这两个参数就可以调整模型的网络结构。

yaml文件的内容会在yolo.py中进行调用,只需要修改"width_multiple"和"depth_multiple"两个参数就可以,可以灵活地修改网络的结构,具体分析如下。

第一部分是三个参数,第一个是数据集中的类别数. 第二个用来调整网络的深度. 第三个用来调整网络的宽度,具体怎么调整的结合后面的backbone代码解释。

depth_multiple和width_multiple用来生成不同大小的模型,如果希望大一点,就把这个数字改大一点,网络就会按比例变深、变宽;如果希望小一点,就把这个数字改小一点,网络就会按比例变浅、变窄;如下。

# Parameters

nc: 80 # number of classes

depth_multiple: 0.33 # model depth multiple

width_multiple: 0.50 # layer channel 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

Yolov5的源码中,是将yolov5s的结构封装在"yolov5s.yaml"中,但是他没有单独写neck,将neck分开在了backbone和head里面。

二、网络backbone部分

以下是常规yolov5l的backbone部分

四个参数的意义分别是:

第一个参数 from :从哪一层获得输入,-1表示从上一层获得,[-1, 6]表示从上层和第6层两层获得。 第二个参数 number:表示有几个相同的模块,如果为9则表示有9个相同的模块。 第三个参数 module:模块的名称,这些模块写在common.py中。 第四个参数 args:这个参数就与第一部分的"width_multiple"参数有关了,上面把width_multiple设置为了0.5,那么第一个 [64, 6, 2, 2] 就会被解析为[3,64*0.5=32,6,2,2], 其中第一3为输入channel(因为输入),32为输出channel。(具体可以通过第三个参数(module) 在common.py文件中找到对应传入参数。)

# YOLOv5 v6.0 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]],

[-1, 1, Conv, [256, 3, 2]], # 3-P3/8

[-1, 6, C3, [256]],

[-1, 1, Conv, [512, 3, 2]], # 5-P4/16

[-1, 9, C3, [512]],

[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32

[-1, 3, C3, [1024]],

[-1, 1, SPPF, [1024, 5]], # 9

]

a. Bottleneck 可以译为“瓶颈层”;b. from列参数:-1 代表是从上一层获得的输入,-2表示从上两层获得的输入(head同理);c. number列参数:1表示只有一个,3表示有三个相同的模块;d. SPP、Conv、Bottleneck、BottleneckCSP的代码可以在./models/common.py中获取到;e. [64, 3] 解析得到[3, 32, 3] ,输入为3(RGB),输出为32,卷积核k为3;f. [128, 3, 2] 这是固定的,128表示输出128个卷积核个数。根据 [128, 3, 2] 解析得到[32, 64, 3, 2] ,32是输入,64是输出(128*0.5=64),3表示3×3的卷积核,2表示步长为2;g. 主干网是图片从大到小,深度不断加深;h. args这里的输入都省去了,因为输入都是上层的输出。为了修改过于麻烦,这里输入的获取是从./models/yolo.py的def parse_model(md, ch)函数中解析得到的。

**yolov5会按照配置文件实例化各个层,每行的列表中的四个元素分别代表:[from, number, module, args],

from:该层的输入number:该层的数量module:类名args:类的初始化参数

**

三、anchors解释

anchors:

- [10,13, 16,30, 33,23] # P3/8,检测小目标,10,13是一组尺寸,总共三组检测小目标

- [30,61, 62,45, 59,119] # P4/16,检测中目标,共三组

- [116,90, 156,198, 373,326] # P5/32,检测大目标,共三组

该anchor尺寸是为输入图像640×640分辨率预设的,实现了即可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标。三种尺寸的特征图,每个特征图上的格子有三个尺寸的anchor。

四,结合流程图理解

超参数

初始化超参 YOLOv5的超参文件见data/hyp.finetune.yaml(适用VOC数据集)或者hyo.scrach.yaml(适用COCO数据集)文件

lr0: 0.01 # 初始学习率 (SGD=1E-2, Adam=1E-3)

lrf: 0.2 # 循环学习率 (lr0 * lrf)

momentum: 0.937 # SGD momentum/Adam beta1 学习率动量

weight_decay: 0.0005 # 权重衰减系数

warmup_epochs: 3.0 # 预热学习 (fractions ok)

warmup_momentum: 0.8 # 预热学习动量

warmup_bias_lr: 0.1 # 预热初始学习率

box: 0.05 # iou损失系数

cls: 0.5 # cls损失系数

cls_pw: 1.0 # cls BCELoss正样本权重

obj: 1.0 # 有无物体系数(scale with pixels)

obj_pw: 1.0 # 有无物体BCELoss正样本权重

iou_t: 0.20 # IoU训练时的阈值

anchor_t: 4.0 # anchor的长宽比(长:宽 = 4:1)

# anchors: 3 # 每个输出层的anchors数量(0 to ignore)

#以下系数是数据增强系数,包括颜色空间和图片空间

fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)

hsv_h: 0.015 # 色调 (fraction)

hsv_s: 0.7 # 饱和度 (fraction)

hsv_v: 0.4 # 亮度 (fraction)

degrees: 0.0 # 旋转角度 (+/- deg)

translate: 0.1 # 平移(+/- fraction)

scale: 0.5 # 图像缩放 (+/- gain)

shear: 0.0 # 图像剪切 (+/- deg)

perspective: 0.0 # 透明度 (+/- fraction), range 0-0.001

flipud: 0.0 # 进行上下翻转概率 (probability)

fliplr: 0.5 # 进行左右翻转概率 (probability)

mosaic: 1.0 # 进行Mosaic概率 (probability)

mixup: 0.0 # 进行图像混叠概率(即,多张图像重叠在一起) (probability)

网络结构

接下来可以通过运行python models/yolo.py 脚本得到网路结构,结果如下:

yolo: cfg=yolov5s.yaml, batch_size=1, device=, profile=False, line_profile=False, test=False

YOLOv5  v6.1-383-g7a40e2b Python-3.8.13 torch-1.10.0+cu113 CUDA:0 (NVIDIA GeForce RTX 3080 Ti, 12054MiB)

from n params module arguments

0 -1 1 3520 models.common.Conv [3, 32, 6, 2, 2]

1 -1 1 18560 models.common.Conv [32, 64, 3, 2]

2 -1 1 18816 models.common.C3 [64, 64, 1]

3 -1 1 73984 models.common.Conv [64, 128, 3, 2]

4 -1 2 115712 models.common.C3 [128, 128, 2]

5 -1 1 295424 models.common.Conv [128, 256, 3, 2]

6 -1 3 625152 models.common.C3 [256, 256, 3]

7 -1 1 1180672 models.common.Conv [256, 512, 3, 2]

8 -1 1 1182720 models.common.C3 [512, 512, 1]

9 -1 1 656896 models.common.SPPF [512, 512, 5]

10 -1 1 131584 models.common.Conv [512, 256, 1, 1]

11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']

12 [-1, 6] 1 0 models.common.Concat [1]

13 -1 1 361984 models.common.C3 [512, 256, 1, False]

14 -1 1 33024 models.common.Conv [256, 128, 1, 1]

15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']

16 [-1, 4] 1 0 models.common.Concat [1]

17 -1 1 90880 models.common.C3 [256, 128, 1, False]

18 -1 1 147712 models.common.Conv [128, 128, 3, 2]

19 [-1, 14] 1 0 models.common.Concat [1]

20 -1 1 296448 models.common.C3 [256, 256, 1, False]

21 -1 1 590336 models.common.Conv [256, 256, 3, 2]

22 [-1, 10] 1 0 models.common.Concat [1]

23 -1 1 1182720 models.common.C3 [512, 512, 1, False]

24 [17, 20, 23] 1 229245 Detect [80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]

YOLOv5s summary: 270 layers, 7235389 parameters, 7235389 gradients, 16.6 GFLOPs

Fusing layers...

YOLOv5s summary: 213 layers, 7225885 parameters, 7225885 gradients, 16.4 GFLOPs

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。