尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
猫狗检测数据集构建与YOLO训练实战:从数据到模型全流程
1. 为什么做这个猫狗检测数据集做视觉检测项目的人几乎没有不碰动物识别的。猫和狗作为最常见的宠物看起来好认实际做起来才发现坑比想象中多得多——毛发纹理千变万化、姿态五花八门、遮挡频繁、不同品种之间体型差异巨大小型犬和猫在某些角度下几乎可以以假乱真。之前我接到一个宠物门禁项目的需求需要在门口摄像头画面里区分自家猫和陌生猫后来扩展成猫狗通用检测才发现市面上现成的数据集要么类别太杂、要么标注质量参差不齐真正干净好用的宠物检测数据并不好找。于是干脆自己攒了一个4300张的猫狗检测数据集用YOLO格式整理好一边做项目一边持续迭代这里把我从数据准备到模型训练踩过的路子完整梳理一遍。这个数据集服务于一个很直接的需求在真实场景中快速定位并识别画面里的猫和狗。它不涉及细分类——不需要区分品种不需要知道是柯基还是金毛只要能把猫和狗这两个类别用边界框框出来就行。所以标注类别只有两类cat 和 dog。这在YOLO框架下是最典型的二分类目标检测任务也是入门YOLO训练最合适的练手项目之一。适用人群很明确刚接触YOLO想跑通完整训练流程的新手在做宠物识别相关产品需要自建数据的开发者还有需要一份干净基线数据做算法对比的研究者。4300张图不算多但足以支撑一个可用级别的检测模型配合数据增强和预训练权重训练出来的模型在常见家居、街道、户外场景下能跑出不错的mAP。整个流程如果照着本文走从拿到数据到训练出第一个可用的权重一个下午就能完成。2. 数据集设计思路与YOLO格式要点2.1 为什么选YOLO格式而不是COCO或VOC先说结论如果你的项目不是必须接入COCO生态的工具链那YOLO的TXT标注格式是个人做数据集最省心的一种。YOLO格式每个标注文件对应一张图片文件名一致只是扩展名不同里面每一行代表一个目标框格式为 class_id center_x center_y width height四个坐标值都归一化到0~1之间。这种设计的最大好处是两个一是和图片分辨率解耦不管原图是1920x1080还是640x480标注值都不用改二是纯文本文件体积小、易解析、方便程序化检查和修改。COCO的JSON格式虽然信息密度高但嵌套结构复杂手动写一个检查脚本都要多写不少代码。VOC的XML格式又太啰嗦每个框的坐标直接写像素值图片一旦缩放就得重新换算。我做这个数据集时一开始考虑过VOC因为LabelImg默认输出就是XML后来用脚本转成YOLO格式后就没再回头——训练脚本里读取和可视化检查都顺滑得多。2.2 4300张的数量是怎么定的数量不是拍脑袋定的。当时我的判断标准是在YOLOv8 nano/small这种体量下每类至少要有1500~2000个有效标注实例模型才有足够样本学会类别差异。4300张图里我严格控制了猫狗数量的大致均衡——猫约2150张狗约2150张虽然不是绝对平均但避免了某一类数量悬殊导致训练偏向。很多人容易忽略的是目标检测数据集的有效信息量不只看图片数更要看标注框总数和每张图的实例密度。我的数据里总共标注了超过5200个目标框平均每张图1.2个框这个密度比较贴近真实宠物监控场景——通常一个画面里就一只猫或一只狗偶尔两到三只同框。如果是做密集场景比如宠物店、猫咖这个数据量就不够看了至少需要额外补充每个画面5个以上目标的样本。2.3 类别定义与边界情况二分类检测最容易犯的错误是类别定义模糊。我在标注规范里明确了几条硬规则只有完整的、可辨识的猫或狗才算正样本画面中只有猫尾巴或狗耳朵露出来的一律不标。被家具遮挡超过50%的目标不标但轻微遮挡比如猫躲在椅子腿后面露出大半身体需要标。玩具猫、雕塑猫、图画上的猫不标避免模型学到错误的纹理特征。模糊到人类肉眼都难以判断的远距离小目标不标。这些规则看起来琐碎实际决定了下游模型的精度上限。如果标注员把残缺目标也标进去训练出来的模型就会在类似场景下产生大量误检后处理反而更难做。我后来在排查模型误检时发现最顽固的错误把抱枕当猫、把木雕狗当狗基本都能追溯到标注阶段混入了类似样本。3. 数据采集、清洗与增强实战3.1 图片来源与版权处理数据集的数据来源必须干净。我采用的是三条渠道组合一是自采用手机和运动相机在不同光线、不同背景下拍摄家里的猫和朋友的狗这部分约700张二是开源数据集筛选从公开的宠物图片数据中挑选符合标注规范的图片三是爬取公开图库中CC0协议的宠物照片。无论哪条渠道我都坚持一个原则不带水印、不带角标、画面主体清晰、分辨率不低于640。低分辨率图片在YOLO下采样后细节损失严重尤其对小体型的猫来说32倍下采样后可能只剩十几个像素的有效特征基本等于废图。版权这块多说一句商用项目一定要保留每张图的来源记录。我做了一个简单的CSV表格记录每张图的来源、授权类型、是否允许商用这个习惯在项目后期对接产品化时省了巨大麻烦。3.2 数据清洗的实操流程原始图片收集完后不能直接进标注环节。我的清洗脚本做了这几件事统一分辨率长边超过1600的等比压缩到1600以内小于640的单独归类后续决定是否缩放增强。去重用感知哈希算法pHash计算每张图的指纹相似度高于0.9的直接剔除防止同源图片导致训练集和验证集泄漏。这一步特别重要很多人忽略结果验证集mAP虚高上线一测就崩。清晰度过滤计算拉普拉斯方差低于阈值的模糊图片剔除。运动模糊的宠物照片虽然视觉上有感觉但对训练有害无益。亮度分布检查直方图过于集中过曝或过暗的图片单独挑出来不直接删除留待后续测试模型的鲁棒性。清洗完大约剩下3900张可用图加上部分轻度运动模糊和低光照图保留下来做验证集最终凑到4300张的规模。3.3 数据增强策略与坑训练阶段我建议用YOLO内置的增强而不是离线增强。原因很简单在线增强是随机的每个epoch看到的图都不一样相当于无限多的训练样本离线增强如果做得太多反而会导致验证集分布和训练集逐步偏离。我实际开启的增强参数如下mosaic开启概率1.0。四张图拼一张对小目标检测提升非常明显。mixup0.2太高会让猫狗纹理混在一起模型学到的特征变模糊。随机旋转±15度超过这个范围宠物姿态会不自然。随机透视0.3模拟摄像头安装角度不同带来的形变。hsv变化h0.015s0.7v0.4。适度调色增强光照鲁棒性。有个坑必须提醒flip水平翻转对猫狗这类左右对称的动物没问题但如果后续要检测带有方向性特征的物体或者你的场景里有文字标识就一定要谨慎。我在实际训练中遇到过开了翻转后模型把面向左的学习偏好搞乱的情况虽然猫狗最终不受影响但这个经验值得记录。4. YOLO训练全流程实录4.1 环境准备与数据目录结构我用的是YOLOv8因为它的训练接口最简洁调参方式也直观。装环境这块不再赘述CUDA和PyTorch版本匹配是基本功。数据目录结构按YOLO官方约定来dataset/ ├── images/ │ ├── train/ # 3400张 │ └── val/ # 900张 ├── labels/ │ ├── train/ # 3400个txt │ └── val/ # 900个txt └── pet.yaml # 数据配置文件pet.yaml的内容非常简单path: dataset/ train: images/train val: images/val nc: 2 names: [cat, dog]这里有一个细节path路径我建议写相对路径不要写绝对路径。因为训练脚本和数据集经常在不同机器之间迁移写死绝对路径换个环境就要改一遍纯属浪费时间。train和val的划分我按8:2来做并且保证同一个来源的图片不会同时出现在训练集和验证集中。4.2 标注质量检查脚本标注完成后检查这一步不能省。我写了一个简单的Python脚本逐张读取txt标注文件检查四类常见问题坐标值是否越界小于0或大于1、宽高是否为0、类别ID是否超出nc范围、以及是否有重复标注框几乎完全重叠。这里给一个精简版的检查逻辑import os def check_label(txt_path, img_w, img_h): with open(txt_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f格式错误: {txt_path}) continue cls, cx, cy, w, h parts[:5] cx, cy, w, h map(float, (cx, cy, w, h)) if not (0 cx 1 and 0 cy 1): print(f中心点越界: {txt_path}) if w 0 or h 0 or w 1 or h 1: print(f宽高异常: {txt_path})此外还有一个很有用的辅助技巧把标注绘制回图片上生成一批预览图人工肉眼抽查。随机抽200张如果错误率超过1%整个标注就需要返工。我第一版数据就是这么查出问题的——有大约60张图的标注框整体偏左原因是标注工具界面缩放导致的坐标偏移。这种系统性的错误靠脚本检查坐标范围根本发现不了必须可视化抽查。4.3 预训练权重与训练参数训练我直接用了YOLOv8官方在COCO上的预训练权重yolov8n.pt。这里避不开一个问题COCO里没有猫狗吗有但COCO的猫狗类别只有各自一个类模型已经在COCO上学过猫狗的低层纹理特征和边缘特征这些先验知识迁移到宠物检测任务上有很大帮助。实践中我把训练轮数设为120个epoch前5轮用warmup让模型先适应新数据集的学习率基础学习率设为0.01batch_size根据显卡显存调整——12GB显存跑yolov8n可以到batch 64但如果用yolov8s就得降到32。训练命令极简yolo train datapet.yaml modelyolov8n.pt epochs120 imgsz640 batch64 patience15patience参数我设15意思是连续15轮验证集指标不提升就自动停止。第一次训练我把patience设成30结果最后15轮纯粹在浪费时间模型早已收敛白耗了半个多小时。4.4 指标解读与阈值选择训练结束后Ultralytics会输出一张混淆矩阵和一张PR曲线图。我最关注的是mAP50和mAP50-95两个值。mAP50表示IoU阈值0.5下的平均精度适合评估大致位置对不对mAP50-95则从0.5到0.95按0.05步长取平均更严格考验边界框回归的精确度。我这次训练出的基线结果模型mAP50mAP50-95参数量yolov8n0.9120.7433.2Myolov8s0.9380.79611.2M看到指标先别急着高兴。我习惯把验证集里的失败案例可视化出来——把置信度低于0.35的真实目标框、以及置信度高于0.5的误检框都画到图上逐张看。这一步能暴露很多指标看不到的问题比如狗在阴影里被漏检、白色猫咪在白色沙发上完全消失这类典型低对比场景。如果这些场景在你的实际应用里常见就需要针对性地补充数据而不是靠调参解决。5. 训练时踩过的坑与解决办法5.1 标注坐标归一化错误导致loss爆炸第一次训练时我直接用LabelImg导出的XML转YOLO格式转换脚本里有一处坐标换算写错了把中心点坐标当成了左上角坐标做归一化。结果就是训练loss在前10轮疯狂震荡mAP一直趴在0.3左右上不去。排查过程很痛苦因为网络结构、学习率都检查了一遍都没问题。最后可视化验证集标注才发现框全偏了修正后mAP直接跳到0.85以上。这个经历给我的教训是不要迷信转换脚本每换一个标注工具或转换流程一定要随机抽10张图可视化对比原图和标注框位置。这个步骤成本极低但能挡掉百分之八十的标注事故。5.2 类别不平衡带来的漏检4300张图虽然猫狗大体均衡但具体到某些环境下的样本分布还是有偏。比如户外场景狗多猫少夜间场景猫多狗少。模型最终在夜间狗漏检率偏高因为夜间狗的样本量不足。解决方法有两个方向一是增加数据这个最有效但成本高二是调整损失权重。YOLOv8没有直接暴露类别权重参数实际中我会计算每个batch里各类样本数量对样本少的类别做额外的在线复制增强。效果有一定提升但说实话最终解还是补了一批夜间样本来得踏实。5.3 YOLO训练中BN层崩溃问题热词里提到的yolo训练中bn崩溃我真实遇到过。现象是训练到中途loss突然变成nan或者mAP骤降归零。原因通常是batch_size太小BN层的统计量不稳定或者学习率过高导致梯度爆炸。我的处理方式把batch_size提到至少16最好32以上。调低初始学习率从0.01降到0.005。开启weight decay默认0.0005可以不动。在yolov8中可以通过设置batch-1让Ultralytics自动根据显存选择合适的batch。如果以上都没用检查数据集里是否有损坏的图片文件。一张全黑的、损坏的、或者包含极端像素值的图片可能在增强后产生异常梯度导致训练崩溃。我清理掉几张从网络下载的损坏图片后类似问题再没出现过。5.4 小目标猫狗检测优化监控画面里宠物经常离摄像头很远这时候目标只有二三十个像素大小。yolov8n在640分辨率下对这类小目标比较吃力。我实测的优化组合把训练分辨率从640提到960小目标mAP提升约8个点但训练时间翻倍。开启mosaic增强让模型在拼接图里学到更多小尺度特征。专门准备一个小目标子集把所有标注框面积占图片面积不足1%的样本抽出来放在验证集里单独统计指标。坦白讲小目标检测没有银弹。分辨率提升是最直接的但部署端的算力也要跟着涨。如果摄像头离宠物太远与其在算法上死磕不如调整摄像头的安装高度和角度来得划算。6. 部署落地与模型压缩经验6.1 从PyTorch模型到ONNX导出训练完的.pt权重不能直接上生产环境我一般走ONNX导出这一步方便后续用TensorRT或者ONNXRuntime做推理加速。导出命令同样很简单yolo export modelbest.pt formatonnx opset12 imgsz640导出后建议用onnxruntime跑一遍推理和PyTorch结果对比确认数值一致。这一步经常出现的问题是某些自定义算子导出失败用官方模型基本不会遇到但如果改过模型结构就要仔细核查。6.2 CPU端的推理优化如果你的应用跑在CPU上比如树莓派或者普通工控机这里有三个优化方向一是用INT8量化yolov8n参数量只有3.2M量化后模型体积从6MB降到不到2MB推理速度能提升1.5到2倍mAP损失通常在2个点以内二是换轻量级后端ONNXRuntime配合OpenMP设置线程数比PyTorch直接推理快不少三是输入分辨率降到416或者320宠物目标通常比较大降分辨率对这类任务的影响不如小目标任务那么致命。我实际测试中640降到416mAP50下降约3个百分点但推理帧率从15FPS提到35FPS对于门禁、猫眼这类场景完全够用。6.3 置信度阈值与NMS后处理部署时还有一个容易被忽略的参数conf阈值。训练时默认是0.25但实际场景要看你的误检容忍度。如果场景里经常出现抱枕、毛绒玩具这类和宠物特征很像的干扰物建议把conf提高到0.4到0.5虽然会牺牲少量召回率但体验上少报一次警比漏报一次更让人舒服。NMS的IoU阈值我保持默认0.7因为猫狗目标之间重叠度很低不需要特殊调整。7. 我最后的几点体会做数据集和训练模型最花时间的从来不是标注本身或者训练过程而是那些反反复复的质量校验和错误排查。4300张图听起来不大但从采集、清洗、标注、检查到训练调优完整走下来我花了约一周的业余时间。如果重新做一遍我会在标注环节更早引入可视化抽查而不是等全部标完再检查——那种标了三天发现方向错了的挫败感经历过一次就不想再来第二次。另外分享一个收尾的小技巧把训练好的模型在完全不相关的新图片上跑一遍比如电影截图、绘画作品、漫画里的猫狗看看模型会怎么反应。这一招能快速暴露模型的过拟合程度。我实测下来用我这个数据集训练的模型在漫画图片上能检测出大部分猫狗说明学到的是相对泛化的轮廓和纹理特征而不只是记住了训练集里的某几张特定照片。如果你的模型在风格迁移后的图片上表现很差大概率是训练数据多样性不够这时候补充不同风格的数据比调参更有效。数据集的维护没有终点。我到现在还在往里面补充新场景的图片尤其是不同季节、不同光线、不同拍摄角度下的宠物。做视觉项目越久越承认一个朴素的事实数据质量决定了模型上限算法只是尽量逼近这个上限。希望这篇记录能给正在做宠物识别项目的你一些参考少踩几个我踩过的坑。
RELATED

