YOLOv5模型训练完整讲解方案
一、教学目标
基础目标(学完能掌握)
- 理解YOLO核心思想:掌握one-stage目标检测的基本原理
- 完整训练流程:能够独立完成从数据标注到模型训练的全过程
- 代码实操能力:能够配置环境、修改代码、训练自己的数据集
- 模型评估调优:掌握评估指标解读和基础调参方法
进阶目标(学完能应用)
- 自定义修改:能够根据需求调整模型结构
- 生产部署:掌握模型导出和部署的基本方法
- 问题排查:具备常见训练问题的分析和解决能力

二、YOLOv5核心原理讲解要点
2.1 YOLO设计哲学
核心思想:"You Only Look Once"
- 将目标检测视为回归问题
- 单次前向传播完成检测
- 速度与精度平衡
2.2 网络架构关键组件
Input Image
Backbone: CSPDarknet
Neck: PANet
Head: Detection Layers
输出: BBox + Class + Confidence
标要点讲解:
-
Backbone(主干网络)
- CSPDarknet53结构
- Focus模块(v6.0后改为Conv)
- SPP/SPPF空间金字塔池化
-
Neck(颈部结构)
- PANet路径聚合网络
- 特征金字塔FPN
- 双向特征融合
-
Head(检测头)
- 三个检测尺度:大、中、小目标
- 每个网格预测:4坐标 + 1置信度 + n类别
- Anchor-based设计
2.3 损失函数(三部分)
总损失 = 定位损失 + 置信度损失 + 分类损失
1. 定位损失:CIoU Loss(考虑中心点距离、宽高比)
2. 置信度损失:Binary Cross Entropy
3. 分类损失:Binary Cross Entropy(多标签分类)
2.4 标签分配策略
1. 基于Anchor的匹配
2. 跨网格预测(一个目标可由多个网格预测)
3. 正负样本平衡策略
三、数据标注完整流程
3.1 标注工具选择与使用
python
# 常用标注工具对比
"""
1. LabelImg:传统矩形标注
- 格式:PASCAL VOC (XML)
- 优点:简单易用
2. Label Studio:多模态标注
- 格式:JSON/COCO
- 优点:功能强大,支持团队协作
3. CVAT:专业级工具
- 格式:支持多种格式
- 优点:企业级,支持视频标注
"""
# 推荐流程
# 使用Roboflow进行在线标注和管理(免费额度)
# https://roboflow.com
3.2 YOLO格式标注规范
# 标注文件格式:.txt (每张图片对应一个)
# 每行格式:<class_id> <x_center> <y_center> <width> <height>
# 所有坐标值归一化到[0,1]
# 示例:一行标注的含义
0 0.5 0.5 0.2 0.3
↓ ↓ ↓ ↓ ↓
类别 中心x 中心y 宽 高
3.3 数据准备代码示例
python
# 1. 数据集目录结构
"""
dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
"""
# 2. 创建dataset.yaml配置文件
# my_dataset.yaml
path: ../dataset
train: images/train
val: images/val
test: images/test
nc: 3 # 类别数量
names: ['person', 'car', 'dog'] # 类别名称
3.4 数据增强策略
python
# YOLOv5内置增强(在data/hyps/hyp.scratch.yaml中)
"""
1. 基础增强:
- 随机旋转:±10度
- 缩放平移:scale=0.5, translate=0.1
- 颜色抖动:hsv_h=0.015, hsv_s=0.7, hsv_v=0.4
2. 高级增强(Mosaic & MixUp):
- Mosaic:4图拼接训练
- MixUp:两图混合
- Copy-Paste:小目标复制粘贴
3. 自适应增强:
- 根据训练阶段自动调整
- 小目标自动增强
"""
四、训练框架代码详解
4.1 环境配置
bash
# 1. 克隆仓库
git clone https://github.com/ultralytics/yolov5
cd yolov5
# 2. 安装依赖
pip install -r requirements.txt
# 3. 验证安装
python detect.py --weights yolov5s.pt --source data/images/
4.2 核心训练代码解析
train.py 主函数流程
python
# 核心训练流程(简化版)
def train(hyp, opt, device, callbacks):
# 1. 初始化配置
set_logging()
init_seeds(opt.seed + 1 + RANK)
# 2. 加载模型
model = Model(opt.cfg, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device)
# 3. 加载数据
dataloader, dataset = create_dataloader(train_path, imgsz, batch_size,
stride=int(model.stride.max()))
# 4. 优化器设置
optimizer = smart_optimizer(model, opt.optimizer, hyp['lr0'], hyp['momentum'])
# 5. 训练循环
for epoch in range(start_epoch, epochs):
model.train()
# 前向传播
pred = model(imgs)
# 计算损失
loss, loss_items = compute_loss(pred, targets.to(device))
# 反向传播
loss.backward()
optimizer.step()
optimizer.zero_grad()
# 学习率调度
scheduler.step()
4.3 关键参数解析
yaml
# 训练参数示例(命令行或配置文件)
# 模型选择
--weights yolov5s.pt # 预训练权重
--cfg models/yolov5s.yaml # 模型配置
# 数据配置
--data coco128.yaml # 数据集配置
--epochs 100 # 训练轮数
--batch-size 16 # 批次大小
--imgsz 640 # 输入尺寸
# 优化器配置
--optimizer Adam # 或SGD
--lr0 0.01 # 初始学习率
--lrf 0.01 # 最终学习率系数
# 增强配置
--mosaic 1.0 # Mosaic增强概率
--mixup 0.0 # MixUp增强概率
4.4 自定义训练脚本示例
python
import torch
from utils.general import check_dataset
from models.yolo import Model
from utils.datasets import create_dataloader
import yaml
def custom_train():
# 1. 加载配置
with open('data/my_dataset.yaml') as f:
data_dict = yaml.safe_load(f)
# 2. 创建模型
model = Model('models/yolov5s.yaml', ch=3, nc=data_dict['nc'])
# 3. 加载数据
train_loader = create_dataloader(
path=data_dict['train'],
imgsz=640,
batch_size=16,
stride=32,
hyp='data/hyps/hyp.scratch-low.yaml'
)[0]
# 4. 训练配置
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.937)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
# 5. 训练循环
for epoch in range(100):
for batch_i, (imgs, targets, paths, _) in enumerate(train_loader):
# 前向传播
pred = model(imgs)
# 计算损失
loss = ... # 损失计算
# 反向传播
loss.backward()
optimizer.step()
optimizer.zero_grad()
# 验证和保存
if epoch % 10 == 0:
torch.save(model.state_dict(), f'weights/epoch_{epoch}.pt')
4.5 关键模块详解
4.5.1 损失函数实现
python
class ComputeLoss:
def __init__(self, model, autobalance=False):
self.model = model
# 三个损失组件
self.box_loss = BoxLoss() # CIoU Loss
self.obj_loss = FocalLoss() # 置信度损失
self.cls_loss = BCEcls() # 分类损失
def __call__(self, preds, targets):
# 计算三个损失
lbox = self.box_loss(preds, targets)
lobj = self.obj_loss(preds, targets)
lcls = self.cls_loss(preds, targets)
# 加权求和
loss = lbox * hyp['box'] + lobj * hyp['obj'] + lcls * hyp['cls']
return loss
4.5.2 数据加载器
python
# 关键特性:
# 1. Mosaic数据增强
# 2. 自适应锚框计算
# 3. 多尺度训练
# 4. 自动缓存机制
五、训练监控与评估
5.1 监控指标
python
# 训练过程可视化
"""
1. 损失曲线:
- box_loss: 定位损失
- obj_loss: 置信度损失
- cls_loss: 分类损失
2. 评估指标:
- Precision: 精确率
- Recall: 召回率
- mAP@0.5: IoU=0.5时的平均精度
- mAP@0.5:0.95: IoU从0.5到0.95的平均精度
3. 学习率曲线
4. 锚框适配度
"""
5.2 TensorBoard使用
bash
# 启动TensorBoard
tensorboard --logdir runs/train
# 监控内容:
# 1. 损失曲线
# 2. 验证指标
# 3. 模型图
# 4. 样本预测
5.3 模型评估代码
python
from utils.metrics import ap_per_class, ConfusionMatrix
from utils.general import coco80_to_coco91_class
def evaluate(model, dataloader):
# 运行验证
stats = []
for batch in dataloader:
preds = model(batch[0])
stats.append(process_batch(preds, batch[1]))
# 计算指标
stats = [np.concatenate(x, 0) for x in zip(*stats)]
tp, fp, p, r, f1, ap, ap_class = ap_per_class(*stats)
return {
'mAP@0.5': ap.mean(),
'precision': p.mean(),
'recall': r.mean()
}
六、实战训练步骤清单
步骤1:数据准备
bash
# 1. 收集和整理图片
# 2. 使用LabelImg标注(确保YOLO格式)
# 3. 划分训练集/验证集(建议8:2)
# 4. 创建dataset.yaml配置文件
步骤2:环境配置
bash
# 1. 创建虚拟环境
conda create -n yolov5 python=3.8
conda activate yolov5
# 2. 安装PyTorch(根据CUDA版本)
pip3 install torch torchvision torchaudio
# 3. 克隆YOLOv5
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
步骤3:开始训练
bash
# 基础训练命令
python train.py \
--img 640 \
--batch 16 \
--epochs 100 \
--data my_dataset.yaml \
--weights yolov5s.pt \
--name my_first_training
# 多GPU训练
python train.py --device 0,1
# 恢复训练
python train.py --resume runs/train/my_first_training/weights/last.pt
步骤4:模型验证
bash
# 测试模型性能
python val.py \
--weights runs/train/my_first_training/weights/best.pt \
--data my_dataset.yaml \
--img 640
# 可视化检测结果
python detect.py \
--weights best.pt \
--source test_images/ \
--conf 0.25
七、常见问题与解决方案
7.1 训练问题
Q1: 损失不下降
解决方案:
1. 检查学习率(太大/太小)
2. 验证数据标注质量
3. 检查数据增强是否过强
4. 尝试预训练权重初始化
Q2: 过拟合
解决方案:
1. 增加数据增强
2. 使用早停策略
3. 增加Dropout
4. 简化模型结构
Q3: 内存不足
解决方案:
1. 减小batch size
2. 减小输入尺寸
3. 使用梯度累积
4. 启用混合精度训练
7.2 部署优化
python
# 1. 模型导出
python export.py --weights best.pt --include torchscript onnx
# 2. TensorRT加速(需要GPU)
python export.py --weights best.pt --include engine --device 0
# 3. 量化压缩
import torch.quantization
quantized_model = torch.quantization.quantize_dynamic(
model, {torch.nn.Linear}, dtype=torch.qint8
)
八、教学建议
8.1 分层教学
初级学员:重点掌握
1. 标注工具使用
2. 基础训练命令
3. 结果可视化
中级学员:深入理解
1. 损失函数原理
2. 数据增强策略
3. 超参数调优
高级学员:源码修改
1. 自定义网络层
2. 修改损失函数
3. 添加新特性
8.2 实践项目
项目1:车辆检测
- 数据集:UA-DETRAC
- 目标:检测车辆位置
- 扩展:车型分类
项目2:安全帽检测
- 数据集:SHWD
- 目标:工地安全监控
- 扩展:是否佩戴检测
项目3:自定义项目
- 选择自己感兴趣的场景
- 收集和标注数据
- 完整训练流程
九、资源推荐
学习资源
-
官方资源
-
学习平台
- 课程:吴恩达《深度学习专项课程》
- 实践:Kaggle YOLO相关竞赛
-
社区支持
- Issues:GitHub问题讨论
- 论坛:PyTorch官方论坛
- 博客:知乎、CSDN相关专栏
工具推荐
- 标注工具:Roboflow、CVAT、Label Studio
- 监控工具:TensorBoard、Weights & Biases
- 部署工具:TensorRT、OpenVINO、ONNX Runtime
以上系统的讲解和实操指导,要求掌握YOLOv5的训练流程,从理论基础到实践应用,最终能够独立完成自定义目标检测项目的开发与部署。