尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLO猫狗检测数据集实战:三种标签格式与训练避坑指南

YOLO猫狗检测数据集实战:三种标签格式与训练避坑指南 简介这份资源面向计算机视觉入门与进阶学习者提供一套可直接用于YOLO系列目标检测训练的猫狗数据集解决自建数据集标注耗时、格式转换繁琐的问题。数据均为真实场景采集使用labelimg标注标注框质量较高并同时提供voc(xml)、coco(json)与yolo(txt)三种格式标签分别存放于不同文件夹便于直接接入不同训练框架。压缩包共约2000个文件以1000个xml标注、990个txt标签为主另含少量html教程、py划分脚本与yaml配置文件整体约23.05MB。资源还附赠环境搭建、训练案例教程以及训练集、验证集、测试集划分脚本可按需重新划分数据。已有1355人学习下载适合希望快速跑通检测流程、验证模型效果或开展课程实践的用户参考使用。1. 拿到一份猫狗检测数据集先别急着喂给 YOLO很多人做目标检测练手第一步就卡在数据上要么找不到标注质量过关的图要么手里只有一堆图没有标签要么标签格式和训练框架对不上。这份 YOLO 猫狗目标检测数据集解决的正是这个最脏最累的环节——1000 张真实场景图片用 labelImg 标注同时给出 VOCxml、COCOjson、YOLOtxt三种格式标签分别放在不同文件夹里还附了训练集/验证集/测试集划分脚本和 Windows、Linux 两套环境搭建与训练教程。它适合谁刚入门目标检测、想跑通第一个自定义数据集训练流程的人也适合已经会训模型、但懒得自己标数据、想直接拿现成数据验证改进思路的人。猫狗两类目标类别少、特征明显是验证 YOLO 训练链路是否通畅的理想样本。但别被“1000 张”迷惑真正决定你能不能跑起来的是标签格式对不对、划分脚本会不会用、路径有没有写错。下面按“这是什么 → 怎么用 → 坑在哪”的顺序拆开讲。2. 三种标签格式到底怎么选VOC、COCO、YOLO 的差异与转换逻辑2.1 三种格式的字段结构对比拿到数据集先别急着改代码先搞清楚三种标签各自长什么样。VOC 是 XML一个图对应一个 xml 文件框的坐标是左上角和右下角的绝对像素值COCO 是一个大 json所有图的标注集中在一个文件里坐标是 [x, y, width, height] 的绝对像素YOLO 是每张图一个 txt每行一个目标格式是类别索引 中心x 中心y 宽 高且全部归一化到 0~1。格式文件形态坐标类型类别表示典型用途VOC每图一个 xml绝对像素 xmin/ymin/xmax/ymax字符串类别名老牌检测框架、部分评估脚本COCO单个 json绝对像素 x/y/w/h数字 id 类别名映射通用评估、多任务YOLO每图一个 txt归一化中心点宽高数字索引YOLO 系列训练这份数据集把三种都给你了省去了自己转格式的麻烦。但要注意YOLO 格式的类别索引必须和你的data.yaml里names的顺序严格一致否则训练时会把猫标成狗loss 看着在降实际全错。2.2 用划分脚本切分训练集、验证集、测试集数据集自带的划分脚本有三个训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py、训练集、验证集划分脚本图片标签划分写入新文件夹.py、split_train_val生成ImageSets下txt文件划分脚本.py。前两个是物理复制文件到新文件夹第三个是生成 ImageSets 下的 txt 索引文件适合 VOC 风格的读取方式。我一般用第一个脚本做三路划分比例按 8:1:1。脚本核心逻辑是读入图片列表随机打乱后按比例切片再把对应的标签文件一起复制过去。下面是我改过的版本加了随机种子和路径检查import os import random import shutil # 原始图片和标签目录 img_dir ./images label_dir ./labels_yolo # 用 YOLO 格式的 txt # 输出目录 out_base ./dataset_split train_ratio, val_ratio, test_ratio 0.8, 0.1, 0.1 random.seed(42) # 固定种子保证可复现 imgs [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] random.shuffle(imgs) n len(imgs) n_train int(n * train_ratio) n_val int(n * val_ratio) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:] } for split, files in splits.items(): img_out os.path.join(out_base, split, images) lbl_out os.path.join(out_base, split, labels) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for f in files: shutil.copy(os.path.join(img_dir, f), os.path.join(img_out, f)) txt os.path.splitext(f)[0] .txt src_lbl os.path.join(label_dir, txt) if os.path.exists(src_lbl): shutil.copy(src_lbl, os.path.join(lbl_out, txt)) else: print(f警告{txt} 缺失检查标注是否完整)逻辑说明先固定随机种子避免每次划分结果不同导致实验不可比然后按比例切片分别复制图片和同名 txt 标签。参数上train_ratio等三个比例加起来必须等于 1否则会漏掉或重复文件。脚本里加了缺失标签的警告因为实际标注中经常出现图片有、标签没有的情况不检查的话训练时读不到标签会直接报错。2.3 生成 ImageSets 索引文件的场景第三个脚本split_train_val生成ImageSets下txt文件划分脚本.py不复制文件只在ImageSets/Main下生成train.txt、val.txt等每行是图片的 basename。这种适合数据集很大、不想占双份磁盘的情况或者你的训练代码是按索引读图的。用之前确认你的 DataLoader 支持这种读取方式否则生成了也用不上。3. 环境搭建与训练Windows 和 Linux 两条路怎么走3.1 Windows 环境搭建的关键步骤数据集里附了YOLO环境搭建Windows版本.html和Linux之Ubuntu环境安装教程.html按文档走基本能通。Windows 上核心是装对 CUDA 和 cuDNN 版本再装 PyTorch。我一般用 conda 建独立环境避免和系统 Python 打架conda create -n yolo python3.9 conda activate yolo # 根据你的显卡驱动选 CUDA 版本这里以 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python lxml tqdm参数说明python3.9是 YOLOv5/v8 都兼容的版本CUDA 版本必须和nvidia-smi右上角显示的驱动支持版本匹配装高了会报CUDA driver version is insufficient。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算通。3.2 Linux 下的环境搭建与常见依赖Linux 版本教程里多了几个系统依赖比如libgl1-mesa-glx、libglib2.0-0不装的话 opencv 导入会报libGL.so.1: cannot open shared object file。命令sudo apt-get update sudo apt-get install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev然后同样用 conda 建环境装 PyTorch。Linux 下建议把数据集放在 SSD 上机械盘随机读小文件会拖慢训练速度尤其是 num_workers 开大之后。3.3 按教程改 data.yaml 跑通第一个 epoch训练教程里给了案例配置你要改的是data.yaml里的路径和类别数。假设用 YOLO 格式path: ./dataset_split train: train/images val: val/images test: test/images nc: 2 names: [cat, dog]nc是类别数猫狗就是 2names顺序必须和 txt 里的类别索引对应0 对应 cat1 对应 dog。改完直接跑yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsize640 batch16modelyolov8n.pt是预训练权重用预训练比从零训收敛快很多imgsize640是输入分辨率显存不够就降到 416 或 320batch16根据显存调8G 显存跑 640 大概能到 16。跑起来后看第一个 epoch 的 loss 有没有下降mAP 有没有在涨如果 loss 是 nan多半是标签坐标越界或类别索引超了nc。4. 避坑与排查标注、路径、显存这三类问题最容易翻车4.1 标签坐标越界导致 loss 变 nan现象训练第一个 epoch 就报lossnan或者AssertionError: Label out of bounds。原因YOLO 格式要求归一化坐标在 0~1 之间但标注时如果框超出了图片边界转换后会出现负值或大于 1 的值。解决写个脚本扫一遍所有 txt把越界的行打印出来手动修正或裁剪到边界内。import os for txt in os.listdir(./labels_yolo): with open(os.path.join(./labels_yolo, txt)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: print(f{txt} 第{i}行字段数不对{line}) continue cls, x, y, w, h map(float, parts) if not all(0 v 1 for v in (x, y, w, h)): print(f{txt} 第{i}行坐标越界{line})4.2 图片和标签文件名不匹配现象训练时提示No labels found或者某张图被跳过。原因图片是cat_001.jpg标签却是cat_001.txt之外的名字或者划分脚本复制时只复制了图没复制标签。解决跑一遍配对检查确保每张图都有同名 txt。上面划分脚本里的警告逻辑就是干这个的但如果你手动挪过文件最好再单独扫一次。4.3 显存不足报 CUDA out of memory现象训练到一半突然RuntimeError: CUDA out of memory。原因batch 太大、imgsize 太高或者 num_workers 开太多导致内存泄漏。解决先把 batch 减半再把 imgsize 降到 416还不行就设workers0排除多进程问题。另外 YOLOv8 可以用ampTrue开启混合精度显存能省不少。4.4 类别索引和 names 顺序错位现象训练 loss 正常降但验证时 mAP 极低或者预测出来猫狗反了。原因txt 里 0 是猫、1 是狗但data.yaml里names: [dog, cat]写反了。解决打开任意一个 txt看第一列的数字再对照data.yaml的 names 列表确保索引和名称一一对应。这个坑很隐蔽因为 loss 不会报错只是学错了目标。4.5 划分脚本随机性导致结果不可复现现象每次跑划分脚本训练集和验证集都不一样实验没法对比。原因脚本里没固定随机种子。解决在random.shuffle之前加random.seed(42)或者把划分结果保存成 txt 索引后续直接读索引而不是重新划分。5. 进阶技巧用混淆矩阵和验证集反查数据质量跑通训练只是第一步真正要确认这份数据集能不能用得看验证结果。YOLO 训练完会输出混淆矩阵和 PR 曲线我一般重点看两个地方一是猫狗之间有没有互相误判如果混淆矩阵里 cat 被预测成 dog 的比例很高说明两类特征区分度不够或者标注时把一些模糊样本标错了二是看背景被误检为目标的情况如果 false positive 很多可能是标注框太松把大量背景框了进去。验证集评估命令yolo detect val modelruns/detect/train/weights/best.pt datadata.yaml imgsize640输出里重点看mAP50和mAP50-95猫狗这种两类简单任务mAP50 应该能到 0.9 以上如果只有 0.6 左右先别怀疑模型回去查标签。我习惯把验证集预测结果可视化出来随机抽 20 张看框的位置和类别对不对from ultralytics import YOLO import cv2 import os model YOLO(runs/detect/train/weights/best.pt) val_imgs os.listdir(./dataset_split/val/images)[:20] for img_name in val_imgs: img_path os.path.join(./dataset_split/val/images, img_name) results model(img_path) annotated results[0].plot() cv2.imwrite(f./vis/{img_name}, annotated)这段代码把预测框画到原图上存到vis文件夹。参数上results[0].plot()默认画框和类别置信度如果框的位置明显偏了说明标注坐标有问题如果类别标反了回去查 names 顺序。这一步比看数字直观得多很多标注错误一眼就能看出来。还有一个容易被忽略的点训练集和验证集的分布要一致。如果划分时随机打乱一般没问题但如果你按文件名排序后切分可能训练集全是白天场景、验证集全是夜晚mAP 会虚低。我一般会检查一下两个集合的图片亮度均值差太多就重新随机划分。从那以后我每次拿到新数据集都强制走一遍“扫标签越界 → 查图片标签配对 → 固定种子划分 → 可视化验证预测”这四步宁可前期花半小时也不想到训练完才发现数据有问题。希望这份猫狗数据集和上面的排查思路能帮你把第一个自定义检测模型顺利跑起来。本文还有配套的精品资源点击获取
返回列表