YOLO!!
一、common.py:基础网络组件定义
该文件包含 YOLO 模型中常用的基础神经网络模块,是构建网络的 "积木"。
1. 卷积相关模块
Conv 层:基础卷积模块,包含conv + bn + 激活函数(代码中通过forward方法实现:self.act(self.bn(self.conv(x))))。
DWConv:深度可分离卷积,通过g=math.gcd(c1, c2)设置分组卷积,减少参数量。
2. 特征提取模块
Bottleneck:标准瓶颈结构,由 1x1 卷积(降维)+ 3x3 卷积(升维)组成,支持残差连接(
add参数控制)。- forward 逻辑:若启用残差(
add=True且输入输出通道相同),则输出为x + 3x3卷积结果,否则直接输出 3x3 卷积结果。
- forward 逻辑:若启用残差(
BottleneckCSP:跨阶段部分网络结构,融合两条支路特征:
支路 1:1x1 卷积 + 多个 Bottleneck 堆叠 + 1x1 卷积; 支路 2:直接 1x1 卷积;最终通过BN + 激活函数 + 1x1卷积融合两条支路(torch.cat拼接后处理)。 Focus:将空间信息聚焦到通道维度,输入(b,c,w,h)通过切片(x[..., ::2, ::2]等 4 种切片方式)拼接为(b,4c,w/2,h/2),再通过卷积降维。- SPP:空间金字塔池化,用于融合多尺度特征:
- 先通过 1x1 卷积降维;
- 对降维后特征分别应用不同 kernel 的最大池化(如 5,9,13);
- 拼接原始特征与池化结果,再通过 1x1 卷积输出。
3. 后处理模块
Concat:特征拼接模块,通过
torch.cat(x, self.d)在指定维度(d)拼接输入特征列表。Classify:分类头,将特征图转换为分类结果:
- 先通过自适应平均池化(
AdaptiveAvgPool2d(1))将特征图压缩为(b,c1,1,1); - 卷积降维至类别数,再通过
Flatten展平为(b,c2)。
- 先通过自适应平均池化(
NMS:非极大值抑制模块,调用
non_max_suppression函数过滤冗余检测框,参数包括置信度阈值(conf=0.3)和 IoU 阈值(iou=0.6)。
二、yolo.py:YOLO 模型结构与核心逻辑
该文件定义了 YOLO 模型的整体结构、检测头、前向传播及模型工具函数。
1. Detect:检测头
- 功能:将多尺度特征图转换为检测结果(边界框 + 类别)。
- 核心参数:
nc(类别数)、anchors(锚框)、stride(各层下采样率)。 - 前向传播(
forward):- 训练模式:直接返回各尺度特征图的卷积结果;
- 推理模式:对特征图进行解码(坐标转换):
- 边界框坐标:
(sigmoid(xy) * 2 - 0.5 + grid) * stride(xy 坐标);(sigmoid(wh) * 2)^2 * anchor_grid(wh 坐标); - 拼接所有尺度的检测结果(
torch.cat(z, 1))。
- 边界框坐标:
2. Model:整体模型
初始化(
__init__):通过解析配置文件(yaml),调用parse_model构建网络层,初始化锚框和 stride。前向传播(
forward):- 支持单尺度推理(
forward_once)和多尺度数据增强推理(augment=True,通过缩放、翻转输入提升鲁棒性)。 forward_once:按顺序执行各网络层,保存需要的中间特征(save列表控制)。
- 支持单尺度推理(
模型工具函数:
fuse:融合 Conv 层和 BN 层(fuse_conv_and_bn),减少推理耗时;add_nms:在模型末尾添加 NMS 模块,方便端到端推理;_initialize_biases:初始化检测头的偏置,提升训练稳定性。
3. parse_model:网络构建函数
- 功能:根据配置文件(
backbone + head)解析并构建网络层。 - 流程:
- 解析深度因子(
gd)和宽度因子(gw),调整层数量和通道数; - 对每个层,根据类型(如 Conv、Bottleneck、Detect 等)初始化参数,计算输出通道;
- 记录需要保存的中间特征索引(
save列表)。
- 解析深度因子(
三、train.py:训练流程实现
该文件定义了 YOLO 模型的训练逻辑,包含数据加载、参数优化、训练循环、评估与保存等。
1. 核心流程
- 初始化:加载配置(超参数
hyp、数据配置data_dict)、创建模型(支持预训练权重加载)、设置优化器(Adam/SGD)和学习率调度器(余弦退火)。 - 数据处理:通过
create_dataloader加载训练 / 验证数据,支持多尺度训练(随机调整输入尺寸)、图像权重采样(难例优先)。 - 训练循环:
- 热身训练(
warmup):初始阶段缓慢提升学习率和动量,稳定训练; - 前向传播:计算预测结果和损失(
compute_loss); - 反向传播:使用混合精度训练(
amp)加速,累计梯度(accumulate)等效扩大 batch size; - 参数更新:通过优化器更新权重,使用 EMA(指数移动平均)平滑参数。
- 热身训练(
- 评估与保存:每个 epoch 结束后在验证集计算 mAP,保存最优模型(
best.pt)和最新模型(last.pt),记录训练指标(损失、精度、mAP 等)。
2. 关键技巧
- 混合精度训练:通过
GradScaler在不损失精度的前提下,使用 FP16 加速训练; - 多尺度训练:随机调整输入图像尺寸(
0.5~1.5倍原始尺寸),提升模型对不同尺度目标的适应性; - EMA:维护模型参数的移动平均,提升模型泛化能力;
- 余弦学习率调度:学习率随 epoch 按余弦曲线衰减,平衡前期探索和后期收敛。
总结
common.py是基础组件库,提供了 YOLO 所需的各类网络层;yolo.py构建了 YOLO 的整体网络结构,实现了特征提取、检测头解码等核心逻辑;train.py实现了完整的训练流程,包含数据处理、参数优化、模型评估等,支持多种训练技巧以提升模型性能。
三者协同工作,从网络组件到模型构建,再到训练部署,形成了 YOLO 目标检测的完整 pipeline。以下是基于提供的common.py、yolo.py和train.py代码片段的笔记总结,主要涵盖 YOLO 相关模型组件、网络结构及训练流程:
一、common.py:基础网络组件定义
该文件包含 YOLO 模型中常用的基础神经网络模块,是构建网络的 "积木"。
1. 卷积相关模块
- Conv 层:基础卷积模块,包含
conv + bn + 激活函数(代码中通过forward方法实现:self.act(self.bn(self.conv(x))))。 - DWConv:深度可分离卷积,通过
g=math.gcd(c1, c2)设置分组卷积,减少参数量。
2. 特征提取模块
Bottleneck:标准瓶颈结构,由 1x1 卷积(降维)+ 3x3 卷积(升维)组成,支持残差连接(
add参数控制)。- forward 逻辑:若启用残差(
add=True且输入输出通道相同),则输出为x + 3x3卷积结果,否则直接输出 3x3 卷积结果。
- forward 逻辑:若启用残差(
BottleneckCSP:跨阶段部分网络结构,融合两条支路特征:
- 支路 1:1x1 卷积 + 多个 Bottleneck 堆叠 + 1x1 卷积;
- 支路 2:直接 1x1 卷积;
- 最终通过
BN + 激活函数 + 1x1卷积融合两条支路(torch.cat拼接后处理)。
Focus:将空间信息聚焦到通道维度,输入
(b,c,w,h)通过切片(x[..., ::2, ::2]等 4 种切片方式)拼接为(b,4c,w/2,h/2),再通过卷积降维。SPP:空间金字塔池化,用于融合多尺度特征:
- 先通过 1x1 卷积降维;
- 对降维后特征分别应用不同 kernel 的最大池化(如 5,9,13);
- 拼接原始特征与池化结果,再通过 1x1 卷积输出。
3. 后处理模块
Concat:特征拼接模块,通过
torch.cat(x, self.d)在指定维度(d)拼接输入特征列表。Classify:分类头,将特征图转换为分类结果:
- 先通过自适应平均池化(
AdaptiveAvgPool2d(1))将特征图压缩为(b,c1,1,1); - 卷积降维至类别数,再通过
Flatten展平为(b,c2)。
- 先通过自适应平均池化(
NMS:非极大值抑制模块,调用
non_max_suppression函数过滤冗余检测框,参数包括置信度阈值(conf=0.3)和 IoU 阈值(iou=0.6)。
二、yolo.py:YOLO 模型结构与核心逻辑
该文件定义了 YOLO 模型的整体结构、检测头、前向传播及模型工具函数。
1. Detect:检测头
- 功能:将多尺度特征图转换为检测结果(边界框 + 类别)。
- 核心参数:
nc(类别数)、anchors(锚框)、stride(各层下采样率)。 - 前向传播(
forward):- 训练模式:直接返回各尺度特征图的卷积结果;
- 推理模式:对特征图进行解码(坐标转换):
- 边界框坐标:
(sigmoid(xy) * 2 - 0.5 + grid) * stride(xy 坐标);(sigmoid(wh) * 2)^2 * anchor_grid(wh 坐标); - 拼接所有尺度的检测结果(
torch.cat(z, 1))。
- 边界框坐标:
2. Model:整体模型
初始化(
__init__):通过解析配置文件(yaml),调用parse_model构建网络层,初始化锚框和 stride。前向传播(
forward):- 支持单尺度推理(
forward_once)和多尺度数据增强推理(augment=True,通过缩放、翻转输入提升鲁棒性)。 forward_once:按顺序执行各网络层,保存需要的中间特征(save列表控制)。
- 支持单尺度推理(
模型工具函数:
fuse:融合 Conv 层和 BN 层(fuse_conv_and_bn),减少推理耗时;add_nms:在模型末尾添加 NMS 模块,方便端到端推理;_initialize_biases:初始化检测头的偏置,提升训练稳定性。
3. parse_model:网络构建函数
- 功能:根据配置文件(
backbone + head)解析并构建网络层。 - 流程:
- 解析深度因子(
gd)和宽度因子(gw),调整层数量和通道数; - 对每个层,根据类型(如 Conv、Bottleneck、Detect 等)初始化参数,计算输出通道;
- 记录需要保存的中间特征索引(
save列表)。
- 解析深度因子(
三、train.py:训练流程实现
该文件定义了 YOLO 模型的训练逻辑,包含数据加载、参数优化、训练循环、评估与保存等。
1. 核心流程
- 初始化:加载配置(超参数
hyp、数据配置data_dict)、创建模型(支持预训练权重加载)、设置优化器(Adam/SGD)和学习率调度器(余弦退火)。 - 数据处理:通过
create_dataloader加载训练 / 验证数据,支持多尺度训练(随机调整输入尺寸)、图像权重采样(难例优先)。 - 训练循环:
- 热身训练(
warmup):初始阶段缓慢提升学习率和动量,稳定训练; - 前向传播:计算预测结果和损失(
compute_loss); - 反向传播:使用混合精度训练(
amp)加速,累计梯度(accumulate)等效扩大 batch size; - 参数更新:通过优化器更新权重,使用 EMA(指数移动平均)平滑参数。
- 热身训练(
- 评估与保存:每个 epoch 结束后在验证集计算 mAP,保存最优模型(
best.pt)和最新模型(last.pt),记录训练指标(损失、精度、mAP 等)。
2. 关键技巧
- 混合精度训练:通过
GradScaler在不损失精度的前提下,使用 FP16 加速训练; - 多尺度训练:随机调整输入图像尺寸(
0.5~1.5倍原始尺寸),提升模型对不同尺度目标的适应性; - EMA:维护模型参数的移动平均,提升模型泛化能力;
- 余弦学习率调度:学习率随 epoch 按余弦曲线衰减,平衡前期探索和后期收敛。
总结
common.py是基础组件库,提供了 YOLO 所需的各类网络层;yolo.py构建了 YOLO 的整体网络结构,实现了特征提取、检测头解码等核心逻辑;train.py实现了完整的训练流程,包含数据处理、参数优化、模型评估等,支持多种训练技巧以提升模型性能。
三者协同工作,从网络组件到模型构建,再到训练部署,形成了 YOLO 目标检测的完整 pipeline。
