尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLOv5自定义数据集训练全流程:从环境搭建到模型导出避坑指南

发布时间:2026/9/28 22:27:30

资讯中心
01
ARTICLE

YOLOv5自定义数据集训练全流程:从环境搭建到模型导出避坑指南

YOLOv5自定义数据集训练全流程:从环境搭建到模型导出避坑指南
简介这份资源面向希望上手目标检测的深度学习学习者与工程实践者围绕Yolov5与PyTorch框架完整演示从零训练自定义数据集的流程解决数据标注、配置修改、训练调参到测试部署的落地难题。压缩包共69个文件约13.81MB以20个Python脚本为核心覆盖训练、检测、测试与权重转换9个yaml配置文件对应模型结构与数据集参数另有jpg、png、jpeg等示例图片、md与readme说明文档、sh脚本、ipynb教程笔记及Dockerfile便于快速复现环境。资源已吸引302人学习内容包含数据划分与标注检查脚本、模型配置、训练与评估代码、推理输出示例及权重下载脚本读者可据此掌握数据预处理、损失与优化器理解、数据增强、多GPU训练等关键环节并对照目录结构完成自己的检测项目实战。1. 拆开这个 YOLOv5 训练包它到底能不能让你跑通自己的数据集拿到一个标注着「超详细流程教程」的 YOLOv5 训练包第一反应往往不是兴奋而是怀疑——这类资源十有八九是官方仓库改个名再塞几个跑不通的脚本。我把这个包从头翻了一遍结论是它确实把「用 YOLOv5 PyTorch 训练自定义数据集」这条链路拆成了可执行的步骤而且带了一套 score 数据集的完整示例从图片检查、标注校验、训练验证集划分到训练、推理、导出脚本都在。它解决的核心问题是你手上有一批自己拍的、标注好的图片想训一个能识别特定目标的检测器但卡在「数据怎么组织、yaml 怎么写、train.py 参数怎么配、训完怎么看结果」这几步上。这个包适合刚接触目标检测、想跑通第一个自定义数据集的工程师也适合已经会调 YOLOv8 但想回头补 YOLOv5 这套经典流程的人。它不解决模型结构创新也不解决部署到边缘设备就是老老实实把训练流程走完。2. 环境与数据准备从 PyTorch 安装到 YOLO 格式落盘2.1 环境搭建Python、PyTorch 与 CUDA 的版本咬合YOLOv5 对环境的容忍度比想象中低。requirements.txt 里锁了一批依赖但 PyTorch 本身不在里面得自己装。常见做法是先确认显卡驱动支持的 CUDA 版本再去 PyTorch 官网找对应的安装命令。我一般会先跑一行nvidia-smi看驱动再决定装哪个 CUDA 版本的 torch。# 查看显卡驱动与支持的 CUDA 上限 nvidia-smi # 以 CUDA 11.8 为例装 PyTorch版本按官网当前推荐来别照抄旧文 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 装 YOLOv5 其余依赖 pip install -r requirements.txt这里的关键参数是 CUDA 版本和 torch 版本的对应关系。装错了不会立刻报错而是训练时torch.cuda.is_available()返回 False模型默默跑在 CPU 上一个 epoch 跑半小时你还以为是数据量大。装完务必验证import torch print(torch.__version__) print(torch.cuda.is_available()) # 必须是 True print(torch.cuda.get_device_name(0))如果is_available()是 False先别怀疑代码九成是 torch 和 CUDA 版本没咬合或者驱动太旧。这一步没有后悔药环境不对后面全是白费。2.2 数据组织images 与 labels 的镜像目录结构YOLOv5 读数据靠一个 yaml 文件指向图片目录标签靠约定俗成的路径推导。标准结构是 images 和 labels 平行放置内部再分 train 和 valdataset/ images/ train/ xxx.jpg val/ yyy.jpg labels/ train/ xxx.txt val/ yyy.txt标签 txt 每行是class x_center y_center width height全部归一化到 0~1。这个格式和 COCO 的 JSON、LabelImg 的 XML 都不一样是这个包最容易翻车的地方。包里给了03_train_val_split.py做划分、04_myData_label.py处理标注思路就是先把原始标注转成 YOLO txt再按比例切分。# 03_train_val_split.py 的核心逻辑示意 import os, random, shutil img_dir dataset/images/all train_ratio 0.8 imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(imgs) split int(len(imgs) * train_ratio) for i, name in enumerate(imgs): dst train if i split else val shutil.copy(os.path.join(img_dir, name), fdataset/images/{dst}/{name}) # 对应 label 同步搬过去保持同名 shutil.copy(os.path.join(dataset/labels/all, name.replace(.jpg, .txt)), fdataset/labels/{dst}/{name.replace(.jpg, .txt)})train_ratio控制训练验证比例小数据集一般 8:2 或 9:1。注意图片和标签必须同名同目录层级少一个 label 文件训练时那张图会被跳过或报错。划分前先跑01_check_img.py和02_check_box.py前者查损坏图片后者查越界框和空标签这两个脚本能省掉后面一堆玄学报错。2.3 写自己的 data.yaml路径、类别数与类别名数据摆好后复制data/coco128.yaml改成自己的。核心就四块训练/验证路径、类别数、类别名。# data/score.yaml train: ../dataset/images/train val: ../dataset/images/val nc: 3 names: [person, helmet, vest]nc必须和 names 长度一致写错了训练不报错但类别全乱。路径建议用相对路径绝对路径换机器就废。names 的顺序要和标注时 class id 的映射严格对应标 0 是 personnames 第 0 个就得是 person错一位整个模型学出来的类别都是错的。3. 训练与监控train.py 参数怎么配、日志怎么看3.1 选模型与预训练权重s/m/l/x 的取舍models 目录下有 yolov5s/m/l/x 四个 yaml对应从小到大的四档。选型逻辑很直接显存小、要速度选 s精度优先、显存够选 l 或 x。m 是折中。这个包还带了 yolov3-spp.yaml属于历史遗留新项目不用管。预训练权重不在包里得跑download_weights.sh或手动下。用预训练权重是必须的从零训小数据集基本学不出东西。常见做法是 s 配 yolov5s.ptl 配 yolov5l.pt别混。# 下载预训练权重脚本内容示意 bash download_weights.sh # 或手动指定 python train.py --weights yolov5s.pt --data data/score.yaml \ --img 640 --batch 16 --epochs 300 --device 0--weights指定预训练权重--data指向自己的 yaml--img是输入尺寸--batch是批大小--epochs是训练轮数--device 0指定第一块 GPU。这几个是必调项其余用默认。3.2 关键超参数batch、img、epochs 与学习率--img 640是 YOLOv5 的默认输入改大能提小目标精度但吃显存改小提速但丢细节。--batch受显存限制16 是 8G 显存左右的常见值爆显存就往下调调到 8 甚至 4。--epochs小数据集 100~300 够看验证集指标不再涨就可以停。学习率默认由--hyp里的超参文件控制包里没单独给 hyp用的是内置默认。想调就加--hyp data/hyp.scratch.yaml之类但新手别一上来就动学习率先把流程跑通。# 显存不够时的保守配置 python train.py --weights yolov5s.pt --data data/score.yaml \ --img 640 --batch 8 --epochs 150 --device 0 --workers 4--workers是数据加载线程数Windows 上设太大会卡死设 0 或 4 稳妥。训练开始后看第一行输出确认Image sizes、Using设备、类别数都对再让它跑。3.3 训练日志与指标loss、mAP、PR 曲线怎么读训练过程会在 runs/train/exp 下生成结果核心看results.csv和results.png。三个 lossbox_loss 定位、obj_loss 置信度、cls_loss 分类都在降是好事但别只盯 loss要看 mAP。mAP0.5 是 IoU 阈值 0.5 下的平均精度最直观。mAP0.5:0.95 更严格。验证集 mAP 涨到平台期就可以停。如果 loss 一直降但 mAP 不涨多半是过拟合加数据增强或减 epochs。PR 曲线在runs/train/exp/里看每个类别的曲线下面积某个类别特别差说明该类样本太少或标注质量差。提示训练中断了想续用--resume指向 last.pt别从头再来。4. 推理、验证与导出detect.py 与 test.py 的正确用法4.1 detect.py 跑单图与批量推理训练完拿runs/train/exp/weights/best.pt做推理。detect.py 支持单图、目录、视频、摄像头。# 单张图 python detect.py --weights runs/train/exp/weights/best.pt \ --source test.jpg --img 640 --conf 0.25 --device 0 # 整个目录 python detect.py --weights runs/train/exp/weights/best.pt \ --source test_images/ --conf 0.25 --save-txt--conf 0.25是置信度阈值低于它的框不输出调高漏检多、调低误检多。--save-txt会把检测结果存成 YOLO 格式 txt方便后续统计。结果图默认存 runs/detect/exp包里 inference/output/images 就是这类产物。4.2 test.py 评估与指标复现test.py 用来在验证集或测试集上算 mAP和训练时的验证逻辑一致但可以单独跑。python test.py --weights runs/train/exp/weights/best.pt \ --data data/score.yaml --img 640 --batch 16 --device 0输出每个类别的 P、R、mAP0.5、mAP0.5:0.95。这个数字才是你对外报的指标别拿训练日志里最后一个 epoch 的数糊弄。如果 test.py 的 mAP 明显低于训练日志检查 data.yaml 的 val 路径是不是指向了训练集这种低级错误很常见。4.3 模型导出ONNX 与 TensorRT 的入口包里带了onnx_export.py和yolov5_trt.py前者导出 ONNX后者是 TensorRT 相关。导出 ONNX 是为了跨框架部署python onnx_export.py --weights runs/train/exp/weights/best.pt \ --img 640 --batch 1--batch 1导出的是固定 batch 的模型要动态 batch 得改脚本里的 dynamic_axes。导出后建议用 onnxruntime 跑一遍验证输出和 PyTorch 一致别导完直接上生产。TensorRT 那条链路对环境和版本更敏感属于进阶先把 ONNX 走通。5. 避坑与排查训练自定义数据集最常见的五个翻车点5.1 报「No labels found」或训练时类别数为 0现象训练启动后提示找不到标签或 nc 显示为 0。原因data.yaml 里的 train/val 路径写错或者 labels 目录结构和 images 不镜像。解决确认 images/train 下每张图在 labels/train 下有同名 txt路径用相对路径且从 train.py 所在目录算起。跑一遍02_check_box.py能提前暴露。5.2 显存爆掉 CUDA out of memory现象训练几步后报 OOM。原因batch 或 img 太大或 workers 太多导致内存泄漏。解决先把--batch减半再不行降--img到 416--workers设 0 或 4。别一上来就怪显卡八成是参数没配好。5.3 训练 loss 正常但 mAP 一直是 0现象loss 在降验证 mAP 始终 0。原因类别名和标注 class id 错位或标签坐标没归一化写成了像素值。解决抽查几个 label txt确认数值都在 0~1 之间且 class id 从 0 开始连续。names 顺序和标注映射必须一一对应。5.4 推理结果框全错位或类别乱现象detect.py 出来的框位置离谱。原因推理时的 img 尺寸和训练不一致或用了没归一化的标签训出来的模型。解决推理--img和训练保持一致检查训练数据标签格式。这种玄学问题九成出在数据不在模型。5.5 Windows 下 workers 导致卡死或报错现象Windows 上训练卡在启动阶段。原因多进程 dataloader 在 Windows 上的兼容问题。解决--workers 0或 4别设大。这是血泪经验Linux 上跑得好好的配置搬到 Windows 就翻车。6. 进阶技巧用超参数搜索和冻结层把小数据集榨出更高 mAP流程跑通只是及格线真正拉开差距的是在小数据集上把 mAP 再往上顶几个点。这个包里没直接给超参搜索脚本但 YOLOv5 自带--evolve可以基于遗传算法搜超参。用法是在 train.py 后加--evolve它会跑若干代每代用不同超参组合训练最后给出最优组合。代价是耗时成倍适合数据量小、单次训练快的场景。# 超参进化注意这会跑很多轮先确保单轮能跑通 python train.py --weights yolov5s.pt --data data/score.yaml \ --img 640 --batch 16 --epochs 50 --evolve 30--evolve 30表示进化 30 代实际训练次数远大于 30显存和时间要留够。搜出来的超参会存在 runs/evolve 下下次训练用--hyp指过去。另一个实用技巧是冻结主干。小数据集容易过拟合冻结前几层让模型只学检测头能稳住精度# 冻结前 10 层 python train.py --weights yolov5s.pt --data data/score.yaml \ --img 640 --batch 16 --epochs 100 --freeze 10--freeze 10冻结前 10 层数字按模型深度调s 模型总共几十层冻 10 层差不多是主干前半段。冻结后训练更快、更不容易过拟合但精度上限也低一些适合数据量几百张的情况。数据上千张就别冻了让它全量学。验证有没有真提升别只看训练日志一定用 test.py 在独立验证集上复算 mAP对比冻结前后和 evolve 前后的数字。我一般会固定一个验证集不动所有实验都在这上面比避免数据泄漏带来的虚高。从那以后我每次训新数据集都强制先跑一遍01_check_img.py和02_check_box.py再确认torch.cuda.is_available()是 True最后才动 train.py。这三步花不了五分钟能挡掉后面几小时的无效训练。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。