機械学習でツムツムを自動化してみる

2019年10月19日

はじめに

前回、以下の記事にて自動化自体は完成しているのですが、色と形でツムを認識させていたのですが、誤認識も多分にあってゴリ押し感が否めなかったので物体検出を用いてより精度の高いものに変更したいと思います。

前回記事

物体検出手法

今回はYOLOv3を使用してみます。
CNN(畳み込みニューラルネットワーク)を用いた物体検出アルゴリズムです。
利用にあたり、 特に深層学習についての勉強は必要ないと思います。
学習方法とモデルの利用方法だけを押さえておけば使用できます。

用意した学習データ

プレイ中のスクリーンショットを学習データとしています。
1枚のスクリーンショット内に角度の異なる複数のツムがいると思うのでそれほど枚数は必要ないです。
1ツムにあたり複数のスクリーンショットで100体ほど写っていれば問題なく認識すると思います。

アノテーション

アノテーションとは、学習データに対してラベル付けを行う作業です。
今回でいえば、この画像のこの範囲にこのツムがいるよって情報を付与する作業です。ある程度自動化もできるみたいですが、とりあえず手動でやって地獄を見ました。

アノテーション作業中

学習

アノテーションが無事に済んだら学習に取り掛かります。
学習中の画像はただのグラフなので割愛しますが、50体ほどのツムを認識させたため学習にはかなりの時間を要しました。
学習にはGPUを使用しGTX 1080で丸3日ほどかけてようやく納得のいく精度のモデルが作成されました。
次はこのモデルを使用していきます。

自動化プログラム

自動化プログラムをそのまま載せると多方面から怒られてしまうと思うので、自動化に必要な要素を記載しておきます。

プレイ画面の取り込み

これは画像処理ライブラリPillow(PIL)を使用すれば簡単に取得することができます。

ツム認識(物体検出)

作成したモデルを使用する部分です。
kerasのYOLOv3のyolo.pyを参考にすれば、物体認識した結果のボックス取得が容易です。

経路探索

前回記事では再帰的に経路探索を行っていましたが、同じツムが密集している場合に限り経路のパターンが増大し何十秒も最長経路が返ってこないことがありました。
そこでZDD(Zero-suppressed Binary Decision Diagram) を使用します。
興味がある方は調べてみてください。pythonではgraphillionというライブラリを使用することで楽に扱えます。
日本中にある駅を全て効率よく回る方法の算出等にも使えたりします。

マウスの操作

PyAutoGUIでOKです。
押して、移動して、離す。これの繰り返し。

さいごに

こういったゲームの自動化については、詳しく載せすぎるとよくないということもありますので、駆け足での説明になってしまいましたが必要な要素は記載したつもりです。興味のある方はチャレンジしてみてください。

自動化中の動画