YOLOV5入门教程-yolov5s.yaml文件

一、YAML的定义

YAML(YAML Ain't Markup Language)是一种人类友好的数据序列化格式,用于表示数据结构和配置文件。以下是 YAML 文件的一些概述信息:

可读性强:YAML 使用缩进和结构化方式来表示数据,易于阅读和编写。它注重易读性,鼓励使用人类可读的格式。

轻量级:YAML 是一种轻量级的标记语言,相对于 XML 和 JSON,它更简洁、易理解,适合表示复杂的数据结构。

支持数据类型:YAML 支持常见的数据类型,如字符串、整数、浮点数、布尔值、列表和对象(映射),可以灵活地表示各种数据结构。

扩展性:YAML 具有很强的扩展性,可以通过自定义标签和类型来扩展其功能,满足不同应用场景的需求。

用途广泛:YAML 文件常用于配置文件、数据传输、API 接口定义、服务器管理和版本控制等领域,易于与各种编程语言和工具进行集成和解析。

二、参数设定

# Parameters
nc: 80 # number of classes #数据种类
depth_multiple: 0.33 # model depth multiple #控制层的重复次数
width_multiple: 0.50 # layer channel multiple #控制输出特征图的通道数
  1. nc: 80

    • 解释: 这个参数表示模型需要检测的目标类别数。在COCO数据集上,nc通常设置为80,因为COCO数据集包含80个类别。
    • 用途: 决定了模型输出层的维度大小,即每个特征点的预测类别数量。
  2. depth_multiple: 0.33

    • 解释: 这个参数控制模型的深度,是一个深度倍率系数。它通过调整每个模块(例如卷积层、残差块等)的重复次数,来影响模型的深度。
    • 用途: 在不同规模的YOLO模型中(例如YOLOv5s, YOLOv5m, YOLOv5l等),通过调整depth_multiple可以生成不同深度的模型。较大的值会生成更深的网络,捕捉更多的特征,但也会增加计算成本。
  3. width_multiple: 0.50

    • 解释: 这个参数控制模型每一层输出特征图的通道数,是一个宽度倍率系数。它通过调整每一层的通道数来影响模型的宽度。
    • 用途: 类似于深度倍率,不同的YOLO模型通过调整width_multiple来生成不同宽度的模型。较大的值会增加每一层的通道数,从而增加模型的表达能力,但也会增加计算和内存的需求。

这些参数允许用户在YOLOv5模型的规模、计算复杂度和性能之间进行权衡,以满足不同应用场景的需求。例如,较小的模型(如YOLOv5s)使用较小的depth_multiplewidth_multiple,适用于资源受限的环境,而较大的模型(如YOLOv5x)则使用更大的系数,适用于对精度要求较高的场景。

三、先验框(anchors)配置

#先验配置框
anchors: #9个anchor,其中P表示特征图的层级,P3/8该特征图缩放为1/8 是第三层特征
  - [10, 13, 16, 30, 33, 23] # P3/8 检测小网络 52*52
  - [30, 61, 62, 45, 59, 119] # P4/16 检测中目标 26*26
  - [116, 90, 156, 198, 373, 326] # P5/32 检测大目标 13*13

先验框(anchors)配置

  1. anchors:

    • YOLOv5中使用了9个先验框,这些框分布在三个不同的特征图层上,分别用于检测不同大小的目标。
  2. P3/8(52x52特征图):

    • anchors[10, 13, 16, 30, 33, 23]
    • 解释: 这些anchor用于P3/8层的特征图上,这一层的特征图是原始输入图像下采样8倍得到的,尺寸通常为52x52。这个层级的特征图适合检测小目标。
  3. P4/16(26x26特征图):

    • anchors[30, 61, 62, 45, 59, 119]
    • 解释: 这些anchor用于P4/16层的特征图上,这一层的特征图是原始输入图像下采样16倍得到的,尺寸通常为26x26。这个层级的特征图适合检测中等大小的目标。
  4. P5/32(13x13特征图):

    • anchors[116, 90, 156, 198, 373, 326]
    • 解释: 这些anchor用于P5/32层的特征图上,这一层的特征图是原始输入图像下采样32倍得到的,尺寸通常为13x13。这个层级的特征图适合检测大目标。

作用

  • 多尺度检测: 通过在不同尺度的特征图上使用不同大小的先验框,YOLOv5能够在一次前向传播中检测出不同大小的目标。这种多尺度的特征图和anchor设置,使得YOLOv5在检测小目标、中等目标和大目标时都具有较好的性能。

  • anchors匹配目标: 在训练过程中,模型会尝试将预测的边界框与这些预定义的anchors进行匹配,通过调整和学习anchors的偏移量来预测最终的目标框。因此,精心设计的anchors能够显著提高模型的检测准确性。

可能会有人和我有一样的疑问,为什么小的特征图对应大的感受野,接下来是我的一些想法。

在目标检测中,特征图的尺寸和检测目标的大小之间有一个重要的关系。特征图尺寸较大时,它通常用于检测较小的目标,这是由卷积神经网络的架构和特征提取过程决定的。以下是为什么小目标特征图尺寸较大的原因:

  1. 高分辨率特征图保留更多细节

    • 小目标通常只占图像中的很小一部分,如果特征图的分辨率太低,可能会导致这些小目标的信息在下采样的过程中丢失。因此,需要较大的特征图尺寸来保留足够的空间分辨率,从而捕捉到这些细节。
  2. 多尺度特征金字塔

    • 在YOLOv5等模型中,特征金字塔用于不同尺度的目标检测。较浅的层(例如P3/8)具有较高的空间分辨率,因为这些层在网络中经过的下采样次数较少,因此特征图的尺寸较大。由于这些层保留了更多的原始图像信息,特别适合用于检测小目标。
  3. 检测小目标需要更多的位置信息

    • 小目标在图像中占据的像素较少,因此为了准确定位这些目标,网络需要在特征图上保持较高的分辨率,以便能够在更精细的尺度上进行定位和分类。
  4. 特征图尺寸与下采样率的关系

    • 特征图的尺寸通常是原始输入图像尺寸的某个比例(例如1/8、1/16、1/32等)。较大的特征图(如1/8)意味着下采样率较小,这样可以更好地保留图像中的细节信息,这对于检测小目标是必要的。

因此,小目标的检测依赖于特征图的高分辨率,这样才能捕捉到足够的细节信息进行准确的检测和定位。较大的特征图尺寸为小目标的检测提供了必要的空间信息和精度。

四、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, 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
  ]

