
简介这套狗狗表情识别数据集面向计算机视觉与深度学习初学者也适合需要扩充宠物表情样本的研究者核心用途是训练和验证目标检测模型。数据覆盖 angry、happy、relaxed、sad 四种表情累计标注框 4140 个其中 angry 1051 框、happy 1041 框、relaxed 1038 框、sad 1010 框各类样本量接近分布较均衡便于构建稳定的分类或检测任务。全部标注均通过 labelImg 完成采用 Pascal VOC 与 YOLO 两种通用格式组织可以方便地接入 Faster R-CNN、YOLO 系列等主流框架也便于使用脚本进行数据集划分或格式转换。压缩包共 2000 个文件以 xml 标注文件为主1999 个另含 1 个 txt 说明文件整体大小 115.52MB解压后可直接了解数据组织方式和标注规范。目前已有 350 人学习下载对于希望快速获取带精细标注的宠物表情数据、用于实验对比或课程设计的读者这是一份实用的基础数据集。 做宠物AI这行时间长了你会发现一个特别尴尬的事市面上猫狗检测的模型一抓一大把但真要判断“这只狗现在是什么情绪”能用的开源数据少得可怜。我前阵子做智能宠物伴侣需要在摄像头画面里实时识别狗狗的表情状态翻遍了常用数据集COCO只能告诉你“这里有只狗”犬种识别又跟情绪没关系最后只能自己动手整理。这份狗狗表情识别数据集VOCYOLO双格式3971张图4个类别按7z压缩包分发就是那次折腾的产物。这篇文章把数据集的格式细节、解压方式、训练流程和踩坑经验全交代清楚给同样在做宠物行为分析、智能硬件、动物福利研究的朋友一条能直接照着走的路。1. 为什么需要一份专门的狗狗表情数据集1.1 通用目标检测模型卡在哪先澄清一个常见误区很多人觉得“识别狗狗表情”不就是目标检测加分类吗直接用YOLO的预训练权重不就行了实际上差得远。通用数据集里的dog类别标注的目的是告诉模型“这个东西是狗”框的是整个身体或者头部并不会区分这只狗是放松还是紧张。而表情识别是细粒度任务要在“同一种动物”内部再做情绪维度上的区分对模型的要求完全不同。我实际测试过用COCO预训练的权重直接去框狗狗的脸然后丢给一个普通的图像分类器判别情绪效果很不稳定。原因也简单预训练模型学到的特征是“狗长什么样”而不是“狗的表情变化有什么规律”。后者需要大量近距离、清晰面部、带情绪标签的样本去驱动模型学习。1.2 做宠物智能产品为什么绕不开表情识别可能有人问判断狗狗情绪这事真有那么重要我自己做过调研几个典型应用场景都绕不开它智能喂食器狗狗在焦虑、恐惧状态下不建议自动投食情绪识别可以作为交互策略的输入。宠物监控摄像头主人不在家时识别狗狗持续吠叫、来回踱步的紧张状态及时推送给主人。宠物医院和寄养机构辅助评估动物福利状态紧张、恐惧的动物需要更温和的护理方式。行为学研究情绪行为与环境的关联分析目前很多实验室还是靠人工看视频打标签效率很低。这些场景的共同点是检测对象是“狗的面部”检测目标是“情绪状态”两者缺一不可。所以专门的数据集不是可有可无而是整个方案能不能落地的关键。1.3 双格式分发解决的是什么痛点把数据集整理成VOC和YOLO两套格式不是没事找事。VOC格式的XML标注可读性强适合用LabelImg、roboflow这类工具做二次检查和修正YOLO格式的TXT标注则能直接被YOLO训练脚本读取省去转换环节。两份标注互相对照还能起到交叉校验的作用——如果某个图在XML里有标注在TXT里却丢了那一定是转换或者打包过程中出了问题。从使用者的角度说拿到手直接按需取用就行想检查标注质量看VOC想训练模型用YOLO两边都能立刻开工不用再折腾环境。这对很多刚入门的目标检测学习者来说能省掉一整个“格式转换”的学习成本。2. 3971张4类别的数据底细先看清家底再动手2.1 四个表情类别是怎么定义的情绪分类最大的难题是主观性。同一张狗脸有人说它是害怕有人说它是紧张。我最终采用4类相对容易取得共识的划分尽量把标注规则做得客观、可复用happy、alert、fearful、aggressive。类别ID类别名中文含义标注时参考的典型特征0happy开心/放松嘴巴张开、舌头外露、眼睛放松或微眯1alert警觉/专注耳朵竖起或前倾、目光锁定、嘴部闭合2fearful恐惧/紧张耳朵后贴、瞳孔放大、嘴角后拉、身体压低3aggressive攻击/愤怒龇牙露齿、鼻部皱褶、身体前倾压低这套规则的好处是标注员不需要去猜狗的心理状态只需要按面部和体态的典型特征去对照归类。实际标注的时候我要求每张图先看嘴部状态再看耳朵角度最后看眼神按这三个维度的组合去定类别歧义大大减少。2.2 数据多样性与类别分布数据集的3971张图覆盖了金毛、拉布拉多、边牧、泰迪、柯基、中华田园犬等多个犬种场景包括室内、户外、笼舍、车内光照条件有自然光、逆光、夜间红外。之所以强调这些是因为表情识别模型特别容易过拟合到“环境背景”上——如果所有训练图都是同一种室内背景模型很可能学的是背景而不是狗的嘴和耳朵。拿到数据后我建议第一时间统计一下各类别的数量分布。可以直接在命令行快速扫一遍YOLO格式的labels目录for f in labels/train/*.txt; do awk {print $1} $f done | sort | uniq -c如果发现某个类别的样本量明显偏少后续训练就要考虑数据增强或类别权重不要等到模型训完才发现“偏科”。2.3 标注框的粒度说明还有一点需要提醒这份数据的标注框是围绕狗狗的头部和面部区域框的不是按全身框的。原因很直接——表情识别的关键信息集中在眼睛、嘴巴、耳朵这些面部部件上如果框太大把身体和背景都包进来模型会被无关信息干扰。这一点在你后续做自己的数据时也同样适用标注粒度要和检测目标匹配不要省事图大。3. VOC与YOLO双格式共存文件结构拆解与坐标转换3.1 VOC格式的目录结构VOC是视觉领域历史最悠久的标注格式之一结构比较固定。解开压缩包后应该能看到类似这样的路径VOCdevkit/ VOC2007/ JPEGImages/ # 图片文件 Annotations/ # XML标注文件 ImageSets/ Main/ # 训练/验证集划分txtAnnotations目录下每个XML对应一张图核心内容是object节点object namehappy/name bndbox xmin128/xmin ymin96/ymin xmax352/xmax ymax288/ymax /bndbox /object这里存的是像素坐标系下的绝对坐标xmin、xmax是左右边界ymin、ymax是上下边界。VOC格式最大的优点是人有很好的可读性打开XML就能直接看出标注框的位置是否合理。3.2 YOLO格式的目录结构YOLO格式则是为训练效率设计的一个TXT文件对应一张图每一行对应一个目标# images/train/dog_001.jpg 0 0.375 0.250 0.350 0.600五个数字分别代表类别ID、归一化后的中心点x坐标、中心点y坐标、归一化后的宽度、归一化后的高度。注意这里的坐标全部是相对于图片宽高的比例值范围在0到1之间。这样做的好处是无论图片怎么缩放标注都不受影响模型读起来也高效。3.3 坐标转换公式和关键细节从VOC转换到YOLO核心就4个公式。假设图片宽为W、高为Hx_center (xmin xmax) / 2 / W y_center (ymin ymax) / 2 / H box_w (xmax - xmin) / W box_h (ymax - ymin) / H一个比较容易踩的坑是忘记归一化分母用的是原始图片的宽高而不是标注框所在坐标系的宽高。我自己早期转过一次分母写成了1结果所有中心点坐标都超出了0到1的范围训练时损失直接变成nan。排查这个问题也简单训练前扫一遍TXT只要看到有大于1的数值基本就是归一化出了问题。顺便说一句双格式数据集的另一个好处是能自动校验用上面的公式把TXT转回XML再和原始XML比对如果不一致说明数据在传输或转换过程中出了问题。这份数据集打包前我是逐张比对过的但大家拿到手如果发现异常可以按这个思路自查。4. 7z压缩包的分发逻辑与跨平台解压实操4.1 为什么选7z而不是zip数据集文件动辄几个GB选压缩格式不能只看顺手。7z的压缩率通常比zip高10%到20%尤其对图片这种重复度较高的文件更明显。对于3971张图加标注文件的体量同样内容用zip可能要1GB用7z能省下一两百MB在网盘和低带宽环境下分发这个差距就很实际了。另外7z还支持分卷压缩和AES加密。如果后续数据集升级想按批次分开发或者给协作方加个访问口令不需要重新打包整个文件这个灵活度在zip上要弱一些。对比项7zziprar压缩率高中高开源工具链完善完善部分工具闭源跨平台支持好最好一般加密支持AES-256弱加密AES-2564.2 三大平台解压的具体命令数据集解压不难但不同平台的坑不一样分别说一下我试过的方案。Windows下用7-Zip或NanaZip直接右键解压即可。如果要用命令行注意7-Zip的安装路径通常需要手动加入环境变量否则cmd里敲7z会提示找不到命令。Linux下比较干净Debian/Ubuntu系先装p7zipsudo apt install p7zip-full 7z x dog_expression_dataset.7zmacOS的话用Homebrew装p7zip或者用Keka这类图形工具。需要注意新版macOS对未签名命令行工具会有拦截提示首次运行时去系统设置里点一下允许就行。4.3 解压前先做一次哈希校验数据集从网盘下载很怕下载过程被截断或者文件损坏。解压到一半报“Unexpected end of archive”再排查浪费的时间比提前校验多得多。建议解压前先算一遍哈希值# Linux / macOS sha256sum dog_expression_dataset.7z # Windows PowerShell Get-FileHash dog_expression_dataset.7z -Algorithm SHA256用算出来的值和发布页提供的SHA256比对一致再解压。这是我自己从踩坑里总结出来的最初分享数据时没有附哈希有用户反馈解压失败排查半天发现是网盘客户端断点续传导致的文件损坏。从那之后凡是超过1GB的压缩包我都习惯先做哈希校验再解压。5. 用这份数据跑通YOLO训练流程、参数与常见坑5.1 目录组织与训练验证集划分YOLO训练前需要把数据整理成固定结构。先把图片和标注按8:1:1分配成训练集、验证集、测试集。注意划分的粒度不要按单个文件随机抽最好按“图片对应标注”成对移动防止标注和图片错位。如果文件夹里已经有VOC的ImageSets划分文件可以基于它做映射能保证两个格式用同一份划分。最终目录结构参考dog_exp/ images/ train/ val/ test/ labels/ train/ val/ test/5.2 data.yaml配置YOLO用yaml文件描述数据集这是最容易写错的一步尤其是路径。建议都用绝对路径避免相对路径在不同工作目录下解析错乱。train: /home/user/dog_exp/images/train val: /home/user/dog_exp/images/val test: /home/user/dog_exp/images/test nc: 4 names: [happy, alert, fearful, aggressive]5.3 训练命令和参数选择以YOLOv8为例先拿s模型跑通全流程比直接上x模型更稳妥yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16几个参数的选择逻辑说一下。imgsz用640是平衡点狗狗面部在监控画面里经常是小目标用更大分辨率有助于提升小目标召回率但显存占用也会明显升高。batch大小以显存能装下为上限不用盲目堆大。epochs建议先跑100轮看曲线如果val_loss早就平了后续轮次就是纯浪费。5.4 硬件环境的现实问题这里专门提一下显卡。很多人手里是AMD RX 580这类老卡想着能不能直接跑YOLO——实测下来主流YOLO版本训练依赖CUDAAMD显卡走ROCm路线能兼容的部分框架但配置过程比较折腾而且RX 580的ROCm支持也不如N卡顺畅。如果不想在环境上耗时间要么用CPU训练小模型要么在云GPU上跑。CPU训练也不是不能跑把模型换成yolov8n、imgsz降到416、epochs减少先验证数据和流程没有问题是完全够用的。5.5 训练过程中的常见坑数据集的4个类别天然存在分布差异警觉和开心的样本通常比恐惧、攻击的多。如果发现某个类别AP特别低优先考虑是不是样本量不足可以在data.yaml里加class_weight或者对少数类做更多增强。另一个经常出现的问题是标注框太小导致漏检。狗狗离摄像头远的时候面部可能只有几十个像素这时候可以试试关掉mosaic或者调整copy_paste参数因为马赛克增强会进一步缩小目标在整图里的比例让本来就小的目标更难学。最后是过拟合的判断。看训练曲线时重点关注val_loss和mAP50-95的变化如果训练集loss持续下降而验证集mAP停住不动就该调低模型容量、增大增强力度或加早停了。最后分享一个我自己的固定习惯任何数据集拿到手第一件事不是急着训练而是花半小时做可视化检查——把XML或TXT里的框画回原图一屏一屏翻着看。类别填错、坐标越界、框没贴合面部这类低级错误在这个环节暴露得最快。这份数据我自己坚持这么过了好几遍才打包但数据流转过程中没人能保证100%完好所以你拿到手之后我还是建议按这个流程再走一次。模型性能的上限在数据标注完成的那一刻就已经定死了后面的训练只是尽量逼近这个上限而已。本文还有配套的精品资源点击获取