☰
PaddleSpeech 声音分类实战:基于 PANNs 预训练模型微调 ESC-50 数据集,完成训练、预测与静态图部署
2026/9/25 2:36:35 网站建设 项目流程
  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

本篇技术指南以 PaddleSpeech 仓库中的 examples/esc50 声音分类示例为切入点,完整讲解如何利用在 AudioSet 上预训练的 PANNs(CNN14/CNN10/CNN6)模型,在 ESC-50 环境声音分类数据集上进行微调(Fine-tune),并依次走通训练、预测、动转静导出与静态图部署推理的完整链路。读完本文,你将掌握:PaddleSpeech 声音分类任务的示例目录结构、panns.yaml全部配置项的含义、四个阶段的 shell 命令用法,以及 PANNs 骨干网络与分类器在仓库中的底层实现原理。

声音分类任务与 PANNs 方案

声音分类与检测是声音算法领域的热门研究方向。传统机器学习方法通常先人工提取音频的时域、频域多种特征,再经特征选择、组合与变换,最后交给 SVM 或决策树等分类器;而端到端深度学习方法则利用 RNN、CNN 等深度网络直接对波形(waveform)或时频特征(time-frequency feature)进行表示学习(representation learning)与分类预测。

在 IEEE ICASSP 2017 大会上,Google 开放了大规模音频数据集 AudioSet,包含 632 类音频类别、2,084,320 条人工标注、每段10 秒的声音片段(来源于 YouTube 视频)。基于该数据集训练出的 PANNs(Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition)模型,在完成预训练后可以用于提取音频的 embedding,作为下游任务的通用特征。本示例正是使用 PANNs 预训练模型,通过 Finetune 完成声音分类任务。

模型简介:CNN14 / CNN10 / CNN6

PaddleSpeech 中的 PaddleAudio 模块提供了 PANNs 的 CNN14、CNN10、CNN6 三种预训练模型,结构规模与 embedding 维度各不相同,可在精度与计算量之间按需取舍:

| 模型 | 结构 | 参数量 | Embedding 维度 | | -- | -- | -- | -- | | CNN14 | 12 个卷积层 + 2 个全连接层 | 79.6M | 2048 | | CNN10 | 8 个卷积层 + 2 个全连接层 | 4.9M | 512 | | CNN6 | 4 个卷积层 + 2 个全连接层 | 4.5M | 512 |

从源码 paddlespeech/cls/models/panns/panns.py 可以印证三种网络的实现差异:

  • CNN14由 6 个ConvBlock串联(每个 block 含 2 个 3×3 卷积层,即 12 个卷积层),通道数从 64 逐级翻倍至 2048,emb_size = 2048;
  • CNN10由 4 个ConvBlock(8 个卷积层)构成,emb_size = 512;
  • CNN6由 4 个ConvBlock5x5(每个 block 1 个 5×5 卷积层)构成,emb_size = 512。

三者共享的卷积块结构为卷积 → BatchNorm → ReLU → 池化,池化支持avg、max、avg+max三种方式;特征聚合阶段使用mean(axis=3)与max(axis=2) + mean(axis=2)的组合,后接 dropout(p=0.5)与fc1。当extract_embedding=True时输出 embedding,否则输出经 sigmoid 归一化的 AudioSet 527 类预测(fc_audioset输出维度为 527)。

三种模型均通过工厂函数cnn14()/cnn10()/cnn6()创建,设置pretrained=True时会从百度 BOS 下载对应预训练权重(panns_cnn14.pdparams等)并加载到本地MODEL_HOME/panns目录。

数据集:ESC-50

ESC-50 是环境声音分类的经典基准数据集,包含2000个带标签、时长5 秒的环境声音样本,采样率44,100 Hz、单声道,样本按语义划分为50 个类别,每类40 个样本。类别覆盖动物叫声、自然声景、人类非语音声音、室内/家用声音、室外/城市噪声五大类(如 Dog、Rain、Crying baby、Door knock、Helicopter 等)。

