開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

MacでIkaLogを使ってみる

 IkaLogという画像認識を用いてSplatoonの対戦結果を記録できるサービスがあるとのこと。

任天堂WiiU 用ソフト「スプラトゥーン」の画面をリアルタイム解析して、 いろいろなことができるソフトです。
引用元 : IkaLog/IkaUI.md at master · hasegaw/IkaLog · GitHub

 Windows版はexeファイルが公開されているなどサポートが手厚いようです。でもちゃんとMacLinuxのことも考えられているらしく、動画ファイルから解析する手順であればPython経由で使えそうなので、試してみました。

必要なライブラリのインストールとか

 まずPythonOpenCV、その他ライブラリを揃えます。homebrewがインストールされている前提で書いています。

brew install python3
brew install numpy --with-python3
brew link numpy
brew install opencv3 --with-python3
brew link opencv3 --force

pip3 install slackweb
pip3 install fluent-logger
pip3 install requests-oauthlib
pip3 install urllib3
pip3 install u-msgpack-python
pip3 install Pillow

# for IkaUI
pip3 install --upgrade --trusted-host wxpython.org --pre -f http://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix
pip3 install PyYAML

IkaLogをダウンロード

IkaLogのGitHubページの右にあるDownload ZIPで一式ダウンロードすればOKです。

IkaLogの実行

 実行するには設定ファイルが必要です。サンプルの設定ファイルIkaConfig.py.sampleIkaConfig.pyに名前を変更にします。
 続いてIkaConfig.py内の設定をイカのように変更します。

# if IkaUtils.isOSX():
#     source = inputs.AVFoundationCapture()
# else:
#     source = inputs.CVCapture()
source = inputs.CVCapture()

↑sourceを強制変更

# source.start_camera(0)                        # キャプチャデバイスから
source.start_recorded_file('/path/to/movie.mp4')      # ファイルからの読み込み

↑動画読み込み用に変更

実行

 pythonIkaLog.pyを実行します。

python3 IkaLog.py

 大体動画の時間と同程度の時間で解析が終了しました。ちなみに実行結果はイカのようになりました。

<ikalog.inputs.cvcapture.CVCapture object at 0x107ff0f98>: initalizing pre-recorded video file Segment_0001.mp4
start model.train 972
done model.train
Loaded weapons recoginization model.
ゲームスタート。マップ ハコフグ倉庫 ルール ガチヤグラ
[event] 00:14 on_game_start
[event] 00:21 on_game_team_color
[event] 00:22 on_game_go_sign
プレイヤーをたおした!
[event] 01:43 on_game_killed
プレイヤーをたおした!
[event] 01:55 on_game_killed
[event] 02:00 on_game_finish
<ikalog.scenes.result_judge.ResultJudge object at 0x10dd8cc18>: duration = 6039 ms
[event] 02:12 on_result_judge  judge: win, knockout: True
ゲーム終了。 ステージ:ハコフグ倉庫 ルール:ガチヤグラ 勝ち 2K/3D 使用ブキ:N-ZAP85 チーム内順位: 4 プレイ前ウデマエ S+
スクリーンショット ./screenshots/ikabattle_20151018_160531.png を保存しました
[event] 02:14 on_game_individual_result
Entering result_udemae loop
[event] 02:22 on_result_udemae  {'udemae_exp_after': 35, 'last_update': 142542.3757090424, 'udemae_str_pre': 's+', 'udemae_str_after': 's+', 'udemae_exp_pre': 32}
Escaped result_udemae loop
Entering result_gears loop
<ikalog.scenes.result_gears.ResultGears object at 0x10dd92128>: duration = 6439 ms
[event] 02:29 on_result_gears
Escaped result_gears loop
Watchdog fired. Closing current session
ゲームセッション終了
<ikalog.outputs.csv.CSV object at 0x10aa42da0> (enabled = True)
<ikalog.outputs.json.JSON object at 0x10aa671d0> (enabled = True)
[event] 02:29 on_game_session_end  death_reasons = {}

 使用武器はN-ZAP85ではなくわかばシューターなので、そこだけ画像認識が間違っていました。解析した動画ファイルは852×480pxで、引き伸ばした動画を解析に使ったのが原因かもしれません。しかしそこ以外は完璧だと思います。ika.jsonに実行結果が記録されるようです。

その他

 結果発表の20秒後に記録が保存されるようになっているようです。試合ごとに録画ファイルを変えていると待ち時間が短くうまく保存されないので、10秒後に保存するように変更したのをメモしておきます。

engine.py

self.session_close_wdt = context[
    'engine']['msec'] + (10 * 1000) # ここ

 次→MacでIkaLogとStatInkを連携する - 開発のヒホ