网络结构图
YOLOv5配置了4种不同大小的网络模型,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中 YOLOv5s 是网络深度和宽度最小但检测速度最快的模型,其他3种模型都是在YOLOv5s的基础上不断加深、加宽网络使得网络规模扩大,在增强模型检测性能的同时增加了计算资源和速度消耗。出于对检测精度、模型大小、检测速度的综合考量,本文选择YOLOv5s作为研究对象进行介绍。
models/yolov5s.yaml文件内容分析
1. 文件作用
yolov5s.yaml
定义了YOLOv5s模型的网络结构、通道数(宽度)、层数(深度)和锚框(anchors)配置,是模型构建的核心配置文件。
2. 关键参数解析
(1) 模型缩放参数
YAML
# YOLOv5s depth_multiple: 0.33 # 控制模块重复次数(深度因子) width_multiple: 0.50 # 控制通道数(宽度因子)
- depth_multiple:模块重复次数的缩放因子。
例如,若某模块默认重复次数为3,则YOLOv5s实际重复次数为3 × 0.33 ≈ 1
。 - width_multiple:通道数的缩放因子。
例如,某层默认输出通道为64,则YOLOv5s实际通道为64 × 0.50 = 32
。 - 说明:YOLOv5s/m/l/x通过调整这两个参数实现模型大小和精度的平衡(s: small,m: medium,l: large,x: xlarge)。
(2) 锚框(Anchors)
YAML
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(检测大目标)
- 含义:每组锚框的宽高组合(w, h),用于初始化预测框尺寸。
- 层级分配:
- P3(特征图尺寸为输入图像的1/8):适合检测小目标。
- P4(1/16):适合中目标。
- P5(1/32):适合大目标。
- 调整建议:若自定义数据集目标尺寸差异大,需通过
k-means
聚类生成新的anchors。
(3) 网络结构
YOLOv5s的主干(Backbone)、颈部(Neck)和检测头(Head)采用模块化设计,典型结构示例如下:
YAML
backbone:
# [来源, 参数列表]
# 来源:-1表示上一层的输出,数字表示特定层的输出
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2(卷积层)
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]], # 2
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]], # 4
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]], # 6
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]], # 8
[-1, 1, SPPF, [1024, 5]], # 9(空间金字塔池化)
]
head:
[[-1, 1, Conv, [512, 1, 1]], # 10
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 11 上采样
[[-1, 6], 1, Concat, [1]], # 12 横向连接(特征融合)
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]], # 14
[-1, 1, nn.Upsample, [None, 2, 'nearest']], # 15
[[-1, 4], 1, Concat, [1]], # 16
[-1, 3, C3, [256, False]], # 17
[-1, 1, Conv, [256, 3, 2]], # 18
[[-1, 14], 1, Concat, [1]], # 19
[-1, 3, C3, [512, False]], # 20
[-1, 1, Conv, [512, 3, 2]], # 21
[[-1, 10], 1, Concat, [1]], # 22
[-1, 3, C3, [1024, False]], # 23
[[17, 20, 23], 1, Detect, [nc, anchors]], # 24 检测头(P3, P4, P5)
]
3. 模块详解
(1) 核心模块
-
Conv
层:
包含卷积 + BN + SiLU激活,参数格式为[输出通道数, 卷积核大小, 步长, 填充]
。YAML
[-1, 1, Conv, [64, 6, 2, 2]] # 输出64通道,6x6卷积核,步长2,填充2
-
C3
模块:
跨阶段部分网络(Cross Stage Partial Network),减少计算量的同时保持精度。YAML
[-1, 3, C3, [128]] # 重复3次,输出128通道
-
SPPF
模块:
空间金字塔池化快速版,融合多尺度特征。YAML
[-1, 1, SPPF, [1024, 5]] # 输入1024通道,池化核最大5x5
-
Detect
层:
检测头,输出预测结果(坐标、类别、置信度)。YAML
[[17, 20, 23], 1, Detect, [nc, anchors]] # 输入来自第17、20、23层,nc为类别数
(2) 特征融合逻辑
- 上采样:通过
nn.Upsample
提升特征图分辨率。 - 横向连接(Concat):将深层特征与浅层特征拼接,增强小目标检测能力。
YAML
[[-1, 6], 1, Concat, [1]] # 拼接当前层和第6层的输出(按通道维度)
4. 模型定制建议
- 调整深度和宽度:修改
depth_multiple
和width_multiple
以适配不同算力需求。 - 优化锚框:若数据集目标尺寸分布特殊,需重新计算anchors(使用
utils/autoanchor.py
)。 - 增减检测层:修改Head部分层级数可调整检测尺度(例如增加P2层检测极小目标)。
个人总结
- 熟悉了YOLOv5s模型的配置信息
- 将YOLOv5s模型中第4层和第6层的C3模块重复次数减少,具体影响分析如下:
1. 修改内容对比
原始配置
原来的第4层:[-1, 6, C3, [256]]
原来的第6层:[-1, 9, C3, [512]]
(6 * 0.33=2,9* 0.33=3)
修改后配置
修改后的第4层:[-1, 3, C3, [256]]
修改后的第6层:[-1, 6, C3, [512]]
2. 对模型性能的影响
(1) 模型参数量与计算量
- 参数量(Parameters):C3模块的重复次数减少会直接降低参数量,尤其是第4层(256通道)和第6层(512通道)的权重矩阵减少。
- 计算量(FLOPs):C3模块的计算量与重复次数正相关,修改后模型整体FLOPs将下降,理论推理速度提升。
- 估算变化(以YOLOv5s为例):
- 原始:总参数量约7.2M,FLOPs约16.4B
- 修改后:参数量预计减少约 0.8~1.2M,FLOPs减少约 3~4B。
(2) 检测精度(mAP)
- 负面影响:C3模块的重复次数减少会削弱网络的特征提取能力,尤其是对复杂场景和细粒度特征的捕捉,可能导致mAP下降。
- 第4层(浅层网络):减少C3模块次数会削弱对图像基础特征(如边缘、纹理)的提炼能力。
- 第6层(中层网络):减少C3模块次数会降低对中等尺度目标的语义理解能力。
- 典型场景影响:
- 小目标检测:对分辨率较低的深层特征依赖更大,精度损失更明显。
- 遮挡或模糊目标:模型鲁棒性可能下降。
(3) 推理速度
- 正向影响:计算量降低会提升推理速度(FPS),尤其在边缘设备(如Jetson Nano)上更显著。