仓库中的数据集实现位于 audio/paddleaudio/datasets/esc50.py:

  • 首次使用时通过download_and_decompress自动下载ESC-50-master.zip(md5 为7771e4b9d86d0945acce719c7a59305a)并解压到DATA_HOME;
  • 解析meta/esc50.csv元数据(字段包括 filename、fold、target、category、esc10、src_file、take);
  • 通过mode(train/dev)与split(fold 编号)参数完成数据划分:mode='train'取 fold 不等于split的全部样本,mode='dev'取 fold 等于split的样本。

模型指标

示例依据 ESC-50 官方提供的 fold 信息进行5-fold微调训练与评估,平均准确率如下(亦记录于 examples/esc50/RESULTS.md):

| Model | Acc | | -- | -- | | CNN14 | 0.9500 | | CNN10 | 0.8975 | | CNN6 | 0.8825 |

可以看到参数量最大的 CNN14 在 ESC-50 上获得了 95% 的平均准确率,明显优于 CNN10(89.75%)与 CNN6(88.25%)。

快速开始:示例目录结构与命令入口

示例位于仓库 examples/esc50/cls0 目录,统一入口为run.sh,通过stage参数串联四个阶段:

| Stage | 功能 | 命令 | | -- | -- | -- | | 1 | 模型训练 |./run.sh 1 conf/panns.yaml| | 2 | 模型预测 |./run.sh 2 conf/panns.yaml| | 3 | 动转静导出 |./run.sh 3 <checkpoint> <output_dir>| | 4 | 静态图部署推理 |./run.sh 4 <device> <model_dir> <audio_file>|

run.sh 会先执行source path.sh设置环境变量(将仓库根目录与utils加入PATH、将仓库根目录加入PYTHONPATH,并将BIN_DIR指向paddlespeech/cls/exps/panns),随后根据CUDA_VISIBLE_DEVICES中显卡数量计算ngpu并分发到对应local/子脚本。训练阶段若ngpu > 0则通过paddle.distributed.launch --gpus $CUDA_VISIBLE_DEVICES启动多卡分布式训练,否则单进程直接运行 train.py。示例默认使用 CNN14,若希望更换骨干网络,只需修改配置文件中model.backbone字段。

阶段 1:模型训练

启动训练(单卡):

$ CUDA_VISIBLE_DEVICES=0 ./run.sh 1 conf/panns.yaml

多卡训练时只需在CUDA_VISIBLE_DEVICES中列出多张卡,例如CUDA_VISIBLE_DEVICES=0,1,run.sh会自动计算 GPU 数量并走paddle.distributed.launch分支。

训练相关参数集中在配置文件 examples/esc50/cls0/conf/panns.yaml 的training节,完整配置如下:

data: dataset: 'paddle.audio.datasets:ESC50' num_classes: 50 train: mode: 'train' split: 1 dev: mode: 'dev' split: 1 model: backbone: 'paddlespeech.cls.models:cnn14' feature: sr: 32000 n_fft: 1024 hop_length: 320 window: 'hann' win_length: 1024 f_min: 50.0 f_max: 14000.0 n_mels: 64 training: epochs: 50 learning_rate: 0.00005 num_workers: 2 batch_size: 16 checkpoint_dir: './checkpoint' save_freq: 10 log_freq: 10

其中各训练参数的含义与建议:

  • epochs:训练轮次,示例配置为 50;
  • learning_rate:Fine-tune 学习率,示例配置为5e-5(微调阶段通常使用较小的学习率,避免破坏预训练权重);
  • batch_size:批处理大小,需结合显存情况调整,若出现显存不足(OOM)请适当调低,示例配置为 16;
  • num_workers:DataLoader 获取数据的子进程数;文档说明默认值为 0(加载数据在主进程执行),仓库自带示例配置为 2;
  • checkpoint_dir:模型参数与 optimizer 参数的保存目录,示例配置为./checkpoint;
  • save_freq:模型保存频率(每 N 个 epoch 保存一次),示例配置为 10,即依次保存epoch_10、epoch_20……epoch_50;
  • log_freq:训练信息打印频率(每 N 个 batch 打印一次),示例配置为 10。

