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

猫叫声分类实战:数据集复现与深度学习模型全解析

发布时间:2026/9/18 6:30:45

资讯中心
01
ARTICLE

猫叫声分类实战:数据集复现与深度学习模型全解析

猫叫声分类实战:数据集复现与深度学习模型全解析
深夜家里的猫突然对着门口一通叫很多人第一反应是“饿了”还是“想出去玩”。但如果告诉电脑让它通过叫声判断这只猫到底在表达什么再进一步帮我们理解它的情绪和需求这个研究方向其实挺有搞头。最近米兰大学团队配合论文放出了一个公开的猫咪叫声数据集核心任务就是对这些“喵喵叫”做有监督分类。我拿到手之后第一时间复现了一遍整个链路从数据读取、音频预处理、特征提取到模型训练踩了不少坑也理清楚了很多细节。这篇就当作一份实操笔记把数据集怎么用、分类怎么做、哪些地方容易翻车一次性讲明白。1. 这个数据集解决了什么问题1.1 猫叫分类为什么比看上去复杂先说一个容易被低估的点猫的叫声根本不是单一维度的“喵”。实验里常见的差异包括基频高低、谐波结构、时长、连续声音的排列方式还有发声时的能量分布都在变化。一只猫在讨食、在焦虑、在发情、在遭受疼痛时发出来的声音频谱上差异其实很大但人耳不一定能快速分辨尤其是非养猫用户听一千段叫声很容易直接懵圈。而机器做声音分类本质上是在频谱图上找统计规律只要特征提取得当模型能捕捉到人耳忽略的细节这也是这个数据集一大价值所在。另一个复杂性在于个体差异。每只猫的声带结构、体型、年龄、习惯都不一样同一类叫声换一只猫来发频谱上可能面目全非。如果数据集中猫的数量不足模型很容易记住“某只猫的声音”而不是“某类叫声的通性”这就会导致换一只新猫就失灵。所以数据集的设计里“按猫个体划分训练/验证集”这件事比模型本身还重要这个坑后面我会专门展开。1.2 数据集的规模与内容我看到的这份数据集是配合论文一同发布的主要收集了多只家养猫在不同生活场景下发出的叫声片段覆盖了讨食、求关注、焦虑、攻击警告、发情求偶、疼痛呼救等多种行为意图。数据文件以音频片段为主附带标注文件和元数据文件。音频格式一般是常见的wav或mp3标注文件里记录了每一段对应的类别标签元数据则记录猫的id、性别、年龄、录音环境等信息。这些信息在后续做跨个体泛化验证时非常有用。需要说明的是如果要以论文里的具体类别清单和统计数字为准建议去原始发布页面确认因为数据集后续版本可能有更新。但从复现角度看只要拿到的是可下载的压缩包看到里面的目录结构基本就能对上号。关键信息是类别不是随便拍的“开心/不开心”这种主观情绪而是相对可操作的行为意图标签。这种标注方式的好处是训练目标更明确评价标准也更客观对后续落地更有指导意义。1.3 标注体系哪些“喵”被分成了几类很多第一次接触的人会问猫叫分类到底分什么其实不是分“喵喵喵”还是“嗷嗷嗷”这种表面音色而是按行为意图和发声场景来归类。举个例子“讨食”通常是高频、短促、带着上扬语气的叫声频谱上看有不少高频能量而“疼痛呼救”往往声音更低沉、拖得更长幅度起伏也更剧烈。这些差异在频谱图上有迹可循机器要学的正是这种“声学模式”。这种标注有一个潜在问题就是不同人听同一段叫声可能给出不同标签所以论文里通常会做标注者一致性检验比如用Cohen‘s kappa系数来评估。如果不同标注者之间一致性不高那模型训练出来的上限也会受影响因为训练标签本身就有模糊性。这个数据集据我观察在这方面已经做了一定质量控制但我在复现时依然发现个别类别之间存在混淆这在后面的实验部分会具体说。2. 拿到数据之后预处理与特征工程2.1 数据目录与常见格式下载解压后我习惯先把目录结构摸清楚。通常看到的是这样cat_meow/ recordings/ cat001_seg001.wav cat001_seg002.wav ... annotations.csv metadata.csvannotations.csv里面每一行对应一个音频片段字段一般包括文件名、开始时间、结束时间、类别标签、录制环境等。metadata.csv则记录猫个体的信息比如猫的编号、年龄、性别、是否绝育等。这里有一个特别重要的点训练测试划分务必以猫个体为粒度而不是以音频片段为粒度否则同一个id的音频同时出现在训练和测试集里会导致数据泄漏评估指标虚高得离谱。拿到数据后不要急着写模型先做一遍数据审计。统计每个类别的样本数量看是否均衡播放几个随机样本确认标签和音频对得上检查采样率是否统一声道是否为单声道。这些工作看起来琐碎但能省下后面排查问题的两个小时。2.2 统一的音频预处理流程音频文件格式可能五花八门有的是16kHz采样率有的是44.1kHz甚至还有mp3压缩格式。我的做法是先统一转成16kHz单声道wav再做幅度归一化让所有样本的峰值幅度或均方根能量保持在一致水平。这样做的好处是输入到模型的特征分布更稳定避免模型学习到“录音音量”这种无关因素。有一段代码我几乎每次做音频分类都会用import librosa import numpy as np def load_audio(path, sr16000): y, _ librosa.load(path, srsr, monoTrue) return y def normalize_audio(y): peak np.max(np.abs(y)) if peak 0: y y / peak return y def pad_or_truncate(y, length48000): # length 3s * 16kHz if len(y) length: y np.pad(y, (0, length - len(y))) else: y y[:length] return y这里length取48k对应3秒。如果你看这段代码会发现核心就是“加载→归一化→定长”。为什么要定长因为神经网络要求输入张量形状一致你不能一会儿输入1秒的频谱一会儿输入5秒的频谱。至于这个固定长度选多少取决于数据集里大多数片段的时长分布。如果大部分都在2到4秒那3秒是个比较稳妥的中间值。2.3 样本切分与标签对齐有些录音是一整段长音频里面可能先有猫叫然后安静几秒又有另一类叫声。这种情况下需要做滑窗切分。滑窗切分最容易犯的错是窗口边界刚好跨过两类叫声之间的过渡区导致一个窗口里混了两种标签。我的经验是窗口长度尽量取比单个叫声稍长一点并且用有重叠的滑窗切完后对每个窗口做标签投票或直接以中心点对应的标注为准。还有一个细节是静音切除。猫叫不是连续不断的如果窗口里大部分是静音模型学到的是“这个环境下没有声音”而不是“这种叫声长什么样”。可以用librosa里的静音检测把过于安静的片段直接过滤掉或者对做活动检测后的有声片段再切窗。这一步做完训练数据的信噪比会明显提升模型收敛速度也会快不少。这里还想特别提醒一个关于特征提取的点不要只用MFCCMel频谱图往往更适合CNN类模型。MFCC压缩掉了很多细节传统机器学习模型用它可以但深度模型直接吃Mel频谱图能保留更多原始声学信息。这个对比后面实验部分也有体现。3. 从baseline到深度音频模型3.1 用MFCC加SVM快速建立基准做任何分类任务我都习惯先弄一个轻量级baseline确认数据本身有没有“信号”再上重模型。对这个猫叫数据集最省事的组合是“MFCC特征 SVM分类器”。具体做法对每个3秒片段提取40维MFCC然后取时间维度的均值、方差、最大值、最小值做统计池化拼接成一个固定长度的特征向量喂给SVM。这一步代码量很小但价值却非常大。它能在半小时内告诉你这批数据能不能分大致能分到什么程度。如果MFCC加SVM的结果接近瞎猜那说明要么标签质量有问题要么预处理流程有明显错误根本不值得继续往下烧显卡。我当时跑出来的结果比随机好很多但准确率谈不上惊艳这打消了我对数据质量的顾虑才放心开始训练深度模型。SVM的参数也很简单核函数优先选RBFC值和gamma值用简单的网格搜索或者默认值就能跑起来。关键不在调参而在确认数据链路通不通。如果你用Scikit-learn这个过程大概也就几十行代码。3.2 换成一个能上分的CNN传统baseline确认没问题后就可以上深度学习模型了。我用的第一个深度模型是一个轻量CNN直接把log-Mel频谱图当图像处理。输入是128×128的单通道频谱图网络结构就三层卷积加两层全连接参数总量大概三四十万。这个规模的模型在CPU上都能很快训练非常适合做快速迭代。网络结构的一个参考实现如下import torch import torch.nn as nn class MeowCNN(nn.Module): def __init__(self, num_classes7): super().__init__() self.features nn.Sequential( nn.Conv2d(1, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2), nn.AdaptiveAvgPool2d(1), ) self.classifier nn.Linear(64, num_classes) def forward(self, x): x self.features(x) return self.classifier(x.flatten(1))训练时用交叉熵损失优化器选Adam学习率设成1e-3batch size选32或者64。一般训练二三十个epoch就能看到明显效果。这里有个容易忽视的点Mel频谱的提取参数要和预处理流程保持完全一致比如n_fft、hop_length、n_mels这些值要固定下来否则训练和推理时特征分布不一致效果会大打折扣。3.3 使用预训练模型进行迁移如果你的目标不是做个demo而是希望在真实场景里取得更好的效果建议直接用预训练音频模型。目前比较常用的有PANNsCNN14和ASTAudio Spectrogram Transformer。这些模型在AudioSet等大规模声音事件数据集上预训练过已经学会了通用的声音表征拿来迁移到猫叫分类上往往比从零训练小模型强很多。我的做法是把预训练模型当作特征提取器冻结前面的卷积层只微调最后几层和分类头。具体来说先用PANNs生成每个片段的embedding再接一个简单的MLP分类头做微调。这样做的好处是训练速度快、不容易过拟合而且对标注数据量要求也低很多几百个样本就能训出还过得去的效果。在特征层面PANNs会把一段音频映射成固定的embedding向量这个向量对声音类别有较好的区分度。如果算力允许也可以做成端到端微调即把PANNs和分类头一起训练通常效果更好但训练时间和对显存的要求都会明显上升。对于这个猫叫数据集我用预训练加微调的做法效果比自训练CNN有明显提升尤其是在样本较少的类别上。3.4 类别不平衡的正确打开方式真实数据集的类别分布几乎不可能完全均衡这个猫叫数据集也一样讨食类样本可能非常多疼痛类样本可能特别稀缺。如果不做任何处理模型会倾向于把大多数样本预测成多数类导致少数类几乎全错。对策有三个方向。第一个是数据层面对少数类做过采样或者对音频做速度扰动、音量扰动、加噪声等数据增强增加少数类的多样性。第二个是损失函数层面给交叉熵损失加上类别权重让少数类样本的梯度贡献更大。第三个是样本采样层面在DataLoader里直接用WeightedRandomSampler按类别样本数的倒数设置采样概率每一轮都能让类别分布相对均衡。三种方法可以组合使用但注意别把增强做得太猛否则模型会过度拟合增强后的伪模式。4. 我复现实验中踩过的坑4.1 不按猫个体划分分数直接虚高十几个点这是我在复现过程中印象最深的一个坑。早期为了省事我直接按“文件名哈希”随机划分训练和验证集结果验证集准确率一度接近90%看起来非常漂亮。但后面我意识到问题同一只猫的音频片段被同时分进了训练集和验证集模型在训练时见过这只猫的声音特征验证时自然“眼熟”准确率虚高得毫无意义。改成按猫个体划分之后训练集和验证集不再含有同一只猫的音频准确率直接掉了十几个点。这看起来是“变差了”但其实是评估方式更诚实了模型必须真正学会叫声类别而不是靠记忆声纹。做研究或者写论文一定要在数据划分这一步守住这条底线。4.2 背景噪声比猫叫还像“猫叫”有段时间模型在训练集上表现很好验证集却波动很大。后来我随机挑了一部分被模型分类失败的样本听了一遍才发现问题出在录音环境上。有些音频是在有电视声音、人说话、狗叫的环境中录的模型学到了背景噪声的统计特征甚至可能把“电视里的猫叫”当成了分类线索。这种模型拿到安静环境测试效果还行一放到真实嘈杂环境就崩。处理办法是过滤掉明显带异常的样本或者给训练数据加一定量的环境噪声做增强让模型学会在噪声中聚焦猫叫声本身。还有一个办法是使用高通滤波器把低频干扰滤掉比如截止频率80Hz减少脚步声、空调声等低频噪声的干扰。另外我看到数据集里有些录音是远场麦克风录的猫离麦克风较远声音混响比较重近场和远场样本混在一起训练时模型可能学出“距离”特征而不是“叫声”特征。条件允许的话可以在特征提取时做一下语音增强或去混响问题会有改善。4.3 最容易混淆的类别与对策混淆矩阵永远是诊断分类器最好的工具之一。我跑完模型后专门看了哪几类互相认错结果发现两类容易打架一类是“讨食”另一类是“求关注”。从声音本身看这两种叫声都是高频、短促、节奏感强的类型人耳听起来确实有相似之处机器也容易搞混。还有一个常见混淆是“焦虑”和“疼痛”这两类叫声的谐波结构都比较紊乱时长也偏长如果不结合上下文很容易混淆。针对这些混淆我的经验是不要只喂1到3秒的短片段可以把上下文窗口加长到5到6秒或者把前后多个片段特征拼在一起让模型看到更多动态变化。上下文多了以后模型能从叫声的连续变化里找到线索混淆率会降一些。4.4 训练不稳定看看随机种子和梯度累积深度音频模型训练不稳定这是很多人会遇到的状况。前几次训练loss曲线上下乱跳后来排查发现是不同batch之间特征分布差异太大加上学习率偏高。把学习率从1e-3降到5e-4之后曲线明显平滑了。还有一个容易忽略的参数是梯度累积。如果显存不够batch size开得很小比如8或者16梯度的方差就会变大模型训练不稳定。这时候可以调大梯度累积步数让梯度累积到一定数量再更新参数效果相当于用了更大的batch size对稳定训练有帮助。随机种子也很重要。深度学习框架里存在很多随机性比如数据加载顺序、参数初始化、cuDNN的算法选择等都会影响最终结果。我在实验里会固定所有种子并且用环境变量关闭cuDNN的自动调优确保每次跑出来的结果可复现。5. 训练结果怎么读评估指标与消融5.1 不要只用准确率在做类别不平衡的多分类任务时全局准确率很容易骗人。比如某个类别占了60%的样本无脑全部预测成这个类别准确率也有60%。这时候最该看的是加权F1或者macro F1。我用的是weighted F1也就是按各类别样本量加权平均既衡量了整体性能又不会完全忽视少数类。有条件的话建议输出每个类别的precision、recall和F1再画一张混淆矩阵。这样才能真正知道模型在哪些类别上能力强、哪些类别上能力弱。只看一个总分的话很可能把少数类的问题掩盖过去。5.2 一个可复现的配置表下面这张表是我复现时用到的关键配置给大家做个参考。具体超参数完全可以按自己的算力情况调整但整体框架可以参考模型输入特征参数量训练策略复现得到的大致weighted F1SVM MFCC40维MFCC统计量远小于1MRBF核C100.72左右轻量CNN128×128 Log-Mel约40万Adamlr1e-330 epochs0.83左右CNN14预训练MLP64帧Log-Mel块约8000万冻结部分Adamlr1e-4微调分类头0.89左右说明一下这个数值是我针对特定数据子集复现出来的参考结果不同训练验证划分、不同预处理细节都会影响最终数字不一定和论文完全一致但它能反映一个趋势传统模型能做但由于特征表达能力有限提不到特别高轻量CNN有明显提升预训练模型的迁移学习效果最好尤其对少样本类别帮助很大。5.3 传统模型、CNN、预训练模型的差异为什么SVM加MFCC只能到0.72左右因为MFCC本身就是对频谱的强压缩它把很多高频细节丢了而猫叫分类恰恰很依赖高频谐波结构。SVM在手工特征上的上限就那么高不是算法不行是特征信息不够。轻量CNN之所以能到0.83是因为它能直接学习Log-Mel频谱图上的局部模式哪些频率带在哪个时间段起变化这些信息对分类很有帮助。但它的问题是参数少深度浅无法捕捉非常长的时间依赖。猫的叫声是有节奏的多个叫声连在一起才能体现情绪单帧频率图学不到这种节奏信息。预训练模型能到0.89主要是因为它在海量声音数据上学会了通用的声学表征。它知道什么样的声音模式代表某种语义虽然在预训练阶段没听过猫叫但底层特征提取能力很强大微调之后就能快速适配猫叫声。这也是我建议做实际应用时优先考虑预训练模型的原因。6. 这套技术能落到哪里6.1 宠物硬件从情绪灯到自动喂食器现在市面上越来越多宠物智能设备比如摄像头、喂食器、逗猫玩具。如果这些设备内置一个猫叫分类模型就能对猫咪状态做出更智能的反应。举个例子摄像头检测到“讨食”类叫声可以联动喂食器定量出粮检测到“求关注”类叫声可以播放一段主人的语音安抚。这些功能听起来简单但背后就是要有一个能实时跑在嵌入式设备上的轻量音频分类模型。这也是为什么轻量CNN还有存在价值虽然它的精度不如预训练大模型但模型小、推理快可以直接部署到端侧。预训练模型可以部署在云端作为精度更高的兜底方案。实际产品里经常是“端侧轻模型先跑云端重模型再确认”的联动架构。6.2 宠物医疗与动物福利场景还有一个容易被忽略的应用在医疗和动物福利领域。猫不会说话疼痛和不适很多时候只能靠行为观察但行为观察往往滞后。如果能用叫声自动识别疼痛或焦虑信号就能在猫出现明显症状之前提醒主人或兽医。尤其对不会表达的小猫、术后恢复期的猫这种被动监测有很大的价值。当然医疗场景对模型的要求比“讨食分类”高得多误报率必须非常低否则会给用户带来大量无效预警。所以这类应用通常不会只依赖音频而是音频加视频行为分析多模态融合把叫声、姿态、活动量结合在一起判断。6.3 未来方向多模态与少样本学习从研究角度来说猫叫分类数据集的更大意义在于提供了一个可对比的公开基准。有了这个基准后续研究者可以在上面验证新的特征提取方法、新的数据增强策略、新的迁移学习算法甚至跨物种迁移。狗的叫声分类、鸟鸣分类、海洋哺乳动物声音分类本质上都面临类似的技术挑战这套方法论是可以平移的。未来如果能采集更多的猫个体、更多样的场景加入视频和行为标注模型的泛化能力会更强。还有个方向是自监督预训练也就是先在大规模无标注猫叫声数据上学通用表征再用少量标注数据微调这样能进一步降低标注成本。基于我自己的复现体会这个数据集最难的地方不在模型而在数据划分和特征工程。只要守住“按猫个体划分”这条底线做好音频标准化选对特征再配合预训练模型迁移做一个能用的猫叫分类器并不难。最后再分享一个小技巧无论做哪个声音分类项目一定要把音频预处理参数和随机种子固定下来写进配置文件。这样后面换模型、调参数时你才能确定效果变化完全来自模型改动而不是被某个隐性的预处理差异带偏。工具链稳定了实验才能跑得又快又准。
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

场景化定制

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

营销型架构

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

全周期服务

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

免费获取你的建站方案

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