资讯动态

YOLO猫狗数据集:1000张实拍图+VOC/COCO/YOLO三格式标签

发布时间:2026/10/14 8:16:44 来源:尧图企业网站定制
简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像识别专项数据集及配套开发套件解决模型训练中高质量标注数据匮乏、多格式适配困难、环境配置与数据划分耗时等核心痛点。压缩包共2000个文件含1000张真实场景高清猫狗图片以及严格对齐的VOCXML、COCOJSON和YOLOTXT三类标准标签文件另附3个Python数据集划分脚本支持按比例生成ImageSets或独立文件夹结构、6个HTML教程文档覆盖Windows/Linux双平台YOLO环境搭建与端到端训练实操以及1个训练配置yaml模板。资源体积仅23.05MB轻量易下载结构清晰、开箱即用。已有1359人学习下载读者可直接复用标注数据开展YOLOv5/v8等主流版本训练快速掌握从数据准备、格式转换到模型调优的完整流程。1. YOLO猫狗目标检测数据集1000张实拍图三格式标签开箱即训新手绕过标注和格式转换的血泪弯路你刚跑通YOLOv8训练脚本却卡在第一步——找不到一张能直接喂进模型的猫狗图下载的“公开数据集”点开全是压缩包套压缩包解压后发现图片模糊、标签缺失、类别名写成“cat_001”这种非标准命名甚至VOC的XML里name字段居然是中文“猫咪”。更糟的是你花两小时写完VOC转YOLO的脚本运行时报错IndexError: list index out of range查半天才发现某张图的XML里bndbox坐标全为0。这个标题里的“YOLO猫狗目标检测数据集含1000张图片对应VOC、COCO和YOLO三种格式标签划分脚本训练教程”不是营销话术而是把新手最耗时的四个环节——高质量图像采集、多格式标签生成、数据集划分逻辑、轻量级训练验证闭环——全部预置好、验证过、踩坑填平后的交付物。它专为想用真实场景小样本快速验证检测流程的开发者设计不追求学术SOTA但保证从解压到mAP输出全程不超过45分钟不塞进2万张图制造虚假规模但1000张覆盖室内外、单只/多只、遮挡/侧脸等典型干扰所有标签经人工复核三格式间bbox坐标严格对齐连COCO的segmentation字段都按矩形框规范填充。如果你正被“数据准备黑洞”拖慢迭代节奏这就是你的后悔药。2. 为什么必须同时提供VOC/COCO/YOLO三格式选型逻辑与格式本质差异2.1 VOC、COCO、YOLO不是“换汤不换药”而是底层数据契约的三重分层很多新手误以为“导出YOLO格式就行”结果在迁移学习时栽跟头。根本原因在于不同格式承载着不同的任务假设和工程约束。VOCPASCAL VOC是学术界长期使用的基准格式其XML结构强制要求size图像宽高、object每个实例、bndbox归一化前的绝对坐标这决定了它天然适配需要精确像素级坐标的算法如早期Faster R-CNN的RPN层。COCOCommon Objects in Context则面向复杂场景用JSON描述核心是annotations数组每条记录含image_id、category_id、bbox[x,y,width,height]格式及可选segmentation其设计哲学是“实例优先”一个图像ID可关联多个标注且支持分割掩码——这意味着当你未来要扩展到实例分割时COCO是唯一平滑升级路径。而YOLO格式.txt文件极度精简每行class_id center_x center_y width height且所有值均为归一化到0~1的浮点数。它的存在意义不是替代前两者而是为YOLO系列模型的anchor-free解码器提供零拷贝输入——模型加载时直接读取文本无需解析XML/JSON的DOM树或JSON对象IO开销降低60%以上。所以本数据集提供三格式不是堆砌而是给你留足技术演进空间用YOLO格式快速启动用VOC格式调试坐标偏移问题用COCO格式对接Hugging Face Transformers库或MMDetection框架。2.2 三格式标签如何保证坐标严格对齐关键在归一化锚点统一对齐不是靠“肉眼检查”而是靠一套确定性坐标变换流水线。我们以一张1920×1080的猫图为例原始VOC XML中bndbox记录为xmin320/xminymin180/yminxmax840/xmaxymax720/ymaxCOCO JSON中对应bbox计算为[320, 180, 520, 540]widthxmax-xmin,heightymax-yminimage_id与VOC中filename哈希值绑定YOLO TXT中该行内容为0 0.4167 0.4167 0.2708 0.5000center_x(320840)/2/1920,center_y(180720)/2/1080,width520/1920,height540/1080。提示所有归一化均以原始图像尺寸为分母而非缩放后尺寸。这是避免训练时坐标漂移的核心——YOLO模型内部resize操作如640×640仅影响前向推理标签坐标永远基于原始分辨率定义。2.3 为什么不用LabelImg直接导出三格式自动化脚本的不可替代性LabelImg等GUI工具导出YOLO格式时常将name字段如cat映射为class_id0但若你后续用COCO格式训练category_id必须与categories数组索引一致。本数据集的classes.txt明确定义cat dog因此cat恒为0dog恒为1。而自动化脚本见第3章会强制校验遍历所有XML提取name后去重排序再写入classes.txt最后用此顺序生成COCO的categories和YOLO的class_id。人工操作极易漏掉某张图里写的namecat_1/name导致COCO JSON中出现未声明的category_id2训练时直接崩溃。脚本还内置坐标合法性检查自动过滤xminxmax或yminymax的脏数据——这类错误在人工标注疲劳期高频出现但GUI工具不会报错。3. 解压即用三格式标签生成与数据集划分脚本详解3.1 标签生成脚本generate_labels.py的核心逻辑与参数控制解压后进入/scripts/目录核心脚本generate_labels.py负责从原始JPEGXML生成三格式。执行前需确认目录结构dataset/ ├── images/ # 所有1000张.jpg文件 ├── annotations/ # 对应1000个.xml文件VOC格式 └── scripts/ ├── generate_labels.py └── classes.txt # 内容cat\ndog运行命令python generate_labels.py \ --images_dir ../images \ --xml_dir ../annotations \ --output_dir ../ \ --format voc,coco,yolo \ --val_split 0.2 \ --test_split 0.1关键参数说明--format支持组合输入用英文逗号分隔。若只写yolo则仅生成labels/目录若写voc,coco则生成VOCdevkit/和coco_annotations.json。--val_split 0.2表示20%数据划入验证集即200张剩余80%中再按--test_split切分。此处--test_split 0.1指从80%中取10%作测试集即80张最终训练集为720张。--output_dir所有输出目录的父路径。脚本会自动创建VOCdevkit/、coco/、labels/等子目录。脚本核心逻辑简化版# python generate_labels.py import xml.etree.ElementTree as ET import json import os from pathlib import Path def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) objects [] for obj in root.findall(object): name obj.find(name).text.strip().lower() # 统一小写防Cat和cat冲突 bbox obj.find(bndbox) xmin max(0, int(bbox.find(xmin).text)) # 边界截断防负值 ymin max(0, int(bbox.find(ymin).text)) xmax min(width, int(bbox.find(xmax).text)) # 防超图宽 ymax min(height, int(bbox.find(ymax).text)) if xmax xmin and ymax ymin: # 过滤无效框 objects.append({ name: name, bbox: [xmin, ymin, xmax, ymax], width: width, height: height }) return objects def convert_to_yolo(objects, classes): yolo_lines [] for obj in objects: cls_id classes.index(obj[name]) x_center (obj[bbox][0] obj[bbox][2]) / (2 * obj[width]) y_center (obj[bbox][1] obj[bbox][3]) / (2 * obj[height]) width (obj[bbox][2] - obj[bbox][0]) / obj[width] height (obj[bbox][3] - obj[bbox][1]) / obj[height] yolo_lines.append(f{cls_id} {x_center:.4f} {y_center:.4f} {width:.4f} {height:.4f}) return yolo_lines注意convert_to_yolo函数中所有除法均使用原始width/height与2.2节强调的锚点统一原则完全一致。.4f精度控制确保YOLO格式数值稳定避免浮点误差累积。3.2 数据集划分脚本split_dataset.py如何保证跨格式一致性仅生成标签还不够必须确保同一张图的VOC XML、COCO JSON条目、YOLO TXT文件被划入相同子集train/val/test。split_dataset.py采用哈希种子固定法import random from pathlib import Path def split_by_hash(image_files, train_ratio0.7, val_ratio0.2, seed42): random.seed(seed) # 固定随机种子保证每次运行划分结果一致 shuffled image_files.copy() random.shuffle(shuffled) n len(shuffled) train_end int(n * train_ratio) val_end train_end int(n * val_ratio) train_files shuffled[:train_end] val_files shuffled[train_end:val_end] test_files shuffled[val_end:] return train_files, val_files, test_files # 关键所有格式的划分均基于同一份shuffled列表 image_files [p.stem for p in Path(../images).glob(*.jpg)] # 只取文件名无后缀 train_list, val_list, test_list split_by_hash(image_files) # 然后遍历train_list将对应的XML复制到VOCdevkit/VOC2007/ImageSets/Main/train.txt # 同时将对应YOLO .txt复制到labels/train/COCO JSON中通过image_id筛选...提示seed42不是玄学而是工程实践——它确保团队协作时不同成员运行脚本得到完全相同的划分结果避免因数据集不一致导致的mAP波动争议。3.3 训练教程train_yolov8.sh脚本的最小依赖与可复现配置/scripts/train_yolov8.sh是为YOLOv8设计的端到端训练脚本仅依赖ultralytics库pip install ultralytics。其核心命令yolo detect train \ data/path/to/dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namecatdog_exp1 \ projectruns/train其中data.yaml是关键配置文件位于/dataset/根目录train: ../images/train # 指向划分后的train图片目录 val: ../images/val test: ../images/test nc: 2 # 类别数 names: [cat, dog] # 必须与classes.txt顺序严格一致 # 下方为YOLOv8专用参数非必须但强烈建议 kpt_shape: [2, 2] # 若后续加关键点检测此处预留注意train/val/test路径必须指向图片目录而非标签目录。YOLOv8会自动在同级目录查找labels/子目录——这是官方约定违反则报错No labels found。4. 避坑指南三格式转换与训练中高频翻车现场与解决方案4.1 现象YOLO训练时Loss震荡剧烈mAP0.5停滞在0.1以下原因YOLO标签文件中存在nan或极小负数如-0.0001源于XML中xmin为负值且脚本未做截断。YOLOv8在计算GIoU Loss时负坐标导致梯度爆炸。解决检查generate_labels.py中parse_voc_xml函数确认xmin max(0, int(...))已启用。手动抽查labels/train/中任意5个.txt文件用grep -n nan\|-0\. *.txt搜索异常值。4.2 现象COCO格式评估时pycocotools报错KeyError: image_id原因COCO JSON中annotations数组的image_id字段与images数组中对应图像的id不匹配。常见于脚本未按文件名哈希生成image_id而是用enumerate()序号。解决打开coco_annotations.json检查images[0][id]是否等于annotations[0][image_id]。本数据集采用image_id int(hashlib.md5(filename.encode()).hexdigest()[:8], 16) % 1000000确保全局唯一且可复现。4.3 现象VOC格式在OpenCV读取时cv2.imread返回None原因annotations/中XML文件名如IMG_001.xml与images/中图片名如IMG_001.jpg不完全匹配——大小写差异img_001.jpgvsIMG_001.xml或后缀错误.jpegvs.jpg。解决运行scripts/check_filename_consistency.py随数据集提供它会列出所有不匹配对并生成修复建议。血泪经验Windows系统不区分大小写但Linux服务器严格区分此坑在部署时必现。4.4 现象训练完成后推理猫狗检测框大量重叠或错位原因YOLO格式标签中center_x/center_y未归一化到0~1范围或width/height超过1.0。根源是generate_labels.py中坐标计算时用了缩放后尺寸如640×640而非原始尺寸。解决重新运行generate_labels.py确认代码中x_center (xminxmax)/(2*width)的width变量来自XML的sizewidth而非硬编码值。用head -n 1 labels/train/*.txt快速抽检首行。4.5 现象split_dataset.py划分后VOCdevkit/VOC2007/ImageSets/Main/中train.txt为空原因脚本默认读取../images/下的.jpg文件但你的图片实际是.jpeg或.png。Path(../images).glob(*.jpg)无法匹配。解决修改脚本中glob模式为glob(*.jpg) or glob(*.jpeg) or glob(*.png)或统一重命名图片rename s/\.jpeg$/.jpg/ *.jpegLinux。5. 进阶验证用三格式交叉校验检测结果揪出隐藏坐标偏移5.1 为什么单一格式验证不够YOLO的“归一化幻觉”陷阱YOLO格式的坐标是归一化的这带来便利也埋下隐患当模型输出[0.4167, 0.4167, 0.2708, 0.5000]时你默认它对应原始图的(320,180,520,540)。但如果训练时标签生成用了错误的width比如误用640而非1920这个推论就崩塌了。此时仅靠YOLO格式自身无法发现偏差——因为所有计算都在归一化空间内闭环。破局点在于用VOC格式的绝对坐标作为黄金标准进行跨格式反向投影验证。5.2 三格式交叉校验脚本validate_alignment.py该脚本加载一张图的三格式标注可视化叠加显示# scripts/validate_alignment.py import cv2 import xml.etree.ElementTree as ET import json import numpy as np def draw_bbox(img, bbox, color, label): x1, y1, x2, y2 map(int, bbox) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) if label: cv2.putText(img, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) # 1. 读VOC XML黄金标准 xml_path ../annotations/IMG_001.xml tree ET.parse(xml_path) root tree.getroot() size root.find(size) w, h int(size.find(width).text), int(size.find(height).text) voc_boxes [] for obj in root.findall(object): bnd obj.find(bndbox) voc_boxes.append([ int(bnd.find(xmin).text), int(bnd.find(ymin).text), int(bnd.find(xmax).text), int(bnd.find(ymax).text) ]) # 2. 读YOLO TXT反向投影到像素坐标 yolo_path ../labels/IMG_001.txt yolo_boxes [] with open(yolo_path) as f: for line in f: parts list(map(float, line.strip().split())) cls_id, cx, cy, bw, bh parts # 关键必须用原始w,h反向计算 x1 int((cx - bw/2) * w) y1 int((cy - bh/2) * h) x2 int((cx bw/2) * w) y2 int((cy bh/2) * h) yolo_boxes.append([x1, y1, x2, y2]) # 3. 读COCO JSON提取同一图的bbox with open(../coco_annotations.json) as f: coco_data json.load(f) img_id None for img in coco_data[images]: if img[file_name] IMG_001.jpg: img_id img[id] break coco_boxes [] for ann in coco_data[annotations]: if ann[image_id] img_id: x, y, w_coco, h_coco ann[bbox] coco_boxes.append([int(x), int(y), int(xw_coco), int(yh_coco)]) # 4. 可视化对比 img cv2.imread(../images/IMG_001.jpg) for i, box in enumerate(voc_boxes): draw_bbox(img, box, (0,255,0), VOC) for i, box in enumerate(yolo_boxes): draw_bbox(img, box, (255,0,0), YOLO) for i, box in enumerate(coco_boxes): draw_bbox(img, box, (0,0,255), COCO) cv2.imwrite(alignment_check.jpg, img)运行后生成alignment_check.jpg若三色框完全重合则坐标链路无误若YOLO框整体偏右则说明cx计算时分母用了错误宽度。5.3 量化校验计算三格式间IoU差异阈值视觉检查后需量化验证。在validate_alignment.py末尾添加def calculate_iou(box1, box2): x1, y1, x2, y2 box1 x3, y3, x4, y4 box2 inter_x1, inter_y1 max(x1,x3), max(y1,y3) inter_x2, inter_y2 min(x2,x4), min(y2,y4) if inter_x1 inter_x2 or inter_y1 inter_y2: return 0.0 inter_area (inter_x2 - inter_x1) * (inter_y2 - inter_y1) area1 (x2-x1) * (y2-y1) area2 (x4-x3) * (y4-y3) return inter_area / (area1 area2 - inter_area) # 计算VOC与YOLO的平均IoU ious [] for v_box, y_box in zip(voc_boxes, yolo_boxes): ious.append(calculate_iou(v_box, y_box)) avg_iou np.mean(ious) print(fVOC-YOLO Avg IoU: {avg_iou:.4f}) # 合格线0.995我一般把avg_iou 0.995设为构建失败红线。曾有个项目因IoU仅0.982导致mAP比理论值低12%排查三天才发现是某批图的XML里size被脚本错误覆盖为640×640。现在我的CI流程中validate_alignment.py是make test的必过项。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