新闻详情

新闻详情

首页 / 资讯中心 / 详情

猫情绪检测数据集构建实战:3200张YOLO标注样本从筛选到部署

发布时间:2026/10/1 3:32:18来源:尧图网络
猫情绪检测数据集构建实战:3200张YOLO标注样本从筛选到部署
做猫情绪检测这件事我被问得最多的一个问题是YOLO都出到 v8、v11 了为什么你还在花大力气搞一套只有3200张的数据集说实话这也是我踩了不少坑之后才想明白的一件事——对一个宠物行为识别项目来说模型反而是最好解决的部分真正决定成败的是训练数据本身。这篇就完整分享一下我整理这套「猫情绪检测数据集 | 3200张YOLO宠物行为数据集」时的完整思路从情绪怎么定义、图片怎么挑、标注怎么规范到训练时看哪些曲线、部署时要防哪些误检一次讲透。1. 猫情绪检测远不是看图猜心情先要定义可观测的行为标签1.1 情绪看不见能标注的是行为姿态刚做这个项目时我犯过一个很蠢的错直接让标注同学按开心难过生气去标框。结果半个月后回收数据一看同一个场景四个人能标出三种不同的情绪吵架吵到标注群解散。后来我才回过神来——机器视觉能做的是检测不是读心。一只猫到底是不是真开心连主人都未必百分百确定更别提让标注员去猜。所以这套数据集真正落地时我把标注目标从情绪换成了可观测的行为姿态再通过行为姿态的组合去推导情绪状态。比如飞机耳炸毛弓背基本可以判定为恐惧或防御性攻击慢眨眼侧躺露肚皮可以推断为放松和信任。这套推理逻辑本身就是猫行为学里常用的方法放到检测任务里也完全成立。1.2 一套能落地的类别体系示例我在3200张图里最终采用了情绪-行为双层标签映射的做法检测框负责把猫主体和关键行为姿态框出来类别名用的是可以直接在图片上确认的行为标签训练完成后再通过业务规则映射到情绪结论。检测类别可观测特征对应情绪映射relax眯眼、慢眨眼、侧卧、露肚皮放松、信任alert瞳孔放大、耳朵竖直向前、身体紧绷警觉、警惕play扑咬、追逐、尾巴竖直抖动兴奋、玩耍hide躲在角落、缩成一团、耳朵压低恐惧、不安aggressive飞机耳、哈气、呲牙、弓背炸毛防御、攻击性soliciting蹭人、呼噜、踩奶亲昵、求关注这份标记表我贴在标注手册第一页任何新来的人只要看一眼就能开始标。它解决的是共识问题标注员不需要判断猫的心情只需要判断画面里猫的耳朵、眼睛、尾巴和体态属于哪个特征组有冲突时以最明显的两项为准。顺带说一句3200张这个数量对YOLO数据来说属于能出结果但不算宽裕的规模。目标检测数据集动辄上万张并不新鲜但宠物行为细粒度分类的数据本身就是稀缺资源。3200张如果类别分布合理、标注质量过关配合预训练权重和合理增强足够训练出一个可用的检测模型。真正的问题从来不是数量而是每一张图有没有把该表达的行为状态表达清楚。2. 3200张图片的来源、筛选与场景平衡2.1 合法图片来源的四条路径整理动物行为数据集第一个硬性问题就是图片来源。直接用网络爬虫抓取别人家猫的照片轻则有版权纠纷重则涉及隐私绝对不能碰。我走的四条路径供参考自家拍摄和身边朋友授权占一半以上。这部分最大好处是能获得标注者的天然共识因为拍的时候就知道猫当时在干嘛。CCO/CC-BY授权的公开图库素材这类素材在Unsplash、Pixabay等平台都有不少宠物行为瞬间下载前务必确认授权类型并记录来源。开源宠物数据集的子集复用比如Oxford-IIIT Pet Dataset等学术用途数据集里面有不少猫的品种和姿态信息虽然是分类任务标注但可以筛选出符合我们行为类别定义的图片重新标注。向猫舍、宠物店和博主购买或交换授权素材这个费用不低但能得到大量不同品种、不同年龄段的行为样本对泛化能力帮助极大。2.2 筛选标准光线、遮挡、目标尺寸图片来源解决之后下一个问题是什么样的图值得进数据集。我筛图的规则定得很细这里给出一份可以直接拿去的 checklist主体清晰度猫的面部或身体轮廓不能被严重虚化至少能看清耳朵和尾巴的方向。光线条件尽量覆盖顺光、逆光、室内暗光、夜晚红外等不同条件但单张图不能过曝或全黑到看不出行为特征。遮挡程度允许少量遮挡比如猫躲在椅子后面只露半身这类图能提升模型在真实遮挡场景下的鲁棒性但遮挡超过40%的图要单独说明不适合当训练主力。目标尺寸小猫在整张图里占比很小的样例要保留一部分YOLO模型对小目标的识别能力全靠这类图撑起来。画面裁切不要把大头贴式特写作为唯一形态要有全景、中景、特写的梯度分布。我实际操作时写了一个简单的筛选脚本先按清晰度拉普拉斯算子方差和尺寸做初筛再人工快速过一遍行为可标注性几百张图能在半小时内处理完。3200张最终是从近9000张原始素材里筛出来的落选率超过60%别心疼那些被丢掉的图脏数据进了训练集才是真正的灾难。2.3 为什么要控制场景分布而不是只求数量有一个很容易被忽略的点是类别和场景的耦合。很多人标完数据直接训练发现模型在沙发上的猫上判断极准一换到阳台上的猫就全线崩溃这就是典型的场景单一化过拟合。我在分配数据时强制约束同一个场景来源的图不超过总量的15%同一只猫的连续帧镜头不超过50张。这么做是因为目标检测模型很容易偷懒学到背景先验。如果数据集里大量图片都是浅色沙发上的布偶猫模型很可能在浅色沙发区域直接无脑输出目标框这在小样本数据上尤其致命。所以3200张看着不多但我在品种、环境、拍摄角度上做了强制分散最终的分布大致是这样室内日常环境约55%户外环境约20%猫舍/医院等中性背景约25%英短、美短、布偶、田园猫等常见品种约80%其他品种约20%单猫画面约70%多猫画面约30%多猫场景专门用来训练遮挡推理这些比例未必绝对最优但它们保证了验证集上能更接近真实应用时的数据分布训练出来的模型换到新环境也不至于直接失忆。3. YOLO格式标注的完整链路从txt规则到一致性校验3.1 YOLO txt标注格式与label映射既然题目把YOLO数据集写在名字里标注格式就得说清楚。YOLO系列v5/v8/v11沿用的目标检测标注格式是每张图片对应一个同名txt文件放在labels目录下文件里每一行代表一个目标框class_id x_center y_center width height其中x_center y_center width height全部是归一化坐标取值0到1用框的中心点坐标和宽高分别除以图片宽高得到。类别id从0开始编号对应data.yaml里定义的类别顺序。举例一张宽640高480的图里一只猫的目标框左上角在(100, 120)、右下角在(300, 360)那么中心点是((100300)/2/640, (120360)/2/480) (0.3125, 0.5)宽高是(200/640, 240/480) (0.3125, 0.5)。这一行写下来就是0 0.31250 0.50000 0.31250 0.50000如果你用标注工具导出成COCO或VOC格式记得最后转成txt时类别顺序要和YAML保持一致这是个特别容易翻车的暗坑——很多人在Roboflow导出的顺序和本地YAML对不上结果训练出来的模型所有预测全错位一格还误以为是模型没收敛。3.2 标注工具选型和行为框的边界规则工具我用过LabelImg、Labelme、X-AnyLabeling最终长期用的是X-AnyLabeling。原因很简单它内置了yolov5/yolov8模型预标注功能先用一个通用模型把猫的矩形框自动打出来人工只需要修正边界和修改行为类别标签。3200张图的预标注大概能省掉一半甚至更多的手工画框时间。But这里有个重点预标注出的框并不直接等于行为框。猫检测模型标出的通常是整只猫的紧凑框但行为识别更关注的是行为特征集中区域。我最后定的标注规范是框选区域包含猫的主体和当前行为最显著的部位比如炸毛时的整只猫、哈气时的头颈部。如果行为特征集中在头部框可以适当收紧到头部和上半身让模型更多学习局部特征。一个画面里出现多只猫时每一只都要单独标注且目标框之间允许重叠部分但重叠区域不能超过30%。单张图里同一类别多次出现就写多行不需要合框。这份规则要打印出来放在标注同学手边。宠物行为边界模糊是正常的重要的是统一而不是绝对正确。3.3 多人标注的一致性校验与错误样本修正多人标注时如果各标各的数据质量会迅速失控。我每完成一批标注都会跑一次一致性校验做法有两种都很简单计算标注框和类别在不同标注者之间的一致性。最简单的是随机抽10%的图让两个人分别标然后算 IoU 和类别一致率。IoU 低于 0.5 的框直接判为存疑类别一致率低于 85% 的类别要重新开会对齐标准。用脚本跑可视化检查。把每个标注框画回原图并合成为一个视频或长图快速扫一遍通常一眼就能看出耳朵没包进去框明显框错目标这类低级错误。修正完成的标注要重新导出并保留版本号。我踩过一个真实教训有一版数据修改了类别顺序但没有同步改名导致上一轮训练结果无法复现最后只能重新从 git 历史里捞配置。所以数据集的labels目录、data.yaml、标注版本号一定要捆绑归档不要只丢一个文件夹就跑训练。4. 喂给模型之前数据集划分、增强策略和YAML配置4.1 划分比例与防泄漏所有图片按场景-镜头粒度而不是单张图片粒度去划分 train/val/test。如果同一段视频里抽出来的连续帧一部分进了train一部分进了val验证结果会虚高因为模型等于提前看过几乎相同画面的参考答案。我最终的比例是 train:val:test 7:2:1并且test直接锁死不用来调参。3200张的划分结果是2200多张训练、640张验证、320张测试。对这个体量来说验证集偏大一点没坏处能让损失曲线更平滑val评测更有统计意义。4.2 数据增强该用的和不该用的YOLO自带的数据增强很强大但不是什么增强都适合宠物行为检测。这里要区分清楚该用的增强包括Mosaic把四张图拼接成一张能显著提升模型对目标尺寸变化的适应力。HSV微调轻微改饱和度和色调能增强模型对不同光线和猫毛色变化的鲁棒性。随机平移和缩放模拟摄像头位置的变化。水平翻转猫的行为姿态在左右方向上天然对称水平翻转完全合理。不该用的增强包括垂直翻转猫极少倒立或从下往上拍摄垂直翻转会让模型学到天上的猫这种诡异姿态直接降低真实场景精度。过度旋转旋转超过30度后的猫行为特征已经变形标注框含义也跟着漂移。过强的色彩扭曲把橘猫变成紫猫在视觉上直观但脱离现实适得其反。我训练的最终设定是 Mosaic1.0 在前 20 个 epoch 开启之后自动关闭以避免小目标过度拼接导致的分布偏移这个细节来自 Ultralytics 的热身策略实测对收敛有帮助。4.3 yolov8的data.yaml配置示例所有东西准备好之后配置其实极短。这里贴一份我实际用到的cat_behavior.yamlpath: /data/cat_emotion # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 test: images/test # 测试图片相对路径 names: 0: relax 1: alert 2: play 3: hide 4: aggressive 5: soliciting跑训练的命令也顺便给了yolo detect train \ datacat_behavior.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ patience50 \ project/runs/cat_emotion \ nameexp1modelyolov8s.pt这行很重要它下载的是在 COCO 上预训练过的权重我们的类别虽然只有六个但迁移学习的收益非常大比从零随机初始化省掉几十个 epoch 的训练时间最终精度也能明显高一截。5. 训练过程的损失曲线、混淆矩阵与常见坑5.1 三个损失分量怎么看训练YOLO时终端里会实时打印三个 lossbox_loss、cls_loss、dfl_loss。很多新手只看总 loss 往下掉就觉得万事大吉其实三个分量分开看更重要box_loss 负责预测框和真实框的重合度数值下降慢通常意味着定位精度还没到位。cls_loss 负责行为类别判断如果分类一直降不下去多半是类别定义有歧义或者标注冲突太多。dfl_loss 负责边框分布细节Distribution Focal Loss它对小目标比较敏感dfl 后期还在明显波动时别急着提前停。我自己的判断标准是训练到后期box_loss 和 dfl_loss 是否进入平台震荡只要 val 精度还在上升或基本稳定损失曲线的平台就不必过度干预。真正要警惕的是训练损失无限下降、验证损失反弹上升——这是过拟合出现这种情况时优先做两件事加大数据增强强度、把早停 patience 从 50 降到 20 及时止损。5.2 模型选型与关键超参数3200张数据属于中小编制模型不是越大越好。我对比过 yolov8n、yolov8s、yolov8m最终选了 yolov8s模型参数量mAP50-95 实测单张640推理耗时RTX 3060结论yolov8n3.2M0.82约3ms精度略低适合边缘设备yolov8s11.2M0.88约5ms精度/速度均衡主力方案yolov8m25.9M0.89约8ms精度提升有限性价比不高从 n 到 s 的提升非常明显但从 s 到 m 只涨了1个点而推理耗时涨了近一倍。在小数据集上模型容量再大也架不住有效信息量有限过拟合风险还会上升。超参数方面我踩过的核心教训是学习率不能给太大。小数据集配大学习率极易让 BN 层的统计量崩掉对就是热词里那个yolo训练中bn崩溃现象是 loss 突然变成 nan 或剧烈震荡。解决方法不是改 BN而是把 lr0 从默认 0.01 降到 0.005batch 尽量不小于 16。batch 太小 BN 无统计意义也会表现出类似崩溃的抖动。5.3 关于混淆矩阵总合不唯一的解释训练结束会生成混淆矩阵很多人发现矩阵里所有格子的总数加起来不对不是全体样本数于是怀疑代码bug。其实不是bug。YOLO 输出的混淆矩阵如果按百分比显示每一行是这一行真实类别下所有样本的分布各行的和才是100%如果把所有类别放在同一个总样本里归一化数字当然不一样。看每个真实类别被识别成什么用行归一化看整体预测分布才用全体归一化先搞清楚自己要看哪一层再下结论。我训练完最关注的是三组混淆关系alert和hide是否互相混、play和aggressive是否互相混、relax是否大量被误判成soliciting。这几组都是行为特征上有天然相似性的类别如果混淆比率超过20%说明类别定义在标注手册里还没有彻底分离开需要回到标注环节重新细化规则而不是盲目加数据。6. 从实验到落地阈值调优、TensorRT部署和迭代闭环6.1 后处理置信度阈值不能只信默认值YOLO默认推理置信度阈值是0.25NMS IoU阈值是0.45但这两组默认值在宠物行为场景下并不一定合适。行为检测的特点是宁可漏检不可误报——比如在智能喂食器场景里把玩闹误判成攻击会让设备做出错误反馈带来极差的体验。我实际跑了一组阈值扫描对比置信度阈值精确率召回率适用场景0.250.830.91数据采集、批量回看0.450.910.82通用监控、日常告警0.600.950.68精确行为判断、自动喂食联动没有一组阈值是绝对最好的关键看业务容错方向。如果应用是识别到害怕就给主人推消息那错误报警可以容忍用0.25保证不漏如果应用是识别到攻击就自动锁门、触发防护设备那宁可晚一秒也不能乱触发阈值往0.6以上调。另外NMS的IoU阈值在多猫场景要适当调低到0.35~0.4。两只猫挤在一起睡觉时默认阈值可能把两个框合并成一个导致猫的数量统计直接错误。6.2 部署时一个算力估算参考模型最终要落到设备上跑就绕不开推理性能和路数估算。以T4这张卡为例用TensorRT FP16跑yolov8s、640分辨率输入单帧推理耗时大约在4~6ms之间。如果视频源是1080p25帧一路视频每一帧间隔40msGPU推理只占其中一小段但实际还要算上前处理解码、缩放、后处理NMS这些环节。我做过的保守估算是单张T4在batch size为1时稳定支持6~8路1080p25帧的实时检测如果优化成batch推理把多路画面拼成一个batch喂给 GPU极限能在10路以上但部署复杂度会明显上升每路的延迟也会被最大帧等待时间拖住。边缘端如果是Jetson Orin Nano这类设备yolov8n加TensorRT640分辨率大约也能跑到20~30ms一帧带1到2路还比较从容。实际部署时最容易被忽视的不是GPU推理而是视频解码和图像缩放占据了大量CPU资源。我在一个项目里曾经因为python侧用OpenCV逐帧resize导致CPU直接打满GPU利用率反而上不去后来改成GPU上的预处理比如DeepStream或TensorRT插件里做缩放整链路速度才提上来。6.3 坏样本回流与第二版数据集训练集的整理不是一次性工作。我的习惯是每次上线后定期收集误检和漏检截图攒一批后回到标注环节把模型认为是aggressive但其实是play的样本挑出来确认后修正标签混合新积累的真实场景图增量训练一个新版本。这套闭环跑起来后第二版数据集通常只需要加几百张针对性样本而不是重新攒几千张。3200张只是起点——我认为比这个数字更重要的是每一张图都经过筛选、每一类行为都有清晰的标注边界、每一个版本都有记录。把这些做到位模型精度和数据规模之间的关系才会真正健康。最后分享一个实操小技巧做数据集时记得把最容易混淆的样本单独放到一个hard examples目录里。我第一次训练完发现play和aggressive的误判率居高不下就把所有被模型高置信度判错的图抽出来建了一个专门的小训练集重新微调只用了200多张图就把这两类混淆率从21%压到了11%。这种从小样本数据里抠精度的过程比一味堆图片数量要有效得多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

