【まとめ】ディープラーニングによる環境音の認識

とあるきっかけで、**環境音の認識**（歩く音や雨の音、掃除機の音など）について、
論文を調べたので、メモとして残しておきます。

せっかくなので、**精度向上の歴史**を振り返る形式で、書いていきます。

#データセット
精度の基準となるデータセットをご紹介します。画像の認識では、ImageNetという圧倒的な
データセットがあり、性能評価で用いられます。

一方、音の認識はImageNetほど巨大ではありませんが、**ESC-50**というデータセットが
あります。今回の基準となる[ESC-50](https://github.com/karolpiczak/ESC-50)の概要は以下のとおりです。

+ 犬の鳴き声やドアのノック音など50種類、2000個の音源を収録
+ 音源の長さは5秒間
+ 精度評価をするときは、学習用とテスト用に分けて(5-foldなど）それぞれ評価

##音の前処理
画像の前処理は、通常255で割れば良く、非常に簡単です。

一方、音の前処理は通常logmelを用います。logmelで処理することにより、音の生波形を
周波数と時間方向で表現でき、音を画像として扱うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/279ec780-b9f6-70aa-d6a8-798cdb9b5c28.png)

詳しくは[こちら](https://qiita.com/shinmura0/items/858214154f889c05e4f4#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%89%8D%E5%87%A6%E7%90%86)をご覧ください。

ただ、logmelで十分なのか？という議論があり、ここは後述するように
精度向上のポイントになってきます。

#精度向上の歴史
##（精度：64.5％）logmel-CNN
前述したように、音をlogmelにすることで音を画像として扱うことができます。

画像の認識では、畳み込みニューラルネットワーク（CNN）を使うことで認識精度が
一気に向上しました。そして、音でも同じ効果があるのか検証したのが、logmel-CNNです。

[ENVIRONMENTAL SOUND CLASSIFICATION WITH CONVOLUTIONAL NEURAL NETWORKS](https://www.karolpiczak.com/papers/Piczak2015-ESC-ConvNet.pdf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/445624a6-5896-b8de-b037-96631034abb3.png)
図は[1]より

・CNN2層と全結合層2層、活性化関数はReLU
・Dropoutも使用
・0.95秒ごとに音をlogmelに変換
・さらに入力は、周波数の動的変化を捉える[Δlogmel](http://speechresearch.fiw-web.net/66.html#qe7a16fb)も加え2chとした（下図参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/d33cf9d2-0d68-40f1-c14d-7d00232cd189.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/c0180377-55d1-14bb-6f41-6989276083b2.png)
図は[1]より

##（精度：71％）EnvNet
冒頭で触れたように、音の前処理はlogmelで良いのか？という疑問に真正面から
挑んだのがEnvNetです。

[LEARNING ENVIRONMENTAL SOUNDS WITH END-TO-END CONVOLUTIONAL NEURAL NETWORK](https://www.mi.t.u-tokyo.ac.jp/assets/publication/LEARNING_ENVIRONMENTAL_SOUNDS_WITH_END-TO-END_CONVOLUTIONAL_NEURAL_NETWORK.pdf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e75aeab4-8a4b-da5d-023e-8c2a4936043e.png)
図は[2]より

・logmelを使わずにCNNで直接特徴を抽出させる
・1.5secの窓をスライドさせながら、音を学習させる
・テスト時の評価は、窓をスライドさせながらvotingによって分類させる
・EnvNet単独でlogmel-CNNを上回る精度
・さらに、EnvNetとlogmelを組み合わせ大幅な精度向上に寄与（下の表参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/659fe399-b5ee-3e3f-1eea-337f4410dc8c.png)
表は[2]より

・学習済のモデルにサインカーブを入れることで、どの周波数帯が反応しているのか調査
・その結果、logmelと似たような特徴抽出ができた（下の図参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/614b1ea3-7bf3-a986-bfdf-a560e2721ca9.png)
図は[2]より

・ただ、特徴抽出はlogmelと全く同じではなく、そこがlogmelを上回った要因ともいえる
・音以外のデータでも使える可能性を示唆（振動のデータなんかにも使えそう！？）

###おまけ
logmelに頼らない手法として以下の研究もあります。

+ [Sample-level Deep Convolutional Neural Networks for Music Auto-tagging Using Raw Waveforms](https://arxiv.org/abs/1703.01789)
+ [Very Deep Convolutional Neural Networks for Raw Waveforms](https://arxiv.org/pdf/1610.00087.pdf)

##（精度：85％）BC learning
画像の認識問題では、データを水増し（拡張）するmixupという手法が一般的になっています。
これにより、精度がかなり向上します。BC learningはこれを音に適用した研究です。

[LEARNING FROM BETWEEN-CLASS EXAMPLES FOR DEEP SOUND RECOGNITION](https://arxiv.org/abs/1711.10282)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/e753c0f2-2ee0-163b-1491-621ea3fd7396.png)
図は[3]より

・音の生波形を混ぜる。ただし、比率は音圧を考慮して決定
・通常の手法に対し、5％ほど精度向上（下の表参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/8edbe5cd-a28f-a088-9eea-1a368e5ecea9.png)
表は[3]より（数字はエラー率）

・ただし、表のEnvNet-v2は前述のEnvNetの層をより深くしたもの
・損失関数はクロスエントロピーではなく、KL-divergenceを採用
・間接的に、FISHER’S CRITERION を拡大することに繋がっている（下図参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/d59163f7-d2e3-c591-5042-05f56b71e0be.png)
図は[3]より

##（精度：95％）PANNs
巨大な音データ（AudioSet）で学習させた学習済モデルを、転移学習（fine-tuning）
させたのがPANNsです。画像では転移学習が有効なことが示されており、音でもそれが
効くのか検証した研究です。

[PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/abs/1912.10211)

・AudioSet（632種類、200万！の音）で学習したモデルを提案。
・転移学習により、ほとんどのデータセットでSOTAを超える性能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/3bcbc269-fea8-0cbb-ff25-3f292438ebd7.png)
表は[4]より（STOA→SOTAか？）

・入力は「logmel」と「生波形を1D-CNNで処理したもの」を結合（下図参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/d8ead0ba-89ab-f5e3-32ab-4b06209415fd.png)
図は[4]より

・データ拡張はmixup + [SpecAugment](https://qiita.com/shu_O/items/25a483ff3266d1482b31)
・その他に、logmelで学習させたMobileNetやResNetを提供。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/4bba1324-c1ef-d45c-ffb7-51fa739fd97f.png)
図は[4]より

・図の一番上、Wavegram-Logmel-CNNが提案した新モデル。

#学習済モデル
前述したとおり、環境音の認識でも転移学習が有効なことが分かりました。
以下に、転移学習に使えるモデルを示しておきます。

+ [VGGish](https://github.com/tensorflow/models/tree/master/research/audioset/vggish)
割と古いモデルらしいですが、最近でも良く使われるようです。
入力時間に縛られない自由度の高さがよいです。

+ [PANNs](https://github.com/qiuqiangkong/audioset_tagging_cnn)
前述した最先端のモデルです。非常に巨大なデータで学習させたモデルです。
MobileNetからResNet、そして、提案モデルまで様々なモデルがダウンロード可能です。

#（考察）mixup vs BC learning
データ拡張は、最新のモデルにおいて　mixup + [SpecAugment](https://qiita.com/shu_O/items/25a483ff3266d1482b31)となっています。
これは、2019年に行われた[Kaggleのコンペ](https://www.kaggle.com/c/freesound-audio-tagging-2019/discussion/95382)でも同じ手法が用いられているため、
現在の主流といえます。

ただ、mixupの同じような手法として、BC learningがあります。両者の本質的な
中身は同じですが、どちらを用いた方がよいのでしょうか？これらのメリットを
挙げると以下になるかと思います。

+ mixupは生波形を一度logmelにしてしまえば、画像として扱えるためメモリに優しい
+ BC learningは前述したように、音圧を考慮しているため、音圧に差があるデータでは有効

まとめると、**音圧に差がある場合はBC learningを用いた方が良いかもしれません。**
それ以外の場合は、mixupで十分かと思います。SpecAugmentは有効になるケースと
ならないケースがあると思われますが、入れておいて損はないかと思います。
ただ、データ拡張は学習時間が長くなるため、注意が必要です。

#まとめ
+ やはり転移学習が強い
+ そして、データ拡張もなくてはならない技術で、今の主流はmixup + SpecAugment
+ logmelで前処理するのが主流だが、1D-CNNで処理する技術も精度向上に貢献している

#最後に
冒頭の**きっかけ**とは、DCASE2020のTask2、異常音コンペのことでした。

[機械音の異常検知チャレンジ DCASE 2020 Task 2](https://qiita.com/daisukelab/items/b106c567cf8927a5519a)

私事ですが、このコンペに参加することにしました。人生初参加のコンペとなります。
本稿で挙げた技術をゴリゴリ使って精度向上を目指していきます！
ちなみに、本稿でも紹介した以下の外部リソースは、コンペでも使用可能となっています。

+ [AudioSet](https://research.google.com/audioset/)（632種類、200万の音）
+ [VGGish](https://github.com/tensorflow/models/tree/master/research/audioset/vggish)（学習済モデル）

これをどう使っていくのか、コンペ攻略のカギになりそうです。

自分のスコアも気になりますが、個人的に専門でやっているところなので、
1st Solutionが一番気になるところです。興味がある人は、是非ご参加ください。

#参考文献
[1]Karol J. Piczak. [ENVIRONMENTAL SOUND CLASSIFICATION WITH CONVOLUTIONAL NEURAL NETWORKS](https://www.karolpiczak.com/papers/Piczak2015-ESC-ConvNet.pdf)
[2]Yuji Tokozume, Tatsuya Harada. [LEARNING ENVIRONMENTAL SOUNDS WITH END-TO-END CONVOLUTIONAL NEURAL NETWORK](https://www.mi.t.u-tokyo.ac.jp/assets/publication/LEARNING_ENVIRONMENTAL_SOUNDS_WITH_END-TO-END_CONVOLUTIONAL_NEURAL_NETWORK.pdf)
[3]Yuji Tokozume, Yoshitaka Ushiku, Tatsuya Harada.
[LEARNING FROM BETWEEN-CLASS EXAMPLES FOR DEEP SOUND RECOGNITION](https://arxiv.org/abs/1711.10282)
[4]Qiuqiang Kong, Yin Cao, Turab Iqbal, Yuxuan Wang, Wenwu Wang, Mark D. Plumbley. [PANNs: Large-Scale Pretrained Audio Neural Networks for Audio Pattern Recognition](https://arxiv.org/abs/1912.10211)