IkaLogの裏側~「スプラトゥーン」のリアルタイム画像解析はどのように行われているのか

第3回 「ニコ生主でもつかえるIkaLog」を目指してのWindows対応

この記事を読むのに必要な時間:およそ 5.5 分

GitHubでIkaLogを公開!

このような経緯を経て,IkaLogがWii Uの映像をHDMIキャプチャデバイスで入力し,リアルタイムに追跡できるところまで実装でき,2015年8月16日,GitHub上にIkaLogを初公開しました。なお,GitHubイニシャルカットの時点で搭載していた機能は下記のとおりです。

IkaLog イニシャルカットにおける認識項目

場面認識項目
ゲーム開始時ステージ名,ルール名を認識する
ゲーム終了時ゲームの勝ち/負けを認識する

IkaLog イニシャルカットにおける対応アクション

アクション説明
コンソール出力勝敗情報をコンソールに出力
CSV出力CSVファイル形式でゲームの勝敗記録をログ出力
JSON出力JSONファイル形式でゲームの勝敗記録をログ出力
Twitter投稿Twitterでゲーム結果をつぶやくbot
Slack投稿Slackチャンネルにゲーム結果を投稿するbot
Fluentd出力Fluentdにゲームの勝敗記録を転送
スクリーンショット保存リザルト画面をスクリーンショットとして保存

ところで,最初のバージョンのIkaLogは,画像認識処理(ステージ名,ルール名,勝敗)が100行,各種アクションの実装が500行,合計で600行のPythonスクリプトでした。

一方,現在のIkaLogは,関連スクリプトを含めて23,000行を超えています。開発開始から約1年で,初回リリースと比べて38倍の規模にまで大きなソフトウェアになったようです。

しかし,反応は思わしくなく……

IkaLogを公開はしてみたものの,反応は思った以上に冷ややかでした。Twitterのタイムラインにスプラトゥーンのプレイ記録がどんどん流れるような夢(妄想?)を見ていたのですが,実際にはそうはなりませんでした。実際問題として,多くの方が無秩序にスプラトゥーンのプレイ記録を投稿すれば,Twitterのタイムラインがノイズだらけになり,それはそれで困惑するでしょう。リバースエンジニアリングなしで実装したいという私の思いとは裏腹に,⁠どうしてプロトコルハックで済ませないのか?」といったコメントもいただきました。

IkaLogに対する反応が自分の想定を大幅に下回ったので,原因を自分なりに分析してみたところ,以下のような課題が思い浮かびました。

  • HDMIキャプチャデバイスを持っている人が少ないので,使える人が少ない
  • CSV/JSON,Fluetndで戦績を蓄積できても,それを分析できる人が少ない
  • IkaLogのためにPython3,OpenCVなどの環境を整備する元気のある人が少ない
  • IkaLogの設定ファイル(Pythonクラス)を書いてまで実行できる人が少ない
  • そもそも私以外に,こんなソフトウェアに期待している人がいなかった

ほかに理由はいろいろとあったかと思いますが,IkaLogでプレイヤーの興味が得られないのは,やはり「ソフトウェアとしての使い勝手の問題」だと考えました。⁠HDMIキャプチャデバイスが必要である」という点は大きなハードルに思えますが,ニコニコ動画でゲームを投稿しているニコ生主はすでにHDMIビデオキャプチャカードを持っているのですから,スプラトゥーンのプレイヤーが買えない理由はありません。このため,1つの目標として「ニコ生主でもつかえるIkaLog」を目指して,Windows環境における利便性を上げる努力をすることにしました。

Windowsバイナリ版の開発秘話

GitHubに初回バージョンをリリースした後の改善として取り組んだのが,Windowsバイナリ版の開発です。

