YoloV5实战:手把手教物体检测"深度指南

YoloV5实战:手把手教物体检测

引言:为何选择YoloV5?

在计算机视觉领域,物体检测(Object Detection)是核心任务之一,广泛应用于自动驾驶、安防监控、工业质检等场景。YoloV5作为Yolo系列(You Only Look Once)的第五代版本,凭借其速度与精度的平衡易用性活跃的社区支持,成为当前最流行的实时检测框架之一。相比传统两阶段检测器(如Faster R-CNN),YoloV5采用单阶段架构,直接在图像上回归边界框和类别,极大提升了推理效率。本文将通过实战案例,从零开始指导读者完成一个完整的物体检测项目。

一、环境准备:搭建开发基础

1.1 硬件与软件要求

  • 硬件:建议使用NVIDIA GPU(如RTX 3060及以上)以加速训练,CPU训练亦可但耗时较长。
  • 软件
    • Python 3.8+
    • PyTorch 1.7+(与CUDA版本匹配)
    • CUDA 11.1+(若使用GPU)
    • 其他依赖:pip install opencv-python matplotlib tqdm

1.2 安装YoloV5

YoloV5以GitHub仓库形式开源,安装步骤如下:

  1. # 克隆仓库
  2. git clone https://github.com/ultralytics/yolov5.git
  3. cd yolov5
  4. # 安装依赖
  5. pip install -r requirements.txt
  6. # 验证安装
  7. python detect.py --source data/images/zidane.jpg --weights yolov5s.pt --conf 0.25

若成功输出检测结果(如图像中的人、球等),则环境配置完成。

二、数据准备:从原始数据到训练集

2.1 数据集格式要求

YoloV5支持两种主流格式:

  1. Yolo格式:每行一个标注,格式为<class_id> <x_center> <y_center> <width> <height>(归一化到0-1)。
  2. COCO格式:JSON文件包含图像信息、标注和类别。

示例Yolo标注

  1. 0 0.5 0.5 0.2 0.3 # 类别0,中心点(0.5,0.5),宽高0.2x0.3

2.2 数据集划分与增强

  • 划分:建议按7:2:1比例分为训练集、验证集、测试集。
  • 增强:YoloV5内置Mosaic、RandomAffine等增强方法,可通过data/coco128.yaml中的augment参数开启。

自定义数据集配置
data/目录下创建my_dataset.yaml

  1. train: ../my_data/train/images
  2. val: ../my_data/val/images
  3. test: ../my_data/test/images
  4. nc: 3 # 类别数
  5. names: ['cat', 'dog', 'person'] # 类别名称

三、模型训练:调参与优化

3.1 选择预训练模型

YoloV5提供多种规模模型:

  • yolov5s.pt(轻量级,速度快)
  • yolov5m.ptyolov5l.ptyolov5x.pt(精度更高,但计算量增大)

训练命令

  1. python train.py --img 640 --batch 16 --epochs 100 --data data/my_dataset.yaml --weights yolov5s.pt --name my_model
  • --img 640:输入图像尺寸。
  • --batch 16:批次大小(根据GPU内存调整)。
  • --epochs 100:训练轮数。

3.2 关键参数调优

  • 学习率:初始学习率建议0.01,使用--lr0--lrf(最终学习率比例)调整。
  • 优化器:默认使用SGD,可尝试AdamW(需修改models/yolo.py)。
  • 损失函数:YoloV5采用CIoU损失,可通过--iou_t调整IoU阈值。

3.3 训练日志分析

训练过程中会生成runs/train/my_model/results.csv,包含:

  • metrics/precision:精确率。
  • metrics/recall:召回率。
  • metrics/mAP_0.5:IoU=0.5时的平均精度。

可视化工具

  1. tensorboard --logdir runs/train

四、模型评估与优化

4.1 评估指标

  • mAP(Mean Average Precision):衡量模型在不同IoU阈值下的综合性能。
  • F1-score:精确率与召回率的调和平均。

评估命令

  1. python val.py --data data/my_dataset.yaml --weights runs/train/my_model/weights/best.pt --conf 0.001 --iou 0.65

4.2 常见问题与解决方案

  • 过拟合
    • 增加数据增强(如--hsv_h调整色调变化)。
    • 使用Dropout或Label Smoothing(需修改模型结构)。
  • 收敛慢
    • 增大批次大小(若GPU内存允许)。
    • 使用学习率预热(--warmup_epochs)。

五、模型部署:从推理到应用

5.1 导出模型

YoloV5支持多种导出格式:

  1. python export.py --weights runs/train/my_model/weights/best.pt --include torchscript onnx engine
  • --include torchscript:导出TorchScript模型(用于PyTorch部署)。
  • --include onnx:导出ONNX格式(兼容TensorRT等推理引擎)。

5.2 推理示例(Python)

  1. import torch
  2. from models.experimental import attempt_load
  3. # 加载模型
  4. weights = 'runs/train/my_model/weights/best.pt'
  5. model = attempt_load(weights, map_location='cuda')
  6. # 推理
  7. img = 'data/images/test.jpg'
  8. results = model(img)
  9. # 解析结果
  10. for det in results.pred[0]: # 假设单张图像
  11. class_id = int(det[5])
  12. confidence = det[4].item()
  13. x1, y1, x2, y2 = det[:4].tolist()
  14. print(f"Class: {class_id}, Confidence: {confidence:.2f}, BBox: ({x1}, {y1}, {x2}, {y2})")

5.3 部署优化技巧

  • 量化:使用torch.quantization减少模型体积和推理时间。
  • TensorRT加速:将ONNX模型转换为TensorRT引擎,提升GPU推理速度。

六、实战案例:自定义数据集检测

6.1 任务描述

假设需检测交通标志(如停车标志、限速标志),数据集包含1000张图像,3个类别。

6.2 实施步骤

  1. 标注数据:使用LabelImg或CVAT标注工具,导出为Yolo格式。
  2. 配置数据集:创建traffic_signs.yaml
  3. 训练模型
    1. python train.py --data data/traffic_signs.yaml --weights yolov5s.pt --epochs 50 --batch 8
  4. 评估与调优:根据mAP调整学习率或增强策略。
  5. 部署:导出ONNX模型并集成到车载系统中。

七、总结与进阶方向

7.1 核心收获

  • 掌握YoloV5从数据准备到部署的全流程。
  • 理解关键参数对模型性能的影响。
  • 学会通过日志和指标诊断训练问题。

7.2 进阶建议

  • 尝试更复杂的模型:如YoloV7或YoloV8(需注意API差异)。
  • 探索多任务学习:在检测中加入分割或分类头。
  • 参与社区:关注Ultralytics官方GitHub,获取最新更新。

通过本文的实战指导,读者已具备独立开发物体检测应用的能力。YoloV5的模块化设计使得扩展和优化变得简单,期待读者在实际项目中创造更多价值!