游戏引擎选型实战:Unity、UE、Godot场景化决策指南 2026/10/1 4:30:43

游戏引擎选型实战:Unity、UE、Godot场景化决策指南

1. 这不是“选哪个更好”,而是“你正在解决什么问题”Unity、UE、Godot——这三个名字在游戏开发圈里几乎天天被提起,但绝大多数人第一次接触它们时,面对的不是技术选型,而是一堆混乱的碎片信息:有人在B站刷到“Godot三…

阅读更多 →
C++ Qt实现老鼠走迷宫:递归回溯生成与BFS寻路 2026/10/1 4:30:43

C++ Qt实现老鼠走迷宫:递归回溯生成与BFS寻路

简介:一套基于C与Qt框架的老鼠走迷宫游戏源码,附可直接运行的EXE,面向Qt初学者、游戏开发爱好者及算法学习者,可用来练习GUI编程、迷宫生成和路径规划。压缩包共53个文件,大小约24.31MB,包含27个DLL运行库、…

阅读更多 →
揭秘爆火“哑巴模型”Jev:话少活好的编程神器,轻松接入Codex实战 2026/10/1 4:30:43

揭秘爆火“哑巴模型”Jev:话少活好的编程神器,轻松接入Codex实战

最近AI编程圈的热度,几乎全被一个叫Jev的模型带起来了。热搜里那个“哑巴模型”的外号,估计很多人跟我一开始一样摸不着头脑:AI怎么还能是哑巴?直到我真的把它接入Codex用了两周,才明白这个外号有多传神。它不会像你熟…

