
简介本资源是专为YOLO系列目标检测算法设计的室内宠物仓鼠精细化检测数据集面向计算机视觉初学者、AI开发者及智能宠物设备研发人员解决小目标、低对比度场景下仓鼠识别难、标注数据稀缺等实际问题。数据集共2000个文件包含1084个PASCAL VOC格式XML标注文件用于坐标与类别校验、914个YOLO标准TXT标签文件已按归一化格式生成适配v5/v7/v8/v11/v13/v26等主流版本以及1份PDF说明文档和1份Markdown格式README结构清晰、开箱即用。压缩包仅41.16MB轻量高效内置完整data.yaml配置文件并已完成train/val划分无需额外预处理即可投入训练。已有18人下载学习配套博文详细解析了数据采集环境、标注规范、类别分布及YOLOv8微调实测效果特别适合快速验证模型泛化能力、开展小众生物目标检测研究或构建智能仓鼠行为分析系统。 做室内宠物监测的朋友八成会遇到同一个问题我养了一只仓鼠想用摄像头自动判断它现在是在跑轮、吃饭还是睡着但网上开源数据集里全是猫狗压根找不到仓鼠的身影。这正是我整理这份YOLO算法室内宠物仓鼠目标检测数据集-1096张-标注类别为仓鼠.zip的初衷。数据集包含1096张真实室内场景下的仓鼠图片统一标注为单一类别仓鼠并整理成YOLO训练可直接使用的格式。本文我会把这个数据集从设计思路、标注格式、解压到训练的全过程拆开讲清楚顺便把踩过的坑也一并交代。1. 项目整体设计与思路拆解1.1 为什么要专门做一个仓鼠数据集最近几年目标检测在智能家居、宠物监控、行为分析这些场景越来越火但有个尴尬的局面主流公开数据集大多集中在通用物体、行人、车辆或者猫狗这类常见宠物上。仓鼠作为小型啮齿动物在开源数据集里几乎是空白状态所谓找不到能用的预训练数据其实是根本没有现成数据可找。这里说的室内宠物仓鼠目标检测核心问题有两个第一仓鼠体型很小一只成年的侏儒仓鼠体长也就8到12厘米在监控画面里占的像素往往只有几十个第二仓鼠的动作非常快尤其是跑轮的时候目标容易出现运动模糊。这两个因素叠加对检测模型的召回率提出了比较苛刻的要求。所以我整理这个数据集时主要参照的需求是室内环境为主覆盖笼内、桌面、沙发、地板等实际饲养场景目标尺度偏小贴近真实监控视角光照变化明显白天自然光、夜间补光、暖色灯都有涉及单一类别标注降低标注复杂度的同时聚焦于有没有仓鼠和仓鼠在哪这两个核心问题。这种聚焦单一类别的设计对刚入门目标检测的人来说其实是更友好的。你不需要一上来就处理80个类别的复杂任务而是用一个小而完整的数据集把整个流程跑通理解每个环节的作用之后再扩展多类别就容易很多。1.2 数据集规模为什么控制在1096张你可能好奇为什么是1096张而不是更多或更少。说实话这个数量不是拍脑袋定的而是权衡了标注成本、训练时间和模型效果之后的结果。先说一个经验值在单一类别、场景相对固定的目标检测任务里1000张左右的精标注图片已经足够让YOLO系列的小模型比如yolov8s、yolov5s达到可用的水平。如果你的场景更窄比如只检测固定位置的仓鼠笼可能500张就够用了。但如果是全屋巡检画面背景差异大那2000到3000张会更稳妥。1096张属于一个性价比比较高的区间既不会因为数据太少导致严重过拟合也不会因为数据太多让标注工作量变得不可接受。从训练角度来说现代YOLO训练默认会做Mosaic增强、随机透视、色彩抖动等数据增强实际参与训练的有效样本量会远超原始图片数。也就是说1096张原图配合增强在常规训练轮次下模型见过的有效样本量能到达上万级别这对小目标检测来说基础是够的。还有一个容易被忽略的点图片的多样性比数量更重要。同样是1000张图如果900张都是一个背景、一个角度效果反而不如500张覆盖多种场景的图。所以我在采集和整理时特别控制了多样性这个后面展开说。1.3 数据集格式与目录结构设计整个数据集打包成一个zip文件解压后你会看到这样的目录结构yolo_hamster_dataset/ ├── images/ │ ├── train/ # 约870张 │ ├── val/ # 约150张 │ └── test/ # 约76张 ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt # 类别列表内容为hamster ├── dataset.yaml # YOLO训练配置文件 └── README.md # 数据集说明文档注意这里的images和labels目录是对应的每一张图片都会有一个同名的txt标注文件。比如images/train/hamster_001.jpg对应的标注就是labels/train/hamster_001.txt。如果发现哪张图片没有对应的txt那说明这张图里没有需要标注的目标这种情况在目标检测数据集里也是允许的但我在整理时基本都做了过滤。dataset.yaml是给YOLO训练用的关键配置文件里面规定了类别数量和类别名称。classes.txt则是人类可读的类别列表方便你用脚本查看或转成其他格式。2. 核心细节解析与YOLO标注格式2.1 YOLO标注格式的原理和坐标约定这个数据集用的是YOLO系列通用的txt标注格式。你可能已经看过类似的文件但这里还是把原理说透因为后面训练出问题时90%都出在格式理解偏差上。YOLO标注的每一行代表一个目标框格式为class_id x_center y_center width height其中class_id是类别编号从0开始。这个数据集只有仓鼠一个类别所以所有标注行的class_id都是0x_centery_center是目标框中心点的坐标widthheight是目标框的宽度和高度。关键来了这四个数值全部是归一化后的相对坐标范围在0到1之间。怎么算假设图片宽度为W高度为H目标框左上角坐标是(x_min, y_min)右下角坐标是(x_max, y_max)那么x_center ((x_min x_max) / 2) / W y_center ((y_min y_max) / 2) / H width (x_max - x_min) / W height (y_max - y_min) / H这种做法的好处是不管图片是1920×1080还是640×480标注文件都可以通用模型训练时会自动resize不需要你额外处理尺度问题。如果你用LabelImg这类工具标注后导出的是VOC格式XML或者用labelme导出的是JSON格式都需要经过一步转换才能变成YOLO格式。网上有不少转换脚本我自己的做法是直接用Python解析XML里的objectbndbox节点按上面的公式换算。2.2 一个标注文件的真实样例为了让你不觉得抽象我直接贴一个真实的标注文件内容。假设这是labels/train/hamster_084.txt0 0.713867 0.547852 0.482422 0.128906 0 0.205078 0.315430 0.158203 0.082031这表示这张图里有两只仓鼠。第一行的含义是类别0目标中心点在图片横向71.4%的位置纵向54.8%的位置宽度占整张图的48.2%高度占12.9%。第二行同理是一只体型更小、位于画面偏左偏上位置的仓鼠。为什么有时候一张图会有两个框因为仓鼠这种动物领地意识强但实际饲养时偶尔也有两只同笼的情况或者画面里同时出现了仓鼠和它的玩具遮挡物。我标注时遵循的原则是只要肉眼能明确判断出是仓鼠且轮廓可辨识就标一个框如果目标太小比如小于20×20像素我会单独筛选出来决定是否保留。这里有一个新手常犯的错误把整个笼子都框进去认为这样包含了目标。这在语义上没错但对目标检测训练来说过大的框意味着背景噪声太强模型学到的特征会被笼子、垫料等干扰导致检测框严重偏大或定位不准。正确的做法是让边界框尽量贴合仓鼠的身体轮廓哪怕轮廓边缘有点毛糙也没关系。2.3 数据标注过程中的几个关键控制点标注质量直接决定模型上限这一点怎么强调都不过分。我在标注这批数据时重点控制了这几个方面边界框紧贴目标。仓鼠的轮廓和它的毛发颜色高度相关纯白仓鼠和浅色垫料背景容易混淆标注时就要略收一点框把毛发的亮边排除在外深色仓鼠则相反框可以稍微外扩一点避免因为轮廓暗部融入背景导致框偏小。半遮挡和模糊目标如何处理。室内监控场景下仓鼠经常躲在跑轮后面、木屑堆里或者躲避屋中这时只露出头或半个身体。我采取的策略是露出部分完整且可辨识就标注可见部分的框如果目标被遮挡超过一半直接不标。这种做法是为了让模型学到的是仓鼠的完整形态特征而不是半个仓鼠也要硬框的错误认知。类别不平衡问题在这里不存在但要注意场景均衡。因为只有一各类别所以不需要担心类别不平衡。但图片的场地分布要尽量均衡比如笼内吃食场景、跑轮运动场景、主人手上互动场景、地板上探索场景的比例要大致均匀避免模型对某一类场景过拟合。多轮质检是必不可少的环节。我标注完第一轮后让第二个人抽检了20%的数据重点看边界框是否贴边、有没有漏检。这步千万别省尤其当你决定自己标注大批量数据时单人标注很容易产生系统性偏差比如越标越随意、框越画越大。3. 实操过程从解压zip到跑通第一次训练3.1 解压zip文件与环境准备拿到yolo_hamster_dataset.zip之后第一步当然是解压。如果你是Linux服务器环境用unzip命令unzip yolo_hamster_dataset.zip -d ./datasets/如果你是在Windows上直接用资源管理器右键解压就行也可以用PowerShellExpand-Archive -Path .\yolo_hamster_dataset.zip -DestinationPath .\datasets\解压之后建议先检查一下文件完整性。怎么检查看图片数量和标注数量是否对得上find datasets/yolo_hamster_dataset/images/train -name *.jpg | wc -l find datasets/yolo_hamster_dataset/labels/train -name *.txt | wc -l如果两个数字不一致说明有图片缺失标注文件或者有多余的标注文件需要排查。环境这块我的建议是直接用ultralytics的YOLO包它封装了yolov5、yolov8、yolov11等模型训练推理一套代码搞定。创建虚拟环境然后安装python -m venv venv source venv/bin/activate # Windows下是 venv\Scripts\activate pip install ultralytics装完后可以快速验证一下安装是否正常from ultralytics import YOLO model YOLO(yolov8n.pt) # 会自动下载nano预训练权重 print(model.model)如果你网络状况不太好下载预训练权重可能会卡住这个属于正常情况多试几次或者手动下载权重文件放到项目目录下即可。正常训练流程对预训练权重的依赖不是必须的但有了预训练权重小数据集上的收敛速度和精度都会好不少。3.2 数据集划分与内容校验数据解压出来后我习惯先写个脚本做个全面体检这一步虽然看起来简单但能帮你挡住后续训练时的绝大多数莫名其妙的问题。import os from pathlib import Path dataset_root Path(datasets/yolo_hamster_dataset) for split in [train, val, test]: img_dir dataset_root / images / split lbl_dir dataset_root / labels / split img_files list(img_dir.glob(*.jpg)) list(img_dir.glob(*.png)) lbl_files list(lbl_dir.glob(*.txt)) # 检查图片和标注是否一一对应 img_names {f.stem for f in img_files} lbl_names {f.stem for f in lbl_files} missing_lbl img_names - lbl_names extra_lbl lbl_names - img_names if missing_lbl: print(f[WARN] {split} 缺少标注的图片: {missing_lbl}) if extra_lbl: print(f[WARN] {split} 无图片的标注: {extra_lbl}) # 检查标注内容是否合法 for lbl_file in lbl_files: with open(lbl_file, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f[ERROR] {lbl_file} 不是5列: {line}) continue class_id int(parts[0]) x, y, w, h map(float, parts[1:]) if class_id ! 0: print(f[ERROR] {lbl_file} 类别ID异常: {class_id}) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): print(f[ERROR] {lbl_file} 坐标越界: {line}) print(f{split}: 图片 {len(img_files)} 张标注 {len(lbl_files)} 个)这段脚本主要干三件事找缺失的图片或标注文件、检查标注行是不是合法的5列格式、检查坐标是否在0到1范围内。如果你是自己从其他格式转来的YOLO数据这个检查尤其重要因为坐标归一化时除以图片宽高很容易写错一错就是全线崩溃。正常情况下执行完终端应该输出类似这样的结果train: 图片 870 张标注 870 个 val: 图片 150 张标注 150 个 test: 图片 76 张标注 76 个说明数据集本身已经是划分好的不需要你再手动按比例切分。这里我把训练集、验证集、测试集的比例控制在8:1.5:0.5左右是目标检测里比较常见的配置。测试集是纯粹用来衡量最终模型效果的训练过程中不会用到所以它的图片通常选最难的那些比如低光照、强遮挡的样本。3.3 配置dataset.yaml文件YOLO训练时需要一个yaml文件告诉它数据在哪里、有多少类。这个数据集里已经带了一个dataset.yaml内容大致如下path: /绝对路径/yolo_hamster_dataset # 改成你本机的实际路径 train: images/train val: images/val test: images/test nc: 1 names: [hamster]这里有几个容易踩坑的点值得单独说下。第一path字段最好写绝对路径尤其是当你的训练脚本和数据集不在同一目录时。用相对路径虽然也能跑但一旦当前工作目录切换就会报Dataset not found的错误排查起来很费时间。第二train和val字段的值是相对于path的路径不包含前面的/写成绝对路径也不会报错但相对路径更稳妥。第三nc是类别数量这里必须写1不能写0否则模型构建时会因为输出通道数不对直接报错。如果你拿到的数据集没有现成的yaml文件自己创建一个也很简单照上面的格式写就行。在ultralytics代码里这个yaml文件不仅用于数据加载还决定了模型输出层的通道数量所以类别名称和数量必须和标注文件里的class_id完全一致。3.4 训练参数选择与启动训练环境就绪、数据集校验通过、yaml配置完成接下来就是启动训练。我用的指令如下yolo train modelyolov8n.pt datadatasets/yolo_hamster_dataset/dataset.yaml epochs100 imgsz640 batch16 device0逐项解释一下这些参数为什么这么选modelyolov8n.ptn代表nano是YOLOv8系列里最小的模型。对仓鼠这种单类别、目标尺度不大的任务nano模型完全够用而且训练速度快迭代调试非常合适。如果你的数据集更大、场景更复杂再考虑换ssmall或mmedium版本epochs100100轮是单类别小数据集的一个参考值。训练过程中可以观察验证集上的mAP50曲线如果到60轮左右已经平了说明模型已经收敛没必要硬跑完100轮如果曲线还在明显上升可以适当增加到150轮imgsz640YOLOv8默认训练尺寸就是640。对仓鼠这种小目标如果你发现检测效果不理想可以尝试改成1024或1280让模型在更大的分辨率上学习小目标的细节但代价是显存占用和训练时间都会直线上升batch16根据你的显卡显存调整。8G显存用16问题不大24G显存甚至可以上32或64。显存不足时适当调小batch或者开启cacheTrue来提前把图片缓存到内存也能缓解一部分压力。训练启动后建议盯一下前几个epoch的loss下降情况。正常情况下box_loss、cls_loss、dfl_loss都应该稳步下降如果某个loss出现剧烈震荡甚至不降反升大多是标注数据有问题比如某张图片的标注框和内容对不上。训练完成后结果会自动保存到runs/detect/train/目录里面有训练过程的曲线图、验证集上的预测可视化、以及最终的权重文件best.pt和last.pt。best.pt是验证集上表现最好的那一版权重后续推理就用它。3.5 模型推理与效果验证训练完不只是看个指标就完事我习惯拿测试集里的图片跑一遍推理直观看看检测框和置信度情况from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourcedatasets/yolo_hamster_dataset/images/test/, conf0.25, saveTrue, projectruns/detect, nametest_inference )这里的conf0.25是置信度阈值。如果检测结果里漏检比较多可以适当调低到0.1或者0.15如果误检比较多就调高到0.4甚至0.5。建议打开saveTrue保存的预测图肉眼扫一遍重点看有没有把仓鼠的玩具误检成仓鼠有没有把深色垫料误检成仓鼠边界框有没有过大或过小这些都是模型质量最直接的反馈。4. 常见问题与操作排查实录4.1 zip文件解压时报错或解压后数据缺失数据集是zip打包的如果下载过程中断或者文件损坏解压时会出现file is not a zip file或者invalid zip archive: could not find eocd这样的报错。我的建议是先看看zip文件大小是否和发布者标注的大小一致如果明显偏小直接重新下载如果大小没问题但解压报错可以用命令行工具修复比如Linux下的zip -FFzip -FF yolo_hamster_dataset.zip --out repaired.zip unzip repaired.zip这个命令会尝试修复zip中央目录Central Directory的损坏。实测下来单纯下载不完整导致的eocd缺失大部分情况可以救回来。如果修复之后依然不行那就别折腾了重新下载更靠谱。解压后如果发现某些子目录是空的很可能是你用了某些解压软件对压缩包内的文件权限处理有问题。这种情况直接用unzip命令在终端重新解压一次比图形化解压软件更可靠。4.2 标注文件与图片对不上这是很多人训练自己的数据集时最容易出问题的环节现象通常是训练时日志里冒出大量类似WARNING: 找不到图片xxx对应的标注文件的提示或者验证时mAP一直是0。排查思路很简单写个脚本对比图片文件名集合和标注文件名集合找出差集。如果是你自己标注的数据常见原因有两个一是标注时勾选了自动保存但某些图片操作中断导致txt没写出来二是从其他标注工具导出时文件名后缀不一致比如图片是.JPG大写标注导出时记成.jpg小写。另外需要注意YOLO训练时是通过图片文件的stem不含后缀的文件名来查找标注文件的所以photo_001.jpg对应的是photo_001.txt千万不能把标注文件命名成photo_001.jpg.txt这种格式。4.3 训练时loss异常或mAP始终为0遇到过几次训练跑完但mAP始终是0的情况这种问题十有八九是标注格式问题而不是模型问题。最典型的情况包括标注文件的坐标值不是0到1之间的归一化值而是像素值。比如一张1920×1080的图中心点x直接写了960超出了正常范围模型训练时看到的坐标值全部错乱标注文件里有空的txt文件也就是0行内容。部分标注工具在导出时如果图片没有目标会生成空文件但YOLO训练时把空文件当作背景样本也不是不行问题不大但如果空文件和正常文件混杂而你又没注意区分可能会影响数据分布dataset.yaml里的nc写错。比如实际只有1类但你误写成2模型的输出通道数就成了2类别ID为0的标注虽然能训练但最终输出概率分布在2类上结果必然不理想。遇到loss异常时最快的定位方法就是随机抽几张图片用OpenCV或PIL把标注框画上去肉眼确认框的位置是否和仓鼠的位置匹配。这一步建议做成脚本批量生成可视化图比一个个手动翻标注文件高效多了。4.4 小目标漏检仓鼠太小模型检测不到这是仓鼠检测里最核心的问题。训练完模型普通场景效果不错但镜头离得远或者仓鼠缩成一团时检测框就是出不来。针对这个问题我的经验有三条第一训练尺寸从640提高到1024。YOLOv8的推理尺寸和训练尺寸可以不一致但最好一致。提高输入分辨率相当于让模型在更大画幅上看到目标对小目标尤为有效代价是推理速度下降第二使用Tiling策略做切割推理。就是把大图切成若干小块分别推理再合并结果。这个思路在遥感小目标检测里用得很多用在仓鼠监控上也成立。实操上可以让摄像头画面按2×2切块每块单独推理小目标的像素相对占比就变大了第三数据增强里的mosaic和copy_paste对提升小目标鲁棒性很有帮助但如果你发现训练时loss已经收敛、验证集mAP也不错部署到真实监控画面却效果差那说明训练数据和真实数据分布有偏差建议补充一些目标更小、角度更刁钻的样本而不是一味调参。4.5 类别ID错误导致推理混乱这个数据集中只有一个类别通常不会有ID错位的问题。但如果你后续自己扩展数据集比如把仓鼠和跑轮作为两个类别就很容易遇到标注文件里写的class_id是1但yaml里names列表第二个位置写的却不是跑轮。训练时模型不会报警但推理结果会全部错位。避免这个问题的方法很简单改完类别后不要直接训练先跑一遍校验脚本把每个class_id出现的次数统计出来再和yaml里的names一一对照。这一步虽然枯燥但对数据集标注这种一天都做不完的工作来说是值得的。5. 数据集扩展方向与实际部署感受5.1 从单类别扩展到行为识别这个数据集目前只做了仓鼠在哪的检测但实际项目里大多数人关心的是仓鼠在干什么。如果你想在检测基础上继续做行为分析一个自然的扩展方向是把跑轮、食盆、水壶、躲避屋等关键物体也标注出来然后利用检测框的位置关系和时间序列变化来做行为判断。比如仓鼠在跑轮附近且身体检测框中心点一直在跑轮框内连续移动基本可以判定为跑轮中。这个思路不需要额外训练行为分类模型用简单的规则逻辑就能实现非常适合做轻量级的宠物行为监测。如果你有更大的精力也可以用YOLO的pose分支估计仓鼠的关键点进而识别更细粒度的行为比如理毛、进食、攀爬等。这个数据集的下一版我计划补充6到8个行为类别并输出对应的行为时序分析工具。5.2 小模型与边缘设备部署的取舍仓鼠检测这种实时监控场景通常跑在树莓派、Jetson Nano这类边缘设备上算力有限。我的建议是先用nano模型验证可行性再根据实际帧率需求选择量化方案。ultralytics提供一键导出ONNX和TensorRT的功能yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640 yolo export modelruns/detect/train/weights/best.pt formatengine device0 # TensorRT导出TensorRT量化后模型在Jetson上的推理速度通常能到30到60毫秒一帧完全够用。但注意TensorRT的engine只对导出时的型号和TensorRT版本有效换设备或升级环境后需要重新导出这一点和ONNX的跨平台性形成鲜明对比。5.3 真实部署中我踩过的几个坑这里说几个我实际部署过程中遇到的坑供参考。第一千万不要用训练时的conf阈值直接去部署训练时为了看效果会把阈值调低真实场景建议从0.35开始往上调我最终用的是0.45误检和漏检平衡得比较好第二摄像头画面如果固定不动可以考虑做背景差分来预处理减少无效帧的推理开销第三夜间模式下画面会偏色或出现红外噪点如果训练集里没覆盖夜间场景部署时最好加一层简单的滤波或者直接用灰度图推理效果比直接跑RGB更稳定。最后分享一个数据层面小技巧不是所有视频帧都值得作为训练样本。我当初采集原始素材时从10小时的视频里抽了4000多帧然后用了一个简单的运动区域占比筛选把画面几乎静止的帧全部淘汰最终保留了1800帧做初筛再人工挑出这1096张。虽然是笨办法但比盲目抽帧标注要高效得多标注质量也更有保障。本文还有配套的精品资源点击获取