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

YOLOv9实战:成人/小孩检测数据集详解与训练调优指南

发布时间:2026/9/24 20:30:15

资讯中心
01
ARTICLE

YOLOv9实战:成人/小孩检测数据集详解与训练调优指南

YOLOv9实战:成人/小孩检测数据集详解与训练调优指南
简介面向成人与小孩识别任务的数据集包共1738张原始图片基于YOLOv9格式完成标注模型识别率约70.9%适合需要快速训练成人/小孩检测模型的开发者、算法工程师及计算机视觉学习者。压缩包共2000个文件其中包含1738个txt标注文件、261张jpg图像以及1个yaml配置文件整体约91.41MB结构简洁可直接用于YOLOv9系列模型的训练与验证。已有167人浏览学习数据量适中兼顾训练效率与样本多样性。下载后可获得完整图片集与对应标注标注内容覆盖不同姿态、场景下的成人和小孩目标便于开展模型调优、数据增强对照实验或作为课堂实战案例。配套yaml文件明确了类别信息txt标注遵循YOLO格式坐标规范方便使用者直接接入常见训练流程节省数据预处理时间。1. 识别成人和小孩的数据集1738 张图、YOLOv9 标注、70.9% 识别率够不够你用在真实项目里同时识别成人和小孩比想象中麻烦得多。大人和小孩的体型差异、服装复杂度、拍摄距离都不一样直接拿通用行人检测模型去跑经常出现小孩漏检或者把远处的大人当小孩。这个数据集用 1738 张原始图片做基础用 YOLOv9 格式标注官方标注的识别率在 70.9% 左右类别就两个成人和小孩。对刚接触目标检测的人说它是个结构完整、代价小的切入点——数据量不大不小格式标准能直接喂给 YOLO 系列训练自己的模型不需要再折腾标注格式转换。适合两类人一类是正在学怎么训练自定义数据集的初学者另一类是需要在成人/小孩分类场景里快速跑通基线模型的从业者。它不完美但作为基线数据称职。2. 拆开数据集目录结构、标签文件与类别分布先把手里的牌看清拿到数据集第一件事不是急着训练而是把这 1738 张图的结构摸清楚。以我的经验目标检测项目里一半以上的“训练翻车”都能追溯到数据本身的问题比如标注文件对不上图片、类别编号写错、验证集里混进了训练集。先把数据长什么样搞清楚后面所有环节才有意义。2.1 目录长什么样images / labels 双目录约定与文件名玄机从文件名能看出这批数据带着_rf._标记比如000000000368_jpg.rf.a354cea163edd946205e4d13985aba16.jpg。这个rf是 Roboflow 导出数据的典型命名痕迹说明这份数据集很可能经过 Roboflow 平台的处理或生成。这不影响直接使用但要理解一点Roboflow 导出 YOLO 格式时默认会把图片和标注分开放成images和labels两个目录标注文件与图片文件同名只是扩展名从.jpg变成.txt。清理时先验证这套对应关系再动手训练也不迟。# 在数据集根目录执行检查 .jpg 和 .txt 的文件名配对情况 for img in images/*.jpg; do base$(basename $img .jpg) if [ ! -f labels/$base.txt ]; then echo 缺少标注: $img fi done echo 检查完成输出所有缺少对应 txt 的图片路径这段脚本的逻辑很简单遍历images目录下所有.jpg文件取出不带扩展名的文件名basename再拼出对应的.txt路径看它是否存在。如果某些图片没有对应的标注文件说明这个样本是背景图或者标注遗漏了训练时需要单独决定是保留还是剔除。我建议把这个检查脚本跑一遍即使各大平台导出的数据通常配对没有问题但人工整理过的数据集不一定可靠。2.2 标签文件怎么读一行五个数从坐标换算到目标尺寸YOLO 格式的标注文件是纯文本每行代表一个目标对象格式固定为类别编号 中心点x 中心点y 宽度 高度其中所有坐标都做了归一化处理值在 0 到 1 之间对应图片宽高的比例。对于这份只有两个类别的数据集0代表某个类别1代表另一个具体哪个对应成人还是小孩得看数据集的data.yaml配置文件。with open(labels/000000000368_jpg.rf.a354cea163edd946205e4d13985aba16.txt, r) as f: lines f.readlines() for line in lines: parts line.strip().split() class_id, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) print(f类别: {class_id}, 中心点: ({cx:.3f}, {cy:.3f}), 宽: {w:.3f}, 高: {h:.3f})这里有个隐藏信息值得关注每个目标的宽高比例。如果数据集中大量标注框的高宽比明显大于 1说明图片以竖构图或者人物站立姿态为主这对训练时的imgsz和anchor设定有一定影响。另外归一化坐标意味着图片分辨率变化不影响标注文件的有效性——640×640 和 1280×1280 都能直接使用这也是 YOLO 格式的便利所在。2.3 数据分布体检类别不平衡时70.9% 不能只看总数1738 张图听着不少但拆到两个类别上样本量可能并不均匀。我习惯做一次分布统计看每个类别的目标框总数、每张图的平均目标数找出哪些图片里目标特别密集或特别稀疏。from collections import Counter class_counter Counter() boxes_per_image [] for txt_file in glob.glob(labels/*.txt): with open(txt_file, r) as f: lines f.readlines() boxes_per_image.append(len(lines)) for line in lines: class_id int(line.strip().split()[0]) class_counter[class_id] 1 print(每个类别的目标框总数:, dict(class_counter)) print(平均每张图目标数:, sum(boxes_per_image) / len(boxes_per_image))如果发现某个类别的框数量明显偏少70.9% 这个数字就解释得通了——模型对样本多的类别学得好对样本少的类别容易漏。这个数据体检结果决定后续训练时要不要做类别加权或者采样策略。我在处理类似场景时如果某个类别占比低于 20%通常不会直接硬训而是先考虑用数据增强或者补充数据的方式拉平分布。3. 从零跑通 YOLOv9数据划分、配置文件与训练命令的完整链路数据检查没问题就可以进入训练环节了。目标检测的训练流程有几个关键决策点数据怎么划分、配置怎么写、训练参数怎么定。每一步都有讲究走错了后面返工成本很高。3.1 数据划分train / val 比例与随机种子先定规矩再拆分1738 张图不算大训练集和验证集的比例我习惯用 80/20也就是大约 1390 张训练、348 张验证。测试集在这个数据规模下可以省掉直接用验证集评估就好。但要注意一个硬性规则不能把所有图片放在同一个目录里让程序自动随机分必须自己先拆好目录结构。import os import random import shutil random.seed(42) imgs os.listdir(images) random.shuffle(imgs) val_count int(len(imgs) * 0.2) val_imgs imgs[:val_count] train_imgs imgs[val_count:] for img in train_imgs: shutil.copy(fimages/{img}, dataset/train/images/) txt img.replace(.jpg, .txt) shutil.copy(flabels/{txt}, dataset/train/labels/) # 验证集同理固定随机种子random.seed(42)是关键细节。它保证每次运行脚本图片被划分到训练集和验证集的方式都完全一致这样两次训练的结果才具备可比性。很多人在调参时发现模型效果忽上忽下先检查数据划分是否一致再怀疑模型结构。3.2 写 YAML 配置文件路径、类别名、一个都不能错YOLOv9 用 YAML 文件描述数据集的路径和类别信息这是整个训练链路里最简单也最容易出错的一步。路径写错、类别数对不上、类别名顺序颠倒都会让训练过程报错或者结果混乱。# dataset.yaml train: dataset/train/images val: dataset/val/images nc: 2 names: [adult, child]这段配置的要点train和val都指向图片目录程序会自动在同一级目录下找labels文件夹nc是类别总数必须是 2因为这份数据集只区分成人和小孩names里的顺序不是随便写的它对应标注文件里的0和1。如果标注文件写0代表孩子那你必须把names的第一个位置设成child否则训练出的模型推理时类别名就错了。3.3 启动训练YOLOv9 命令行参数怎么设batch 与 imgsz 的关系在 Ultralytics 的框架里YOLOv9 的使用方式跟 YOLOv8 非常像甚至可以直接用同一个命令行入口。训练命令的写法大同小异但参数选择有一些实际经验yolo train modelyolov9c.pt datadataset.yaml epochs100 imgsz640 batch16 device0 patience20这份命令的参数选择背后有实际逻辑。yolov9c.pt是预训练权重用预训练权重做迁移学习比从零训练少走很多弯路收敛也快imgsz640是速度与精度的平衡点如果目标框普遍比较小可以试imgsz1280但显存占用会显著上涨batch16是个相对保守的值如果你的显卡显存低于 8GB建议直接降到 8否则容易 Out Of Memorypatience20表示训练在连续 20 轮验证集指标没有提升时就会自动停止避免无效的训练时间消耗。如果你是从 YOLOv8 训练自己的数据集转过来的会发现这套参数跟 YOLOv8 几乎完全兼容这也是把 YOLOv9 作为一个“升级包”来用最舒服的地方。3.4 第一次训练完看什么metrics、混淆矩阵和 bad case 怎么找训练完成后先看跑出来的指标但不要只看mAP50一个数。打开runs/detect/train目录里的results.png观察验证集损失曲线是否在收敛有没有过拟合的迹象——训练损失持续下降但验证损失回升就是过拟合的典型信号。混淆矩阵confusion_matrix.png能告诉你两类错误成人被错判成小孩还是小孩被漏检。这两种错误的纠正方向完全不同前者需要检查类别边界是否清晰后者大概率是小目标漏检问题。我建议把val_batch_pred.jpg里预测错误的图片都翻出来一张张看别急着调参。有时候模型犯的错误很具体比如所有穿红衣的小孩都被漏检这种规律只有人眼才能在海量数据中发现。4. 70.9% 这个数字怎么读精度下限、失败模式与针对性调优70.9% 的识别率放在目标检测领域不算高但这恰恰说明它有很大的调优空间。拿到这个基线后不满足于 70.9% 是对的但首先要搞明白这个数字是怎么算出来的再谈怎么提高。4.1 70.9% 是 mAP 还是 accuracy先搞清楚指标再谈优化不同数据集给出的“识别率”含义不同常见的可能是mAP50交并比阈值为 0.5 时的平均精度也可能是某个特定测试集上的准确率。对于这个数据集我倾向于理解为mAP50这一类目标检测标准指标。两者的意义有区别mAP50会综合模型的检出能力和定位精度而准确率通常只关心分类是否正确。你在看这个数字时需要自己验证一下——最直接的办法是自己跑一次验证集看输出的指标是否符合 70.9%。这里有坑不同数据划分下同模型的 mAP 也会明显浮动。如果分了 80/20 的训练验证集训练出的模型在验证集上可能只有 68%换一个随机种子可能就 72%。所以当你发现自己的结果跟 70.9% 有差距时先看划分是否相同再看训练参数。4.2 失败模式分析小孩目标小、遮挡重、类间混淆怎么处理两个类别的目标检测常见失败模式在成人/小孩场景里都很典型。第一个是小目标漏检小孩在图片里占的面积如果很小比如高度小于 32 像素YOLO 系列模型特别容易漏掉。第二个是遮挡问题成年人牵着孩子走两张脸贴在一起模型容易把两个目标合并成一个。第三个是类间混淆穿着宽大衣服的小孩和一个身形瘦小的成年人在远处看轮廓极其相似。针对小目标漏检提升输入分辨率是最直接的办法。把imgsz从 640 升到 960 或 1280相当于给模型更多像素去分辨小目标但训练时间会变长不少。针对遮挡问题可以调整数据增强策略——Mosaic 增强实际上能增加模型对部分遮挡的鲁棒性但前提是你的显存撑得住。类间混淆没有银弹需要你手动检查那些“体型特征不明显”的样本看标注是否合理再看模型输出是否有规律可循。4.3 调参优先级数据增强、学习率、epochs 与置信度阈值别一上来就动骨干网络或者换模型性价比最高的调参顺序是先调数据增强再调训练超参最后才考虑换模型结构。对于 1738 张图的小数据集数据增强的价值大于任何模型层面的优化。# Ultralytics YOLOv9 数据增强相关参数在命令行中设置 yolo train modelyolov9c.pt datadataset.yaml epochs100 imgsz640 batch16 \ hsv_h0.02 hsv_s0.7 hsv_v0.5 degrees10 translate0.1 scale0.5 fliplr0.5这段命令中hsv_h、hsv_s、hsv_v控制颜色空间的变化幅度degrees10允许图片随机旋转 10 度translate0.1允许图片平移 10%scale0.5允许缩放 - 50%fliplr0.5就是水平翻转概率为 50%。对于成人/小孩这种姿态不固定的场景这些增强手段能让模型对拍摄角度和光照变化的鲁棒性明显提升。如果类别分布不均衡还可以考虑给少样本类别更高的增强强度但 Ultralytics 默认配置不支持按类别设置增强权重需要手动复制数据或引入额外脚本复杂度高小数据集场景下不建议优先做。置信度阈值是推理阶段的参数对训练指标没有影响但对实际部署效果影响巨大。如果 70.9% 是在默认 0.25 阈值下测出来的你可以把阈值调到 0.4 或 0.5误检会减少但漏检会增加需要观察具体场景里哪类错误更致命。一般安防场景漏检比误检更危险阈值反而应该降一降。5. 避坑指南标注格式、数据泄漏与训练环境的三类常见翻车这个数据集的规模不大结构也不复杂但我在处理类似数据时踩过的坑在这里基本都能复现一遍。每条都是真金白银换来的经验按“现象 → 原因 → 解决”的方式拆开说遇到对应问题能少走很多弯路。5.1 标注文件与图片对不上文件名不匹配导致的天量空标签现象训练开始后日志里显示每张图都没检测到目标loss 一直很低但不收敛验证集精度近似等于 0。原因Roboflow 导出的数据做过 resize 或预处理后图片文件名和标注文件名可能不一致或者数据经过人工整理时把标注文件改了名。YOLO 训练时是“图片名当成 anchor”在 labels 目录里找同名标注文件的对不上就是空标签。解决不要用肉眼看目录写脚本做一一校验把不匹配的文件名全部打印出来逐条核对。这一步也是第 2 章检查脚本的意义所在——我刚拿到任何数据集都会先做一致性检查再进入训练流程。5.2 数据泄漏验证集混进训练集导致的虚假高分现象训练集 mAP 曲线一直往上走没问题但验证集指标高得离谱比如 90% 以上一旦换个真实场景数据就现出原形掉到 50% 以下。原因数据划分时没做去重。拿视频抽帧生成的数据集举例相邻两帧画面几乎一样分到训练集和验证集里实际上等于验证集“看过”训练数据了。虽然这个数据集是 1738 张原始图片标注文件里还带着rf.的 Roboflow 依赖标记但分布规律一致时同样有相似风险。解决划分前先做感知哈希去重把重复或高度相似的图片归成一组整组划入同一集合。不要用随机打乱的方式处理可能含相似帧的数据集。这一点对从视频中截取的数据尤其重要。5.3 环境翻车Ultralytics 版本差异、NumPy 版本与 AMP 黑匣子现象训练跑到前几个 batch 时突然报RuntimeError: CUDA error: device-side assert triggered或者直接Segmentation fault (core dumped)。原因最常见的是 Ultralytics 版本不匹配。YOLOv9 的代码支持经历过从yolo命令行到ultralytics包集成的变化不同版本的参数名和行为有差异。比如旧版本用--batch-size新版本用batch。另外NumPy 版本太高或太低可能引发np.float相关报错。解决固定版本是唯一的出路。用pip freeze把训练时的依赖版本记录下来或者直接使用项目附带的requirements.txt安装。AMP自动混合精度也偶尔是元凶如果你的训练反复在前几个 epoch 崩溃试一下ampFalse有时候收益大于损失。6. 不做 90% 也能进步三个检查点从数据质量一路查到推理链路当你改了不少参数结果还是卡在 70% 出头这时候别急着换大模型先停一下动手检查这条链路的三个关键环节。这三个检查点每一个都比调参更可能让你突破瓶颈。6.1 标签质量复查用脚本把标注框画回去人眼过一遍标签错在哪里模型就错在哪里。成人/小孩这个任务里小孩子蹲着、被抱着、只露出半个身体标注人员很容易把部分遮挡的小孩框错。写一个可视化脚本把标注框画回图上生成一张一张的图片快速翻看。import cv2 img cv2.imread(images/xxx.jpg) with open(labels/xxx.txt, r) as f: lines f.readlines() for line in lines: cls, cx, cy, w, h map(float, line.split()) x1 int((cx - w / 2) * img.shape[1]) y1 int((cy - h / 2) * img.shape[0]) x2 int((cx w / 2) * img.shape[1]) y2 int((cy h / 2) * img.shape[0]) color (0, 255, 0) if int(cls) 0 else (0, 0, 255) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.imwrite(check.jpg, img)这段代码把归一化坐标换算回像素坐标在图上画出矩形框。颜色区分两个类别看有没有框错位置、漏框、框得过大过小。这个检查通常只需要 20 分钟但能在进入下一轮训练前发现大量低级错误省下几个小时的无效训练时间。6.2 推理链路核对归一化坐标、letterbox 与置信度阈值训练没问题但部署效果差问题往往在推理阶段。YOLO 系列模型输入图片时会做 letterbox 缩放也就是把图片等比缩放后填充灰边。如果推理时预处理方式与训练时不一致模型的检测效果会明显下降因为目标的尺度和位置都被改变了。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model(test_person.jpg, conf0.25, imgsz640)conf0.25就是置信度阈值这个值你要根据自己的业务场景去定。安防场景可以选择调低一点宁可多框几个不要漏。而在需要精准计数的场景里阈值调高更合适。别一直用默认值我见过很多人在这个参数上吃了亏。6.3 最终一步自查清单把“后处理”固定成肌肉记忆现在做一个固定动作把上面三个检查点合并成一套自查清单。第一新拿到的数据集先做文件名配对校验。第二训练前跑一次分布统计站点类别比例有没有失衡。第三每轮训练完强制自己打开混淆矩阵和预测结果图而不是只看 mAP。第四推演部署时用到的预处理方式确保它和训练链路一致。这套清单执行得不复杂关键是每次都要做。自从我吃过一次验证集混入训练集的亏之后我每次换数据集都强制走一遍这三个检查点不只是为了这次的结果更是为了让自己对这套流程有肌肉记忆。希望你也能少走一次弯路希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

◈

场景化定制

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

◐

营销型架构

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

▲

全周期服务

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

免费获取你的建站方案

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