スマブラのAIを作ってみた

#背景
スマブラ好きなんですよ。
なんかAIチックなもの作りたいんですが、キャラクター検出はアノテーション面倒くさそうだし、逆にアノテーション頑張ればできることなので面白くなさそうだなと。
ということで、スマブラのステージ分類器を作ってみたいと思います。
(遊びの一環なので細かいところは適当です)


#条件設定
地味にベリーハード。
クラス数 ： 103

めんどくさいので画像は1枚から学習するワンショット学習
つまり学習用画像は103枚

条件
・終点化
・キャラクターはプリンとプリン
・トレーニングモードの全体図
・背景が動く場合は適当な一瞬

を学習用としました。
大戦場は終点化したら戦場になったのでなし、DLCもいないのでなし。
意外とステージ数あったので、多クラスワンショット分類という問題になってしまいました。

目標は単純にステージ分類がそれなりにできること。

<details><summary>クラス一覧</summary><div>

\['3Dランド', '75m', 'WiiFitスタジオ', 'いかだと滝', 'いにしえっぽい王国', 'いにしえの王国', 'いにしえの王国USA', 'すま村', 'すれちがい伝説', 'とある星', 'はじまりの塔', 'アンブラの時計塔', 'イッシュポケモンリーグ', 'ウィンディヒル', 'ウーフーアイランド', 'エイトクロスサーキット', 'エレクトロプランクトン', 'エンジェランド', 'オネット', 'オルディン大橋', 'カロスポケモンリーグ', 'ガウル平原', 'グリーングリーンズ', 'グリーンヒルゾーン', 'グレートベイ', 'ゲルドの谷', 'ゲーマー', 'コトブキランド', 'コンゴジャングル', 'シャドーモセス島', 'ジャングルガーデン', 'スカイロフト', 'スーパーしあわせのツリー', 'スーパーマリオメーカー', 'タチウオパーキング', 'ダックハント', 'テンガンざんやりのはしら', 'トモダチコレクション', 'トレーニング', 'ドラキュラ城', 'ドルピックタウン', 'ニュードンク市庁舎', 'ニューポークシティ', 'ノルフェア', 'ハイラル城', 'バルーンファイト', 'パイロットウィングス', 'パックランド', 'ビッグブルー', 'ピクトチャット2', 'ピーチ城', 'ピーチ城上空', 'フェリア闘技場', 'フォーサイド', 'フラットゾーンX', 'フリゲートオルフェオン', 'ブリンスタ', 'ブリンスタ深部', 'プププランド', 'プププランドGB', 'プリズムタワー', 'ペーパーマリオ', 'ポケモンスタジアム', 'ポケモンスタジアム２', 'ポートタウンエアロダイブ', 'マジカント', 'マリオUワールド', 'マリオギャラクシー', 'マリオサーキット', 'マリオブラザーズ', 'ミッドガル', 'ミュートシティSFC', 'メイドインワリオ', 'ヤマブキシティ', 'ヨッシーアイランド', 'ヨッシーストーリー', 'ヨースター島', 'ライラットクルーズ', 'ルイージマンション', 'レインボークルーズ', 'レッキングクルー', 'ワイリー基地', '再開の花園', '初期化爆弾の森', '夢の泉', '天空海', '子犬がいるリビング', '惑星コーネリア', '惑星ベノム', '戦場', '戦艦ハルバード', '攻城戦', '朱雀嬢', '村と街', '汽車', '洞窟大作戦', '海賊船', '特設リング', '神殿', '終点', '野原', '闘技場', '頂上']

ステージ名謎なやつ多いな...
</div></details>



#作戦
ステージの全体図とはこんな感じである。

![いにしえっぽい王国.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/bce09e66-299c-d18f-812d-c5cbb6ebfdc7.png)

実際の戦いではこんなに広いことはないので、このでかい写真を切り出すことで、それっぽい大きさにする。切り出し方を変えることで写真数を増やすことができます。

学習用に切り出したイメージ

<img width="743" alt="スクリーンショット 2020-04-20 17.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/b1189169-11fe-35a0-f7cd-8cb4e5a81164.png">

切り出した際には
・いくつかのスケール(今回はとりあえず3つ)で切り出す
・重複あり
・基本適当だけど、背景のテクスチャをなんとなく学習できれば良いかと思っていた
・たぶん各ステージ162枚生成している
・切り出した時は、とりあえず作っておいてうまくいかなければここを適宜修正しようと思っていた

検証データは実スケールのこんな感じ

![いにしえっぽい王国.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/9c43fe02-eceb-f350-d87f-1af3f922c917.png)
この写真で検証している。
この画像を(224,224)にreshapeして前処理してから用いている。
trainと比べて部分的ではない。また、大きめの範囲になっている
ただし、面倒なので検証用の画像も一枚しか用意してない。

#ネットワーク構造
mobile-net-v2をpytorch.torchvisionから吸い出して使いました。
画像の枚数が103クラス×162枚で結構増えたので軽量なネットワークにしておきました。
出力層だけ103クラスに変えてます。

#結果

まずはどのくらい正解できているかを確認してみます。
とりあえずは、10epoch回したあとの結果を確認してみます、

###精度

|train acc  |test acc  |test|
|---|---|---|
|96.9%  |91.3%  |94  /  103 |

意外とうまくいっていた笑



###定性評価
とりあえず自分の対戦動画の１シーンを保存していれてみた。
この画像を(224,224)にresizeしてネットワーク通しただけです。

