YOLO-V5实战入门:从零开始构建你的第一个目标检测系统
在工业质检线上,摄像头扫过流水线,瞬间识别出缺失零件的电路板;在楼宇大堂,门禁系统自动判断行人是否佩戴口罩;在农田上空,无人机飞过便能统计果树数量——这些看似“聪明”的视觉能力背后,往往都离不开一个核心角色:实时目标检测模型。
而在众多算法中,YOLOv5虽然不像某些顶会论文那样充满数学推导和理论创新,却以惊人的实用性和部署便捷性,成为工程师最信赖的工具之一。它不追求“最前沿”,但力求“最可用”。如果你正需要快速搭建一套能跑通、能输出结果的目标检测流程,那么跳过冗长的理论铺垫,直接动手用 YOLOv5 实战,可能是最快的方式。
环境准备:让代码跑起来是第一步
我们从官方仓库开始:https://github.com/ultralytics/yolov5。点击 “Code” → “Download ZIP” 下载项目,解压后建议命名为yolov5,保持路径清晰。
进入目录后,第一件事就是安装依赖:
pip install -r requirements.txt这里有个关键点:版本兼容性。YOLOv5 对 PyTorch 和 Python 有明确要求:
-Python ≥ 3.7
-PyTorch ≥ 1.7
为了避免与其他项目的环境冲突,强烈推荐使用 Conda 创建独立虚拟环境:
conda create -n yolov5 python=3.9 conda activate yolov5 conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia激活环境后,简单验证一下 GPU 是否就绪:
import torch print(torch.__version__) # 应显示 1.7 以上 print(torch.cuda.is_available()) # 若使用 GPU,应返回 True一旦看到True,说明你已经拥有了加速训练的“发动机”。
数据集配置:教会模型认识你要检测的东西
新手常犯的一个错误是直接挑战 COCO 这类超大数据集,动辄几十GB,不仅下载慢,训练一轮就得几个小时。其实完全可以用一个小而精的数据集快速走通全流程。
推荐平台 Roboflow Public Datasets,里面有很多标注好、格式齐全的小型数据集。比如我们选一个经典的口罩检测(Mask Wearing)数据集进行演示。
下载时选择YOLO v5 PyTorch 格式,解压后你会看到这样的结构:
mask_data/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/将整个文件夹放到与yolov5同级目录下,方便后续引用。
接下来要写一个.yaml配置文件来告诉模型:“你要学什么?数据在哪?” 新建或修改data/mask_data.yaml:
train: ../mask_data/train/images val: ../mask_data/valid/images test: ../mask_data/test/images nc: 2 names: ['with_mask', 'without_mask']nc是类别数,这里是两个:戴口罩 vs 没戴。- 路径用的是相对路径,确保脚本运行时能找到数据。
- 如果暂时没有测试集,可以省略
test字段。
这个 YAML 文件就像是模型的“学习大纲”,之后所有训练都会依据它来加载数据。
顺便提一句标签格式:每张图对应一个.txt文件,内容为归一化坐标:
<class_id> <x_center> <y_center> <width> <height>例如:
1 0.48 0.62 0.20 0.35表示这是一个 ID 为 1 的目标(即without_mask),中心位于图像 48% 宽度、62% 高度处,框占整图宽的 20%、高的 35%。这种设计使得模型对不同分辨率图像具有更好的适应性。
首次训练时,YOLOv5 会自动生成labels.cache缓存文件,加快后续数据读取速度,这也是它工程优化细腻的地方之一。
模型初始化:站在巨人的肩膀上
从小数据集从头训练一个深度网络?效果通常很差。更聪明的做法是迁移学习——加载在大规模数据上预训练好的权重作为起点。
YOLOv5 提供了多个尺寸版本,满足不同场景需求:
| 模型 | 特点 |
|---|---|
yolov5s | 最小最快,适合边缘设备 |
yolov5m | 平衡速度与精度 |
yolov5l/yolov5x | 更大更深,精度更高但耗资源 |
对于实验阶段,首选yolov5s。前往 Release 页面下载权重:
👉 https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt
保存为yolov5s.pt并放入项目根目录即可。
开始训练:让模型真正“学会看”
训练命令可以通过修改train.py执行,但更灵活的方式是使用终端传参:
python train.py \ --img 640 \ --batch 16 \ --epochs 50 \ --data data/mask_data.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --name mask_exp逐个解释这些参数的意义:
--img 640:输入图像统一缩放到 640×640,这是默认尺度,兼顾效率与精度。--batch 16:每次处理 16 张图片。如果你显存不够,可降到 8 或 4。--epochs 50:完整遍历数据集 50 次。小数据集一般 30~100 轮足够。--data:指向我们刚写的mask_data.yaml。--cfg:指定模型结构,这里用的是yolov5s的定义。--weights:初始权重来源。--name:本次实验的名字,结果将保存在runs/train/mask_exp/。
第一次运行可能会自动下载一些辅助资源(如绘图字体),若网络受限导致失败,可手动访问提示链接补全。
训练过程中,你会看到类似输出:
Epoch gpu_mem box_loss obj_loss cls_loss Instances Size 1/50 2.1G 0.0784 0.0342 0.0215 12 640 2/50 2.1G 0.0691 0.0310 0.0187 14 640 ...重点关注:
- 各项损失是否稳定下降?
- mAP@0.5 是否逐步上升?
训练结束后,最佳模型会保存为:
runs/train/mask_exp/weights/best.pt同时生成一系列可视化图表:PR 曲线、混淆矩阵、特征热力图等,帮助你判断模型有没有“死记硬背”或者严重偏科。
推理应用:让模型真正“干活”
模型训练好了,下一步就是让它去“实战”。YOLOv5 提供了detect.py脚本,支持多种输入源。
图像检测
单张图检测命令如下:
python detect.py \ --weights runs/train/mask_exp/weights/best.pt \ --source inference/images/example.jpg \ --conf-thres 0.4 \ --name mask_detect_result也可以批量处理整个文件夹:
--source inference/images/检测结果会自动叠加边界框和标签,并保存到:
runs/detect/mask_detect_result/视频检测
支持.mp4,.avi等常见格式:
python detect.py \ --weights best.pt \ --source video.mp4 \ --conf-thres 0.5输出视频会在原帧上绘制检测框,流畅展示每一帧的识别过程。
实时流与扩展场景
更酷的是,它还能接入实时信号:
--source值 | 功能 |
|---|---|
'0' | 调用本地摄像头(实时检测) |
'rtsp://xxx' | 接入安防监控流 |
'https://youtu.be/...' | 直接分析 YouTube 视频(需安装 youtube-dl) |
比如想做个简易的门禁提醒系统,只需一条命令:
python detect.py --weights best.pt --source 0摄像头一开,画面中的人脸是否戴口罩立刻被标出——这就是工业落地的第一步。
常见问题与调优技巧
❗ CUDA out of memory?
这是最常见的报错。解决方法很直接:
- 减小--batch(如设为 8 或 4)
- 降低输入分辨率:--img 320或416
- 添加--noautoanchor关闭自动锚框调整(有时反而更稳)
❗ 检测不准?漏检严重?
可能原因包括:
- 数据太少(<200 张难以泛化)
- 标注质量差(漏标、错标)
- 测试样本与训练分布差异大(如肤色、光照、角度)
应对策略:
- 增加多样性数据(不同背景、姿态、遮挡情况)
- 利用内置增强功能(Mosaic、HSV 变换、随机裁剪)
- 微调阈值:--conf-thres 0.3~0.6控制灵敏度,--iou-thres调整合并逻辑
值得一提的是,YOLOv5 默认开启 Mosaic 数据增强,即将四张图拼成一张进行训练,极大提升了小样本下的鲁棒性。这一点在实际项目中非常实用。
❗ 如何部署到生产环境?
训练完的.pt文件不能直接扔进服务器。你需要把它转换成通用格式:
python export.py --weights best.pt --include onnx engine这条命令会生成:
-best.onnx:适用于 ONNX Runtime 的跨平台推理
-best.engine:TensorRT 引擎,可在 Jetson 系列设备上实现超高性能推理
这意味着你可以把模型部署到树莓派、Jetson Nano、工控机甚至手机端,真正做到“端边云一体”。
为什么 YOLOv5 能成为工业界的“标配”?
尽管 YOLOv5 没有发表传统意义上的学术论文,但它在工程实践中的成功绝非偶然。它的核心优势在于:
✅ 极致的易用性
- 代码结构清晰,模块解耦良好
- 训练/检测脚本开箱即用
- 支持一键导出 ONNX/TFLite/CoreML
✅ 高效的训练与推理表现
- 在 GTX 1660 上也能达到 30+ FPS
- 多尺度推理策略动态平衡速度与精度
- 内置 AMP(自动混合精度),节省显存提升速度
✅ 强大的生态支持
- GitHub 星标超 15k,社区活跃
- 文档详尽,Issue 回复及时
- 与 Roboflow、LabelImg 等工具无缝集成
更重要的是,它降低了 AI 落地的技术门槛。无论是学生做课程项目,还是企业开发自动化质检系统,都能在几天内完成“数据→训练→部署”的全流程闭环。
下一步你可以做什么?
掌握了基础流程后,不妨尝试以下方向深化理解:
🔧构建自己的数据集
用 LabelImg 工具标注一批真实场景图片,打造专属检测器。
🚀模型轻量化与部署
将模型转为 TensorRT,在 Jetson Nano 上实现实时运行,体验嵌入式 AI 的魅力。
📊性能评估与分析
打开results.csv,观察 precision、recall、mAP 等指标的变化趋势,理解它们背后的含义。
🧠阅读核心源码
深入models/yolo.py看看 Detect 层如何工作,研究utils/datasets.py中的数据增强实现,你会发现很多“原来如此”的细节。
YOLOv5 不只是一个目标检测算法,更是一套完整的工业化解决方案。它不炫技,但务实;不深奥,但可靠。当你亲手跑通第一个检测任务,看着屏幕上跳出那个绿色的“with_mask”标签时,你就已经迈出了通往智能视觉世界的第一步。
别犹豫了——现在就去运行那条命令,让电脑真正“看见”你想要它识别的世界。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考