YoloV5实战:手把手教你玩转物体检测

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

一、引言:为什么选择YoloV5?

物体检测是计算机视觉的核心任务之一,广泛应用于安防监控、自动驾驶、工业质检等领域。YoloV5作为Yolo系列(You Only Look Once)的第五代版本,凭借其高精度、高速度、易部署的特点,成为开发者首选的实时检测框架。相较于传统两阶段检测器(如Faster R-CNN),YoloV5采用单阶段端到端设计,直接在图像上回归边界框和类别,速度提升数倍;同时,通过改进的CSPDarknet骨干网络和PANet特征融合结构,在精度上媲美甚至超越双阶段模型。

本文将从零开始,通过环境配置、数据准备、模型训练、优化调参、部署应用五个环节,手把手教你完成一个完整的YoloV5物体检测项目。无论你是初学者还是有一定经验的开发者,都能从中获得实用的技术指导。

二、环境配置:搭建开发基石

1. 硬件与软件要求

  • 硬件:推荐使用NVIDIA GPU(如RTX 3060及以上),CUDA加速可显著提升训练速度;若无GPU,可使用Colab免费GPU资源。
  • 软件:Python 3.8+、PyTorch 1.7+、CUDA 10.2+(与PyTorch版本匹配)、cuDNN。

2. 安装YoloV5

通过PyPI直接安装最新稳定版:

  1. pip install ultralytics

或从GitHub克隆源码(适合修改代码):

  1. git clone https://github.com/ultralytics/yolov5 # 克隆仓库
  2. cd yolov5
  3. pip install -r requirements.txt # 安装依赖

3. 验证环境

运行官方示例检测图像:

  1. from ultralytics import YOLO
  2. model = YOLO('yolov5s.pt') # 加载预训练模型
  3. results = model('zidane.jpg') # 检测图像
  4. results.show() # 显示结果

若成功输出带边界框的检测图像,说明环境配置正确。

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

1. 数据集格式要求

YoloV5支持两种数据格式:

  • Yolo格式:每行文本为<class> <x_center> <y_center> <width> <height>(归一化到[0,1])。
  • COCO格式:JSON文件存储标注信息,适合复杂场景。

示例Yolo格式标注(labels/train/img1.txt):

  1. 0 0.5 0.5 0.2 0.3 # 类别0,中心点(0.5,0.5),宽0.2,高0.3
  2. 1 0.3 0.7 0.1 0.1 # 类别1

2. 数据集划分

推荐按7:2:1划分训练集、验证集、测试集。使用datasets.py中的create_dataloader函数自动处理:

  1. from ultralytics.data.utils import create_dataloader
  2. data_dict = {
  3. 'train': 'data/images/train/', # 训练图像路径
  4. 'val': 'data/images/val/', # 验证图像路径
  5. 'names': ['cat', 'dog'] # 类别名称
  6. }
  7. train_loader = create_dataloader(data_dict, batch_size=16, img_size=640)[0]

3. 数据增强策略

YoloV5内置丰富的数据增强方法,可通过hyp.scratch.yaml配置:

  • 几何变换:随机缩放、裁剪、翻转(hsv_h, hsv_s, hsv_v调整色调、饱和度、亮度)。
  • Mosaic增强:将4张图像拼接为1张,增加上下文多样性。
  • MixUp增强:图像与标签的线性叠加,提升模型鲁棒性。

四、模型训练:从预训练到微调

1. 选择预训练模型

YoloV5提供多种规模模型(按参数量从小到大):

  • yolov5s.pt:14M参数,速度快,适合边缘设备。
  • yolov5m.pt:40M参数,平衡精度与速度。
  • yolov5l.pt:76M参数,高精度。
  • yolov5x.pt:170M参数,极致精度。

2. 训练命令详解

基本训练命令:

  1. python train.py --img 640 --batch 16 --epochs 100 --data custom.yaml --weights yolov5s.pt --name my_model
  • --img 640:输入图像尺寸(建议640或1280)。
  • --batch 16:批大小(根据GPU内存调整)。
  • --epochs 100:训练轮数。
  • --data custom.yaml:数据集配置文件。
  • --weights yolov5s.pt:预训练权重路径。
  • --name my_model:实验名称(结果保存在runs/train/my_model)。

