简介:这份宠物猫狗识别检测数据集面向从事深度学习目标检测的科研人员、学生与工程开发者,用于训练和验证猫狗目标检测模型,解决宠物识别场景中样本不足、标注不规范的问题。资源包共2000个文件,包含3947张jpg图像、3947个xml标注文件与3947个txt标注文件,分别对应VOC与YOLO两种主流标注格式,压缩包整体约388.12MB,可直接接入常见检测算法流程。图像中猫狗目标形态多样、背景丰富,标注精准无误,适合作为课程实验、算法对比与项目落地的训练素材。目前已有2092人学习下载,说明其在同类数据集中具备一定认可度。使用者可据此省去自行采集与标注的成本,快速构建训练集与验证集,并借助双格式标签灵活适配不同框架,提升模型训练与调参效率。
1. 宠物猫狗识别检测数据集:3947 张、xml 与 yolo 双格式到底解决了什么
如果你正在做宠物猫狗识别检测,大概率卡在同一个地方:模型结构抄得飞快,数据却凑不齐。网上能找到的猫狗图片要么是分类数据集(一张图一个标签,没有框),要么是零散爬下来的图,标注质量参差不齐。真正能直接喂给 YOLO 训练的检测数据集,尤其是同时带 xml 和 yolo 格式标签的,其实不多。这个 3947 张的宠物猫狗识别检测数据集,核心价值就在于它把「图 + 框 + 双格式标签」一次性给全了:xml 是 Pascal VOC 风格,yolo 是 txt 归一化坐标,两条路都能走。
它适合三类人:一是刚入门目标检测、想跑通训练全流程的新手,二是需要快速验证自己模型改动、不想在数据清洗上耗时间的熟手,三是做宠物相关应用(喂食器、门禁、监控)需要落地检测能力的工程师。3947 张不算大,但作为单类别(猫、狗两类)检测任务,够你跑通训练、调参、评估的完整链路。下面我把这套数据从格式解析到训练落地拆开讲,包括 xml 解析、yolo 标签校验、类别映射这些容易翻车的点。
2. 先搞懂 xml 和 yolo 两种标签格式:结构、差异与转换逻辑
2.1 Pascal VOC 的 xml 长什么样,字段怎么读
xml 格式的标注,一张图对应一个 xml 文件,文件名通常和图片同名。核心结构是<annotation>根节点,下面挂<filename>、<size>(宽高通道)、以及若干个<object>。每个<object>里有<name>(类别名,这里是 cat 或 dog)、<bndbox>(xmin、ymin、xmax、ymax,绝对像素坐标)。很多人第一次打开 xml 觉得眼花,其实只要盯住<object>循环就行。
<annotation> <filename>cat_001.jpg</filename> <size> <width>640</width> <height>480</height> <depth>3</depth> </size> <object> <name>cat</name> <bndbox> <xmin>112</xmin> <ymin>88</ymin> <xmax>430</xmax> <ymax>402</ymax> </bndbox> </object> </annotation>上面这段里,<size>决定了后面归一化的分母,<bndbox>是绝对坐标。注意一个坑:有些 xml 的 xmin 可能大于 xmax,或者框超出图像边界,训练前必须校验。xml 解析用 Python 标准库xml.etree.ElementTree就够,不用装额外依赖。
2.2 yolo 格式的 txt 为什么是归一化坐标
yolo 格式一张图对应一个 txt,每行一个目标,格式是class_id x_center y_center width height,全部是相对图像宽高的归一化值(0~1)。class_id 从 0 开始,需要你自己维护一个类别映射表,比如{0: 'cat', 1: 'dog'}。它和 xml 最大的区别是:xml 存绝对坐标和类别名,yolo 存归一化坐标和类别索引。归一化的好处是图片缩放、resize 后标签不用改,直接跟着模型输入尺寸走。
# xml 绝对坐标转 yolo 归一化坐标 def voc_to_yolo(xmin, ymin, xmax, ymax, img_w, img_h): x_center = (xmin + xmax) / 2.0 / img_w y_center = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h return x_center, y_center, w, h这段函数是转换的核心。参数 img_w、img_h 来自 xml 的<size>,不要用图片实际尺寸去猜,因为标注时的尺寸可能和当前图片不一致。转换后所有值必须落在 0~1,超出说明框有问题,要单独拎出来看。
2.3 两种格式的选型:什么时候用哪个
选哪个格式,取决于你的训练框架。YOLOv5/v8 系列直接吃 yolo txt,配一个data.yaml指定 train/val 路径和类别名。如果你用 Detectron2、MMDetection 或者自己写的 PyTorch 训练循环,xml 转成 COCO json 更顺。这套数据集两种都给了,省去你自己转的麻烦。但要注意:双格式不代表可以混用,训练时只能选一种,混着喂会直接报错或静默学歪。
| 对比项 | xml (VOC) | yolo txt |
|---|---|---|
| 坐标类型 | 绝对像素 | 归一化 0~1 |
| 类别表示 | 类别名 cat/dog | 类别索引 0/1 |
| 一图多目标 | 多个 object 节点 | 多行 |
| 适用框架 | Detectron2、MMDetection | YOLOv5/v8、YOLOX |
| 校验重点 | 框越界、坐标反了 | 值域、类别 id 越界 |
3. 用这套数据集跑通训练:目录组织、配置与最小可运行命令
3.1 目录结构怎么摆,别让路径成为第一个翻车点
拿到数据集后,第一件事是整理目录。YOLO 训练对目录结构有约定,常见做法是 images 和 labels 分开,train/val 再分。很多人直接把图和标签混在一个文件夹,训练脚本找不到标签,报No labels found,这就是血泪经验。推荐结构如下:
pet_dataset/ ├── images/ │ ├── train/ # 约 3158 张 │ └── val/ # 约 789 张 ├── labels/ │ ├── train/ # 对应 txt │ └── val/ └── data.yamltrain/val 按 8:2 切,3947 张大概 3158 训练、789 验证。切分时注意同一只宠物的多张图尽量别跨集,否则验证指标虚高。图片和标签必须同名,cat_001.jpg对应cat_001.txt,差一个字符都找不到。
3.2 data.yaml 的三个必填字段
YOLO 训练靠data.yaml找数据。这个文件看着简单,写错一个字段就训练不起来。
path: /home/user/pet_dataset train: images/train val: images/val nc: 2 names: ['cat', 'dog']path是数据集根目录,train/val是相对 path 的路径。nc是类别数,这里是 2。names顺序必须和 txt 里的 class_id 对应:0 对应 cat,1 对应 dog,写反了模型会把猫认成狗,而且 loss 还降得很正常,属于最隐蔽的坑。改完 yaml 建议先跑一次数据校验再开训。
3.3 最小可运行训练命令与参数含义
假设你用 YOLOv8,一条命令就能起训:
yolo detect train \ data=pet_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0model=yolov8n.pt是预训练权重,小模型适合快速验证。imgsz=640是输入尺寸,和标注时的尺寸不必一致,yolo 会自动缩放标签。batch=16看显存调,显存不够就降到 8 或 4。device=0指定第一块 GPU,没 GPU 就写cpu,但 3947 张用 CPU 训会非常慢。训练开始后重点看mAP50和box_loss,前者涨、后者降才算正常。
3.4 训练前用脚本校验标签,别等 loss 不降才回头查
开训前花两分钟跑个校验脚本,能省几小时排查。
import os from pathlib import Path def check_yolo_labels(label_dir, nc=2): bad = [] for txt in Path(label_dir).glob('*.txt'): for i, line in enumerate(open(txt)): parts = line.strip().split() if len(parts) != 5: bad.append((txt.name, i, '字段数不对')) continue cid = int(parts[0]) vals = list(map(float, parts[1:])) if cid < 0 or cid >= nc: bad.append((txt.name, i, f'类别越界 {cid}')) if any(v < 0 or v > 1 for v in vals): bad.append((txt.name, i, '坐标越界')) return bad issues = check_yolo_labels('pet_dataset/labels/train') print(f'发现 {len(issues)} 处问题') for it in issues[:10]: print(it)这个脚本检查三件事:每行是否 5 个字段、类别 id 是否在 0~nc-1、坐标是否在 0~1。参数nc要和 data.yaml 一致。发现问题标签要么修要么删,别带着脏数据训,否则模型学到的框会飘。
4. 避坑与排查:xml 解析、标签转换、训练报错的高频问题
4.1 xml 解析报错 ParseError,多半是编码或特殊字符
现象:用 ElementTree 解析时抛xml.etree.ElementTree.ParseError: not well-formed。原因通常是 xml 文件头声明了encoding="utf-8"但实际存的是 GBK,或者类别名里混了&、<这类未转义字符。解决:先用chardet或直接二进制读前几字节判断编码,统一转成 utf-8;特殊字符做转义。批量处理时加 try/except 把坏文件单独记录,别让一个坏 xml 中断整个转换。
4.2 转换后框位置整体偏移,检查 size 和实际图片是否一致
现象:xml 转 yolo 后,可视化发现框整体偏了或大小不对。原因:xml 里的<width>/<height>和图片真实尺寸不一致,可能是标注工具导出时写死了旧尺寸。解决:转换时以PIL.Image.open(img).size的真实宽高为准,而不是盲信 xml 的 size。如果两者差异超过 5%,这批数据要重点复核。
4.3 训练报 No labels found,路径和文件名大小写是元凶
现象:训练启动即报找不到标签。原因:images 和 labels 目录层级不对,或者图片是.JPG大写而标签是.txt小写,YOLO 按 stem 匹配时对不上。解决:确认 images/train 和 labels/train 平级,图片和标签主文件名完全一致(含大小写)。Linux 下大小写敏感,Windows 下不敏感,跨系统搬数据特别容易踩。
4.4 类别名写反导致猫狗互换,验证集指标却正常
现象:推理时猫被标成 dog,但训练 mAP 看着不低。原因:data.yaml 的 names 顺序和 txt 里 class_id 的约定反了。解决:抽 5 张图做可视化推理,人工确认类别。names 顺序一旦定了就别改,改了要重新对齐所有标签。这个坑最坑的地方在于 loss 曲线完全正常,只能靠可视化抓出来。
4.5 显存溢出 CUDA out of memory,先降 batch 再查 imgsz
现象:训练中途报显存不足。原因:batch 或 imgsz 太大,或者 dataloader 的 workers 开太多。解决:先把 batch 减半,还不行就把 imgsz 从 640 降到 512 或 416。workers 一般设 4~8,设成 CPU 核数反而可能因为内存拷贝拖慢。3947 张数据量不大,batch=8 配 imgsz=640 在 8G 显存上通常能跑。
5. 进阶技巧:用这套数据做迁移与半自动标注提效
5.1 用预训练模型做半自动标注,把 3947 张的边际成本压下来
3947 张全人工标注成本不低。如果你要扩充数据,可以先用这套数据训一个基础模型,再拿它去推理新图片,生成预标注 yolo txt,人工只做修正。流程是:训练好的best.pt跑yolo detect predict,输出带框的 txt,再导入标注工具微调。这样每张新图的标注时间能从几分钟降到几十秒。注意预标注的框会有漏检和误检,修正时重点看小目标和遮挡目标。
yolo detect predict \ model=runs/detect/train/weights/best.pt \ source=new_images/ \ save_txt=True \ conf=0.25 \ iou=0.45conf=0.25是置信度阈值,调低会多出框但误检增多,调高会漏检。iou=0.45控制 NMS 合并重叠框的力度。生成的 txt 在labels子目录下,直接拿去改。这套半自动流程适合数据持续增长的场景,边际成本会越来越低。
5.2 验证模型是否真的学到东西:看混淆矩阵而不是只看 mAP
mAP 高不代表模型可用。跑完训练后,YOLO 会在runs/detect/train下生成confusion_matrix.png。重点看猫狗之间的误判比例:如果 cat 被预测成 dog 的比例超过 10%,说明两类特征区分度不够,可能是数据里猫狗同框太多,或者类别名映射有问题。另一个技巧是拿验证集里 mAP 最低的 20 张图单独看,往往能发现标注错误或难样本。我一般会把这 20 张的预测结果和原图并排看,比盯指标有用得多。
5.3 一个我踩过的习惯:先跑通 10 张再全量
刚拿到数据集时,别急着上全量训练。我习惯先抽 10 张图、20 个目标,跑 5 个 epoch,确认数据加载、标签解析、类别映射、推理可视化整条链路通了,再放开全量。这一步能提前暴露 80% 的格式问题。3947 张全量训一次少则几十分钟,多则几小时,用 10 张做冒烟测试,省下的时间够你调好几轮参数。数据格式这种事,宁可前期慢一点,也别等训到一半才发现标签是错的。希望帮到你。
本文还有配套的精品资源,点击获取