機械学習サービスを用いたFallGuysのスコア集計アプリケーション

OVERVIEW

OCRを用いたFallGuysのスコア自動集計アプリ

YEAR 2022

制作目的: 
 私が参加している学生団体がFallGuysと言うゲームを用いてゲーム大会を主催する事になった。FallGuysとは、最後の一人になるまで戦うオンライン障害物競走ゲームである。ゲーム大会では、三試合行ったスコアの合計で十位までの順位を算出したいと考えているが、FallGuysにはスコア集計機能が無く、仕様上優勝者以外の正確な順位が分からない。そこで、ゲームの途中経過画面を認識しプレイヤーが進んだラウンドに応じてスコアを割り振る事で、一位以外のプレイヤーにもスコアが加算され差を付ける事ができるアプリケーションを作成したいと考えた。


アプリケーション概要:
 製作期間      - 2日間
 開発言語      - Python 3.9
 必須ライブラリ   - Tesseract, Cloud Vision API
 ※Tesseractファイルのダウンロード、Cloud Vision APIへの登録が必要
 ソースコード   - github - natunayu
 動作概要     - 起動するとスクリーン1のスクリーンショット(SS)を0.5秒毎に行い、ステージクリア画面か否かを判定する。ステージクリア画面だった場合判定したSSをCloud Vision APIへ送信しIDの文字列を取得する。動作遷移はCUI上で確認する事が可能である。


Tesseract:
 TesseractはGoogleが後援するOSSなローカルOCRである。簡単で比較的整った文字の認識を行う事ができる。FallGuysではステージクリア時に大きく「クリア」と言う文字が表示される為、その文字を識別して画面を判別している。


Cloud Vision API:
 Cloud Vision APIはGoogleが提供するクラウドOCRである。画像を引数として渡す事で、画像に内在する文字列を戻り値として取得する事ができる。Googleのサーバと通信する必要がある為、以下の様にPILライブラリで画像を切り出し、一枚の画像として送信する事で通信回数を削減している。

文字列の後処理:
 VisionAPIから受け取った文字列をそのままスコアに反映すると、OCRの些細な認識間違いでラウンド毎にプレイヤー名が増えてしまう。そこで受け取った文字列と前のラウンドに読み込んであるIDのレーベンシュタイン距離を動的計画法でそれぞれ求めて、最短のIDに保存する事で上記の問題を解決した。


結果と考察:
 正確に検出できたIDの割合は70%ほどで、実際に参加している人とは異なるIDで結果が表示される事象が多発した。しかし、予め参加者のIDをデータとして用意し、1ラウンド目からそのデータをレーベンシュタイン法の比較として用いる事で正確にスコア加算する事が出来た。また、後にスクリプトを書き換えてFHD環境ではなく4K環境で実行した所、FHD環境化よりも文字の認識精度が向上した事が分かった。他の問題として、稀にTesseractで行っているクリア画面の判定がスルーされてしまう事があった。代替案としてクリア画面の判定を特徴量検出に変更する方法もあったが、アップデートなどでクリアの字の装飾が変更され検出されなくなるケースを想定し変更を行わなず、クリア画面の判定間隔を0.5から0.1にする事でスルーしてしまう問題を解決した。


おわりに:
 OCRを用いたアプリケーションの作成を行った事は良い経験となった。
次の開催までにGUIを実装して、誰でも分かり易くスコアの閲覧操作ができる様なアプリケーションにしたいと考えている。