feature节定义特征提取参数:重采样率sr: 32000、FFT 点数n_fft: 1024、帧移hop_length: 320、窗函数window: 'hann'、窗长win_length: 1024、Mel 频率范围f_min: 50.0与f_max: 14000.0、Mel 通道数n_mels: 64,训练与预测阶段会使用同一套特征参数。

从训练主循环源码 paddlespeech/cls/exps/panns/train.py 可以看到完整链路:先通过dynamic_import加载ESC50数据集与cnn14骨干,用LogMelSpectrogram(**feat_conf)构造特征提取器,再用SoundClassifier(backbone, num_class=50)组装分类模型,优化器采用 Adam、损失函数采用 CrossEntropyLoss。每个 epoch 内遍历 train_loader,将波形经 LogMel 特征提取、转置为[N, length, n_mels]后送入模型得到 logits,计算损失、反向传播并更新参数;每隔log_freq个 step 打印一次loss / acc / lr / step/sec / ETA;每隔save_freq个 epoch 在验证集(dev split)上评估一次并保存 checkpoint。

训练结束后,checkpoint 目录结构如下:

checkpoint/ └── epoch_50/ ├── model.pdparams # 模型参数 └── model.pdopt # optimizer 参数

阶段 2:模型预测

使用训练好的动态图模型对单个音频文件进行预测:

$ CUDA_VISIBLE_DEVICES=0 ./run.sh 2 conf/panns.yaml

预测参数在predicting节配置:

predicting: audio_file: '/audio/dog.wav' top_k: 10 checkpoint: './checkpoint/epoch_50/model.pdparams'
  • audio_file:指定待预测的音频文件;
  • top_k:显示得分最高的 top k 个标签;文档描述默认值为 1,仓库示例配置为 10;
  • checkpoint:模型参数 checkpoint 文件路径。

预测脚本 paddlespeech/cls/exps/panns/predict.py 的实现逻辑为:读取audio_file(按feature.sr重采样)、经LogMelSpectrogram提取特征、加载 checkpoint 权重构建SoundClassifier后前向得到 logits,再经 softmax 得到概率,按概率降序输出前top_k个类别与得分。示例输出如下:

[/audio/dog.wav] Dog: 0.9999538660049438 Clock tick: 1.3341237718123011e-05 Cat: 6.579841738130199e-06

可见模型以接近 1 的概率将样本判别为 Dog,完全符合预期。

阶段 3:动转静导出

训练结束后,可将动态图参数导出为静态图模型与参数文件,以实施静态图部署:

$ CUDA_VISIBLE_DEVICES=0 ./run.sh 3 ./checkpoint/epoch_50/model.pdparams ./export

导出脚本 paddlespeech/cls/exps/panns/export_model.py 支持两个参数:

  • checkpoint:模型参数 checkpoint 文件;
  • output_dir:静态图模型与参数文件的保存目录(默认./export)。

导出过程为:构建SoundClassifier(backbone=cnn14(pretrained=False, extract_embedding=True), num_class=len(ESC50.label_list)),加载 checkpoint 权重后置为 eval 模式,通过paddle.jit.to_static指定输入规格InputSpec(shape=[None, None, 64], dtype=float32)(即任意 batch、任意帧数、64 维 Mel 特征)转成静态图,最后用paddle.jit.save保存。导出后的目录结构为:

export ├── inference.pdiparams ├── inference.pdiparams.info └── inference.pdmodel

阶段 4:静态图部署推理

paddle.inference模块下的 Python 端部署示例由 paddlespeech/cls/exps/panns/deploy/predict.py 提供:

