资讯详情

资讯详情

导盲犬拐杖检测数据集VOC+YOLO双格式4635张实战指南

简介本数据集面向计算机视觉开发者与目标检测学习者聚焦导盲犬与盲杖两类目标的识别任务可用于辅助视障人士出行场景下的智能感知模型训练。资源同时提供Pascal VOC与YOLO两种标注格式包含jpg原图及一一对应的xml、txt标注文件方便直接接入主流检测框架。压缩包共约2000个文件以1999个xml标注文件和1个说明用txt为主整体大小286.53MB标注工具为labelImg采用矩形框方式标注。数据集共4635张图片标注类别为guide dog与whiteCane框数分别为1620和4430总框数达6050。需注意部分图片经过增强处理且存在从视频截取、画面连续的场景使用前建议仔细核查。目前已有90人学习下载可作为导盲犬与盲杖检测任务的训练与验证素材帮助快速搭建数据管线并开展模型对比实验。1. 导盲犬拐杖检测数据集4635 张 VOCYOLO 双格式到底能拿来做什么导盲犬拐杖检测数据集 VOCYOLO 格式 4635 张 2 类别这个标题里其实藏了三件事一个特定场景视障人士出行辅助器具识别、两种标注格式Pascal VOC 的 XML 与 YOLO 的 TXT、一个可直接开训的数据规模4635 张、2 类。如果你正在做辅助出行设备、智能盲杖、机器人避障这类项目最卡脖子的往往不是模型结构而是「找不到贴合场景、标注干净、格式现成」的数据。这个数据集解决的正是这个问题它把导盲犬和拐杖两个目标框出来省掉你自己拍图、标框、转格式的两三周时间。它适合三类人一是做 YOLO 入门、想拿真实双类别数据跑通训练闭环的新手二是做辅助器具识别、需要快速验证 baseline 的算法工程师三是做嵌入式部署比如在边缘设备上跑轻量模型想先拿现成数据调通流程的人。需要提前说清楚4635 张、2 类别属于中小规模够跑通、够验证但想冲高精度还得靠增广和迁移学习别指望它一步到位。2. 先搞懂 VOC 与 YOLO 两种格式为什么同一个数据集要存两份2.1 VOC 的 XML 和 YOLO 的 TXT 差在哪Pascal VOC 格式是目标检测领域的老牌标准每张图对应一个同名 XML 文件里面用object节点记录类别名和xmin/ymin/xmax/ymax四个绝对像素坐标。它的好处是可读性强、工具链成熟LabelImg 默认就存这个缺点是坐标是绝对值换分辨率就得重算。YOLO 格式则是每张图对应一个同名 TXT每行一个目标格式是类别索引 cx cy w h后四个都是相对整图宽高的归一化值0~1 之间。它天生适配 YOLO 系列训练脚本读取快、不用解析 XML但可读性差人眼直接看不知道框在哪。这个数据集同时给两份本质是让你「标注用 VOC 存档、训练用 YOLO 直读」不用自己写转换脚本。常见做法是VOC 那份留作原始标注备份和跨框架复用比如转 COCO、转 MMDetectionYOLO 那份直接喂给 ultralytics 的训练入口。2.2 目录结构长什么样先核对再动手拿到压缩包解压后典型结构是这样不同打包者命名略有差异以实际为准dataset/ ├── annotations/ # VOC 的 XML │ ├── 0001.xml │ └── ... ├── images/ # 所有原图 │ ├── 0001.jpg │ └── ... ├── labels/ # YOLO 的 TXT │ ├── 0001.txt │ └── ... └── classes.txt # 类别名顺序即类别索引classes.txt是命门它的行顺序决定了 YOLO TXT 里类别索引的含义。比如第一行是guide_dog、第二行是cane那 TXT 里的0就是导盲犬、1就是拐杖。顺序错了模型学出来的类别就全反了这是最常见的翻车点。先跑一段脚本核对三件事图片数、XML 数、TXT 数是否一致以及类别名是否只有两个。import os from collections import Counter import xml.etree.ElementTree as ET img_dir dataset/images xml_dir dataset/annotations txt_dir dataset/labels imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir)} xmls {os.path.splitext(f)[0] for f in os.listdir(xml_dir)} txts {os.path.splitext(f)[0] for f in os.listdir(txt_dir)} print(图片数:, len(imgs)) print(XML 数:, len(xmls)) print(TXT 数:, len(txts)) print(图片有但XML缺:, imgs - xmls) print(XML有但图片缺:, xmls - imgs) # 统计 VOC 里出现的类别名 counter Counter() for f in os.listdir(xml_dir): tree ET.parse(os.path.join(xml_dir, f)) for obj in tree.getroot().findall(object): counter[obj.find(name).text] 1 print(类别分布:, counter)这段脚本先做集合差集能立刻暴露「有图没标注」或「有标注没图」的脏数据再用Counter统计每个类别出现次数如果出现第三个类别名说明打包时混进了别的标注得先清理。参数上只需改三个目录路径其余不用动。2.3 类别不平衡要先看清楚再决定策略2 类别数据集最怕一类多一类少。跑完上面的统计如果导盲犬 4000 框、拐杖只有 800 框直接训会让模型偏向多数类。常见做法有三种对少数类做复制增广、在损失里给少数类加权、或者用 mosaic/mixup 这类增广让每批里两类都出现。先统计再决策别上来就调模型。3. 用 YOLO 把这份数据跑通从 data.yaml 到第一次训练3.1 组织成 ultralytics 认的目录并写 data.yamlultralytics 系列的 YOLOv5/v8/v11 都类似要求目录按images/train、labels/train这种划分。先写个划分脚本按 8:1:1 切训练/验证/测试import os, random, shutil random.seed(42) src_img, src_lbl dataset/images, dataset/labels root yolo_dataset for split in [train, val, test]: os.makedirs(f{root}/images/{split}, exist_okTrue) os.makedirs(f{root}/labels/{split}, exist_okTrue) names [os.path.splitext(f)[0] for f in os.listdir(src_img)] random.shuffle(names) n len(names) train, val names[:int(n*0.8)], names[int(n*0.8):int(n*0.9)] test names[int(n*0.9):] for split, items in [(train, train), (val, val), (test, test)]: for name in items: for ext in [.jpg, .png, .jpeg]: p os.path.join(src_img, name ext) if os.path.exists(p): shutil.copy(p, f{root}/images/{split}/{name}{ext}) break shutil.copy(f{src_lbl}/{name}.txt, f{root}/labels/{split}/{name}.txt) print(划分完成:, len(train), len(val), len(test))random.seed(42)保证每次划分一致方便复现8:1:1 是中小数据集的稳妥比例验证集用来选 checkpoint测试集只在最后评一次。注意图片扩展名可能不统一脚本里做了三种尝试。然后写data.yamlpath: ./yolo_dataset train: images/train val: images/val test: images/test nc: 2 names: [guide_dog, cane]nc必须等于类别数names的顺序必须和classes.txt完全一致否则标签全错位。3.2 第一次训练的命令与关键参数yolo detect train \ data./data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/guide \ nameexp1modelyolov8n.pt用 nano 版先跑通显存占用低、迭代快imgsz640是通用起点如果你的原图分辨率远大于此可以试 960 但显存翻倍batch16在 8G 显存上比较稳爆显存就降到 8patience20表示 20 轮验证指标不升就早停省时间。第一次训练的目标不是刷精度而是确认 loss 正常下降、没有标签越界报错。3.3 训练日志里该盯哪几个数启动后重点看三行train/box_loss是否稳定下降、metrics/mAP50是否在涨、有没有WARNING: corrupt image/label之类的提示。如果 box_loss 一直不降八成是标签格式问题比如坐标没归一化、类别索引越界。如果 mAP50 卡在很低的值不动先怀疑names顺序和 TXT 索引对不上。这些是血泪经验别急着换模型先把数据链路查干净。4. 避坑与排查这份数据集最容易翻车的 5 个地方4.1 现象训练报「Label class X is out of bounds」原因YOLO TXT 里的类别索引超过了nc-1。比如nc: 2但某行写了2或者classes.txt有 3 行而 yaml 只写了 2 类。 解决跑一段脚本扫描所有 TXT 的最大索引和nc对齐同时核对classes.txt行数。import os max_idx -1 for f in os.listdir(dataset/labels): with open(fdataset/labels/{f}) as fp: for line in fp: if line.strip(): max_idx max(max_idx, int(line.split()[0])) print(最大类别索引:, max_idx) # 应等于 nc-14.2 现象mAP 一直很低但 loss 在降原因VOC 和 YOLO 两份标注不同步比如你用了 VOC 的图配了 YOLO 的旧标签或者转换时坐标算错。 解决随机抽 5 张图把 YOLO TXT 的归一化坐标还原成像素框画到图上肉眼核对是否贴合目标。这一步能抓出绝大多数「静默错误」。4.3 现象验证集指标虚高测试集一塌糊涂原因划分时同一场景/同一视频的连续帧被分到了 train 和 val造成数据泄漏。 解决如果图片来自视频抽帧按视频或时间段整体划分而不是随机按图划分。随机划分在连续帧数据上会骗你。4.4 现象小目标远处拐杖几乎检不到原因拐杖在远景里可能只有十几像素640 输入下特征太弱。 解决提高imgsz到 960 或 1280或开启mosaic增广让模型多见小目标也可以在标注阶段过滤掉过小的框比如宽高小于 8 像素的避免噪声标签拖累。4.5 现象训练中途显存爆掉原因batch太大或imgsz太高和数据集本身无关。 解决先把batch减半再考虑降imgsz也可以用batch-1让 ultralytics 自动选但自动值不一定最优还是手动试稳。5. 进阶把这份数据用到部署和迁移上的两个具体技巧5.1 导出 ONNX 并在边缘设备上验证推理一致性训练完拿到best.pt后导出 ONNX 是部署前的标准动作yolo export modelruns/guide/exp1/weights/best.pt formatonnx imgsz640 opset12opset12兼容性较好多数推理引擎都支持。导出后务必做一次「PyTorch 结果 vs ONNX 结果」的对比同一张图分别推理看框的坐标和置信度差异是否在 1e-3 量级内。差异过大通常是预处理归一化方式、letterbox 填充没对齐这是部署阶段最常见的黑匣子问题。5.2 用迁移学习把 2 类扩到更多辅助器具类别如果你后续要加「轮椅」「盲道」等类别不必从零重标。做法是保留这份数据的 2 类作为基础新增类别单独标然后在data.yaml里把nc改成新总数、names追加。训练时用已训好的best.pt作为预训练权重lr0调小到 0.001 左右让模型在保留旧类能力的同时学新类。这样比从头训收敛快得多也能缓解新类样本少的问题。场景建议 imgszbatchlr0说明快速验证流程640160.01nano 模型先跑通小目标为主96080.01显存换精度增量加类640160.001用预训练权重微调边缘部署前640--导出 ONNX 对齐验证我自己踩过最深的一次坑是拿到一份「VOCYOLO 双格式」数据后偷懒只看了 YOLO 那份结果classes.txt顺序和 yaml 写反了训了两天才发现导盲犬和拐杖的标签整个对调。从那以后我养成了一个习惯任何数据集到手先跑一遍类别统计和可视化抽检再动训练脚本。数据链路干净比换任何模型都值钱。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →