尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

自制YOLO猫狗检测数据集:标注、训练与评估实战

发布时间:2026/9/30 1:17:23

资讯中心
01
ARTICLE

自制YOLO猫狗检测数据集:标注、训练与评估实战

自制YOLO猫狗检测数据集:标注、训练与评估实战
1. 项目源起为什么我需要一套猫狗检测数据集我自己在做一个宠物识别类产品原型的时候最头疼的并不是模型选型而是数据集本身。YOLO这种目标检测算法对训练数据的要求有点“挑剔”它既要原图也要带类别和坐标标注而且标签格式必须统一成txt文本每行对应一个目标框。市面上公开的猫狗相关数据大多是分类数据集比如Stanford Dogs、Oxford-IIIT Pet图片主体基本居中背景相对干净拿去训练分类模型没问题但直接喂给YOLO做检测训练模型学到的是“一张图等于一只猫”而不是“图里这个坐标框里的东西是一只猫”。等模型部署到真正的摄像头画面里猫出现在角落、部分被遮挡、和背景融为一体时检测框就会开始乱跳甚至直接漏检。所以我花了将近三周时间从多个来源收集、筛选、清洗并手工标注了4300张猫狗图像最终整理成了一套标准YOLO格式的宠物识别数据集。这个数据集中所有图像都有对应的txt标注文件类别只保留猫和狗两类坐标统一为归一化格式训练集和验证集按9比1划分。如果你正准备用YOLOv5、YOLOv8或最新的一些改进版本训练猫狗检测模型这一套数据可以直接拿来用不用再踩我踩过的那些数据坑。这个项目适合三类人一是刚接触YOLO、想跑通第一个自定义检测模型的初学者二是已经在做宠物相关的视觉应用比如智能猫门、宠物喂食器、猫咪行为分析需要一个干净数据集做基线实验的开发者三是想研究检测模型在“类间外观接近、背景复杂”场景下如何表现的朋友。猫和狗其实在体型、颜色、姿态上都有很大差异但幼猫幼犬、长毛品种、局部遮挡这些情况会给模型带来不少挑战这套数据里我对这些边界情况做了额外补充。有个数据上的细节我后来觉得非常重要这套数据集不是简单地把网图打包而是刻意模拟了真实落地场景的图像分布。室内外环境都有覆盖光照条件从明亮的窗边到昏暗的走廊都有图像里出现的目标数量从单只到三四只不等目标大小从占画面三分之一的近景到只占画面十分之一的远景都有。之所以这么设计是因为我在实际测试中发现很多公开数据集在mAP指标上刷得很高但一放到真实场景就“见光死”原因就在于训练图像太“干净”模型没有见过复杂的视觉噪声。1.1 数据集能解决什么实际问题统一YOLO格式训练集和验证集的图像文件、标注文件一一对应放到data.yaml里就能直接训练。类别定义明确猫、狗两类标注严格按照左、上、右、下坐标映射到归一化的中心点坐标加宽高。场景覆盖贴近落地单目标、多目标、小目标、遮挡目标都有涉及模型训练后泛化性更接近真实需求。提醒别小看“数据干净”这四个字。我最初用爬虫方式收集了一批图片结果里面混了漫画、玩偶、甚至衣领上印的卡通猫图案标注的时候全部需要重新筛掉。这类噪声如果不清理训练出来的模型会莫名其妙把卡通形象当成真实目标。2. 数据集的内部结构与设计思路这套4300张的数据集从文件结构上看很简洁但为了保证训练效果我在内部构成上做了很多考究。2.1 目录结构与标注格式数据集根目录下分为images和labels两个大文件夹每个文件夹里再按train和val细分。图像统一采用JPG格式分辨率为640x640到1920x1080不等训练时YOLO会自动做letterbox适配不需要提前裁剪。labels目录下的每个txt文件与图像文件同名例如一张名叫IMG_0042.jpg的图片对应标注文件就是IMG_0042.txt。txt文件里每行代表一个检测目标格式如下class_id center_x center_y width height其中class_id为0或10代表狗1代表猫。四个坐标值都是归一化后的浮点数范围在0到1之间计算方式很简单用目标的中心点x坐标除以图片宽度得到center_x目标框宽度除以图片宽度得到width高度同理。这种格式是YOLO系列训练时默认读取的格式我见过很多人拿到VOC或COCO数据集后到处找转换脚本其实核心就是做这一层归一化映射。举个例子如果一张宽800像素、高600像素的图片里有一个目标框左上角坐标是(200, 150)右下角坐标是(400, 450)那么归一化后的标注就是center_x (200 400) / 2 / 800 0.375center_y (150 450) / 2 / 600 0.5width (400 - 200) / 800 0.25height (450 - 150) / 600 0.5对应txt文件内容为0 0.375 0.5 0.25 0.5。2.2 场景分布与类别平衡为了不让模型对某一种背景产生过拟合我对图像来源做了统计。数据集中室内图像约占55%室外约占45%。室内场景包括客厅、卧室、阳台、宠物医院诊室室外场景包括小区的道路、公园草地、宠物乐园。很多猫狗检测项目训练时只有室内图像结果模型跑到户外就频繁漏检这是我在真实项目中吃过亏的地方所以这套数据在收集阶段就有意识地控制背景多样性。类别平衡上我统计了一下包含狗的图像约2100张包含猫的图像约2250张其中约300张图像里猫狗同时出现一共标注了大约6100个目标框平均每张图约1.4个目标。这里有意识保留了一批猫狗同框的照片因为实际应用中经常出现宠物互动的画面如果模型只会识别单独出现的猫或狗那多宠物场景基本就废了。2.3 图像筛选标准在筛选图像时我给自己定了三条硬性标准第一图像中必须有可辨识的完整或大部分可见的猫狗主体只露一条尾巴或者只看到模糊背影的不要第二图像本身不能有严重压缩痕迹或者分辨率过低小于480p的图直接排除第三同一张图如果被多次转载、在水印位置发生变化用感知哈希算法去重避免重复图像进入数据集。关于去重我多说一句。很多人训练时发现验证集的mAP特别高但测试集上效果明显下降第一反应是模型过拟合实际上很可能是因为训练集和验证集之间有重复或高度相似的图像。我在整理数据时写了一个哈希去重脚本对每张图生成一个64位的感知哈希值把汉明距离小于等于5的图片全部找出来人工确认这一步至少清掉了二十多组重复图片。3. 标注流程全记录与实操细节标注是整个数据集构建过程中最耗时的一环。我前前后后用了十天来标注和校对中间试过好几种标注工具最后沉淀出一套比较顺手的流程。3.1 标注工具选型与经验我用过三款工具LabelImg、labelme和X-AnyLabeling。LabelImg是老牌工具对YOLO格式支持很直接打个勾就可以导出txt标注文件labelme输出的是json格式适合做实例分割标注但拿来做检测框标注反而要多一步转换X-AnyLabeling是我后期的主力工具因为它支持加载YOLO预训练模型做自动预标注然后再由人工修正。个人建议如果标注量在几百张以内LabelImg足够如果标注量到了几千张强烈建议先用一个预训练好的目标检测模型哪怕是通用的COCO模型对图片做第一轮自动标注然后打开标注工具逐张检查修正。这个过程我实测下来能把总耗时压缩40%左右因为大部分图像里的猫狗都能被预标注模型准确框出来人工只需要调整边缘框的位置而不是从零开始画框。3.2 标注过程中的三个重点难点第一个难点是小目标标注。很多图像里的猫狗只占画面的一小块区域比如躲在沙发角落的猫、远处草坪上奔跑的狗。这类目标的框如果标注不准确训练时YOLO很难学到有效特征。我的经验是小目标的框宁可稍微紧一点也不要为了把耳朵尾巴都包进去而扩得太大背景噪声进框太多反而会让模型学到无关特征。第二个难点是遮挡目标。只露出半个身子的猫、趴在毯子下面只露出头的狗这类遮挡样本要单独标注并且不要试图用一个很大的框把被遮挡的和遮挡物都框进去只需要把可见部分框出来。我在标注时发现如果人被框进目标里相当于给模型注入了错误监督信息后期模型的误检率会显著上升。第三个难点是猫狗同框时候的边界划分。有些长毛品种的猫狗在颜色和纹理上很接近尤其是幼年个体框子稍微偏一点就可能落到另一类目标上。我处理这类图像时会同时打开原图的分辨率视图放大到200%以上逐边缘检查宁可多花十秒钟也不要留下一个错误标签。4. YOLO模型选型与训练实操数据集准备好之后就是模型训练环节。我用这套数据集同时跑过YOLOv5s、YOLOv8s和YOLOv8n最终在项目里选型的是YOLOv8s原因是它在算力占用和检测精度之间比较平衡单张RTX 3060显卡就能在合理时间内完成训练。4.1 模型版本对比与选型理由虽然知乎、公众号上经常能看到各种“YOLO新版本杀疯了”的标题但我自己的经验是选模型要看你手头的算力和部署目标。YOLOv8n的模型体积最小只有3.2MB左右推理速度极快适合部署到树莓派、手机端或者低功耗摄像头设备但精度在复杂背景下的表现一般尤其是在小目标上漏检率比YOLOv8s高不少。YOLOv5s虽然版本相对旧但生态最成熟部署到TensorRT、OpenVINO的文档和踩坑案例最多适合需要快速落地的项目。YOLOv8s精度和速度的平衡最好C2f结构带来更好的特征提取能力这也是我最后选它的主要原因。如果你在做一个研究性质的对比实验我建议把YOLOv8s作为基线模型然后再去对比一些改进方案比如给Neck部分加注意力机制、换用某种更加高效的检测头结构。检测头这块多说一句Efficient Head是最近很多改进工作的重点方向它的核心思路是让不同尺度的特征在检测头里更充分地融合对小目标的检测收益比较明显。这套数据集里有一个专门的子集是包含小目标的跑改进模型时可以直接用这个子集做对比。4.2 训练配置与命令训练前需要先写好data.yaml文件内容大概是path: /path/to/dataset train: images/train val: images/val nc: 2 names: [dog, cat]然后执行训练命令。我用YOLOv8训练时的核心参数如下yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs120 \ imgsz640 \ batch16 \ lr00.01 \ optimizerAdamW \ seed42这里有个值得说道的点为什么imgsz选640而不是更大我试过用960分辨率训练mAP确实有提升特别是小目标上的召回率涨了大概1.8个百分点但训练时间差不多增加了一倍推理速度也明显下降。对猫狗检测这种目标本身不算特别小、实时性要求又比较高的应用来说640是比较务实的选择。如果你做的是其他小目标检测场景再把分辨率往上调也不迟。4.3 训练过程监控与超参数调整训练过程中我主要盯着三个指标box_loss、cls_loss和dfl_loss。正常训练时这三个损失都会在前期快速下降然后进入平缓期。在epoch 80左右我发现cls_loss出现了异常反弹反复查了才发现是数据增强中的mosaic增强导致标签在拼接图边缘被切断模型在中期开始学习到了不稳定的特征。解决方法是把mosaic概率从1.0降到0.5并且在最后十轮训练中关闭mosaic增强这才让损失曲线恢复平稳。关于数据增强的另一条经验上下翻转flipud在你训练宠物识别时要慎重。YOLO默认设置里flipud的概率是0fliplr是0.5这其实是符合直觉的——猫狗在水平方向上翻转不影响语义但上下翻转会让模型学到“宠物倒立”这种不真实样本如果部署环境中摄像头不存在俯仰翻转建议保持默认不要开flipud。我曾在一次测试中把Augment里所有增强项都拉满跑了个实验结果训练集loss虽然降到很低验证集mAP却掉了两个点典型的增强过猛导致分布漂移。5. 评估体系mAP、混淆矩阵与真实场景验证训练完成后不能只盯着训练日志里的数字完整的评估体系要包括定量指标和定性测试两部分。5.1 定量指标解读我跑完YOLOv8s之后在验证集上得到的一组关键指标如下模型PRmAP50mAP50-95YOLOv8s0.8850.8620.9120.684YOLOv8n0.8470.8330.8910.635很多人只看mAP50觉得0.91已经不错了但我更关注mAP50-95这个指标因为它会以不同IoU阈值从0.5到0.95步长0.05对模型做综合评价更能反映检测框位置准确度。0.684对于一个两类的数据集来说说明还有不少目标的预测框位置不够精准尤其在小目标和遮挡目标上。5.2 混淆矩阵里的信息混淆矩阵是训练结束时自动生成的YOLOv8会在 runs/detect/train 目录下输出confusion_matrix.png。我仔细看了这张图发现除了dog和cat两个类别外有一小部分目标被分到了background这一类也就是模型在图上画了框但实际上那个区域里没有猫狗。这些误检大多出现在光照极低、目标边缘模糊的图像里。有一个值得注意的现象是cat被误检为dog的比例比dog被误检为cat的比例略高。原因是数据集里有一些幼年萨摩耶和白色的布偶猫它们都是白色长毛、圆脸大眼在低分辨率下确实容易混淆。我在标注时已经尽量保证边界清晰但模型还是学到了一些容易混淆的特征。针对这种情况我给训练集额外补充了几十张白色长毛犬和白色长毛猫的近距离特写单独又跑了一轮微调混淆情况明显缓解。5.3 真实场景验证比指标更重要我始终觉得验证一个猫狗检测模型是否合格不能只看验证集mAP更要去真实场景里测。我把训练好的YOLOv8s导出为ONNX格式然后在一台只有CPU的Jetson Nano上分别测试了三段事先录好的视频一段是白天小区里遛狗的画面一段是室内猫从沙发后面走出来的画面一段是夜晚光线昏暗时宠物在门边的画面。结果很有意思。白天室外场景几乎零漏检室内半遮挡场景的检出率也不错但夜晚低光照场景下模型依然能找到目标只是框的抖动非常明显。后来我在预处理里加了自适应直方图均衡化相当于在推理前对图像做了一次对比度增强框的稳定性马上提升了。这个改动很小但对于实际应用的视觉体验影响非常大。6. 常见问题与排查技巧实录整个项目做下来踩过的坑确实不少。我把做得比较多的排查过程整理成一份速查表方便你照着自查。6.1 典型问题与对应解法现象可能原因排查与解决办法训练时loss为NaN或BN层崩溃学习率过高或数据中存在极端像素值降低初始学习率到0.001检查图像是否有纯白/纯黑损坏文件验证集mAP高但真实场景很差训练集与验证集分布不一致缺失背景多样性增加场景扩充不要只靠网图训练某一类目标几乎检测不到类别样本数不均衡用数据增强、重复采样或补充收集该类图像检测框不断抖动模型对低光照或运动模糊敏感推理前加图像增强预处理用视频流做时序平滑训练速度越来越慢数据加载瓶颈打开Dataloader的workers参数图像全部转为JPEG编码统一格式损失曲线后期反弹数据增强过猛关闭mosaic或降低增强概率后期用微调方式训练6.2 几个印象深刻的Bug第一个让我印象特别深刻的坑是标签错位。有一批图像的标注文件是我手动批量改文件名时生成的结果有一小部分图片和txt对不上——图片是狗标签是猫。训练过程中损失曲线表现正常但混淆矩阵里dog和cat之间多了一大块交叉区域。后来我写了一个脚本随机抽了50张图把标注框画回到原图上人工核对立刻发现了问题。从此我再也不相信手动批量重命名全部改用脚本生成同名文件。第二个坑来自数据泄漏。我在统计验证集和训练集时发现mAP50高到接近1.0以为是模型神了后面才排查到问题出在一小批图像从不同来源下载但内容完全相同感知哈希去重只在初次筛选时跑过一遍处理新增图像时忘了再跑一次。后面我把去重脚本集成到了数据处理流程的末尾确保每次版本更新都重新做一遍去重。第三个坑是标注框过小。YOLO训练时如果你把过小的目标框比如宽度或高度小于图像尺寸的5%直接喂进去模型预设在特征图上对应的感受野会有问题非常容易产生大量漏检。我的做法是在训练前跑一次统计脚本把所有宽高占比过小的标注框筛出来逐张判断是否属于真实小目标如果属于我会在训练配置里把anchor或者检测层的小目标分支调优如果不属于就删除这个无效框。6.3 独家排查技巧如果你不确定训练数据有没有问题我教你一个懒人但有效的排查法训练完成后直接把验证集图像连同预测结果画框输出保存到一张大图上人眼快速扫一遍。这个操作比看任何指标都有用。YOLOv8在predict时会把结果存到runs/detect文件夹你只需要把saveTrue打开然后花十分钟翻一下预测图模型哪里不行一目了然。7. 数据集扩展与后续使用建议这套数据集解决了“从无到有”的问题但你如果想把模型做得更稳有几个方向值得继续投入。7.1 类别细分的扩展空间当前数据集的类别只有dog和cat两类。实际业务里用户通常还想知道“这是什么品种”或者“这是谁家的猫”。你可以在这套检测数据集的基础上把每个检测框裁切出来再做一个品种分类模型形成“检测分类”的两阶段方案。我实际试过对检测框做IoU裁剪后只用一个轻量级图像分类模型就能达到可用的品种识别效果比直接训练一个多类别检测模型省力得多。7.2 融入主动学习和数据闭环如果是长期运营的线上系统建议把每天的误检结果、漏检结果保存下来每周人工审核一次把确有价值的新样本补充进训练集。这种主动学习的数据闭环一旦跑起来模型的泛化能力会持续提升而不是训练完就固定在一个水平上。我自己早期做的时候没有这套机制后来发现模型上线两周后遇到了一批新的场景比如宠物店玻璃橱窗里的猫漏检率明显升高才意识到数据更新必须持续性。7.3 与多模态、Transformer方向结合如果你关注学术前沿可以在猫狗检测任务上尝试两种进阶方向。一是把YOLO和Transformer模块结合比如在Backbone后面加一个轻量级Transformer模块做全局特征建模能帮助模型更准确地捕捉那些被遮挡目标的全局上下文信息。二是做“检测跨模态检索”比如根据文字描述去找对应的宠物个体这对数据集结构会有更高要求需要补充每个目标的属性标注。这套数据集虽不能直接满足多模态任务需求但它作为基础的检测底座能把目标区域准确裁出来为后续的多模态对齐省去不少麻烦。我在实际使用中把训练好的模型部署到一台带摄像头的边缘设备上全天候记录小区里宠物出没的情况前两周运行下来白天场景的检测置信度基本稳定在0.8以上夜间会降到0.7左右但都没有出现完全漏检的情况。对真实项目来说这样的稳定性已经具备落地价值了。最后补充一个实用小技巧训练完模型后建议把模型导出成多种推理格式比如PyTorch的.pt、ONNX的.onnx和TensorRT的.engine。不同部署平台对格式的兼容性不一样我已经吃过“只在PyTorch下测试好用一到嵌入式设备才发现不支持”的亏了。提前导出验证一遍能让你的模型从实验室到生产环境的路顺畅很多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。