ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleHub ESC50 环境声音分类数据集 API 详解与源码解析

PaddleHub ESC50 环境声音分类数据集 API 详解与源码解析 PaddleHub ESC50 环境声音分类数据集 API 详解与源码解析【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers本篇技术指南围绕 PaddleHub 内置的paddlehub.datasets.ESC50数据集类展开讲解其在环境声音分类Environmental Sound Classification任务中的定义方式、构造参数、音频特征提取流程并结合 PaddleHub 源码与官方音频分类示例说明如何基于 ESC-50 数据集完成模型 Fine-tune 与推理。读完本文你将掌握 ESC50 数据集的完整使用姿势、Mel 频谱特征的底层生成原理以及它与 PANNs 系列预训练模型的配合方式。ESC50 数据集类概览ESC-50 是一个用于环境声音分类方法基准测试的公开数据集包含2000 条标注过的环境声音录音覆盖 50 个类别每个类别 40 条样本。PaddleHub 将这一数据集封装为ESC50类位于 paddlehub/datasets/esc50.py并统一通过 paddlehub/datasets/init.py 导出因此可以直接使用如下导入方式from paddlehub.datasets import ESC50对应的 API 文档为 docs/docs_ch/api/datasets/esc50.rst其类签名为class paddlehub.datasets.ESC50(mode: str train, feat_type: str mel)该数据集类专为环境声音分类设计数据集描述原文指出ESC-50 是一组带标注的环境声音录音集合适合用作环境声音分类方法的基准测试。构造参数详解ESC50构造函数接受两个可选参数下面结合源码逐一说明。mode数据集模式类型str可选默认值为train取值train、test或dev用于标识当前数据集所处的模式从 paddlehub/datasets/esc50.py 的构造函数实现可以看到def __init__(self, mode: str train, feat_type: str mel): base_path os.path.join(DATA_HOME, esc50) if mode train: data_file train.npz else: data_file dev.npz即modetrain时加载train.npz用于模型训练其余取值包括dev和test统一加载dev.npz用于模型验证或测试。在实际使用中官方音频分类示例demo/audio_classification/train.py正是分别构造训练集与验证集train_dataset ESC50(modetrain) dev_dataset ESC50(modedev)feat_type输入特征类型类型str可选默认值为mel取值mel或rawmelMel 频谱Mel Spectrogram由原始波形在线计算得到raw原始波形直接使用 npz 中存储的波形数据。该参数由基类AudioClassificationDataset消费。在 paddlehub/datasets/base_audio_dataset.py 中定义了支持的特征集合_supported_features [raw, mel]若传入其他取值会在特征转换阶段抛出异常见_convert_examples_to_records中Unknown type of self.feat_type的报错逻辑。数据集内部结构与关键常量ESC50类在类级别定义了若干供模型与训练流程直接引用的常量这些常量是理解数据集与模型衔接的关键常量值含义sample_rate44100音频统一采样率Hzinput_lengthint(sample_rate * 5)即 220500每条样本固定 5 秒时长num_class50类别总数用于配置分类头label_list50 个字符串与类别索引一一对应的标签名其中label_list按语义分组涵盖五类环境声音Animals动物叫声Dog、Rooster、Pig、Cow、Frog、Cat、Hen、Insects (flying)、Sheep、CrowNatural soundscapes water sounds自然与水流声Rain、Sea waves、Crackling fire、Crickets、Chirping birds、Water drops、Wind、Pouring water、Toilet flush、ThunderstormHuman, non-speech sounds人类非语音声音Crying baby、Sneezing、Clapping、Breathing、Coughing、Footsteps、Laughing、Brushing teeth、Snoring、Drinking, sippingInterior/domestic sounds室内/居家声音Door knock、Mouse click、Keyboard typing、Door, wood creaks、Can opening、Washing machine、Vacuum cleaner、Clock alarm、Clock tick、Glass breakingExterior/urban noises室外/城市噪声Helicopter、Chainsaw、Siren、Car horn、Engine、Train、Church bells、Airplane、Fireworks、Hand saw。这些标签在推理阶段用于构建label_map见下文推理部分。数据下载与目录约定ESC50类通过装饰器自动完成数据下载download_data(urlhttps://bj.bcebos.com/paddlehub-dataset/esc50.tar.gz) class ESC50(AudioClassificationDataset):首次实例化时PaddleHub 会自动从该 URL 下载esc50.tar.gz并解压到数据集缓存目录。根据 paddlehub/env.py 的定义DATA_HOME _get_sub_home(dataset)DATA_HOME是 PaddleHub 用于存放自动下载数据集的目录ESC50的数据实际存放于DATA_HOME/esc50下包含train.npz与dev.npz两个 NumPy 压缩包文件。底层数据读取从 npz 到 InputExampleESC50继承自AudioClassificationDatasetpaddlehub/datasets/base_audio_dataset.py后者又继承自BaseAudioDataset与paddle.io.Dataset因此ESC50实例天然是 PaddlePaddle 的 Dataset可直接交给DataLoader或 PaddleHub Trainer 使用。基类的_read_filepaddlehub/datasets/base_audio_dataset.py负责解析 npz 文件dataset np.load(os.path.join(self.data_file), allow_pickleTrue) audio_id 0 for waveform, label in zip(dataset[waveforms], dataset[labels]): example InputExample(guidaudio_id, sourcewaveform, labellabel) audio_id 1 examples.append(example)可以看到npz 文件中包含两个关键数组waveforms原始波形数据一维数组labels对应的类别标签。两者逐条配对被封装为InputExample包含guid、source、label三个字段。目前基类仅支持npz文件类型其他文件类型会触发NotImplementedError。特征提取Mel 频谱的生成原理构造AudioClassificationDataset时ESC50会传入一组特征配置feat_cfgpaddlehub/datasets/esc50.pyfeat_cfg dict( sample_rateself.sample_rate, # 44100 window_size1024, # STFT 窗口大小n_fft hop_size320, # 帧移 mel_bins64, # Mel 滤波器组数量 fmin50, # 最低频率 fmax14000, # 最高频率 windowhann) # 窗函数类型随后基类的_convert_examples_to_recordspaddlehub/datasets/base_audio_dataset.py根据feat_type决定每个样本的最终特征feat_typeraw直接使用原始波形example.sourcefeat_typemel调用extract_melspectrogram在线计算 Mel 频谱其他取值抛出RuntimeError。Mel 频谱的底层实现位于 paddlehub/utils/utils.py其计算流程为短时傅里叶变换STFT调用librosa.stft使用n_fftwindow_size、hop_lengthhop_size、win_lengthwindow_size、windowhann并设置centerTrue、pad_modereflect功率谱计算对 STFT 结果取绝对值后求平方得到功率谱Mel 滤波通过librosa.filters.mel构建 Mel 滤波器组n_melsmel_bins频率范围fminfmax与功率谱做矩阵乘法得到 Mel 频谱分贝换算使用librosa.power_to_db将 Mel 功率谱转换为对数分贝刻度ref1.0、amin1e-10、top_dbNone并做转置最终输出形状为(时间帧, mel_bins)的特征矩阵。需要说明的是该函数依赖librosa及numba库。若环境中未正确安装PaddleHub 会打印提示并抛出导入异常因此使用 ESC50 前请确保安装依赖。最终__getitem__paddlehub/datasets/base_audio_dataset.py返回(特征, 标签)二元组其中标签被转换为int64类型可直接用于 PaddlePaddle 模型训练。实战基于 ESC50 的 Fine-tune 全流程官方示例 demo/audio_classification/README.md 给出了使用 PaddleHub Fine-tune API 完成环境声音分类的四步流程下面结合 demo/audio_classification/train.py 完整演示。Step 1选择预训练模型import paddle import paddlehub as hub from paddlehub.datasets import ESC50 model hub.Module(namepanns_cnn14, version1.0.0, tasksound-cls, num_classESC50.num_class)参数说明name模型名称可选panns_cnn14、panns_cnn10、panns_cnn6详见仓库中 modules/audio/audio_classification/PANNs 目录下的模块说明tasksound-cls表示声音分类任务None表示基于 AudioSet 527 类标签的 Audio Tagging 任务num_class分类任务的类别数这里直接使用ESC50.num_class50实现数据集与分类头的自动对齐。Step 2加载数据集train_dataset ESC50(modetrain) dev_dataset ESC50(modedev)Step 3配置优化器与 Traineroptimizer paddle.optimizer.AdamW(learning_rate5e-5, parametersmodel.parameters()) trainer hub.Trainer(model, optimizer, checkpoint_dir./checkpoint, use_gpuTrue)示例默认超参数可通过命令行覆盖num_epoch50、learning_rate5e-5、batch_size16、save_interval10。Step 4执行训练与评估trainer.train( train_dataset, epochs50, batch_size16, eval_datasetdev_dataset, save_interval10, ) trainer.evaluate(dev_dataset, batch_size16)启动训练的命令为export CUDA_VISIBLE_DEVICES0 python train.py训练完成后验证集上表现最优的模型会保存在${CHECKPOINT_DIR}/best_model/model.pdparams目录下。实战加载微调模型进行预测微调完成后可用 demo/audio_classification/predict.py 中的逻辑对本地 wav 文件进行分类。其核心代码为import librosa import paddlehub as hub from paddlehub.datasets import ESC50 label_map {idx: label for idx, label in enumerate(ESC50.label_list)} model hub.Module( namepanns_cnn14, version1.0.0, tasksound-cls, num_classESC50.num_class, label_maplabel_map, load_checkpoint./checkpoint/best_model/model.pdparams) data [librosa.load(./cat.wav, sr44100)[0]] result model.predict(data, sample_rate44100, batch_size1, feat_typemel, use_gpuTrue)关键点利用ESC50.label_list构建label_map将模型输出的类别索引映射为可读的类别名称如Cat、Dog预测前使用librosa.load以sr44100与ESC50.sample_rate一致读取音频model.predict内部同样使用feat_typemel与数据集训练时保持一致的特征处理管线。命令行推理方式python predict.py --wav ./cat.wav --topk 3输出示例格式为标签与对应得分[./cat.wav] Cat: 0.9123 ...小结ESC50是 PaddleHub 为环境声音分类场景内置的开箱即用数据集类。通过mode与feat_type两个参数即可在训练/验证数据集与原始波形/Mel 频谱特征之间灵活切换其 50 个类别标签、44100Hz 采样率、5 秒定长样本等常量与 PANNs 系列预训练模型天然衔接配合 demo/audio_classification 目录下的训练与预测脚本可以快速搭建一套完整的环境声音分类应用。【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表