![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/f116f2e4-74fd-3608-59c4-2d1245588ffe.jpeg)

結果
<img width="300" alt="スクリーンショット 2020-04-21 23.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/a5784e93-f4e9-c573-ca77-2e7cf696c316.png">

65クラス目のマジカント...正解！

すげぇ...笑

もう何枚か入れてみましょう.

せっかくなので、プリンがいない画像にしてみます。
2枚目、グリーングリーンズです。


![test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/c674ba40-513b-6a9c-9441-7a7b4e94d234.jpeg)

<img width="300" alt="スクリーンショット 2020-04-23 14.38.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/822cc156-26b8-27c3-a9c1-2e77aca3caf0.png">

3枚目、終点化戦場です。

![test3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/0342c6c2-c5f5-54f7-8126-f9290c5ae23c.jpeg)



<img width="220" alt="スクリーンショット 2020-04-23 14.40.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/f7dfac51-b6d4-6cf3-3386-c7e7577de8b3.png">

どれも正解でした。


###何を間違ったか

・そもそもアノテーションの時に気がついたこと
マリオブラザーズ
![マリオブラザーズ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/25335f93-8481-01c9-8a66-2fbfc537708b.png)

バルーンファイト
![バルーンファイト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/01df4ae6-a4da-03b7-0107-2e3a46e0be57.png)

75m(なんだそのステージ名w)
![75m.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/e13d61da-4188-5a06-d467-eff389389639.png)

台が違うけど、かなりテクスチャは近いというか低解像度にしたら背景はほぼ一緒笑
こいつらは多分間違えてもしゃーないと思ってます。

・あとは背景が動くシリーズです。
アンブラの時計塔というステージは背景が大きく動くので、対戦中に気持ち悪いとか言われることが多いステージです。
終点も基本のステージだけど、結構激しく背景動くんですよね。
今回はワンショット学習なので、背景変わるとまるっきり違うものになってしまう可能性があるので、これも仕方ないです。

そういう意味では、7割~9割を期待していたので結果はまぁまぁ良かったです。

<details><summary>各クラスの正解不正解</summary><div>

ステージ名|正解か
---|---
3Dランド |○
75m |○
WiiFitスタジオ |○
いかだと滝 |○
いにしえっぽい王国 |○
いにしえの王国 |○
いにしえの王国USA |○
すま村 |○
すれちがい伝説 |○
とある星 |○
はじまりの塔 |○
アンブラの時計塔 |×
イッシュポケモンリーグ |○
ウィンディヒル |○
ウーフーアイランド |○
エイトクロスサーキット |○
エレクトロプランクトン |○
エンジェランド |○
オネット |○
オルディン大橋 |○
カロスポケモンリーグ |○
ガウル平原 |○
グリーングリーンズ |○
グリーンヒルゾーン |○
グレートベイ |○
ゲルドの谷 |○
ゲーマー |○
コトブキランド |○
コンゴジャングル |○
シャドーモセス島 |○
ジャングルガーデン |○
スカイロフト |○
スーパーしあわせのツリー |○
スーパーマリオメーカー |×
タチウオパーキング |○
ダックハント |○
テンガンざんやりのはしら |○
トモダチコレクション |○
トレーニング |○
ドラキュラ城 |○
ドルピックタウン |×
ニュードンク市庁舎 |○
ニューポークシティ |○
ノルフェア |○
ハイラル城 |○
バルーンファイト |○
パイロットウィングス |×
パックランド |○
ビッグブルー |○
ピクトチャット2 |○
ピーチ城 |○
ピーチ城上空 |○
フェリア闘技場 |○
フォーサイド |○
フラットゾーンX |○
フリゲートオルフェオン |○
ブリンスタ |○
ブリンスタ深部 |○
プププランド |○
プププランドGB |○
プリズムタワー |○
ペーパーマリオ |○
ポケモンスタジアム |○
ポケモンスタジアム２ |○
ポートタウンエアロダイブ |○
マジカント |○
マリオUワールド |○
マリオギャラクシー |○
マリオサーキット |×
マリオブラザーズ |○
ミッドガル |○
ミュートシティSFC |○
メイドインワリオ |○
ヤマブキシティ |○
ヨッシーアイランド |○
ヨッシーストーリー |×
ヨースター島 |○
ライラットクルーズ |○
ルイージマンション |○
レインボークルーズ |○
レッキングクルー |○
ワイリー基地 |○
再開の花園 |○
初期化爆弾の森 |○
夢の泉 |○
天空海 |○
子犬がいるリビング |○
惑星コーネリア |○
惑星ベノム |×
戦場 |○
戦艦ハルバード |○
攻城戦 |○
朱雀嬢 |○
村と街 |○
汽車 |○
洞窟大作戦 |○
海賊船 |○
特設リング |○
神殿 |○
終点 |×
野原 |×
闘技場 |○
頂上 |○

</div></details>


#感想
100クラス以上の分類の地点でそれなりに難易度は高めなんですよね。
思ったより良かったので、ちょっと何かミスったかなと思ったレベルです。

まぁでもtestの全く関係ない画像でうまくいってるので動作上は問題ないかな。
103クラスあると、適当だと当たらないことを踏まえると、上出来。


#データとコード

コード
https://github.com/daikiclimate/sumaAI

データ
https://drive.google.com/drive/folders/1BUvnfLVzl34CTk3eE5lUc69PXvSx_4LT?usp=sharing

まぁそんなに応用先もなければ、基本的に需要もないので、適当です笑
動けばいっかな〜くらいでやりました。