相关推荐

Visual Studio接入Ace Data Cloud与Inferpal:AI编程读懂数据字典

Visual Studio接入Ace Data Cloud与Inferpal:AI编程读懂数据字典

最近一直在折腾 Visual Studio 里的 AI 编程环境。工具换了不少,从 Cursor 到 VS Code Copilot 都用过一圈,但真正回到老本行 Visual Studio 的时候,你会发现一个问题:很多 AI 助手只懂你当前打开的代码文件,对项目背后…

📅 2026/9/29 4:49:26
Ubuntu上安装Anaconda3全指南:环境变量配置与避坑实战

Ubuntu上安装Anaconda3全指南:环境变量配置与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:44:26
I2C多主机仲裁与时钟延展:从开漏输出到分布式协调的底层机制

I2C多主机仲裁与时钟延展:从开漏输出到分布式协调的底层机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:44:26
MORE NEWS

更多资讯

📰

CAP 框架全解析:基于 Outbox 模式的微服务事件总线与分布式事务解决方案

后端消息队列微服务 【免费下载链接】CAP 基于最终一致性的微服务分布式事务解决方案,也是一种采用 Outbox 模式的事件总线。 项目地址: https://gitcode.com/dotnetcore/CAP 点击查看 免费下载 CAP(dotnetcore/CAP)是一个开箱即…

