从零开始:基于YOLOv5与PyTorch的物体检测实战指南

一、技术选型与前置准备

1.1 YOLOv5与PyTorch的技术优势

YOLOv5作为单阶段检测器的代表,其核心优势在于速度与精度的平衡。基于PyTorch框架的实现,使其具备动态计算图、GPU加速等特性。PyTorch的生态支持(如TorchVision)可简化数据预处理流程,而YOLOv5的模块化设计(Backbone-Neck-Head结构)便于自定义修改。

1.2 环境配置指南

推荐使用Python 3.8+环境,通过conda创建虚拟环境:

  1. conda create -n yolo_env python=3.8
  2. conda activate yolo_env
  3. pip install torch torchvision torchaudio # 根据CUDA版本选择版本
  4. pip install opencv-python matplotlib tqdm

从GitHub克隆YOLOv5官方仓库:

  1. git clone https://github.com/ultralytics/yolov5.git
  2. cd yolov5
  3. pip install -r requirements.txt

二、数据准备与预处理

2.1 数据集格式要求

YOLOv5采用TXT标签格式,每行格式为:<class> <x_center> <y_center> <width> <height>(归一化到[0,1])。示例:

  1. 0 0.5 0.5 0.2 0.3 # 第0类,中心点(0.5,0.5),宽高占比0.2和0.3

2.2 数据增强策略

YOLOv5内置Mosaic增强(4图拼接)和混合增强(MixUp),可通过修改data/hyp.scratch-p5.yaml调整参数:

  1. # 示例:调整HSV色彩空间增强强度
  2. hsv_h: 0.015 # 色调调整范围
  3. hsv_s: 0.7 # 饱和度调整范围
  4. hsv_v: 0.4 # 明度调整范围

2.3 自定义数据集训练

  1. 创建data/custom.yaml
    1. train: ../datasets/train/images
    2. val: ../datasets/val/images
    3. nc: 3 # 类别数
    4. names: ['cat', 'dog', 'person'] # 类别名称
  2. 启动训练命令:
    1. python train.py --img 640 --batch 16 --epochs 50 \
    2. --data custom.yaml --cfg yolov5s.yaml \
    3. --weights yolov5s.pt --name custom_model

三、模型训练与调优

3.1 训练参数详解

  • --img 640:输入图像尺寸(建议32的倍数)
  • --batch 16:批次大小(根据GPU内存调整)
  • --epochs 50:训练轮次(通常300轮收敛)
  • --weights yolov5s.pt:预训练权重路径

3.2 损失函数分析

YOLOv5采用CIoU Loss优化边界框回归,其损失组成:

  1. 总损失 = 分类损失 + 目标性损失 + 定位损失

通过runs/train/exp/results.png可查看训练过程中的mAP@0.5变化曲线。

3.3 超参数优化技巧

  1. 学习率调整:使用--lr0 0.01设置初始学习率,配合--lrf 0.01(学习率衰减系数)
  2. 锚框优化:运行python utils/autoanchor.py --weights yolov5s.yaml --img 640自动生成适配数据集的锚框

四、模型推理与部署

4.1 基础推理代码

  1. import torch
  2. from models.experimental import attempt_load
  3. import cv2
  4. # 加载模型
  5. weights = 'runs/train/custom_model/weights/best.pt'
  6. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  7. model = attempt_load(weights, map_location=device)
  8. # 图像预处理
  9. img = cv2.imread('test.jpg')[:, :, ::-1] # BGR转RGB
  10. img = cv2.resize(img, (640, 640))
  11. img_tensor = torch.from_numpy(img).to(device).float() / 255.0
  12. img_tensor = img_tensor.permute(2, 0, 1).unsqueeze(0) # CHW格式
  13. # 推理
  14. with torch.no_grad():
  15. pred = model(img_tensor)[0]
  16. # 后处理(需实现NMS和坐标转换)

4.2 部署优化方案

  1. TensorRT加速
    1. python export.py --weights yolov5s.pt --include trt --device 0
  2. ONNX导出
    1. python export.py --weights yolov5s.pt --include onnx --opset 12
  3. 量化压缩:使用PyTorch的动态量化:
    1. quantized_model = torch.quantization.quantize_dynamic(
    2. model, {torch.nn.Linear}, dtype=torch.qint8
    3. )

五、进阶应用技巧

5.1 多尺度训练

修改data/hyp.scratch-p5.yaml中的尺度参数:

  1. scale: 0.5, 1.0 # 随机缩放范围

5.2 类别不平衡处理

在数据集YAML中添加权重参数:

  1. weights: [1.0, 2.0, 0.5] # 对应3个类别的损失权重

5.3 模型蒸馏

使用教师-学生架构进行知识蒸馏:

  1. # 教师模型(YOLOv5x)
  2. teacher = attempt_load('yolov5x.pt')
  3. # 学生模型(YOLOv5s)
  4. student = attempt_load('yolov5s.pt')
  5. # 添加蒸馏损失(需自定义)
  6. distillation_loss = ...

六、常见问题解决方案

  1. CUDA内存不足

    • 减小--batch-size
    • 使用--img 512降低输入分辨率
    • 启用梯度累积:--gradient-accumulation 2
  2. 训练不收敛

    • 检查数据标注质量
    • 降低初始学习率至--lr0 0.001
    • 增加训练轮次至100+
  3. 推理速度慢

    • 启用半精度推理:model.half()
    • 使用TensorRT或OpenVINO加速
    • 简化模型结构(如从YOLOv5x改为YOLOv5s)

七、性能评估指标

指标 计算方法 目标值
mAP@0.5 IoU>0.5时的平均精度 >95%(COCO)
mAP@0.5:0.95 IoU从0.5到0.95的平均精度 >65%(COCO)
FPS 每秒处理帧数(V100 GPU) >140(YOLOv5s)
参数量 模型可训练参数总数 7.3M(YOLOv5s)

通过本文的完整流程,开发者可快速构建从数据准备到部署落地的物体检测系统。实际项目中建议从YOLOv5s小模型开始验证,再逐步扩展至更大模型。最新代码可参考Ultralytics官方仓库的更新日志。