阅读更多 →
HER实战:目标重标记破解稀疏奖励,从原理到代码实现 2026/10/1 4:30:37

HER实战:目标重标记破解稀疏奖励,从原理到代码实现

做强化学习的都知道,稀疏奖励问题是最让人头疼的事情之一。我最早接触 hindsight 这个概念,是在读 OpenAI 那篇 Hindsight Experience Replay(HER)论文的时候,当时第一反应是“这个操作也太取巧了”,但认真…

阅读更多 →
Simulink光伏MPPT仿真:电导增量法建模与Boost电路设计详解 2026/10/1 4:30:37

Simulink光伏MPPT仿真:电导增量法建模与Boost电路设计详解

做光伏系统仿真的人,基本绕不开MPPT这个坎。无论是做并网逆变器、独立微电网还是光伏充电控制,最大功率点跟踪都是整套控制策略的核心。而电导增量法(Incremental Conductance,INC)因为跟踪精度高、稳态震荡小&#xf…

阅读更多 →
基于Nodejs+Vue的招聘平台开发全指南:从环境配置到项目落地 2026/10/1 4:30:37

基于Nodejs+Vue的招聘平台开发全指南:从环境配置到项目落地

2. 开工前必须想清楚的事先说结论:Nodejs Vue 做在线招聘平台,这个选型放到今天依然是合理的,但我更建议你在动手前先想清楚几个问题,不然做着做着很容易跑偏。第一个问题是“你到底要做一个什么量级的平台”。如果只是课程设计或…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