$ CUDA_VISIBLE_DEVICES=0 ./run.sh 4 cpu ./export /audio/dog.wav

该脚本支持的主要参数如下(比文档描述的device/model_dir/wav更丰富):

  • device:预测设备,可选cpu、gpu、xpu、gcu,默认gpu;
  • model_dir:静态图模型与参数文件的保存目录(默认./export);
  • wav:待预测的音频文件(必填);
  • batch_size:推理批大小,默认 1;
  • use_tensorrt:GPU 下是否启用 TensorRT 加速,默认False;
  • precision:TensorRT 精度,可选fp32、fp16,默认fp32;
  • cpu_threads:CPU 推理线程数,默认 10;
  • enable_mkldnn:CPU 下是否启用 MKLDNN 加速,默认False。

部署脚本内部使用paddle.inference.Config构建推理配置:GPU 模式调用enable_use_gpu(100, 0)并支持 TensorRT 引擎与 FP16/FP32 精度;CPU 模式调用disable_gpu(),可选enable_mkldnn()(缓存容量 10)与set_cpu_math_library_num_threads();XPU 模式调用enable_xpu(100)。预测时对输入音频做 LogMel 特征提取,通过 feed 句柄copy_from_cpu传入、执行predictor.run()、从输出句柄取回 logits,经 softmax 与 argmax 得到类别索引,最终打印:

Wav: /audio/dog.wav Label: Dog

源码级原理:从配置到分类的完整链路

将以上四个阶段串起来看,声音分类的完整数据流为:

  1. 数据:ESC50数据集按 fold 划分 train/dev(见 audio/paddleaudio/datasets/esc50.py);
  2. 特征:LogMelSpectrogram将 32kHz 波形转为 64 维 Log-Mel 特征图(feature节参数);
  3. 骨干:PANNs 预训练模型(CNN14/10/6)提取 2048/512 维音频 embedding(paddlespeech/cls/models/panns/panns.py);
  4. 分类头:SoundClassifier在 embedding 上接 Dropout(默认 0.1)与Linear(emb_size, num_class)线性层,输出 50 类 logits(paddlespeech/cls/models/panns/classifier.py);
  5. 训练:Adam + CrossEntropyLoss 微调,save_freq控制 checkpoint 落盘(paddlespeech/cls/exps/panns/train.py);
  6. 部署:paddle.jit动转静导出inference.pdmodel / inference.pdiparams,再由paddle.inference创建 Predictor 完成静态图推理(paddlespeech/cls/exps/panns/deploy/predict.py)。

值得注意的是,整个示例由dynamic_import驱动的"配置即代码"风格贯穿:无论是数据集(paddle.audio.datasets:ESC50)还是骨干模型(paddlespeech.cls.models:cnn14)都由 yaml 中的字符串动态解析导入,因此切换 CNN14/CNN10/CNN6 只需改一行model.backbone,无需改动任何 Python 代码。这正是本示例可复用于自定义声音分类任务的关键设计。

总结

本文围绕 PaddleSpeech 的 ESC-50 声音分类示例,系统梳理了基于 PANNs 预训练模型完成环境声音分类的完整流程:了解 PANNs 三种骨干网络的规模与 embedding 维度、ESC-50 数据集的自动下载与 5-fold 划分机制、panns.yaml中训练/特征/预测三组配置的逐项含义,以及训练、预测、动转静、静态图部署四个阶段的命令与脚本实现。借助dynamic_import的配置化设计,读者可以轻松将 CNN14 替换为更轻量的 CNN10/CNN6,或将 ESC-50 数据集替换为自定义音频分类数据,快速复用到实际的声音分类业务中。

  • 人工智能
  • 语音
  • 音频

【免费下载链接】PaddleSpeech

Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleSpeech
点击查看免费下载

相关推荐

上一篇:FanControl中文界面配置指南:5步实现Windows风扇精准控制
下一篇:【亲测免费】 RibbonWinForms 项目常见问题解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询