Yolov5-模型配置文件(yolov5l.yaml)讲解

配置文件: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
  1. nc:类别数,你的类别有多少就填写多少。从1开始算起,不是0-14这样算。

  2. depth_multiple:控制模型的深度。

  3. 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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

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

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年8月16日
下一篇 2023年8月16日

相关推荐