YOLOv5结构文件分析
在这篇笔记中,我们将分析 YOLOv5 网络的结构。特别是,我们关注的是其在 GitHub 上 Ultralytics YOLOv5 项目中的 yolov5s.yaml 配置文件,该文件定义了 YOLOv5s 模型。在文件名称中的 “s” 代表 “small”,意味着这是一种较小的模型版本,设计用于在资源有限的环境下运行,同时在速度和精度之间保持良好的平衡。此文件位于:YOLOv5s YAML file on GitHub。
代码
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# 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 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
]
# 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)
]
该yaml文件中包括了模型的参数设置、预选框(anchors)配置、backbone(骨干网络)和head(头部网络)的详细层配置。下面详细解释每个部分的含义和作用。
参数(Parameters)
- nc: 80:表示模型用于检测的目标类别总数为80。如果你用的是不同的数据集,此处应对应你所用数据集的目标类别数。
- depth_multiple: 0.33:模型深度倍数,用于调整网络层的深度,影响模型大小和计算复杂度。
- width_multiple: 0.50:层宽度倍数,用于调整每一层的通道数,同样影响模型的大小和性能。
预选框(Anchors)
YOLOv3提供了三组不同尺寸的锚框,分别适用于不同层级的特征图(P3/8, P4/16, P5/32),这些预选框用于检测不同尺寸的目标。
每组中的数字代表锚框的宽度和高度,例如 [10, 13, 16, 30, 33, 23] 表示有三个锚框,尺寸分别为 (10x13), (16x30), (33x23),同理,另外两组数字分别代表了尺寸为(30x61),(62x45),(59x119)的预选框,还有(116x90),(156x198),(373x326)的框,如笔者上一篇笔记中的表格。
Backbone(骨干网络)
网络层介绍
骨干网络用于从输入图像中提取特征,配置中详细列出了各层的类型和参数:
- Conv:卷积层,用于特征提取。
- C3:该模块通常包含三个主要的部分:
- 分割: 输入特征图首先被分割成两部分。一部分直接通过,作为残差连接;另一部分则进入后续的卷积处理。
- 卷积处理: 分割后的一部分特征图会通过一系列的卷积层。这通常包括几个批量归一化层(BatchNorm)和激活函数(如 ReLU 或 Leaky ReLU)以及卷积层。在 YOLOv5 中,这部分还包括 “Bottleneck” 层,即使用 1x1 和 3x3 卷积的组合来减少参数数量并处理特征。
- 合并: 卷积处理后的特征图会与残差连接的部分合并,通常是通过连接(concatenation)操作实现,然后可能会进行更多的卷积处理以进一步融合特征。
- SPPF:空间金字塔池化快速版,用于提取多尺度的上下文特征,增强模型对于对象大小变化的鲁棒性。
逐层分析
- [-1, 1, Conv, [64, 6, 2, 2]]:从上一层(输入层)应用一个卷积层,使用 64 个 6x6 的卷积核,步长为 2,padding 为 2。这一层用于降低空间维度(P1/2),即减半。
- [-1, 1, Conv, [128, 3, 2]]:使用 128 个 3x3 的卷积核,步长为 2,进一步降低空间维度至四分之一(P2/4)。
- [-1, 3, C3, [128]]:C3 模块使用 128 个通道,重复三次。C3 是一个复杂的模块,包括多个卷积层,用于增强特征提取。
- [-1, 1, Conv, [256, 3, 2]]:进一步降低空间维度到八分之一(P3/8)。
- [-1, 6, C3, [256]]:同样是 C3 模块,使用 256 个通道,重复六次。
- [-1, 1, Conv, [512, 3, 2]]:降低空间维度到十六分之一(P4/16)。
- [-1, 9, C3, [512]]:C3 模块重复九次,使用 512 个通道。
- [-1, 1, Conv, [1024, 3, 2]]:继续降低空间维度到三十二分之一(P5/32)。
- [-1, 3, C3, [1024]]:使用 1024 个通道的 C3 模块,重复三次。
- [-1, 1, SPPF, [1024, 5]]:使用 SPPF 模块对特征进行空间金字塔池化,池化核大小为 5,使用 1024 个通道。这有助于捕获不同尺度的特征并提高模型的鲁棒性。
Head(头部网络)
网络层介绍
头部网络用于使用骨干网络提取的特征来进行目标的检测,配置中的层主要用于进一步处理和合并特征,以及最终的目标检测:
- Conv:卷积层,用于进一步的特征提炼。
- nn.Upsample:上采样层,用于增大特征图尺寸,使得来自不同尺度的特征图可以合并。
- Concat:合并层,用于将来自不同层的特征图合并在一起,通常是为了融合不同尺度的特征。
- Detect:检测层,这是YOLOv5特有的层,用于最终的目标检测,利用之前定义的类别数和锚框进行目标的定位和分类。
逐层分析
- [-1, 1, Conv, [512, 1, 1]]:使用 512 个 1x1 的卷积核进行卷积,通常用于特征压缩或通道数调整。
- [-1, 1, nn.Upsample, [None, 2, “nearest”]]:进行上采样(放大两倍),使用最近邻插值。
- [[ -1, 6], 1, Concat, [1]]:将当前层和第 6 层的输出进行通道方向的连接。
- [-1, 3, C3, [512, False]]:使用 512 通道的 C3 模块,不使用残差连接(False),重复三次。
- [-1, 1, Conv, [256, 1, 1]] 和之后的层类似操作,但逐渐降低通道数并将不同层级的特征图通过上采样和连接操作融合。
- [-1, 3, C3, [256, False]]:更细粒度的特征融合。
- [[17, 20, 23], 1, Detect, [nc, anchors]]:最后的检测层,将 P3, P4, P5 的特征图合并,使用定义的类别数 nc 和锚点 anchors 进行最终的物体检测。
总结
这个配置文件提供了一个完整的 YOLOv5 模型结构,涵盖了从输入图像的初步处理到特征提取的骨干网络,再到用于目标检测的头部网络。每个层的设置都旨在优化检测性能,同时通过参数如 depth_multiple 和 width_multiple 提供了模型规模和复杂度的调整空间。通过这种方式,可以根据具体应用需求调整模型,以达到最佳的效果和效率平衡。关于每层网络的具体代码也会在后续笔记中分析。