Neural Network Console Challenge　～BGMから飲食店をレコメンド～

#１．Neural Network Console Challenge 
　"[Audiostock](https://audiostock.jp/)の10,000点の音声（BGM）データを解析するAI開発コンテスト" のレポートです。
　　A:AudiostockのBGM検索の自動分類アルゴリズムを作り出す
　　B:自由な発想で音声データを解析する
どちらか選択ということで、音楽のセンスは無いので"B"を選択。

>学習用データ提供：Audiostock

#２．テーマ

　テーマは聞いているBGMからおすすめなランチ:ramen:（お店）を分類するアルゴリズム作成に挑戦。と言うのも、ランチのお店選びって迷いませんか？例えばドライブシーンで、お店を調べながらの運転は難しいので、聞いている音楽からレコメンドしてもらえると助かる:relaxed:（妻のご機嫌を損ねる心配がなくなる）というモチベーションでテーマを決めました。


#３．アノテーション
　音声データを解析した経験は無く、音楽も流行りの曲を聴く程度で知識が無いため、できるだけデータに基づいた分類をしたい:point_up:。また、提案してくれるお店も毎回同じ様なお店ばかり出てくると面白くないので、できるだけ多くの中から推薦してくれるモデルを作りたい:v:。

　今回ドンピシャお店を当てにいくというより、イメージから大きく外れないことが重要と思い、アノテーションはデータを基に実施しました。ありがたいことに各BGMに対し、関連タグを付けていただけていたので、これも利用しました。アノテーション手順は下記になります。