在YOLOv5的配置文件中,backbone部分的每一行都用一个列表来定义网络层或模块。这个列表包含四个元素,分别是 [from, number, module, args],它们的含义如下:

  1. from:

    • 含义: 指定该层或模块的输入来自哪一层的输出。
    • 解释:
      • -1 表示当前层的输入来自上一层的输出。
      • -2 表示当前层的输入来自前两层的输出,以此类推。
      • 还可以是一个列表,如 [-1, -3],表示该层的输入来自两个前面的层,将这些层的输出进行拼接(通常在某些复杂结构中使用,如跨层连接)。
  2. number:

    • 含义: 表示该模块或层重复的次数。
    • 解释:
      • 对于一些复杂的模块(如CSP结构中的C3模块),可以通过这个参数指定在当前层中重复执行多少次。
      • 对于简单的卷积层,如果 number 为1,则该层只执行一次。
  3. module:

    • 含义: 指定使用的模块类型。
    • 解释:
      • 例如,Conv 表示卷积层,C3 表示CSP结构中的一个模块,SPPF 表示空间金字塔池化模块等。
      • 这些模块是在YOLOv5代码中预定义好的,表示不同的神经网络层或结构。
  4. args:

    • 含义: 为该层或模块提供的参数列表。
    • 解释:
      • 例如,对于卷积层(Conv),参数可能包括卷积核的数量、卷积核的大小、步长、填充等。
      • 对于其他模块(如C3或SPPF),参数可能包括输出通道数、池化核大小等。
      • 这些参数会根据模块的类型不同而有所不同,并且它们会直接传递给模块的构造函数。

示例解读

[-1, 1, Conv, [128, 3, 2]]
  • from-1 表示该层的输入来自上一层的输出。
  • number1 表示该层只执行一次。
  • moduleConv 表示这是一个卷积层。
  • args[128, 3, 2],表示该卷积层的参数,其中 128 是输出通道数,3 是卷积核大小,2 是步长。

通过这四个参数,YOLOv5的配置文件可以灵活地定义网络的每一层结构,确保模型的可配置性和灵活性。

backbone的结构

  • 格式说明:
    • 每一行代表一个层或模块,格式为 [from, number, module, args]
    • from: 表示输入来自哪个层的输出,-1表示来自前一层的输出。
    • number: 表示该模块重复的次数。
    • module: 指定使用的模块类型,如ConvC3SPPF等。
    • args: 该模块的参数列表。

具体配置

  1. [-1, 1, Conv, [64, 6, 2, 2]] (第0层,P1/2):

    • 解释: 这一层是一个卷积层(Conv),输入来自前一层(-1),卷积核数量为64,卷积核大小为6,步长为2,填充为2。这个层负责初步的特征提取,特征图下采样到原图的1/2。
  2. [-1, 1, Conv, [128, 3, 2]] (第1层,P2/4):

    • 解释: 这一层也是一个卷积层,输入来自上一层,卷积核数量为128,卷积核大小为3,步长为2。这个层进一步提取特征,同时将特征图下采样到原图的1/4。
  3. [-1, 6, C3, [256]]:

    • 解释: 这一层是一个C3模块,它是YOLOv5中的一个残差结构,包含多个卷积层和跨层连接。这个模块有6个重复单元,卷积核数量为256。它用于提取更高层次的特征,同时保持特征的丰富性。
  4. [-1, 1, Conv, [512, 3, 2]] (第5层,P4/16):

    • 解释: 这是一个卷积层,输入来自上一层,卷积核数量为512,卷积核大小为3,步长为2。这个层进一步下采样特征图,将其缩小到原图的1/16,用于检测中等大小的目标。
  5. [-1, 9, C3, [512]]:

    • 解释: 这一层是一个C3模块,有9个重复单元,卷积核数量为512。继续在较小的特征图上提取更高层次的特征。
  6. [-1, 1, Conv, [1024, 3, 2]] (第7层,P5/32):

    • 解释: 这是一个卷积层,卷积核数量为1024,卷积核大小为3,步长为2。它将特征图进一步下采样到原图的1/32,这对于检测大目标非常重要。
  7. [-1, 3, C3, [1024]]:

    • 解释: 这一层是一个C3模块,有3个重复单元,卷积核数量为1024。用于在较小分辨率的特征图上进一步提取复杂特征。
  8. [-1, 1, SPPF, [1024, 5]]:

    • 解释: 最后一层是SPPF(Spatial Pyramid Pooling - Fast)层,它使用多个不同尺度的池化操作来进一步提取特征并聚合空间信息,卷积核数量为1024,池化核大小为5。这一层有助于提升模型对多尺度目标的感知能力。

详细对上面层的分析

1. 输入图像

  • 输入尺寸: 640 x 640 x 3
  • 说明: 输入是一个3通道的RGB图像,尺寸为640x640。

2. Layer 0: Conv

