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

慈云数据 2024-03-12 技术支持 112 0

配置文件: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
      
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon