简介:面向需要训练自定义目标检测模型的深度学习开发者,这是一份以YOLOv5+PyTorch为核心的超详细实战教程包,内容覆盖环境搭建、数据标注与预处理、train/val/test脚本使用、模型配置与部署,适合刚入门目标检测、希望跑通完整流程并迁移到自有数据集的学习者。资源共69个文件,压缩包约13.81MB,以py脚本、yaml配置、jpg/png样例图像和md/readme说明文档为主,另含sh下载脚本、ipynb教程与Dockerfile,可支撑环境复现、数据检查、训练验证和结果可视化;已有302人学习,目录结构清晰,便于按模块查阅。包内不仅有yolov5s/m/l/x等模型配置和数据划分、标签检查等辅助脚本,还提供README、PDF教程与tutorial.ipynb,能帮助初学者避开常见坑点,对照样例图片完成从数据准备到模型训练的全流程实操。学完后读者可独立训练自己的YOLOv5检测模型,并迁移到实际项目中,是一份兼具教学与工程参考价值的优质项目实战资源。
1. 用 Yolov5 训练自己的数据集:这套流程到底解决了什么
做目标检测的都知道,Yolov5 是目前把速度、精度和易用性平衡得最好的模型之一,网上教程一抓一大把。但真正动手训练自己的数据集时,大多数人会卡在同一个地方——不是模型不会跑,而是数据准备、配置文件、训练参数这三件事从来没被完整串起来过。这份项目包包含完整代码、数据集划分脚本、标注检查工具、Yolov5 全系列模型定义,以及作者排过坑之后的详细流程文档,适合那些已经装好 PyTorch、但还没跑通第一个自定义数据集的初学者,也适合想系统梳理一遍训练流程的从业者。
我拆完这套资源后最直观的感受是:它不只是一个能跑的 Yolov5 代码包,更是一份「数据从标注到训练再到推理」的完整操作手册。整个流程中涉及的数据标注格式、目录组织方式、yaml 配置写法、训练参数选择,每一步都有对应的脚本和说明,你照着做就能跑通,而不是像很多教程那样只给你一段 train.py 的命令行就完事。
2. 环境准备与项目结构:先把这些文件的作用搞清楚
2.1 PyTorch 环境安装与版本匹配
拿到项目包后,第一步不是急着跑 train.py,而是先把环境理顺。这个项目依赖 PyTorch、OpenCV、NumPy 等库,其中最核心的是 PyTorch 版本与 CUDA 的匹配关系。如果你用的是 NVIDIA 显卡,建议先确认显卡驱动支持的最高 CUDA 版本,再选择对应的 PyTorch 安装命令。
# 查看显卡驱动支持的 CUDA 版本 nvidia-smi # 安装 PyTorch(以 CUDA 11.8 为例) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装项目依赖 pip install -r requirements.txt这里有个常见的坑:nvidia-smi显示的 CUDA 版本是驱动支持的最高版本,不代表你当前环境里已经装好了对应版本的 CUDA 工具包。PyTorch 是自带 CUDA 运行时的,所以只要驱动版本不低于 PyTorch 要求的 CUDA 版本,就能正常使用 GPU 加速。我一般用python -c "import torch; print(torch.cuda.is_available())"来验证 PyTorch 是否真的能用 GPU。
2.2 项目目录逐个拆解
这套资源的目录结构非常清晰,我把核心部分整理成了下表,方便你对号入座:
| 路径 | 作用 | 重要程度 |
|---|---|---|
train.py | 训练入口脚本,负责读取配置、加载数据、执行训练 | 核心 |
detect.py | 推理脚本,用训练好的权重检测图片、视频或摄像头画面 | 核心 |
test.py | 测试脚本,在验证集或测试集上评估模型 mAP 等指标 | 高 |
models/yolov5s.yaml | 模型结构定义,s/m/l/x 分别对应不同大小的网络 | 高 |
data/coco128.yaml | COCO 数据集示例配置,可作为自定义数据集的模板 | 参考 |
data/score.yaml | 作者为自定义数据集写的配置示例 | 直接参考 |
utils/datasets.py | 数据加载与增强逻辑,包括 mosaic、随机仿射变换等 | 不必改 |
03_train_val_split.py | 数据集划分脚本,把标注好的图片拆成训练集和验证集 | 直接运行 |
01_check_img.py/02_check_box.py | 检查图片完整性和标注框是否越界的工具 | 直接运行 |
weights/readme.md | 预训练权重下载说明 | 先看这个 |
初次接触 Yolov5 的读者可能对models/yolov5s.yaml和data/score.yaml的区别感到混淆。前者定义的是神经网络结构——多少层卷积、每层通道数、几个检测头;后者定义的是训练数据——图片路径、类别名称、类别数量。两个文件在训练时都会被train.py读取,但职责完全不同。
2.3 预训练权重下载与放置
训练自己的数据集时,强烈建议加载 COCO 预训练权重做迁移学习,而不是从零开始训练。预训练模型已经学会了通用的特征提取能力,能让你用更少的数据、更短的时间训练出可用的模型。
# 查看 weights 目录下的下载说明 cat weights/readme.md # 也可以直接使用 train.py 的自动下载功能(首次运行会自动下载) python train.py --weights yolov5s.pt --data data/score.yaml --img 640 --batch 16 --epochs 100--weights参数可以接受本地路径(如weights/yolov5s.pt),也可以直接写文件名(如yolov5s.pt),项目会自动从官方仓库下载。需要注意的是,如果网络环境不稳定导致下载失败,手动下载后放到weights/目录下,再通过--weights weights/yolov5s.pt指定路径即可。
3. 数据准备全流程:从标注工具到数据集划分
3.1 标注格式与工具选择
Yolov5 使用的标注格式是每个图片对应一个同名.txt文件,每行代表一个目标对象,格式为:类别ID 中心点x 中心点y 宽度w 高度h,其中 x、y、w、h 都是相对图片尺寸归一化后的值(0~1 之间)。这是 YOLO 系列的标准格式,与 COCO 的 JSON 格式或 VOC 的 XML 格式不同。
常用标注工具是 LabelImg,它支持输出 YOLO 格式的标注文件。安装非常简单:
pip install labelimg labelimg打开 LabelImg 后,需要先在左侧选择输出格式为 YOLO,然后设置图片目录和标注保存目录。标注时要保证框紧贴目标边缘,不要留太多背景。标注完成后,每个图片会生成一个同名的 txt 文件,打开内容类似这样:
0 0.456789 0.312345 0.123456 0.234567 1 0.678901 0.456789 0.098765 0.187654第一列是类别 ID,从 0 开始计数。类别顺序必须和后续 yaml 配置文件中的类别列表保持一致,否则训练出来的模型类别就是乱的。
3.2 标注质量检查:用好项目自带的两个脚本
标注是一件很容易出错的事,我见过不少初学者标注到一半发现图片损坏、标注框坐标越界、类别 ID 对不上,跑训练时直接报错或精度奇差。这套资源里作者贴心地准备了两个检查脚本,先跑一遍能省下后面大量排查时间。
# 检查图片是否可以正常读取 python 01_check_img.py --img-dir datasets/images # 检查标注框是否正确(是否越界、是否为负值等) python 02_check_box.py --label-dir datasets/labels --img-dir datasets/images01_check_img.py会遍历指定目录下的所有图片,尝试用 OpenCV 读取,如果文件损坏或读取失败会输出对应的图片路径。02_check_box.py会检查每个标注 txt 文件中的坐标值是否在 0~1 范围内、框的宽度和高度是否为正数。这两个脚本是纯离线检查,不会改动任何文件,属于数据准备阶段的「后悔药」。检查通过后再进入下一步,能避免在训练中途因数据问题翻车。
3.3 数据集划分:训练集与验证集
训练神经网络需要把数据划分为训练集和验证集,一般按 8:2 或 9:1 的比例。项目里的03_train_val_split.py就是干这个的,它会自动扫描图片目录,随机划分并生成train.txt和val.txt两个文件,每个文件里是图片的绝对路径列表。
python 03_train_val_split.py --img-dir datasets/images --label-dir datasets/labels --val-ratio 0.2 --out-dir datasets--val-ratio参数控制验证集比例,0.2 表示 20% 的数据作为验证集。如果你的数据量很小(比如只有几百张),建议把比例调到 0.1,保证训练集有足够样本。生成的两个 txt 文件在后续 yaml 配置中会用到——Yolov5 除了支持直接指定图片目录外,也支持通过 txt 文件列表来读取数据。
这里需要注意一个细节:Yolov5 的数据加载逻辑有两种模式。一种是在 yaml 配置中直接写train: datasets/images/train,指定图片目录;另一种是写train: datasets/train.txt,指定文件列表。两种方式都支持,但前者的目录结构要求图片和标注文件分别放在images/和labels/两个平行目录下。这套项目的划分脚本生成的是 txt 列表方式,所以 yaml 中的路径要指向 txt 文件,而不是目录。
3.4 自备数据集的路径改造
如果你手里已经有一套 VOC 格式或 COCO 格式的数据集,想转成 Yolov5 能用的格式,需要写一个转换脚本把 XML 或 JSON 中的边界框坐标换算成归一化的 YOLO 格式。我自己常用的做法是:
# voc2yolo.py 核心转换逻辑 import xml.etree.ElementTree as ET def convert_bbox(size, box): dw = 1.0 / size[0] dh = 1.0 / size[1] x_center = (box[0] + box[2]) / 2.0 y_center = (box[1] + box[3]) / 2.0 w = box[2] - box[0] h = box[3] - box[1] return (x_center * dw, y_center * dh, w * dw, h * dh) # box = [xmin, ymin, xmax, ymax] 来自 VOC 的 XML转换时最容易出错的是坐标系的混淆:VOC 的坐标原点是图片左上角,YOLO 格式的归一化中心点坐标也是以左上角为原点,但单位从像素变成了比例。除以图片宽高即可完成归一化,这步做错会导致训练时损失函数不收敛或者检测框全部偏移。
4. 配置文件与训练参数:把 yolov5 的训练命令彻底讲透
4.1 data yaml 怎么写
训练前必须准备好一个数据配置文件(通常命名为your_data.yaml),它是train.py读取数据的关键入口。项目里的data/score.yaml是一个很好的参考模板,核心结构如下:
# data/score.yaml train: datasets/train.txt val: datasets/val.txt nc: 2 names: ['person', 'car']三个关键字段分别是:训练集路径、验证集路径、类别数量、类别名称列表。nc必须和names的长度一致,且names的顺序必须与标注文件中的类别 ID 一一对应。很多初学者在names里写了 3 个类别但nc还写 2,或者类别顺序和标注文件不一致,训练出来的模型完全没法用。
另外,路径推荐写绝对路径。相对路径容易在切换工作目录时报「No such file or directory」错误,尤其是当你用 IDE 运行时,工作目录默认是项目根目录,但用系统命令行跑时可能会不一样。为了省事,直接写成/home/yourname/datasets/train.txt这种绝对路径最稳妥。
4.2 模型配置:yolov5s 还是 yolov5m
Yolov5 提供了 s/m/l/x 四种尺寸的模型结构,分别定义在models/yolov5s.yaml、models/yolov5m.yaml、models/yolov5l.yaml、models/yolov5x.yaml中。它们的主要区别是网络的深度和宽度不同,检测精度和推理速度也相应不同。
| 模型 | 参数量 | 推理速度 | 精度 | 建议场景 |
|---|---|---|---|---|
| Yolov5s | 约 7.3M | 最快 | 较低 | 边缘设备、实时推理 |
| Yolov5m | 约 21.4M | 快 | 中等 | 一般场景首选 |
| Yolov5l | 约 46.7M | 较慢 | 较高 | 精度优先 |
| Yolov5x | 约 86.9M | 最慢 | 最高 | 服务器端离线检测 |
我的习惯是先用yolov5s跑通整个流程,确认数据没问题后再换成更大的模型提升精度。直接用大模型训练,如果数据有问题,排查成本会成倍增加。毕竟一个 epoch 的训练时间摆在那,s 模型跑 100 轮的工夫,x 模型可能才跑 10 轮。
4.3 训练命令全参数解析
训练命令是这套资源里最核心的操作,完整命令如下:
python train.py \ --weights yolov5s.pt \ --data data/score.yaml \ --img 640 \ --batch 16 \ --epochs 300 \ --device 0 \ --workers 4 \ --project runs/train \ --name my_custom_exp各参数含义和调整建议:
--weights:预训练权重路径,训练自定义数据集时必填,推荐用yolov5s.pt--data:数据配置文件路径,就是上一步写好的 yaml 文件--img:输入图片尺寸,Yolov5 会自动将图片缩放到这个尺寸。640 是默认值,兼顾速度和精度。如果你的目标物体很小,可以考虑设为 1280,但显存消耗会增加不少--batch:批次大小,取决于 GPU 显存。8GB 显存跑 yolov5s 建议设为 16~32,显存不足时优先减小这个值--epochs:训练轮数。小数据集 100 轮足够,大规模数据集建议 300 轮--device:GPU 编号,0表示第一张显卡,CPU 训练写cpu--workers:数据加载线程数,Windows 上建议设为 0,Linux 可以设 4~8
训练过程中,命令行会实时打印每个 epoch 的 loss 值、mAP 指标和当前最佳模型信息。你需要关注的关键指标是mAP@0.5,它是判断模型是否收敛的核心依据。
4.4 训练过程中的监控与中断恢复
训练不是一锤子买卖,中间可能因为电脑休眠、显存溢出等原因中断。Yolov5 提供了断点续训功能,训练时会在runs/train/目录下持续保存last.pt(最近一次权重)和best.pt(验证集上表现最好的权重)。
# 断点续训 python train.py --resume runs/train/my_custom_exp/weights/last.pt--resume参数直接指定 last.pt 的路径,它会自动恢复之前的所有训练参数,包括学习率调度器的状态。这个功能是 Yolov5 做得比较贴心的部分,不用像早期版本的代码那样手动记录中断时的 epoch。训练完成后,best.pt就是你要拿去部署的模型权重。
5. 避坑指南:目标检测训练中最常见的五个翻车现场
5.1 训练 loss 不降反升
现象:训练了十几个 epoch,loss 值波动很大,没有明显下降趋势,甚至比初始值还高。
原因:最常见的是学习率设置过大,或者数据集标注质量太差。还有一个容易被忽略的原因是--img参数与标注尺寸不匹配——如果标注框本身就很模糊,模型很难学到有效的特征。
解决:先调低学习率,用默认参数中的--lr 0.001试试;检查标注文件有没有明显错误,我一般会把标注框可视化出来逐张看,确认框的位置和类别没有严重偏差。
5.2 CUDA out of memory
现象:训练刚开始就直接报错,提示CUDA out of memory。
原因:显存不够用,最常见于 batch size 设置过大或--img尺寸过大。yolov5x 模型加上 640 的输入尺寸,batch 设为 32,8GB 显存几乎必炸。
解决:把--batch值减半或减到四分之一。如果你只有一张 6GB 显存的卡,跑 yolov5s 时建议 batch 设为 8、图片尺寸设为 480,这是比较稳妥的组合。还有一种做法是启用梯度累积,但 Yolov5 的 train.py 没有直接暴露这个参数,改起来比较麻烦,不如直接调小 batch。
5.3 检测结果全部是同一类标签
现象:训练完成后用 detect.py 测试,发现不管检测到什么物体,都输出同一个类别标签。
原因:类别 ID 与类别名称列表错位。标注文件中的类别 ID 和 yaml 中names列表顺序不一致,比如标注时把「车」标成了 ID 0,但在 yaml 中names[0]却写的是「人」。
解决:最笨但最可靠的办法是重新检查标注文件。如果数据量大,写一个小脚本统计所有 txt 文件中的类别 ID 分布,确保没有超出nc范围的 ID,然后核对 yaml 中 names 的顺序是否与 ID 对应。另外,检查一下数据配置文件里的nc是否和 names 的长度一致。
5.4 验证集 mAP 很高,但实际测试效果很差
现象:训练时验证集 mAP 在 0.9 以上,看起来已经收敛得不错,但拿真实场景的图片测试,检测效果却一塌糊涂。
原因:数据集划分不当导致的数据泄漏,或者训练集与测试集分布差异太大。如果验证集和训练集来自同一批图片的不同剪裁,模型过拟合的风险很高;如果你的测试图片包含训练集中从未出现的背景、光线条件,精度自然会掉。
解决:重新划分数据集,确保训练集和验证集来自不同的视频帧、不同时间段或不同的采集地点。做真实项目时,我会刻意留出一部分「完全没见过」的数据做测试,而不是从训练集里随机抽 20%。
5.5 Windows 下运行报 multiprocessing 错误
现象:在 Windows 上直接运行train.py会报BrokenPipeError或DataLoader worker (pid xxx) is killed by signal。
原因:Windows 下 PyTorch 的多进程数据加载不兼容,这是 PyTorch 在 Windows 平台上已知的问题。
解决:把--workers改为 0,问题立刻消失。代价是数据加载变慢,但训练速度的瓶颈主要在 GPU 计算上,数据加载慢一点影响不大。
6. 训练完成后的推理验证:从最佳权重到实际部署的小技巧
训练完成后,你会得到runs/train/my_custom_exp/weights/best.pt,这是验证集上表现最好的权重。下一步是用它来做推理验证,确认模型在真实场景中的表现。项目里的detect.py就是为此准备的:
# 对单张图片推理 python detect.py --weights runs/train/my_custom_exp/weights/best.pt --source data/images/test01.jpg --img 640 --conf-thres 0.5 # 对视频文件推理 python detect.py --weights runs/train/my_custom_exp/weights/best.pt --source data/videos/test.mp4 --img 640 --conf-thres 0.5 # 调用摄像头实时检测 python detect.py --weights runs/train/my_custom_exp/weights/best.pt --source 0 --img 640 --conf-thres 0.5--conf-thres是置信度阈值,只有置信度大于这个值的检测结果才会被输出。默认 0.25,但实际使用中我建议设为 0.5 左右,太低会输出大量误检框,太高又会漏掉真实目标,具体值要根据实际效果调整。
推理完成后,结果会保存到runs/detect/目录下,可视化后的图片会标注检测框、类别和置信度。我一般会重点检查几个地方:检测框是否紧贴目标边缘、小目标能否被检出、类别标签是否准确。如果发现检测框偏移明显,回看训练输出runs/train/下的results.png,确认训练过程是否正常收敛。
如果要批量评估模型在验证集上的表现,用test.py:
python test.py --weights runs/train/my_custom_exp/weights/best.pt --data data/score.yaml --img 640 --batch 16输出的内容包含各类别 AP(平均精度)和整体 mAP,这些数字能帮你判断模型在哪个类别上表现较差,进而针对性地补充该类别的训练数据。如果某个类别的 AP 明显低于其他类别,大概率是训练集中该类别的样本数量太少或标注质量参差不齐。
整套流程跑下来,你会发现目标检测训练的真正难点不在模型本身,而在数据上。Yolov5 的代码封装已经做得很完善,需要你动脑的地方是数据组织、参数调整和结果分析。从那以后,我每次接新的检测任务都强制走一遍「标注检查 → 数据划分 → 小模型跑通 → 换大模型调优」的流程,看起来多花了一点时间,但省下的却是排查问题的数倍时间。希望帮到你。
本文还有配套的精品资源,点击获取