
简介面向需要训练自定义目标检测模型的深度学习开发者这是一份以YOLOv5PyTorch为核心的超详细实战教程包内容覆盖环境搭建、数据标注与预处理、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.yamlCOCO 数据集示例配置可作为自定义数据集的模板参考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 还是 yolov5mYolov5 提供了 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 轮--deviceGPU 编号0表示第一张显卡CPU 训练写cpu--workers数据加载线程数Windows 上建议设为 0Linux 可以设 4~8训练过程中命令行会实时打印每个 epoch 的 loss 值、mAP 指标和当前最佳模型信息。你需要关注的关键指标是mAP0.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 不降反升现象训练了十几个 epochloss 值波动很大没有明显下降趋势甚至比初始值还高。原因最常见的是学习率设置过大或者数据集标注质量太差。还有一个容易被忽略的原因是--img参数与标注尺寸不匹配——如果标注框本身就很模糊模型很难学到有效的特征。解决先调低学习率用默认参数中的--lr 0.001试试检查标注文件有没有明显错误我一般会把标注框可视化出来逐张看确认框的位置和类别没有严重偏差。5.2 CUDA out of memory现象训练刚开始就直接报错提示CUDA out of memory。原因显存不够用最常见于 batch size 设置过大或--img尺寸过大。yolov5x 模型加上 640 的输入尺寸batch 设为 328GB 显存几乎必炸。解决把--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.pypython test.py --weights runs/train/my_custom_exp/weights/best.pt --data data/score.yaml --img 640 --batch 16输出的内容包含各类别 AP平均精度和整体 mAP这些数字能帮你判断模型在哪个类别上表现较差进而针对性地补充该类别的训练数据。如果某个类别的 AP 明显低于其他类别大概率是训练集中该类别的样本数量太少或标注质量参差不齐。整套流程跑下来你会发现目标检测训练的真正难点不在模型本身而在数据上。Yolov5 的代码封装已经做得很完善需要你动脑的地方是数据组织、参数调整和结果分析。从那以后我每次接新的检测任务都强制走一遍「标注检查 → 数据划分 → 小模型跑通 → 换大模型调优」的流程看起来多花了一点时间但省下的却是排查问题的数倍时间。希望帮到你。本文还有配套的精品资源点击获取