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仓库形式开源,安装步骤如下:
# 克隆仓库git clone https://github.com/ultralytics/yolov5.gitcd yolov5# 安装依赖pip install -r requirements.txt# 验证安装python detect.py --source data/images/zidane.jpg --weights yolov5s.pt --conf 0.25
若成功输出检测结果(如图像中的人、球等),则环境配置完成。
二、数据准备:从原始数据到训练集
2.1 数据集格式要求
YoloV5支持两种主流格式:
- Yolo格式:每行一个标注,格式为
<class_id> <x_center> <y_center> <width> <height>(归一化到0-1)。 - COCO格式:JSON文件包含图像信息、标注和类别。
示例Yolo标注:
0 0.5 0.5 0.2 0.3 # 类别0,中心点(0.5,0.5),宽高0.2x0.3
2.2 数据集划分与增强
- 划分:建议按7
1比例分为训练集、验证集、测试集。 - 增强:YoloV5内置Mosaic、RandomAffine等增强方法,可通过
data/coco128.yaml中的augment参数开启。
自定义数据集配置:
在data/目录下创建my_dataset.yaml:
train: ../my_data/train/imagesval: ../my_data/val/imagestest: ../my_data/test/imagesnc: 3 # 类别数names: ['cat', 'dog', 'person'] # 类别名称
三、模型训练:调参与优化
3.1 选择预训练模型
YoloV5提供多种规模模型:
yolov5s.pt(轻量级,速度快)yolov5m.pt、yolov5l.pt、yolov5x.pt(精度更高,但计算量增大)
训练命令:
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时的平均精度。
可视化工具:
tensorboard --logdir runs/train
四、模型评估与优化
4.1 评估指标
- mAP(Mean Average Precision):衡量模型在不同IoU阈值下的综合性能。
- F1-score:精确率与召回率的调和平均。
评估命令:
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支持多种导出格式:
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)
import torchfrom models.experimental import attempt_load# 加载模型weights = 'runs/train/my_model/weights/best.pt'model = attempt_load(weights, map_location='cuda')# 推理img = 'data/images/test.jpg'results = model(img)# 解析结果for det in results.pred[0]: # 假设单张图像class_id = int(det[5])confidence = det[4].item()x1, y1, x2, y2 = det[:4].tolist()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 实施步骤
- 标注数据:使用LabelImg或CVAT标注工具,导出为Yolo格式。
- 配置数据集:创建
traffic_signs.yaml。 - 训练模型:
python train.py --data data/traffic_signs.yaml --weights yolov5s.pt --epochs 50 --batch 8
- 评估与调优:根据mAP调整学习率或增强策略。
- 部署:导出ONNX模型并集成到车载系统中。
七、总结与进阶方向
7.1 核心收获
- 掌握YoloV5从数据准备到部署的全流程。
- 理解关键参数对模型性能的影响。
- 学会通过日志和指标诊断训练问题。
7.2 进阶建议
- 尝试更复杂的模型:如YoloV7或YoloV8(需注意API差异)。
- 探索多任务学习:在检测中加入分割或分类头。
- 参与社区:关注Ultralytics官方GitHub,获取最新更新。
通过本文的实战指导,读者已具备独立开发物体检测应用的能力。YoloV5的模块化设计使得扩展和优化变得简单,期待读者在实际项目中创造更多价值!