YOLO-v5目标检测入门:从环境搭建到训练
在工业质检、智能监控和自动驾驶等现实场景中,快速准确地识别特定目标已成为一项基础能力。而YOLO系列模型,尤其是YOLO-v5,凭借其简洁的工程结构与出色的推理效率,已经成为许多开发者落地视觉任务的首选工具。
本文不走“理论先行”的老路,而是带你从零开始实战一次完整的自定义目标检测项目——以“金属裂纹检测”为例,手把手完成环境配置、数据标注、模型训练到效果验证的全流程。整个过程无需深厚的数学背景,只要你会基本的命令行操作,就能跑通属于你自己的AI检测模型。
我们先从最基础但最关键的一步开始:环境准备。
要让YOLO-v5顺利运行,核心依赖是PyTorch + CUDA + Python虚拟环境。推荐使用NVIDIA GPU(如RTX 3080)配合CUDA加速训练,当然,如果你只是做小规模实验或推理,CPU也能跑起来,只是速度会慢不少。
首先克隆官方仓库:
git clone https://github.com/ultralytics/yolov5.git cd yolov5接着创建独立的Python环境,避免包冲突。这里推荐使用Miniconda:
conda create -n yolov5 python=3.9 conda activate yolov5然后安装依赖项。由于某些库在国外源下载缓慢,建议使用国内镜像(如清华源)提升速度:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple⚠️ 注意版本兼容性问题!以下组合经过实测稳定,适用于YOLOv5 v6.1/v7.0版本:
库名 推荐版本 torch 1.12.1+cu113 torchvision 0.13.1+cu113 torchaudio 0.12.1 pandas 2.0.3 Pillow 9.5.0 numpy 1.25.1 matplotlib 3.7.2
如果遇到No module named 'torch'错误,请确认是否安装了带CUDA支持的PyTorch版本。可通过PyTorch官网获取对应命令。
安装完成后,用官方脚本测试环境是否正常:
python detect.py --weights yolov5s.pt --source data/images这个命令会自动下载轻量级预训练模型yolov5s.pt,并对data/images中的示例图片进行推理。结果保存在runs/detect/exp/目录下,打开可以看到人、车、交通标志等都被成功框出。
✅ 到这一步,说明你的环境已经就绪,可以进入真正的“定制化”阶段了。
接下来的关键是:让模型学会识别你想检测的东西。默认的YOLO-v5只能识COCO数据集里的80类物体,比如猫狗、汽车、椅子。但我们的目标是“金属裂纹”,这就需要自己准备数据集。
第一步是图像标注。推荐使用开源工具LabelImg,它简单易用,支持YOLO格式输出。
安装方式如下:
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple启动后通过图形界面操作:
labelimg使用流程很简单:
1. 点击“Open Dir”加载图像文件夹;
2. 按W键画矩形框选目标区域;
3. 输入标签名(如 crack);
4. 保存后自动生成.txt文件,内容为归一化的边界框坐标。
📌 示例标签文件内容:
0 0.485 0.512 0.320 0.615含义:class_id x_center y_center width height,全部基于图像尺寸做了比例归一化。
博主在此任务中标注了62张工业图像(训练集42张,验证集20张),每张图包含不同程度的表面裂纹。这类数据对于缺陷检测、自动化巡检非常有价值。
标注完成后,需按YOLO-v5规定的目录结构组织数据。在项目根目录新建datasets/文件夹:
datasets/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 └── labels/ ├── train/ # 对应标签文件 └── val/确保每个.jpg图片与其同名的.txt标签一一对应(如 crack_001.jpg ↔ crack_001.txt)。最终整体结构如下:
yolov5/ ├── models/ ├── utils/ ├── data/ ├── datasets/ │ ├── images/train/*.jpg │ └── labels/train/*.txt └── ...这种结构是YOLO-v5默认读取数据的方式,不能随意更改路径或命名规则。
现在数据有了,下一步是告诉模型:“我要检测什么?有多少类?”
这需要编写一个YAML配置文件。在data/目录下新建crack.yaml:
# crack.yaml train: ../datasets/images/train val: ../datasets/images/val nc: 1 # 类别数量(仅裂纹一类) names: ['crack'] # 类别名称列表这个文件将被训练脚本引用,用于定位数据路径和解析类别信息。你可以复制data/coco.yaml作为模板修改。
同时,还要调整模型本身的类别数。YOLO-v5原始模型是为80类设计的,我们需要修改其配置文件。
编辑models/yolov5s.yaml,找到这一行:
nc: 80 # number of classes改为:
nc: 1否则会在训练时报错维度不匹配:
Expected input batch_size (1) to match target batch_size (80)虽然我们只有一类,但依然可以加载yolov5s.pt的预训练权重——因为主干网络(Backbone)学到的边缘、纹理等通用特征仍然有用,能显著加快收敛速度。
一切就绪,终于可以启动训练了!
执行以下命令开始训练:
python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data data/crack.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --name crack_exp参数说明:
---img: 输入图像分辨率,默认缩放到640×640;
---batch: 批次大小,根据GPU显存调整(RTX 3080可设16);
---epochs: 训练轮次,一般100~300足够;
---data: 指定数据配置文件;
---cfg: 使用哪个模型结构;
---weights: 初始化权重,推荐用预训练模型;
---name: 实验名称,结果保存在runs/train/{name}/
首次运行时会自动下载yolov5s.pt(约27MB),请保持网络畅通。
训练过程中终端会实时显示损失值(Loss)、精度(Precision)、召回率(Recall)以及最重要的mAP@0.5指标。这些数值会随着epoch推进逐渐优化。
训练结束后,所有产物都会保存在runs/train/crack_exp/目录中:
runs/train/crack_exp/ ├── weights/ │ ├── best.pt # mAP最高的模型权重 │ └── last.pt # 最终轮次的权重 ├── results.png # 各项指标变化曲线 ├── labels.jpg # 真值与预测框对比图 └── opt.yaml # 超参数记录重点关注results.png中的mAP@0.5曲线。理想情况下应达到0.85以上。若初期波动较大,可能是学习率偏高,可在train.py中微调hyp参数。
训练完成后,最关键的问题来了:模型到底能不能用?
我们来做一个实际推理测试:
python detect.py \ --weights runs/train/crack_exp/weights/best.pt \ --source inference/images/test_crack.jpg \ --conf 0.5参数解释:
---weights: 使用最佳权重;
---source: 支持单图、视频、摄像头甚至网络流;
---conf: 设置置信度阈值,过滤低分误检。
检测结果保存在runs/detect/expN/下,原图上叠加了边界框和标签。
🎯 实际表现示例:
在一张光照不均、背景复杂的金属板图像中,模型成功定位出一条细微裂纹,位置准确且无明显漏检或多检。即使部分区域反光强烈,模型仍表现出良好的鲁棒性。
这说明训练是成功的。你可以继续扩展数据集、尝试更大的模型(如yolov5l),或者加入更多数据增强策略进一步提升性能。
在实际操作中,你也可能会遇到一些常见问题,这里列出几个高频坑点及解决方案:
❗ 报错ModuleNotFoundError: No module named 'git'
这是因为在train.py中调用了Git模块记录代码版本。解决方法有两个:
安装 gitpython:
bash pip install gitpython或者在
train.py开头添加屏蔽语句:python import os os.environ["GIT_PYTHON_REFRESH"] = "quiet"
❗ CUDA out of memory 显存溢出
当设置过大的--batch时容易触发。应对策略包括:
- 减小批次大小(如从16降到8)
- 使用更轻量模型(如yolov5s替代yolov5x)
- 启用梯度累积:添加--gradient_accumulations 4参数,模拟大batch效果
✅ 实用技巧汇总
| 技巧 | 建议 |
|---|---|
| 数据增强 | 默认已启用Mosaic和随机裁剪,可在train.py中调节强度 |
| 多GPU训练 | 添加--device 0,1实现并行训练,提升吞吐量 |
| 模型导出 | 使用export.py转换为ONNX/TensorRT,便于部署到边缘设备 |
| 超参数优化 | 添加--evolve启动遗传算法自动调参,寻找最优超参组合 |
YOLO-v5之所以能在工业界广泛落地,不只是因为它够快、够准,更重要的是它的工程友好性:清晰的目录结构、完善的文档、开箱即用的脚本,使得即使是刚入门的新手也能在一天内完成一个完整项目的闭环。
从环境搭建到训练部署,你其实已经掌握了现代目标检测的核心工作流。未来还可以在此基础上延伸:
- 尝试更新的YOLO-v8 或 YOLO-v10,获得更好的精度与速度平衡;
- 结合DeepSORT实现多目标跟踪,应用于行为分析;
- 将模型导出并部署到Jetson Nano/TX2等边缘设备,实现端侧实时推断。
掌握YOLO,就像拿到了一把打开计算机视觉应用大门的钥匙。现在,轮到你去构建属于自己的智能检测系统了。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考