IkaLogを使いたいスプラトゥーンプレイヤーに,自分でPython3やOpenCVをはじめとする依存モジュールを導入できる方がどれだけいるでしょうか。多くの方は,そのような作業はできませんし,その時間があったらスプラトゥーンをプレイする時間に充てると思います(私でもそうします⁠⁠。

当初GitHubに公開したIkaLogは,⁠とりあえず動作する」というレベルのPython 3で書かれたスクリプトでした(今でもそうですが……⁠⁠。しかし,スプラトゥーンのプレイヤー層へある程度普及させるためには,少なくともWindowsアプリケーションとして形を整えることが必要だろうと考えていました。そこで,下記の2つの要素に取り組み,Windowsバイナリ版のIkaLogを作ることにしました。

  • Py2EXEを用いて,Windows版バイナリ(.EXE形式の実行ファイル)を生成する
  • wxWidgetsを用いて,WindowsアプリケーションのようなGUIを提供する

PythonプログラムをEXE化する「Py2EXE」

PythonベースのプログラムをEXEファイルとして配布しているソフトウェアの例としてはDropboxのクライアントがよく知られていますが,Windowsバイナリ版のIkaLogもPythonコードを基に生成しています。

IkaLogのWindowsバイナリ版の生成には,Pythonスクリプトを.EXE形式に変更する仕組みとしてPy2EXEを使っています。Py2EXEは,かんたんに説明すると,下記の仕組みで動作します。

バイナリ生成時
  • Pythonプログラム(.py)を中間言語(.pyc)にコンパイルする
  • Pythonプログラム,依存しているモジュール群を1つのファイルにアーカイブする
  • 上記と,Pythonインタプリタ,そしてローダを含めた実行形式(EXE)のファイルを生成する
実行時
  • 実行形式(EXE)のファイルが,自身内のアーカイブから,Pythonスクリプトやモジュール(中間言語)を読み出す
  • 内蔵のPythonのインタプリタを起動し,アーカイブ内のプログラムを実行する

Py2EXEされたIkaLogには実行に必要なモジュール群が含まれているため,OpenCVやNumPyなどのモジュールがセットアップされたPython実行環境を作らなくても,普通のWindowsプログラムのように実行できます。このため,Windows上でIkaLogを使う際に,Pythonのインストールなどに苦労する必要はなくなります。

具体的にPy2EXEを試してみましょう。たとえば,Hello Worldとだけメッセージを出力するhello_world.pyがあるとします。

print('hello world')

これをPy2EXEで実行形式にする場合,下記の内容でsetup.pyファイルを作成します。optionsには,IkaLogで使っているものに近いパラメータを与えてみました。

from distutils.core import setup
import py2exe

setup(
    console=['hello_world.py'],
    zipfile=None,
    options={
        'py2exe': {
        'bundle_files': 1,
        'unbuffered': True,
        'optimize': 2,
        'compressed': 1,
        }
    }
)

そして,Py2EXEを配布元からダウンロード,インストールした環境において,以下の要領で実行ファイルを作成します。

Z:\hasegaw\bitbucket\GihyoIkaLog\src\03>python setup.py py2exe
running py2exe

  3 missing Modules
  ------------------
? readline                            imported from cmd, code, pdb
? win32api                            imported from platform
? win32con                            imported from platform
Building 'dist\hello_world.exe'.

Z:\hasegaw\bitbucket\GihyoIkaLog\src\03>dir dist
 ドライブ Z のボリューム ラベルは Shared Folders です
 ボリューム シリアル番号は 0000-0064 です

Z:\hasegaw\bitbucket\GihyoIkaLog\src\03\dist のディレクトリ

2016/06/15  21:37    <DIR>          .
2016/06/15  21:37    <DIR>          ..
2016/06/15  21:37         5,360,255 hello_world.exe
               1 個のファイル           5,360,561 バイト
               2 個のディレクトリ  142,070,349,824 バイトの空き領域

Z:\hasegaw\bitbucket\GihyoIkaLog\src\03>dist\hello_world.exe
hello world

著者プロフィール

長谷川猛(はせがわたけし)

(株)SRAで7年間のシステム構築&提案を経験したのち,Fusion-ioのセールスエンジニアを経て,フリーランスエンジニアとして活動中。『LDAP Super Expert』(技術評論社)に寄稿したほか,『Xen 徹底入門』(翔泳社)および『萌え萌えうにっくす!UNIX ネットワーク管理ガイド』(毎日コミュニケーションズ)の共著者のひとりである。

スノーボード,ごまラーメン,飼い犬のミニチュアシュナウザー「ラピス君」が大好き。