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

第2回 IkaLogの基本的なしくみ

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

今回は,IkaLogの開発をふりかえりながら,IkaLogの画像処理の基本的な考え方,そしてその背景などについて説明します。

はじめての画面認識の検討

第1回で紹介したとおり,まずはゲームの画像に対してどのような処理をすれば画像認識を達成できるかを検討し始めました。

最初に,スプラトゥーンのプレイ動画を録画してみて,録画を何度か眺めてみました。幸いなことに,スプラトゥーンのゲーム中では,多くのメッセージはたいてい白色で,いつも画面上の同じ位置に表示されます。このため,白色の部分だけを抜き出して,OpenCVのテンプレートマッチング機能を利用して表示内容を検出すればいいのではないかと考えました。

スプラトゥーンのシステムメッセージが真っ白な色で表示されるということは,256階調のグレースケール画像として処理したときに,文字に近いところは255に近い値であり,つまりは非常に高いスレッショルド(閾値フィルタ)をかければシステムメッセージだけが白く残った画像が生成できるだろう,と考えました。その文字形状が綺麗に残った画像が生成できれば理想的です。

この手法がうまくいくか検討するために,オープンソースのビデオエンコードソフトウェアであるFFmpegに,スレッショルドフィルタを実装して試してみました。OpenCVでプログラムを書けばグレースケール化やスレッショルド化の処理も可能ですが,プログラムを書く前に様々なパターンをコマンドラインで試したかったため,まずはFFmpegで,以下のような中間画像の動画を生成できるようにしました。

A. 入力画像(背景=白以外,文字=白)

A. 入力画像(背景=白以外,文字=白)

B. 入力画像をグレースケール化

B. 入力画像をグレースケール化

C. グレースケール画像を明るさ230でスレッショルドした結果

C. グレースケール画像を明るさ230でスレッショルドした結果

実際に試してみると,意図どおり,検出したいステージ名(例:デカライン高架下)やルール情報(例:ナワバリバトル)などのメッセージが白色でくっきりと浮き上がっています。

ほかの例を見てみましょう。ゲーム終了後にWIN(勝利)もしくはLOSE(敗北)と表示されるシーンですが,こちらも同じ手順で中間画像を作成すると下記のイメージになり,勝敗の判定に使えるでしょう(ただし,実際のIkaLogはほかの画面で勝敗を判定しています)。

画像

Python,OpenCVとNumPyを利用することにした理由

IkaLogの開発には,画像処理ライブラリであるOpenCV,そして数値計算モジュールNumPyをおもに利用することにしました。

OpenCVはコンピュータビジョンに使われるさまざまな機能やアルゴリズムがライブラリ化されて収録されたものです。

OpenCV
http://opencv.org/

OpenCVには,以下のような機能が含まれています。

  • 画像ファイルを読み書き
  • 画像のフォーマット変換,加工
  • 画像に図形や文字列を描画
  • 画像処理でよく利用されるフィルタ
  • 画像からの特徴量抽出,マッチング,AR処理など
  • 画像処理で利用される機械学習

いろいろな機能があるため紹介しきれません(私自身,紹介するとして,内容をすべて把握しているわけではありません)が,「画像処理用のアーミーナイフのようなもの」だと思っていただければいいと思います。

開発を使用言語については,「CやC++よりも手軽に開発できる言語で,OpenCVと相性がいいものを使いたい」と考え,今回はPython 3で進めることにしました。

Python.org
http://python.org/

OpenCVには,Python向けバインディングモジュールやサンプルコードが含まれています。また,OpenCVのドキュメントもC/C++のほかPythonによる呼び出し例が説明されているため,ドキュメント類も豊富です。Pythonは「プログラミング言語の中では,OpenCVと相性がいい」と言えるでしょう。

Python上では,多次元配列や行列の演算などをPython上でかんたんに行えるモジュールであるNumPyが利用できます。NumPyは,科学技術計算,統計,また機械学習などの用途でよく利用されます。

NumPy
http://www.numpy.org/

NumPyを使ったプログラムは,シンプルに記述でき,しかもモジュール内で計算の最適化もされています。Pythonコード上でNumPyを使って計算すれば(本気で最適化したネイティブコードに敵うわけではありませんが),割と高速に計算してくれます。チューニングの苦労なしに十分な性能が得られるため,PythonとNumPyの組み合わせは,科学者やデータ分析に関わる方などにも人気があるようです。

IkaLogでは,OpenCVを介して得られた画像データを,大きな配列として扱い,NumPyを用いて計算します。このためNumPyも,OpenCVと同様に,IkaLogにとって欠かせないモジュールだと言えます。

著者プロフィール

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

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

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

コメント

コメントの記入