YoloV5实战:手把手教物体检测
一、为什么选择YoloV5?
YoloV5作为Ultralytics团队推出的目标检测框架,凭借其轻量化设计(最小模型仅7.3MB)、高精度表现(COCO数据集mAP@0.5达56.8%)和易用性(支持PyTorch生态),成为工业界和学术界的热门选择。相较于前代版本,YoloV5通过自适应锚框计算、Mosaic数据增强和CSPDarknet骨干网络等创新,在检测速度和准确率上实现了显著提升。
二、环境配置与工具准备
1. 硬件要求
- 推荐配置:NVIDIA GPU(显存≥4GB)+ CUDA 11.x + cuDNN 8.x
- CPU模式:支持但训练速度较慢(约慢10倍)
2. 软件依赖
# 创建conda环境(推荐)conda create -n yolov5 python=3.8conda activate yolov5# 安装核心依赖pip install torch torchvision torchaudio # 根据CUDA版本选择版本pip install opencv-python matplotlib tqdmpip install git+https://github.com/ultralytics/yolov5.git
3. 验证环境
import torchprint(torch.__version__) # 应输出与CUDA匹配的版本print(torch.cuda.is_available()) # 应返回True
三、数据集准备与预处理
1. 数据集结构规范
dataset/├── images/│ ├── train/ # 训练集图片│ └── val/ # 验证集图片└── labels/├── train/ # 训练集标注(YOLO格式)└── val/ # 验证集标注
2. 标注文件格式
YOLO格式标注文件每行包含:
<class_id> <x_center> <y_center> <width> <height>
其中坐标均为相对值(0~1范围),示例:
0 0.5 0.5 0.2 0.3 # 第0类物体,中心在(0.5,0.5),宽高占比0.2和0.3
3. 数据增强技巧
YoloV5内置Mosaic增强(四图拼接)、HSV色彩空间调整和随机缩放等策略,可通过修改data/coco128.yaml中的augment参数调整:
train: ../datasets/coco128/images/train/val: ../datasets/coco128/images/val/nc: 80 # 类别数names: ['person', 'bicycle', ...] # 类别名称
四、模型训练全流程
1. 选择预训练模型
YoloV5提供6种规模模型:
| 模型 | 参数量 | 速度(FPS) | mAP@0.5 |
|——————|————|—————-|————-|
| YoloV5s | 7.3M | 140 | 56.8% |
| YoloV5m | 21.2M | 110 | 60.6% |
| YoloV5l | 46.5M | 82 | 63.7% |
| YoloV5x | 86.7M | 64 | 65.4% |
推荐策略:
- 嵌入式设备:YoloV5s
- 云端部署:YoloV5l
- 高精度需求:YoloV5x + TTA(测试时增强)
2. 训练命令示例
python train.py --img 640 --batch 16 --epochs 100 \--data coco128.yaml --weights yolov5s.pt \--name custom_model --cache ram
关键参数说明:
--img:输入分辨率(建议640或1280)--batch:批大小(根据GPU显存调整)--epochs:训练轮数(通常300轮)--weights:预训练模型路径--cache:数据加载方式(ram/disk)
3. 训练日志解析
训练过程中会输出以下关键指标:
Epoch: 100 | GPU: 0.98h | Prec@1: 0.923 | mAP@0.5: 0.654 | mAP@0.5:0.95: 0.487
- Prec@1:Top-1准确率
- mAP@0.5:IoU=0.5时的平均精度
- mAP@0.5:0.95:IoU从0.5到0.95的平均精度
五、模型优化技巧
1. 超参数调优
在data/hyp.scratch.yaml中调整:
lr0: 0.01 # 初始学习率lrf: 0.01 # 学习率衰减系数momentum: 0.937 # 动量weight_decay: 0.0005 # 权重衰减
2. 模型剪枝
使用--optimize参数进行通道剪枝:
python export.py --weights yolov5s.pt --include prune \--img 640 --optimize 0.3 # 剪枝30%通道
3. 知识蒸馏
通过--teacher参数引入教师模型:
python train.py --weights yolov5s.pt --teacher yolov5x.pt \--data coco128.yaml --epochs 50
六、部署与应用
1. 模型导出
python export.py --weights yolov5s.pt --include onnx \--img 640 --opset 12
支持格式:
torchscript:PyTorch脚本模型onnx:通用跨平台格式coreml:苹果设备专用tflite:安卓设备专用
2. 推理代码示例
import cv2import torchfrom models.experimental import attempt_load# 加载模型model = attempt_load('yolov5s.pt', map_location='cpu')# 推理函数def detect(img_path):img = cv2.imread(img_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = model(img)# 解析结果for *box, conf, cls in results.xyxy[0]:print(f"Class {int(cls)}: {conf.item():.2f} @ {box}")# 执行检测detect('test.jpg')
3. 性能优化
- TensorRT加速(NVIDIA GPU):
trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.engine
- OpenVINO优化(Intel CPU):
mo --framework onnx --input_model yolov5s.onnx \--output_dir openvino_model
七、常见问题解决方案
1. 训练中断处理
使用--resume参数继续训练:
python train.py --resume yolov5s/last.pt
2. 类别不平衡问题
在数据集中采用加权采样或修改损失函数:
# 在data/hyp.scratch.yaml中调整cls_pw: 1.0 # 类别权重平衡系数
3. 小目标检测优化
- 增大输入分辨率(
--img 1280) - 使用更高分辨率的预训练模型(如YoloV5x)
- 在数据增强中增加
--flipud(上下翻转)
八、进阶应用场景
1. 实时视频流检测
import cv2from models.experimental import attempt_loadmodel = attempt_load('yolov5s.pt')cap = cv2.VideoCapture(0) # 或视频文件路径while True:ret, frame = cap.read()if not ret: breakresults = model(frame)# 绘制检测框(需实现draw_boxes函数)# ...cv2.imshow('Detection', frame)if cv2.waitKey(1) == 27: break # ESC键退出
2. 多任务学习
通过修改models/yolo.py中的head部分,可同时实现:
- 目标检测
- 实例分割
- 关键点检测
3. 嵌入式部署
针对树莓派等设备:
- 使用
--half参数进行半精度训练 - 导出为TFLite格式
- 通过
tensorflow-lite-delegate-gpu加速
九、资源推荐
- 官方文档:https://github.com/ultralytics/yolov5/wiki
- 预训练模型:https://github.com/ultralytics/yolov5/releases
- 数据集工具:LabelImg(标注)、Roboflow(数据管理)
- 可视化工具:Weights & Biases(训练监控)
通过本文的实战指导,读者可系统掌握YoloV5从环境搭建到部署应用的全流程。建议从YoloV5s模型开始实践,逐步尝试模型优化和定制化开发。实际项目中,需特别注意数据质量对模型性能的关键影响,建议采用80/20法则分配时间(80%时间用于数据收集和清洗,20%用于模型调优)。