①[音声データをメル周波数スペクトログラムとして特徴量化し、画像データへ変換](https://qiita.com/Nelca/items/8c0aaaf2a8452352ffe4)。メル周波数スペクトログラムを画像化した一例は下記です。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/23f6c81b-f19d-e781-c1d6-42f758b4d417.png)
②メル周波数スペクトログラムの数値データを用い、k-meansで4つにクラスタリング。ここで各クラスに対しBGMタグを形態素解析し、[WordCloud](https://amueller.github.io/word_cloud/)で可視化してみました。お店のジャンルをラベリングしてます。ここは完全に独断と偏見です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/b25f6063-1448-0e2e-821a-6f6ec224796a.png)

③次に4つの各クラスについて、メル周波数スペクトログラムの数値データをPCAで次元削減し2次元で可視化しています。可視化することでグッとアノテーションしやすくなります。また、PCAの第1、第2主成分を[混合ガウスモデル](https://qiita.com/isuya/items/018a0867bdc95033736d)で、1店舗毎にクラスタリングしてます。この方法で音声データとお店のイメージをリンクさせました。下図はClass:1について処理をした一例です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/a2ef2fd6-3529-bcb6-8b80-21f309140b19.png)






④お店は[食べログ](https://tabelog.com/)のランチ(~2000円)で、ランキングが高いところから、③のイメージと合うものを選定。今回はエリアを東京に限定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/37bdae26-1301-375c-97bd-db2735629132.png)
　以上の手順でアノテーションを実施しました。ちょいちょいBGMを聞きながら作業しましたが、聞いているうちに混乱して分からなくなるので、かなり疲れました:skull:。
　短い曲調データで構成されたクラスや、少数のクラスを削除し最終的なデータ数は以下。

|音楽データ数|アノテーション数|
|---:|---:|
|8244|73|

#４．学習用データセットの作成
　データセットの準備、アップロードは[公式サポート](https://support.dl.sony.com/docs-ja/)に詳細があり、悩むことなく実行できました。
　今回は、アノテーションの①で作成したメル周波数スペクトログラムの画像(x)とアノテーション(y)をデータセットとしています。

|x|y|
|:---:|:---:|
|audiostock_42554.png|43|
|audiostock_42555.png|60|
|audiostock_42556.png|62|
|...|...|

#５．Neural Network Console
　今回初めてNeural Network Consoleを使ったのですが、ネットワーク設計であったり、結果の参照が非常に簡単で、楽に進めることが可能でした。スピーディーに様々なトライができることに感動。エラーにハマることが少ないのが良い:joy:

* ネットワーク設計

　基本はドラッグ＆ドロップでレイヤーを操作し、最後に数値を入力するだけです。まずは簡単なネットワークを設計しトライ実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/acf0b382-77ef-6323-9105-9639dde7cdc9.png)



　CUPで学習開始したところ、たった10エポックなのに予測完了時間が3時間45分・・・:sweat:。今回のチャレンジでは、申請すれば学習用GPU/推論用GPUを合算で10,000円分利用可能ということで、迷わす申請:sunglasses:。NVIDIA®Tesla®V100 GPUを利用したところ比較にならないくらいの速さ。これは快適。計算時間の問題は解決です。

||CPU|GPU(NVIDIA Tesla V100)|
|:---:|:---:|:---:|
|演算時間| 3hr 45min. (推定)|2min|

　一方で本番は試行錯誤し、より深いネットワークを設計することに。VGG16をベースにConvolusion layerの後にBatch Normalizationを追加、さらにConvolution/Batch Normalization/Reluのセットを一層追加した深いネットワークを設計しました。また、ValidationはTop5-errorを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/48a4fe88-ba2f-5110-d1f9-e3a6c455b1a0.png)


* 学習結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/781118/fd185f59-1e77-e112-acec-a36fbc925c69.png)

　学習はうまく進み、100エポックくらいでサチる結果となっています。Validation ErrorとTraining Errorの差があり、過学習のまま収束した感じとなっています。

* 評価結果

|Accuracy|Avg.Precision|Avg.Recall|Avg.F-Measures|
|:---:|:---:|:---:|:---:|
|0.3624|0.3787|0.3504|0.3527|

　音声データを73分類とチャレンジングな試みということもあり、精度は今一つな結果となりました:weary:。




# ６．結果考察

　今回、正しく分類できなかった音声データについて聞き直してみましたが、そこまで間違えているか？正直私には正しく分類することができず．．．:fearful:。ジャンルを大きく外すことはなさそうでした。以下２つの視点で考察を実施。

1．アノテーション②で分類した4つのジャンルを説明できているか？
　Neural Network Consoleのevaluationタブ→混同行列のデータを利用し正答率を算出。

|Class|Accuracy|
|:---:|:---:|
|1|0.7107|
|2|0.5412|
|3|0.7236|
|4|0.7277|

Class:2で若干低めだが、やはりそこそこ説明できている様子。


2．アノテーション②で分類した4つのジャンル中のお店の説明力はどうか？
　層別したデータセットを作成し、上記で実施したCNNと同じネットワークで学習してみます。


|Class|Accuracy|Avg.Precision|Avg.Recall|Avg.F-Measures|
|:---:|:---:|:---:|:---:|:---:|
|1|0.5136|0.5362|0.5255|0.5205|
|2|0.6498|0.7113|0.6415|0.6539
|3|0.3781|0.384|0.3326|0.3316|
|4|0.3654|0.2007|0.308|0.2374|

　各ジャンル中でのお店分類の精度はClass:3、Class:4で低い結果となっています。精度が低い原因の一つがこれで、Class:3、Class:4には似た感じの音声データが多く格納されているため、それ以上の分類が難しいのだと考えられました。
　また、層別の精度に対し全体(５．Neural Network Console結果)の精度が低いことから、各クラスの間で似たような分類が無いか、これを確認することも重要と思われました。
　以上より、アノテーションをもっとしっかりやる＝クラスタリングをチューニングして、人が判断できるような分類に落ち着かせることで改善できると考えられました。

．．．と色々考えましたが、５．Neural Network Consoleで作成したモデルに、そこそこ説明力がありそうなので、これを使って検証していきます。

# ７．検証

　今回学習したモデルの重みを使って、私がよく聞く音声データでどのお店をレコメンドしてくれるか、検証してみました。サビの部分をAudiostockさんご提供のデータと同様の周波数、ビットなどへ加工して音声データを作成しています。
___

* [Wake Me Up / Avicii](https://youtu.be/IcrbM1l_BoI)

　EDMですが、どこか懐かしい感じのする曲


><b>VIA Brianza<b> 

>評価点数：3.93点
>レビュー件数：335

>利用シーン：家族・子供と ｜ 知人・友人と
>ロケーション：隠れ家レストラン
>お子様連れ：子供可（小学生可）
>ホームページ：http://www.la-brianza.com/

>出典：食べログ

___
* [１・２・３ /  After the Rain（そらる×まふまふ）](https://youtu.be/ajjN7eAnyZE)

 　TVアニメ『ポケットモンスター』OP主題歌

><b>ビモン 東京駅キッチンストリート店<b>

>評価点数：3.74点
>レビュー件数：360

>利用シーン :  家族・子供と ｜ 一人で入りやすい ｜ 知人・友人と
>お子様連れ : 子供可
>ホームページ	: http://osietesite.com/gourmet/tokyo/yosyoku/niku/vimon

>出典：食べログ

___



* [Thriller / マイケル・ジャクソン](https://youtu.be/4V90AmXnguw)

　言わずと知れた名曲


><b>ザ グレートバーガー<b>
>
>評価点数：3.77点
>レビュー件数：682
>
>利用シーン：家族・子供と ｜ 一人で入りやすい ｜ 知人・友人と
>お子様連れ：子供可
>ホームページ：http://www.the-great-burger.com
>
>出典：食べログ

___



　歌詞がある場合どうか？若干心配でしたが、イメージと合ってるお店がレコメンドされていると思います:v_tone1:。この作業は面白く、永遠とやってられそうです:laughing:

# ８．まとめ
　今回、“10,000点の音声（BGM）データを解析するAI開発コンテスト”と聞いて、このテーマをどうしてもやりたいと感じ取り組みました。73分類とかなり挑戦的な試みで、結果として精度が出せませんでしたが、Neural Network Consoleを使うことでネットワーク設計の容易さ、GPUの学習速さはもちろん、モデルの問題点、改善手法が容易に検討できることが素晴らしいと感じました。
　また、検証は曲のサビのみでのレコメンドでしたが、時系列でサンプリングしてレコメンドを比較したり、プレイリスト内でのレコメンドをアンサンブル解析などすると、より面白くなるのではと思いました。
　
　楽しいChallengeをありがとうございました。　以上です。