YoloV5实战:手把手教物体检测
一、引言:为什么选择YoloV5?
YoloV5作为Ultralytics团队推出的实时物体检测框架,以其轻量化、高精度、易部署的特点,成为工业界和学术界的热门选择。相比前代版本(YoloV3/V4),YoloV5通过自适应锚框计算、Mosaic数据增强、CSPDarknet骨干网络等优化,在速度和精度上实现了显著提升。本文将以实战为导向,从环境配置到模型部署,逐步拆解YoloV5的核心流程,并提供可复用的代码模板。
二、环境准备:快速搭建开发环境
1. 依赖安装
YoloV5支持PyTorch原生实现,推荐使用Python 3.8+和CUDA 11.x环境。通过以下命令一键安装:
# 克隆官方仓库git clone https://github.com/ultralytics/yolov5.gitcd yolov5# 安装依赖(含PyTorch)pip install -r requirements.txt
关键点:
- 若使用GPU,需确保CUDA版本与PyTorch匹配(可通过
nvidia-smi查看驱动版本)。 - 推荐使用Anaconda管理虚拟环境,避免依赖冲突。
2. 数据集准备
以COCO格式为例,数据集需包含:
images/:训练/验证图片(.jpg或.png)labels/:标注文件(.txt,每行格式为class x_center y_center width height,值归一化至[0,1])
数据增强技巧:
YoloV5内置Mosaic增强,可自动拼接4张图片,提升小目标检测能力。如需自定义增强策略,可修改data/augmentations.py。
三、模型训练:从零开始调优
1. 配置文件解析
YoloV5通过YAML文件定义模型结构与训练参数。以yolov5s.yaml为例:
# yolov5s.yaml 配置示例depth_multiple: 0.33 # 深度缩放系数width_multiple: 0.50 # 宽度缩放系数anchors: 3 # 每层锚框数# 骨干网络定义backbone:[[-1, 1, Focus, [64, 3]], # Focus层:切片+拼接操作[-1, 1, Conv, [128, 3, 2]],[-1, 3, C3, [128]]] # C3模块:含Bottleneck的跨阶段连接
参数说明:
depth_multiple/width_multiple:控制模型复杂度,值越小模型越轻量。anchors:预定义锚框尺寸,可通过utils/autoanchor.py自动计算最优值。
2. 启动训练
使用以下命令启动训练(以自定义数据集为例):
python train.py --img 640 --batch 16 --epochs 100 --data coco128.yaml --weights yolov5s.pt --name custom_model
参数详解:
--img 640:输入图片尺寸(需为32的倍数)。--batch 16:批大小,根据GPU内存调整。--data coco128.yaml:数据集配置文件,需包含类别数与路径。--weights yolov5s.pt:预训练权重(支持yolov5s.pt/yolov5m.pt/yolov5l.pt/yolov5x.pt)。
训练日志分析:
- 监控
results.png中的mAP@0.5曲线,若连续10个epoch未提升,可提前终止。 - 使用TensorBoard可视化训练过程:
tensorboard --logdir runs/train/custom_model
四、模型优化:提升精度与速度
1. 超参数调优
- 学习率调整:使用
--lr0 0.01 --lrf 0.01(初始学习率与最终学习率比)。 - 标签平滑:在
data/hyp.scratch.yaml中设置label_smoothing=0.1,防止过拟合。 - 混合精度训练:添加
--half参数,减少显存占用。
2. 模型剪枝与量化
通过export.py导出轻量级模型:
python export.py --weights runs/train/custom_model/weights/best.pt --include torchscript onnx
- TorchScript:支持PyTorch原生部署。
- ONNX:跨平台兼容性强,可通过ONNX Runtime加速。
- TensorRT(NVIDIA GPU):进一步优化推理速度(需单独安装TensorRT)。
五、部署实战:从模型到应用
1. Python推理示例
import torchfrom models.experimental import attempt_loadfrom utils.general import non_max_suppression, scale_boxesfrom utils.datasets import letterboximport cv2# 加载模型weights = 'runs/train/custom_model/weights/best.pt'device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = attempt_load(weights, map_location=device)# 预处理img = cv2.imread('test.jpg')img0 = img.copy()img = letterbox(img, new_shape=640)[0]img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGBimg = torch.from_numpy(img).to(device).float() / 255.0if img.ndimension() == 3:img = img.unsqueeze(0)# 推理pred = model(img)[0]pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=0.45)# 后处理for i, det in enumerate(pred):if len(det):det[:, :4] = scale_boxes(img.shape[2:], det[:, :4], img0.shape).round()for *xyxy, conf, cls in det:label = f'{model.names[int(cls)]} {conf:.2f}'print(label) # 输出检测结果
2. C++部署(TensorRT加速)
- 将PyTorch模型转为ONNX:
python export.py --weights best.pt --include onnx --opset 12
- 使用TensorRT解析ONNX模型:
```cpp
// 示例代码片段
include
include
void buildTensorRTEngine(const std::string& onnxPath) {
auto builder = nvinfer1::createInferBuilder(gLogger);
const auto explicitBatch = 1U << static_cast
nvinfer1:
:kEXPLICIT_BATCH);
auto network = builder->createNetworkV2(explicitBatch);
auto parser = nvonnxparser::createParser(*network, gLogger);
parser->parseFromFile(onnxPath.c_str(), static_cast
:kWARNING));
// 构建引擎并序列化…
}
```
六、常见问题与解决方案
- 训练崩溃:检查CUDA版本与PyTorch兼容性,或降低
--batch-size。 - 精度不足:尝试增大模型规模(如从
yolov5s切换到yolov5m),或增加数据量。 - 部署延迟高:使用TensorRT量化(INT8模式),或调整输入分辨率(如从640x640降到416x416)。
七、总结与扩展
YoloV5的实战核心在于数据、模型、部署的三环节协同优化。通过本文,读者已掌握:
- 环境配置与数据准备
- 模型训练与超参数调优
- 多平台部署方案
下一步建议:
- 尝试自定义数据集训练(如工业缺陷检测)。
- 探索YoloV5与其他框架(如MMDetection)的对比。
- 关注Ultralytics官方更新(如YoloV8的改进)。
通过持续迭代与优化,YoloV5可广泛应用于安防监控、自动驾驶、医疗影像等领域,成为开发者手中的利器。