機械学習でツムツムを自動化してみる
はじめに
前回、以下の記事にて自動化自体は完成しているのですが、色と形でツムを認識させていたのですが、誤認識も多分にあってゴリ押し感が否めなかったので物体検出を用いてより精度の高いものに変更したいと思います。
前回記事
物体検出手法
今回は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です。
押して、移動して、離す。これの繰り返し。
さいごに
こういったゲームの自動化については、詳しく載せすぎるとよくないということもありますので、駆け足での説明になってしまいましたが必要な要素は記載したつもりです。興味のある方はチャレンジしてみてください。
ディスカッション
コメント一覧
Windows環境だとGraphillion がインストールできないらしく、Linuxで試してみようかとおもいました。使っているOSはなんでしょか。
コメントありがとうございます。
開発時に利用したOSはWindows 10です。
ご懸念のとおり、現在の最新バージョンではそのままインストールできないようですね。
当時利用したバージョンを記載しておきます。(一応win環境にpip installできることは確認しました。)
Graphillion==1.5
自分はパソコンのGPUがしょぼいのですが何か対処法はないでしょうか?
google colabだとpyautoguiが使えないみたいなのですが、、、
コメントありがとうございます。
マシンスペックに関しては、PCを購入する以外の解決法はないように思います。
colabだとどのみちツムツム自体のプレイができないはずなので、機械学習を行わず自動化する方向でいかがでしょうか?
当記事中の前回記事に記載の内容であれば、GPUはほぼ使用せずに実装できるはずです。
初めまして。
ツムツムが大好きで、まさかPythonでツムツムの自動化ができるとはビックリしました。
現在大学3年生で、プログラミングを勉強しています。
まだPythonでタイタニック号の生存予測しかした事がなくて、、marimoさんのように、ツムツムの画像処理と自動化をしてみたいです!
何から始めればいいのかは、前回の記事を参考にすればいいでしょうか
コメントありがとうございます。
前回記事の末尾に経路探索までのソースコードが載っている記事を追加しているので、そちらが参考になるかもしれません。
ツムの認識部分のパラメータ調整等は実行環境に依存する部分ですので、ご自身で調整いただく必要がございます。
物体検出を学んでいる者です。面白そうですね。
最近ツムツムスタジアム(以下ツムスタ)というツムツムの新作が出たので、それで自動化をしてみようと思います。
ツムスタの新要素として、ツムを繋ぐ際に一度来た経路を戻って分岐しても、指を離さなければ1チェーンになります。そのため最長経路ではなく分岐を全て通る経路を探索することになりそうです。
経路探索に関しては素人のため、躓いた際はコメントからアドバイスを頂けると嬉しいです。
なるほど。1つのツムにつき複数のグループを作っていたんですね…!距離を重みにする必要も無くなると。勉強になりました、ありがとうございます。
P.S.アノテーション50体もやる根気、凄すぎです…笑
このブログを参考に自動化することができました。
どうもありがとうございました。
グループ化はアノテーションの手間が要らない、教師なし学習のk-means法で実装しました。
簡単な分、サブツムによってバラツキが出ますが。
graphillionは定式化で一工夫必要(以下参照)でしたが、無事実装できました。
①ツム間の距離を計算
②他のツムと1つも繋がらないツムは除外
③残ったツムの中で、繋げられるツムの組み合わせを全探索し、ユニバースのリスト作成
④③で作成したユニバースリストからグラフセットを作成し、経路探索
フリーなのにライブラリが豊富で色々なことが出来るpython恐るべし。
もっと勉強したくなりました。
プログラミング初学者です。graphillionでの経路探索について質問です。同種のツムでも離れた位置にあるやつは経路から除外する必要があると思うのですが、どうやっているんですかね…?
ツムをグループ化する→そのグループの中で全てのツム同士の距離を測る→その値を辺の重さとして最長経路を求める→その際、ある距離より遠いツムは経路から除外する、とかかなぁと色々考えてみたのですが一向に分からないので、もし良ければ教えて頂きたいです。
コメントありがとうございます。
仰る通り、離れた位置のツムを除外する必要がございます。
プログラミン初学者様の案ではツム1種につき1グループを作成し、その中で距離が遠いツムをどう省いていくかという部分に悩まれていると思います。
私も作成途中に同じ問題に直面しまして、最終的にはツム1種につき1グループを作成するのではなく、近距離の同一ツム種でグループ化を行い、ツム1種に対して複数のグループが作成される作りにしました。
こうすることで、距離の遠いツムを省く必要もなくなりグループ内のツムが繋がっていることが保証されるため、距離を重みにする必要がなくなります。
重みが不要になったので、後は各グループに対して各々最長経路を求めれば自然と一番多くのツムを繋げられる経路が求められます。
もっと良い方法があるかもしれませんが、私のグループ化部分の実装は以上です。
ご参考になれば幸いです。
初めまして!有料でもいいので、自動化のやり方を教えていただけませんか?
コメントありがとうございます。
当記事ではPythonというプログラミング言語を用いて自動化を行っております。
プログラムの技量や知識レベルによりお教えする内容がかなり変わってしまうので、どこで躓いているか提示頂ければお答えできることがあるかもしれないです。
もし、プログラミング未経験の方であればこれを機にプログラムを勉強するというのはいかがでしょうか。他のゲームの自動化にも応用できて楽しいと思います。