3. 关键训练参数

  • 学习率:初始学习率建议0.01(--lr0 0.01),使用余弦退火调整。
  • 优化器:默认SGD(--optimizer 'SGD'),也可选AdamW。
  • 损失函数:CIoU损失(边界框回归)+ Focal Loss(类别不平衡)。

4. 监控训练过程

训练日志会输出以下指标:

  • metrics/precision:精确率(预测为正的样本中实际为正的比例)。
  • metrics/recall:召回率(实际为正的样本中被预测为正的比例)。
  • metrics/mAP_0.5:IoU=0.5时的平均精度。
  • metrics/mAP_0.5:0.95:IoU从0.5到0.95的平均精度(COCO指标)。

可通过TensorBoard可视化:

  1. tensorboard --logdir runs/train

五、模型优化:提升精度与速度

1. 超参数调优

  • 输入尺寸:增大--img(如1280)可提升小目标检测精度,但增加计算量。
  • 批大小:增大--batch可稳定梯度,但需更多GPU内存。
  • 学习率:若训练后期损失波动大,可降低--lr0或增加--warmup_epochs

2. 模型剪枝与量化

  • 剪枝:移除冗余通道,减少参数量:
    1. model = YOLO('yolov5s.pt')
    2. model.prune(amount=0.3) # 剪枝30%通道
    3. model.save('yolov5s_pruned.pt')
  • 量化:将FP32权重转为INT8,速度提升2-4倍:
    1. model = YOLO('yolov5s.pt')
    2. model.quantize() # 量化
    3. model.save('yolov5s_quant.pt')

3. 知识蒸馏

用大模型(教师)指导小模型(学生)训练:

  1. teacher = YOLO('yolov5x.pt')
  2. student = YOLO('yolov5s.pt')
  3. student.distill(teacher=teacher, epochs=50) # 蒸馏50轮

六、部署应用:从模型到产品

1. 导出为不同格式

  • TorchScript:适用于PyTorch生态:
    1. model = YOLO('yolov5s.pt')
    2. model.export(format='torchscript')
  • ONNX:跨平台部署(如TensorRT、OpenVINO):
    1. model.export(format='onnx')
  • CoreML:iOS设备部署:
    1. model.export(format='coreml')

2. 实时检测示例(Python)

  1. from ultralytics import YOLO
  2. import cv2
  3. model = YOLO('yolov5s.pt')
  4. cap = cv2.VideoCapture(0) # 摄像头
  5. while True:
  6. ret, frame = cap.read()
  7. if not ret:
  8. break
  9. results = model(frame) # 检测
  10. annotated_frame = results[0].plot() # 绘制边界框
  11. cv2.imshow('Detection', annotated_frame)
  12. if cv2.waitKey(1) & 0xFF == ord('q'):
  13. break
  14. cap.release()
  15. cv2.destroyAllWindows()

3. C++部署(OpenCV DNN)

若需高性能推理,可用OpenCV加载ONNX模型:

  1. #include <opencv2/dnn.hpp>
  2. #include <opencv2/opencv.hpp>
  3. using namespace cv;
  4. using namespace dnn;
  5. int main() {
  6. Net net = readNetFromONNX("yolov5s.onnx");
  7. VideoCapture cap(0);
  8. Mat frame, blob;
  9. while (true) {
  10. cap >> frame;
  11. if (frame.empty()) break;
  12. blobFromImage(frame, blob, 1/255.0, Size(640, 640), Scalar(0,0,0), true, false);
  13. net.setInput(blob);
  14. Mat outputs = net.forward();
  15. // 解析outputs绘制边界框(需实现NMS)
  16. imshow("Detection", frame);
  17. if (waitKey(1) == 'q') break;
  18. }
  19. return 0;
  20. }

七、总结与展望

本文通过完整的实战流程,展示了YoloV5从环境配置到部署应用的全过程。关键点包括:

  1. 数据准备:规范标注格式,合理划分数据集。
  2. 模型训练:选择合适的预训练模型,调整超参数。
  3. 优化策略:剪枝、量化、蒸馏提升模型效率。
  4. 部署应用:支持多平台导出,满足不同场景需求。

未来,Yolo系列将继续向更高精度、更低延迟发展,结合Transformer架构(如YoloV7的ELAN结构)和自监督学习,进一步拓展物体检测的应用边界。对于开发者而言,掌握YoloV5不仅是完成当前项目的关键,更是迈向更复杂计算机视觉任务的基础。