简介:YOLOv5源码压缩包面向深度学习与计算机视觉研究者、开发者,定位为目标检测训练与推理的完整代码实践资源,适合希望快速上手模型训练与调参的人员。压缩包共121个文件,包含45个yaml配置、34个python脚本,以及pt权重、jpg样例、sh脚本、md说明等,整体约114MB,目录层级清晰,便于按模块查找,已有1160人学习。资源内置yolov5s/m/l模型结构定义、coco数据集配置、数据预处理与增强脚本、train.py训练脚本、test.py测试脚本以及utils工具函数,并附带训练日志、results.csv和预测样例图,可帮助使用者从环境搭建到结果评估完成全流程操作;此外还有requirements.txt依赖清单与Dockerfile,便于快速复现环境。无论是入门目标检测,还是在实际项目中落地YOLOv5,这份代码包都能提供扎实的基础支撑。
1. 解开压缩包之前:先搞懂yolov5-master到底是什么
收到一个名为yolov5-master (1).zip的压缩包,第一反应大概率是:从 GitHub 上拉下来的官方仓库或者某个课程资料里分享的源码包。文件名里的master是 git 的默认主分支名,(1)是浏览器下载重复文件时自动加的序号。这个包,本质上是 Ultralytics 开源的 YOLOv5 目标检测项目完整源码。
很多初学者拿到压缩包的第一件事就是解压,然后双击train.py,等着程序跑起来,结果往往是一堆红色的报错。我见过太多人卡在这里。其实这个包的核心价值不在于它是一个能跑的代码,而在于它把“数据准备、模型训练、指标评估、模型导出、推理部署”整条链路都封装在了一套足够清晰的代码结构里。
YOLOv5 是单阶段目标检测算法的代表实现,它的核心思想是把目标检测当成回归问题一次搞定:输入一张图,直接输出所有目标的类别和位置框。相比两阶段算法(先提议区域再分类),它的优势是速度快、部署友好,在工业界的落地场景极广,比如安防摄像头、工业质检、无人配送车、甚至手机端的实时检测。适合的人群也明确:刚接触深度学习目标检测的学生、需要快速验证算法效果的算法工程师、以及想把检测能力嵌入到实际产品中的开发者。
所以在动手之前,先别急着运行任何东西。打开这个 zip,先看目录结构,理解每个文件夹的职责,这会让你在后面所有操作里都更有底。官方仓库的目录一般长这样:
| 目录/文件 | 作用 |
|---|---|
detect.py | 推理脚本,用训练好的权重对新图片/视频做检测 |
train.py | 训练脚本,用自己的数据集微调模型 |
val.py | 验证脚本,评估模型在验证集上的 mAP 等指标 |
export.py | 模型导出脚本,转成 ONNX、TorchScript、TensorRT 等格式 |
models/ | 模型结构定义(yolov5s.yaml、yolov5m.yaml 等) |
data/ | 数据集配置文件的存放位置 |
utils/ | 各种工具函数(损失计算、数据增强、日志记录等) |
weights/ | 下载的预训练权重通常放这里(官方仓库可能没有,需要自己下载) |
这个项目的代码结构属于那种“模块化到极致”的类型,读代码的路径依赖很强。你只要顺着train.py的 main 入口往下追,基本上能把整个训练流程过一遍。这也是为什么拿一个 zip 包做完整个项目,比看一百篇论文讲解更有效。
2. 环境搭建:从零跑通 detect.py
2.1 环境版本匹配是最大的坑
YOLOv5 的官方要求其实并不苛刻,但对版本匹配比较敏感。我自己踩过最深的坑就是torch和torchvision版本不匹配导致的算子报错。YOLOv5 v6.0 以后的版本,推荐 Python 3.8+ 配合 PyTorch 1.8+。这里建议直接用conda建一个独立环境,避免把系统 Python 折腾坏。
conda create -n yolov5 python=3.8 -y conda activate yolov5然后进入解压好的项目目录,安装依赖:
cd yolov5-master pip install -r requirements.txtrequirements.txt里锁定了核心依赖。但有一个关键点:这个文件默认安装的是 CPU 版的 PyTorch。如果你有 NVIDIA 显卡想用 GPU 训练,最好先单独装 CUDA 版的 PyTorch,再装其他依赖。比如 CUDA 11.8 对应:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118注意:装完 PyTorch 后,建议用
python -c "import torch; print(torch.cuda.is_available())"验证一下。如果输出False,别急着往下走,先解决 GPU 不可用的问题,不然训练速度会让你怀疑人生。
一个很容易忽略的点是requirements.txt里的opencv-python和系统自带的opencv可能冲突。如果安装后import cv2报错,通常是因为 conda 里已经装了另一个版本的 OpenCV。解决办法是强制pip install opencv-python --upgrade --force-reinstall。
2.2 权重文件缺失怎么办
刚解压出来的 yolov5-master 仓库里,通常没有weights/目录下那些.pt权重文件,需要自己去下载。官方提供的预训练权重有yolov5s.pt(最小的轻量版,适合快速验证)、yolov5m.pt、yolov5l.pt、yolov5x.pt(精度最高但最慢)这几个规格。
这里有个小技巧:不需要特地跑到 GitHub Releases 去下载。直接运行detect.py,代码会自动下载对应规格的权重文件。比如:
python detect.py --weights yolov5s.pt --source data/images/bus.jpg如果网络不稳定导致下载失败,可以手动从官方 Release 页面下载到weights/目录。权重文件不大,yolov5s.pt大概 14MB 左右,yolov5x.pt也就 170MB 左右。
2.3 第一次推理的完整过程
detect.py是整个项目里最适合新手第一个跑通的脚本。它会完成“加载模型 → 读取图片 → 前向推理 → 后处理(置信度过滤 + NMS 非极大值抑制)→ 画框 → 保存结果”这一整条链路。
跑官方示例图片:
python detect.py --weights yolov5s.pt --source data/images/bus.jpg --conf-thres 0.4 --iou-thres 0.5参数解释:
--conf-thres:置信度阈值。预测框的置信度低于这个值的会被过滤掉。调低了会漏检,调高了会误检,需要看场景去调。--iou-thres:NMS 的 IoU 阈值。用于去掉重复的框,重叠程度超过这个阈值的框会被合并。一般保持 0.5 左右。
跑完之后,项目目录下会生成runs/detect/exp文件夹,检测结果图就在里面。看到图上画出了 bus、person 这些目标的检测框,说明整个环境已经通了。第一次跑通的感觉会很爽,但这也是刚刚开始。
提示:
--source参数非常灵活,支持单张图片、文件夹、视频文件,还可以直接填摄像头 ID(比如0表示笔记本自带摄像头),实测直接传 RTSP 流地址也能跑,这对后面做实时检测非常方便。
3. 训练自己的数据集:从标注到 yaml 配置
运行环境没问题之后,时机已经成熟,可以开始训练自己的数据集了。这也是绝大多数人下载这个 zip 的真实目的,毕竟用官方权重做通用物体检测只是一个 demo,真正的工作还是要落到自己的业务场景里。
3.1 数据集格式与标注工具
YOLOv5 使用的数据集格式是“一张图片对应一个同名 txt 标注文件”。每行代表一个目标,格式是:
class_id x_center y_center width height注意,x_center、y_center、width、height都是相对于图片宽高的归一化坐标,取值在 0~1 之间。我第一次标注的时候把像素坐标直接塞进去了,训练时 loss 直接爆表,后来才发现问题。
标注工具推荐两个:
- LabelImg:老牌工具,安装方便,支持 YOLO 格式导出,适合小规模数据标注。
- X-AnyLabeling:自动化辅助标注能力更强,可以拿一个现成模型先粗标一遍再人工修正,效率翻倍。
标注完的数据目录组织要规范,YOLOv5 官方推荐这样放:
dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/只要图片和标签对得上,格式符合要求,YOLOv5 就能读。我用过 CoCo 格式的数据,后来做项目时自己写了个脚本转成 YOLO 格式。在这个转换的事情上,如果有耐心,可以再把代码抽出来构建一个通用转换脚本,以后不同来源的数据集都能转。
3.2 data.yaml 配置文件详解
训练之前必须准备一个 yaml 文件,告诉 YOLOv5 三件事:数据集在哪、有哪几个类别、类别名是什么。
最基本的配置长这样:
train: dataset/images/train val: dataset/images/val nc: 2 names: ['cat', 'dog']nc是类别数量,names里每个名字的索引位置必须和标注文件里的class_id对应。比如0对应cat,1对应dog。
这里有一个常见的坑:train和val路径建议写相对路径或者绝对路径,尽量不要用~符号。因为 YOLOv5 在读取配置时对~的展开处理并不总是如预期,我身边有同事因此卡了很久,改成绝对路径就正常了。
3.3 训练启动与关键参数
开始训练:
python train.py --data data.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --imgsz 640--batch-size是最需要根据显卡显存调整的参数。12GB 显存跑yolov5s用batch-size 16比较稳妥;如果显存只有 6GB,就要降到 8 或者 4,否则会报 CUDA out of memory。
训练过程会实时打印每个 epoch 的 loss 值(box_loss、obj_loss、cls_loss)、precision、recall 和 mAP。看到这些指标在逐步变好,基本说明模型在学习。训练结束后,runs/train/exp目录下会保存最佳的权重best.pt和最后一轮的权重last.pt。
4. 训练过程核心问题:评价指标与超参数调整
4.1 怎么理解 mAP、Precision、Recall
训练过程中,大家都在盯着 mAP 这个数,但很多人其实没完全搞清楚它是什么。简单解释一下:
- Precision(精确率):模型预测为正例的目标中,真正正确的比例。高精确率意味着模型很少误报。
- Recall(召回率):真实为正例的目标中,模型成功找出来的比例。高召回率意味着模型很少漏报。
- mAP(mean Average Precision):在不同置信度阈值下 Precision-Recall 曲线围成的面积取平均,是一个综合指标。
训练日志里常见的mAP@0.5是指 IoU 阈值为 0.5 时的 mAP;mAP@0.5:0.95是 0.5 到 0.95 每隔 0.05 取一个 IoU 阈值求平均。这后一个指标对框的位置精度要求更高,也是论文里最常用的对比指标。
实际项目中,我的经验是:如果业务要求“尽量少误报”,就重点看 Precision;如果业务要求“尽量别漏”,就重点看 Recall。比如工业质检里漏检一个次品的代价很高,我就会在训练时往高 Recall 的方向调。
4.2 超参数调整的实操建议
yolov5s本身带着一批默认超参数,在data/hyps/hyp.scratch-low.yaml里可以找到。对绝大多数项目,先跑一版默认超参数,再针对性调整两三个关键项就够了,完全没有必要一开始就动全部参数。
最常调的三个:
lr0:初始学习率,默认 0.01。数据量小的时候可以调到 0.005,避免发散。mosaic:是否启用马赛克数据增强,默认 1.0。小目标多的数据集一定要开,效果提升明显。close_mosaic:训练最后 10 个 epoch 关闭马赛克增强,帮助模型收敛到真实分布。
还有一个容易被忽略的:--patience参数,它控制早停的耐心值。如果连续 N 个 epoch 验证集指标没提升,训练会自动停止。默认值是 100,如果时间紧张可以调成 30,实测能省下不少无效训练时间。
5. 模型部署与进一步扩展
5.1 用 export.py 导出模型
训练完的.pt权重不能直接在移动端或边缘设备上跑,需要通过export.py导出成目标平台需要的格式。
导出 ONNX:
python export.py --weights runs/train/exp/weights/best.pt --include onnx --imgsz 640ONNX 是一个开放的模型交换格式,最大的价值是“一次导出,到处部署”。导出后可以用 ONNX Runtime 在 CPU 上跑,也可以用 TensorRT 在 NVIDIA GPU 上加速。如果目标设备是树莓派这类嵌入式平台,通常还会导出成 NCNN 或 RKNN 格式(针对瑞芯微芯片)。
提醒:导出时
--imgsz是推理时固定输入尺寸。如果训练时用了 640,导出也建议保持 640。如果训练和导出尺寸不一致,精度会有明显下降。我自己实验过 640 训练、416 导出的情况,mAP 掉了将近 3 个点。
5.2 轻量化与边缘端部署的取舍
在边缘端部署 yolov5,最核心的矛盾是速度和精度。以树莓派 5 为例,yolov5s用 CPU 推理一张 640x640 的图差不多要 1~2 秒,这在很多实时场景里没法接受。
解决办法通常是三板斧:
- 换更小的模型:
yolov5n(nano)是参数量最少的版本,速度快很多,精度损失在可接受范围内。 - 降低输入分辨率:640 降到 320,速度能翻倍,但对小目标的检测能力会急剧下降。
- 换成推理优化的后端:比如在 NVIDIA Jetson 上用 TensorRT 做 FP16 推理,速度比原始 PyTorch 快好几倍。
另外一个实战技巧是:用torch.jit或 ONNX 导出后,把模型编进 C++ 工程里调用,这样可以彻底摆脱 Python 解释器的性能损耗,部署到工业现场时也更容易集成到现有系统里。
6. 常见问题排查速查表
| 问题现象 | 排查思路 | 解决办法 |
|---|---|---|
CUDA out of memory | 显存不足 | 调小batch-size,或换更小的模型如yolov5s换yolov5n |
KeyError: 'labels'之类的报错 | 数据集路径或标注格式错误 | 检查 data.yaml 中的路径、标注文件是否和图片一一对应 |
| 训练时 loss 为 NaN | 学习率过大或标签有异常 | 调小lr0,重点检查标注文件是否有负坐标 |
| 推理时检测不到目标 | 阈值设置问题或模型欠拟合 | 调低--conf-thres观察;确认训练轮数是否够 |
torchvision版本不匹配 | 版本冲突 | pip install torchvision --upgrade --force-reinstall |
| 下载权重超时 | 网络问题 | 手动下载 .pt 文件放到 weights 目录 |
| 训练完 best.pt 和 last.pt 一样 | 最后一轮恰好是最优 | 正常现象,优先使用 best.pt |
| 验证集 mAP 高但实际效果差 | 过拟合或数据分布不一致 | 检查验证集是否有数据泄漏,增加真实场景的测试样本 |
上面这些坑,是我在多个实际项目中真实遇到过的。最令自己印象深刻的还是标注数据的质量——训练前期 mAP 一直上不去,怎么调参数都没用,后来逐张检查标注文件,发现某一大类别的框偏移了特别多,重新清理标注后指标直接上涨了 10 多个点。数据质量永远比模型调参更重要,这个道理,在 yolov5 项目里体现得淋漓尽致。
这个 zip 包只是起点,真正有价值的是沿着训练、评估、部署这条链路把它用起来,做成属于自己的检测系统。如果你也想做一个具体场景的检测项目,从现在开始标注第一批数据吧,跑通一遍之后,前面所有的困惑都会慢慢清晰起来。
本文还有配套的精品资源,点击获取