README.md 4.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
```shell
$ hub install panns_cnn14==1.0.0
```


`panns_cnn14`是一个基于[Google Audioset](https://research.google.com/audioset/)数据集训练的声音分类/识别的模型。该模型主要包含12个卷积层和2个全连接层,模型参数为79.6M。经过预训练后,可以用于提取音频的embbedding,维度是2048。

更多详情请参考论文:[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/pdf/1912.10211.pdf)

## API
```python
def __init__(
        task,
        num_class=None,
        label_map=None,
        load_checkpoint=None,
        **kwargs,
)
```

创建Module对象。

**参数**

* `task`: 任务名称,可为`sound-cls`或者`None``sound-cls`代表声音分类任务,可以对声音分类的数据集进行finetune;为`None`时可以获取预训练模型对音频进行分类/Tagging。
* `num_classes`:声音分类任务的类别数,finetune时需要指定,数值与具体使用的数据集类别数一致。
* `label_map`:预测时的类别映射表。
* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。
* `**kwargs`:用户额外指定的关键字字典类型的参数。

```python
def predict(
        data,
        sample_rate,
        batch_size=1,
        feat_type='mel',
        use_gpu=False
)
```

**参数**

* `data`: 待预测数据,格式为\[waveform1, wavwform2…,\],其中每个元素都是一个一维numpy列表,是音频的波形采样数值列表。
* `sample_rate`:音频文件的采样率。
* `feat_type`:音频特征的种类选取,当前支持`'mel'`(详情可查看[Mel-frequency cepstrum](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))和原始波形特征`'raw'`
* `batch_size`:模型批处理大小。
* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。

**返回**

* `results`:list类型,不同任务类型的返回结果如下
  * 声音分类(task参数为`sound-cls`):列表里包含每个音频文件的分类标签。
  * Tagging(task参数为`None`):列表里包含每个音频文件527个类别([Audioset标签](https://research.google.com/audioset/))的得分。


**代码示例**

- [ESC50](https://github.com/karolpiczak/ESC-50)声音分类预测
    ```python
    import librosa
    import paddlehub as hub
    from paddlehub.datasets import ESC50

    sr = 44100 # 音频文件的采样率
    wav_file = '/data/cat.wav' # 用于预测的音频文件路径
    checkpoint = 'model.pdparams' # 用于预测的模型参数

    label_map = {idx: label for idx, label in enumerate(ESC50.label_list)}

    model = hub.Module(
        name='panns_cnn14',
        version='1.0.0',
        task='sound-cls',
        num_class=ESC50.num_class,
        label_map=label_map,
        load_checkpoint=checkpoint)

    data = [librosa.load(wav_file, sr=sr)[0]]
    result = model.predict(
        data,
        sample_rate=sr,
        batch_size=1,
        feat_type='mel',
        use_gpu=True)

    print('File: {}\tLable: {}'.format(wav_file, result[0]))
    ```

- Audioset Tagging
    ```python
    import librosa
    import numpy as np
    import paddlehub as hub

    def show_topk(k, label_map, file, result):
        """
        展示topk的分的类别和分数。
        """
        result = np.asarray(result)
        topk_idx = (-result).argsort()[:k]
        msg = f'[{file}]\n'
        for idx in topk_idx:
            label, score = label_map[idx], result[idx]
            msg += f'{label}: {score}\n'
        print(msg)

    sr = 44100 # 音频文件的采样率
    wav_file = '/data/cat.wav' # 用于预测的音频文件路径
    label_file = './audioset_labels.txt' # audioset标签文本文件
    topk = 10 # 展示的topk数

    label_map = {}
    with open(label_file, 'r') as f:
        for i, l in enumerate(f.readlines()):
            label_map[i] = l.strip()

    model = hub.Module(
        name='panns_cnn14',
        version='1.0.0',
        task=None)

    data = [librosa.load(wav_file, sr=sr)[0]]
    result = model.predict(
        data,
        sample_rate=sr,
        batch_size=1,
        feat_type='mel',
        use_gpu=True)

    show_topk(topk, label_map, wav_file, result[0])
    ```

详情可参考PaddleHub示例:
- [AudioClassification](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0/demo/audio_classification)


##   查看代码

https://github.com/qiuqiangkong/audioset_tagging_cnn


## 依赖

paddlepaddle >= 2.0.0

paddlehub >= 2.0.0

## 更新历史

* 1.0.0

  初始发布,动态图版本模型,支持声音分类`sound-cls`任务的fine-tune和基于Audioset Tagging预测。