YOLOv5模型架构详解 - 从基础模块到完整推理
目录
- 模型基础模块介绍
- CBS模块详解
- SPPF模块详解
- C3模块详解
- 模型架构构建
- YAML配置文件说明
- 推理流程详解
- 论文写作指南
第一章 模型基础模块介绍
1.1 YOLOv5的核心模块
YOLOv5网络架构由以下几个基础模块组成:
- CBS模块:卷积 + 批归一化 + 激活函数的基础构建块
- SPPF模块:空间金字塔池化模块,用于多尺度特征提取
- C3模块:YOLOv5中最复杂的模块,包含跳跃连接的结构
这三个模块的灵活组合构成了整个YOLOv5网络。
1.2 模块代码位置
所有模块相关的构建代码存放在项目的models文件夹中,包含各个模块的压缩文件和相应的实现代码。
第二章 CBS模块详解
2.1 CBS模块概述
CBS模块是YOLOv5的基础构建单元,由以下三部分组成:
- Conv (卷积层):进行特征提取
- BatchNorm (批归一化):加速训练,提高模型稳定性
- SiLU (激活函数):引入非线性特征
2.2 CBS模块的实现
python
class CBS(nn.Module):
def __init__(self, c1, c2, k=1, s=1, p=None):
"""
c1: 输入通道数
c2: 输出通道数
k: 卷积核大小
s: 步长
p: 填充
"""
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, p, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = nn.SiLU()
def forward(self, x):
return self.act(self.bn(self.conv(x)))
2.3 参数说明
- 卷积核大小 (k):决定了感受野的大小
- 步长 (s):默认值为1
- 填充 §:根据卷积核大小自动计算,确保输出尺寸匹配
第三章 SPPF模块详解
3.1 SPPF模块概述
SPPF(Spatial Pyramid Pooling Fast)模块是YOLOv5中用于多尺度特征融合的关键组件。它通过多个不同大小的最大池化操作,在不改变特征图尺寸的情况下,提取多尺度特征。
3.2 SPPF模块的结构
SPPF模块包含以下步骤:
- 定义多个最大池化层(通常为3个),池化核大小为5×5
- 使用1×1卷积进行初始处理
- 分别对输入进行多次池化操作
- 将所有池化结果在通道维度上拼接
- 使用1×1卷积进行融合
3.3 SPPF模块的实现
python
class SPPF(nn.Module):
def __init__(self, c1, c2, k=5):
super().__init__()
self.cv1 = CBS(c1, c1 // 2, 1, 1)
self.cv2 = CBS(c1 * 2, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
def forward(self, x):
x = self.cv1(x)
y1 = self.m(x)
y2 = self.m(y1)
y3 = self.m(y2)
return self.cv2(torch.cat([x, y1, y2, y3], 1))
3.4 前向传播过程
- 输入X经过CBS模块处理
- 对处理后的结果进行第一次最大池化,得到Y1
- Y1再进行最大池化,得到Y2
- Y2再进行最大池化,得到Y3
- 将X、Y1、Y2、Y3在通道维度上进行拼接
- 通过1×1卷积融合所有特征
3.5 感受野分析
- 最大池化的核大小为5×5
- 每次池化操作都能捕捉不同尺度的特征信息
- 通过多尺度融合,增强模型对不同大小目标的感知能力
第四章 C3模块详解
4.1 C3模块概述
C3模块是YOLOv5中最复杂的模块,它通过并联的两条处理通道和可选的跳跃连接,实现了多路特征提取和融合。C3模块有两种变体:
- C3-1:带有跳跃连接(Residual Connection)
- C3-2:不带跳跃连接
4.2 C3模块的结构
C3模块包含:
- 两条并行的特征提取通道
- 上通道:先经过1×1卷积(CBS),再经过3×3卷积(CBS)
- 下通道:先经过1×1卷积(CBS),再经过1×1卷积(CBS)
- 可选的跳跃连接
- 通道融合:将两条通道的输出在通道维度拼接
- 最后通过1×1卷积进行融合处理
4.3 C3模块的代码实现
python
class C3(nn.Module):
def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
"""
c1: 输入通道数
c2: 输出通道数
n: Bottleneck重复次数
shortcut: 是否使用跳跃连接
g: 分组卷积参数
e: 扩展比例
"""
super().__init__()
c_ = int(c2 * e)
self.cv1 = CBS(c1, c_, 1, 1)
self.cv2 = CBS(c1, c_, 1, 1)
self.cv3 = CBS(2 * c_, c2, 1, 1)
self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
def forward(self, x):
return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
4.4 跳跃连接的作用
- C3-1(shortcut=True):使用跳跃连接,允许梯度直接反向传播,加速训练
- C3-2(shortcut=False):不使用跳跃连接,仅通过顺序的卷积操作处理特征
4.5 前向传播过程
- 输入X分别进入两条路径
- 上路径:X → CV1 → Bottleneck模块(重复n次)
- 下路径:X → CV2
- 两条路径的输出在通道维度拼接
- 经过CV3进行最终融合
第五章 模型架构构建
5.1 从YAML配置构建模型
YOLOv5的网络架构由YAML配置文件定义,包含以下信息:
- 网络各层的参数配置
- 每层的输入输出通道数
- 重复次数和其他超参数
5.2 模型构建流程
python
# 1. 读取YAML配置文件
# 2. 初始化各个模块(CBS, SPPF, C3等)
# 3. 根据配置串联各个模块
# 4. 完成整个网络构建
5.3 代码调用示例
使用ul.py文件调用YAML配置并构建模型:
python
from models.ul import YOLOv5
# 指定配置文件
model = YOLOv5('models/yolov5s.yaml') # 也可以是 yolov5m, yolov5l, yolov5x
第六章 YAML配置文件详解
6.1 不同规模的YAML文件
YOLOv5提供多个规模的模型变体:
- yolov5s.yaml:Small模型,深度系数和宽度系数最小
- yolov5m.yaml:Medium模型,参数适中
- yolov5l.yaml:Large模型,深度宽度系数为1.0
- yolov5x.yaml:Extra Large模型,最大的模型
6.2 配置文件参数说明
深度系数(depth_multiple)和宽度系数(width_multiple)控制模型大小:
| 模型 | 深度系数 | 宽度系数 |
|---|---|---|
| S | 0.33 | 0.50 |
| M | 0.67 | 0.75 |
| L | 1.0 | 1.0 |
| X | 1.33 | 1.25 |
6.3 配置文件的使用
通过调整这些系数,可以快速创建不同规模的模型,而不需要修改代码结构。
第七章 推理流程详解
7.1 输入图像预处理
图像缩放过程
假设输入图像尺寸为608×416,目标输入尺寸为608×608:
- 计算缩放比例:min(608/608, 416/608) = 0.591
- 缩放后图像尺寸:608×0.591 = 311, 416×0.591 ≈ 246
- 缩放到32的整数倍
- 填充空白区域:上下左右各填充相应像素
最终得到标准化的输入尺寸。
7.2 推理步骤
- 输入预处理:图像缩放、归一化
- 前向传播:通过各个模块逐层处理
- 特征提取:CBS、SPPF、C3等模块的组合处理
- 输出处理:解析网络输出,得到检测结果
7.3 推理输出
推理完成后,模型会输出:
- 检测框的位置信息(x, y, w, h)
- 置信度分数
- 类别概率