[-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2 -> 320x320x64
  • from: -1,表示输入来自上一层,即输入图像。

  • number: 1,表示执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [64, 6, 2, 2]

    • 64: 输出通道数。
    • 6: 卷积核大小为6x6。
    • 2: 步长为2,意味着特征图尺寸缩小一半。
    • 2: 填充为2。
  • 输出: 320 x 320 x 64

3. Layer 1: Conv

[-1, 1, Conv, [128, 3, 2]] # 1-P2/4 -> 160x160x128
  • from: -1,表示输入来自上一层(Layer 0)。

  • number: 1,表示执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [128, 3, 2]

    • 128: 输出通道数。
    • 3: 卷积核大小为3x3。
    • 2: 步长为2,特征图尺寸缩小一半。
    • 默认填充为1(因卷积核为3x3,步长为2)。
  • 输出: 160 x 160 x 128

4. Layer 2: C3

[-1, 6, C3, [256]] # -> 160x160x256
  • from: -1,输入来自上一层(Layer 1)。

  • number: 6,表示C3模块重复6次。

  • module: C3,这个模块是YOLOv5中用于捕捉更多特征的模块,它包含残差连接和多个卷积层。

  • args: [256]

    • 256: 输出通道数。
  • 输出: 160 x 160 x 256

5. Layer 3: Conv

[-1, 1, Conv, [512, 3, 2]] # 5-P4/16 -> 80x80x512
  • from: -1,输入来自上一层(Layer 2)。

  • number: 1,表示执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [512, 3, 2]

    • 512: 输出通道数。
    • 3: 卷积核大小为3x3。
    • 2: 步长为2,特征图尺寸缩小一半。
  • 输出: 80 x 80 x 512

6. Layer 4: C3

[-1, 9, C3, [512]] # -> 80x80x512
  • from: -1,输入来自上一层(Layer 3)。

  • number: 9,表示C3模块重复9次。

  • module: C3模块。

  • args: [512]

    • 512: 输出通道数。
  • 输出: 80 x 80 x 512

7. Layer 5: Conv

[-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 -> 40x40x1024
  • from: -1,输入来自上一层(Layer 4)。

  • number: 1,表示执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [1024, 3, 2]

    • 1024: 输出通道数。
    • 3: 卷积核大小为3x3。
    • 2: 步长为2,特征图尺寸缩小一半。
  • 输出: 40 x 40 x 1024

8. Layer 6: C3

[-1, 3, C3, [1024]] # -> 40x40x1024
  • from: -1,输入来自上一层(Layer 5)。

  • number: 3,表示C3模块重复3次。

  • module: C3模块。

  • args: [1024]

    • 1024: 输出通道数。
  • 输出: 40 x 40 x 1024

9. Layer 7: SPPF

[-1, 1, SPPF, [1024, 5]] # 9 -> 40x40x1024
  • from: -1,输入来自上一层(Layer 6)。

  • number: 1,表示SPPF模块执行一次。

  • module: SPPF,空间金字塔池化快速模块(Spatial Pyramid Pooling - Fast)。

  • args: [1024, 5]

    • 1024: 输出通道数。
    • 5: 池化核大小。
  • 输出: 40 x 40 x 1024

总结

这段backbone共有9个层次,每个层次逐步提取图像特征并下采样。最后输出的特征图尺寸为40x40,通道数为1024。这个特征图包含了从输入图像中提取到的高层次特征,准备在后续的网络层中用于目标检测。

五、head部分

# YOLOv5 v6.0 head
head: [
    [-1, 1, Conv, [512, 1, 1]],
    [-1, 1, nn.Upsample, [None, 2, "nearest"]],
    [[-1, 6], 1, Concat, [1]], # cat backbone P4
    [-1, 3, C3, [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, C3, [256, False]], # 17 (P3/8-small)

    [-1, 1, Conv, [256, 3, 2]],
    [[-1, 14], 1, Concat, [1]], # cat head P4
    [-1, 3, C3, [512, False]], # 20 (P4/16-medium)

    [-1, 1, Conv, [512, 3, 2]],
    [[-1, 10], 1, Concat, [1]], # cat head P5
    [-1, 3, C3, [1024, False]], # 23 (P5/32-large)

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

这段代码定义了YOLOv5 v6.0版本中的“head”部分,即检测头。检测头的作用是将从backbone中提取的特征进一步处理,生成最终的目标检测结果,包括目标的位置和类别。这部分代码通过特定的结构将不同尺度的特征图拼接和处理,最后输出检测结果。以下是详细的解释:

1. Layer 0: Conv

[-1, 1, Conv, [512, 1, 1]]
  • from: -1,输入来自上一层(backbone的最后一层)。

  • number: 1,表示执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [512, 1, 1]

    • 512: 输出通道数。
    • 1: 卷积核大小为1x1。
    • 1: 步长为1。
  • 输出: 通道数为512的特征图。

2. Layer 1: Upsample

[-1, 1, nn.Upsample, [None, 2, "nearest"]]
  • from: -1,输入来自上一层。

  • number: 1,表示执行一次上采样操作。

  • module: nn.Upsample,上采样层。

  • args: [None, 2, "nearest"]

    • None: 保持输入的通道数不变。
    • 2: 上采样倍率为2,特征图尺寸放大一倍。
    • "nearest": 使用最近邻插值进行上采样。
  • 输出: 特征图尺寸变为上一层的2倍,通道数保持不变。

3. Layer 2: Concat

[[-1, 6], 1, Concat, [1]] # cat backbone P4
  • from: [-1, 6],输入来自上一层和backbone中的P4层(倒数第4层)。

  • number: 1,表示执行一次拼接操作。

  • module: Concat,特征拼接层。

  • args: [1],在通道维度上拼接。

  • 输出: 将来自head的上采样特征图与backbone的P4层特征图进行拼接。

4. Layer 3: C3

[-1, 3, C3, [512, False]]
  • from: -1,输入来自上一层的拼接结果。

  • number: 3,表示C3模块重复3次。

  • module: C3模块。

  • args: [512, False]

    • 512: 输出通道数。
    • False: 不使用残差连接。
  • 输出: 提取拼接特征后的高层次特征,通道数为512。

5. Layer 4: Conv

[-1, 1, Conv, [256, 1, 1]]
  • from: -1,输入来自上一层。

  • number: 1,执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [256, 1, 1]

    • 256: 输出通道数。
    • 1: 卷积核大小为1x1。
    • 1: 步长为1。
  • 输出: 特征图通道数减少到256。

6. Layer 5: Upsample

[-1, 1, nn.Upsample, [None, 2, "nearest"]]
  • from: -1,输入来自上一层。

  • number: 1,执行一次上采样操作。

  • module: nn.Upsample,上采样层。

  • args: [None, 2, "nearest"]

    • None: 保持输入的通道数不变。
    • 2: 上采样倍率为2,特征图尺寸放大一倍。
    • "nearest": 使用最近邻插值进行上采样。
  • 输出: 特征图尺寸变为上一层的2倍,通道数保持不变。

7. Layer 6: Concat

[[-1, 4], 1, Concat, [1]] # cat backbone P3
  • from: [-1, 4],输入来自上一层和backbone中的P3层。

  • number: 1,执行一次拼接操作。

  • module: Concat,特征拼接层。

  • args: [1],在通道维度上拼接。

  • 输出: 将来自head的上采样特征图与backbone的P3层特征图进行拼接。

8. Layer 7: C3

[-1, 3, C3, [256, False]] # 17 (P3/8-small)
  • from: -1,输入来自上一层的拼接结果。

  • number: 3,表示C3模块重复3次。

  • module: C3模块。

  • args: [256, False]

    • 256: 输出通道数。
    • False: 不使用残差连接。
  • 输出: 提取拼接特征后的高层次特征,通道数为256。这一层输出的特征图用于检测小目标。

9. Layer 8: Conv

[-1, 1, Conv, [256, 3, 2]]
  • from: -1,输入来自上一层。

  • number: 1,执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [256, 3, 2]

    • 256: 输出通道数。
    • 3: 卷积核大小为3x3。
    • 2: 步长为2,特征图尺寸缩小一半。
  • 输出: 将特征图尺寸缩小一半,通道数保持为256。

10. Layer 9: Concat

[[-1, 14], 1, Concat, [1]] # cat head P4
  • from: [-1, 14],输入来自上一层和head中的P4层(Layer 14)。

  • number: 1,执行一次拼接操作。

  • module: Concat,特征拼接层。

  • args: [1],在通道维度上拼接。

  • 输出: 将特征图与P4层的特征图拼接。

11. Layer 10: C3

[-1, 3, C3, [512, False]] # 20 (P4/16-medium)
  • from: -1,输入来自上一层的拼接结果。

  • number: 3,表示C3模块重复3次。

  • module: C3模块。

  • args: [512, False]

    • 512: 输出通道数。
    • False: 不使用残差连接。
  • 输出: 提取拼接特征后的高层次特征,通道数为512。这一层输出的特征图用于检测中等目标。

12. Layer 11: Conv

[-1, 1, Conv, [512, 3, 2]]
  • from: -1,输入来自上一层。

  • number: 1,执行一次卷积操作。

  • module: Conv,卷积层。

  • args: [512, 3, 2]

    • 512: 输出通道数。
    • 3: 卷积核大小为3x3。
    • 2: 步长为2,特征图尺寸缩小一半。
  • 输出: 将特征图尺寸缩小一半,通道数保持为512。

13. Layer 12: Concat

[[-1, 10], 1, Concat, [1]] # cat head P5
  • from: [-1, 10],输入来自上一层和head中的P5层(Layer 10)。

  • number: 1,执行一次拼接操作。

  • module: Concat,特征拼接层。

  • args: [1],在通道维度上拼接。

  • 输出: 将特征图与P5层的

你可能感兴趣的:(YOLO,linux,运维)