YOLOv5模型训练完整讲解方案

YOLOv5模型训练完整讲解方案

一、教学目标

基础目标(学完能掌握)

  1. 理解YOLO核心思想:掌握one-stage目标检测的基本原理
  2. 完整训练流程:能够独立完成从数据标注到模型训练的全过程
  3. 代码实操能力:能够配置环境、修改代码、训练自己的数据集
  4. 模型评估调优:掌握评估指标解读和基础调参方法

进阶目标(学完能应用)

  1. 自定义修改:能够根据需求调整模型结构
  2. 生产部署:掌握模型导出和部署的基本方法
  3. 问题排查:具备常见训练问题的分析和解决能力

二、YOLOv5核心原理讲解要点

2.1 YOLO设计哲学

复制代码
核心思想:"You Only Look Once"
- 将目标检测视为回归问题
- 单次前向传播完成检测
- 速度与精度平衡

2.2 网络架构关键组件

Input Image
Backbone: CSPDarknet
Neck: PANet
Head: Detection Layers
输出: BBox + Class + Confidence

标要点讲解:

  1. Backbone(主干网络)

    • CSPDarknet53结构
    • Focus模块(v6.0后改为Conv)
    • SPP/SPPF空间金字塔池化
  2. Neck(颈部结构)

    • PANet路径聚合网络
    • 特征金字塔FPN
    • 双向特征融合
  3. 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:自定义项目
- 选择自己感兴趣的场景
- 收集和标注数据
- 完整训练流程

九、资源推荐

学习资源

  1. 官方资源

  2. 学习平台

    • 课程:吴恩达《深度学习专项课程》
    • 实践:Kaggle YOLO相关竞赛
  3. 社区支持

    • Issues:GitHub问题讨论
    • 论坛:PyTorch官方论坛
    • 博客:知乎、CSDN相关专栏

工具推荐

  1. 标注工具:Roboflow、CVAT、Label Studio
  2. 监控工具:TensorBoard、Weights & Biases
  3. 部署工具:TensorRT、OpenVINO、ONNX Runtime

以上系统的讲解和实操指导,要求掌握YOLOv5的训练流程,从理论基础到实践应用,最终能够独立完成自定义目标检测项目的开发与部署。

相关推荐
Coding茶水间2 小时前
基于深度学习的轮船分类检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·yolo·分类
学习3人组2 小时前
YOLOv8+TensorRT+DeepStream部署实操
yolo
Coovally AI模型快速验证20 小时前
当小龙虾算法遇上YOLO:如何提升太阳能电池缺陷检测精度?
人工智能·深度学习·算法·yolo·目标检测·无人机
数据光子1 天前
【YOLO数据集】自动驾驶
人工智能·yolo·自动驾驶
ASD123asfadxv1 天前
基于YOLOv8-FasterNet的液压阀块端盖表面缺陷检测与分类
yolo·分类·数据挖掘
Coding茶水间1 天前
基于深度学习的X光骨折检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
深度学习·yolo·机器学习
无能者狂怒1 天前
DETR(DEtection TRansformer)——基于Transformer的目标检测范式革命与演进
人工智能·深度学习·yolo·目标检测·计算机视觉·transformer
razelan2 天前
yolo 4 - 进阶技巧 QA
yolo
dundunmm2 天前
【每天一个知识点】YOLO算法
算法·yolo·目标检测