[图像算法]-Yolov5代码解释(yolov5l.Yaml)

YOLOv5代码详解 (第三部分)

  • [3. yolov5l.yaml]
  • [3.1 yaml介绍]
  • [3.2 parameters]
  • [3.3 anchors]
  • [3.4 backbone]
  • [3.5 head]
在这里插入图片描述

贴出一张最近更新的网络结构图,方便读者理解。

3. yolov5l.yaml

这部分属于代码中的配置文件。该代码是xxxx.yaml使用配置文件,通过./models/yolo.py解析文件加了一个输入构成的网络模块。

与config设置的网络不同,不需要进行叠加, **只需要在配置文件中对number进行修改即可 **。

特别说明是2020.7.4更新的那一版。

3.1 yaml介绍

  1. YAML(YAML Ain`t Markup language)文件, **它不是一个标记语言 **。配置文件有xml、properties等,但 **YAML是以数据为中心 **,更适合做配置文件。
  2. YAML的语法和其他高级语言类似,并且可以 **简单表达清单、散列表,标量 **等数据形态。
  3. 它使用 **空白符号缩进 **和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。 yaml介绍
  4. 大小写敏感;缩进不允许使用tab,只允许空格;缩进的空格数不重要,只要相同层级的元素左对齐即可;’#'表示注释;使用缩进表示层级关系。

**注意 **,在yaml文件中空格数其实也是重要的!在建立YAML 对象时,对象键值对使用冒号结构表示 key: value, **冒号后面要加一个空格 **。

3.2 parameters

# parameters
nc: 15 # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

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

**depth_multiple **是用在 **backbone **中的 **number≠1的情况下, **即在Bottleneck层使用,控制模型的深度,yolov5s中设置为0.33,假设yolov5l中有三个Bottleneck,那yolov5s中就只有一个Bottleneck。
因为一般 **number=1 **表示的是 **功能背景的层 **,比如说下采样Conv、Focus、SPP(空间金字塔池化)。
——————————————————————————————————————
**width_multiple **主要是用于设置arguments,例如yolov5s设置为0.5,Focus就变成[32, 3],Conv就变成[64, 3, 2]。
以此类推,卷积核的个数都变成了设置的一半。

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

3.3 anchors

# anchors
anchors:
  - [116,90, 156,198, 373,326]  # P5/32
  - [30,61, 62,45, 59,119]  # P4/16
  - [10,13, 16,30, 33,23]  # P3/8

根据你的检测层相应增加anchors。

3.4 backbone

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, BottleneckCSP, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 9, BottleneckCSP, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, BottleneckCSP, [512]],
   [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
   [-1, 1, SPP, [1024, [5, 9, 13]]],
  ]

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

3.5 head

**head检测头 **:一般表示的是经过主干网后输出的特征图,特征图输入head中进行检测,包括类别和位置的检测。

这里改成了PANet head。

# YOLOv5 head
head:
  [[-1, 3, BottleneckCSP, [1024, False]],  # 9

   [-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, BottleneckCSP, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, BottleneckCSP, [256, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 18 (P3/8-small)

   [-2, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, BottleneckCSP, [512, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 22 (P4/16-medium)

   [-2, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, BottleneckCSP, [1024, False]],
   [-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]],  # 26 (P5/32-large)

   [[], 1, Detect, [nc, anchors]],  # Detect(P5, P4, P3)
  ]

贴出一张解析图,与上面的模型不太一样。


在这里插入图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容