📰

工业读码器选型:固定式与手持扫码枪的适用场景分析

做产线改造或仓储升级时,读码器的选型是个绕不开的问题。固定式和手持扫码枪,价格差好几倍,适用场景完全不同,选错了不仅浪费钱,还可能影响产线效率。这篇从实际使用角度聊聊两者的差异,以及什么场景该选哪…

📰

【ComfyUI】SD1.5 + ControlNet 涂鸦引导图生图

今天给大家演示一个基于 DreamShaper 模型 与 ControlNet Scribble 相结合的 ComfyUI 工作流。这个流程通过导入基础模型和 VAE,结合图像的边缘检测预处理,再配合正向与负向提示词的控制,使生成结果在画面风格和细节上都能保持高质量。 整个流程的重点是将输入图像经过 Cann…

📰

FAST Element 1.x API 深度解读:SlottedBehavior.disconnect() 如何断开 slot 节点观察

前端UI组件 【免费下载链接】fast The adaptive interface system for modern web experiences. 项目地址: https://gitcode.com/gh_mirrors/fa/fast 点击查看 免费下载 本文围绕 microsoft/fast-element 1.x API 文档中的 SlottedBehavior.disconnect() 方法&…

📰

Wand-Enhancer:零成本解锁 WeMod Pro 的完整指南

Wand-Enhancer:零成本解锁 WeMod Pro 的完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer 是一款开源的 WeMod&am…

📰

构建企业级AI知识库:从文档解析到语义检索的完整实践指南

我没有收到具体的项目信息。请按这个格式提供输入内容,我才能基于你的项目标题拆解并生成一篇完整的博文:项目标题: [标题] 项目正文: [对项目的零散描述、技术点或场景说明] 关键词: [关键词1, 关键词2, ...] 摘要描述: [一句话简介]收到后我会直接产出…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