Upload
takeshi-hasegawa
View
1.675
Download
0
Embed Size (px)
Citation preview
IkaLogとはなんぞや
Nov 14, 2015 qpstudy Takeshi Hasegawa (@hasegaw)
本スライド中に登場するスプラトゥーン関連画像は任天堂株式会社の著作物からの引用です。
@hasegaw is 誰 長谷川 猛 (HASEGAWA Takeshi) twitter: @hasegaw Ø もともと、インフラエンジニア(2004-2011)
SEとしてシステム構築、客先のシステム運用、提案 気付いたらプリセールス~PMを担当するインフラエンジニア (ざっくりデザイン、工数/導入物品見積もり、 構築プロジェクトの管理、保守等の問い合わせ対応)
Ø フラッシュストレージを軸とした、アプリケーション高速化を支援するセールスエンジニア(2011-2014)
Ø ファブレス半導体ベンチャーでコンピュータ関連なんでも
2
著書/寄稿
3
(会場のみ)
4
スプラトゥーンとは
• 第三者視点(TPS)のシューティングゲームの一種
• インクで自分たちのナワバリを広げないと進めない
• シューティングが苦手でも バケツやローラータイプのブキで気軽に楽しめる
• 本気でやってる人たちは怖い
5
IkaLog誕生秘話
IkaLog開発の経緯
• スプラトゥーン プレイヤー同士で モツ鍋を食べていたら、戦績の統計の話に
• ゲームには、戦績の統計機能は存在しない
• 手動でExcelを使い戦績を整理している人も
7
とあるイカの戦闘記録
8
とあるイカの戦闘記録
9
とあるイカの戦闘記録
10
0"
2"
4"
6"
8"
0" 1" 2" 3" 4" 5" 6" 7" 8" 9" 10"
Kill Win/Lose
Win" Lose"
0"
1"
2"
3"
4"
5"
1" 2" 3" 4" 5" 6" 7" 8" 9" 10" 11"
Death����Win/Lose"
Win" Lose"0.0%$2.0%$4.0%$6.0%$8.0%$10.0%$12.0%$14.0%$
*5$ *4$ *3$ *2$ *1$ 0$ 1$ 2$ 3$ 4$ 5$
K*D
11
IkaLog 、誕生
• それ、手作業ってあまりに面倒なのでは?
• ツールを作ろう!
• ということで、作りました
12
IkaLog を使ってゲームを遊ぶと
13
HDMIキャプチャ
IkaLog 実行用PC
戦闘記録がログとなって残ります(゜Д゜)
14
{'rank_in_team': 2, 'weapon': 'デュアルスイーパーカスタム', 'result': 'win', 'kills': 1, 'time': 1444491154, 'cash_after': 1820744, 'players': [{'rank_in_team': 1, 'weapon': 'プライムシューター', 'kills': 2, 'deaths': 1, 'udemae_pre': 'B-', 'team': 1}, {'rank_in_team': 2, 'weapon': 'デュアルスイーパーカスタム', 'kills': 1, 'deaths': 0, 'udemae_pre': 'B', 'team': 1}, {'rank_in_team': 3, 'weapon': 'プライムシューター', 'kills': 1, 'deaths': 0, 'udemae_pre': 'C+', 'team': 1}, {'rank_in_team': 4, 'weapon': 'スプラシューターコラボ', 'kills': 1, 'deaths': 0, 'udemae_pre': 'B-', 'team': 1}, {'rank_in_team': 1, 'weapon': 'ジェットスイーパーカスタム', 'kills': 1, 'deaths': 2, 'udemae_pre': 'C', 'team': 2}, {'rank_in_team': 2, 'weapon': '3Kスコープ', 'kills': 0, 'deaths': 1, 'udemae_pre': 'B-', 'team': 2}, {'rank_in_team': 3, 'weapon': 'プロモデラーRG', 'kills': 0, 'deaths': 1, 'udemae_pre': 'B-', 'team': 2}, {'rank_in_team': 4, 'weapon': 'ダイナモローラーテ
スラ', 'kills': 0, 'deaths': 1, 'udemae_pre': 'B+', 'team': 2}], 'rule': 'ガチホコバトル', 'event': 'GameResult', 'deaths': 0, 'udemae_pre': 'B', 'map': 'アロワナモール', 'team': 1}
IkaLog の画像認識例
15
IkaLog の画像認識例
16
IkaLog の画像認識例
17
IkaLog の画像認識例
18
(会場のみ)
19
IkaLog のイメージ
20
HDMIキャプチャ
IkaLog 実行用PC
プラガブルで様々な使い方に対応
21
録画ソフト 自動制御
AmaRecTV
カラーLED連動
Fluentd 転送
スプラトゥーン戦績記録SNS
CSV/JSONファイル保存 スクリーンショット保存
SNS投稿
IkaLog
Embed IkaLog (ライブラリモード)
• IkaLog 自体が Python モジュールとして実装されている
• Python コードから IkaLog を実行して、情報を受け取れる
• 作ってみたアプリケーションの例
22
アプリケーション 説明
IkaRename.py スプラトゥーンのビデオを分析 ステージ/ルール/勝敗のついた ファイル名にリネームする
IkaClips.py スプラトゥーンのビデオを分析 敵を倒した/倒されたシーンだけクリップし、 “忙しい人”向けのサマリムービーを生成
マスク画像を使った 画像認識
ツールを作ろう(検討編 1)
その晩から、720p 1プレイ分の動画を相手に 検討開始 • 非圧縮 5分 → 20GB
OpenCV のテンプレートマッチングで試行錯誤 • 判ったこと:使えなそう – 誤検出が多い
– マッチングアルゴリズムが遅い 24
IkaLog の画像認識例
25
IkaLogの画像マッチング (第一世代)
26
ソース映像 マスク画像 加算画像
+ = =
正しいマスクを加算すると画像が真っ白になる
違うマスクを加算すると画像が真っ白にならない
入力画像から目的の色だけを取り出す
27
入力画像 黄色のみ
白のみ 黒のみ
RGB色空間とHSV色空間
28
RGB色空間 HSV色空間
引用元 hIps://ja.wikipedia.org/wiki/RGB hIps://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
©Wapcaplet ©Marc_Mongenet
数字の認識と機械学習
数字の認識 • ゲーム中で使われているフォントは2種類
• 認識対象になる数字フォントは1種類
• フォントが判っているのだから、認識できるはず
• 試行錯誤の末、既存OCRエンジンの利用は断念
• 機械学習ベースの認識エンジンを実装
30
既存OCRでの問題点 • Tesseract OCRを評価
– 認識率が安定しない
– もともと文章を読み取るためのもの – 1~2文字の文字、数字の認識は苦手
– 0, 8, 3 などを間違えることがある
– 今後問題があったときにアルゴリズムに 対して手が出せない
– Python 3.x スクリプト上から利用しづらい
• 既存の文章向けOCRエンジンよりも 単純で目的に適した認識方式を検討
31
文字として 認識されないことも
kNN(K近傍法)の考え方
32
● ● ●
●
■ ■
■ ■
? ▲
▲
▲
▲
?
?
?
?
とてもシンプルな機械学習 標本 の傍にあるサンプルがどれかで分類する。 K=1 の場合は最寄りのサンプルがあるクラスに分類される。 K=3 の場合は近くに3つのサンプルがあるクラスに分類される。
kNNによる図形マッチングのデモ(1/2)
• GitHub にソースあり – https://github.com/hasegaw/opencv_knn_example/
• 三つのパターン ○ △ □ で画像を生成し、 kNNで学習する
• ランダムに ○ △ □ から画像を生成し、その画像の種類を判定する – KNN を用いてそれに近い画像を見つけ出す
– 見つけた画像の種類から、答え(標本の種類)を特定
33
kNNによる図形マッチングのデモ(2/2)
34
問題図形をランダムに生成
K近傍法を用いて、学習済みの 図形から、もっとも近い図形を調べる
仕分ける ○ △ □
○ 学習済み図形
○ △ □
デモ風景
35
36
kNN による数値認識を実装後、はじめての テスト結果。10の位は文字画像の位置ズレで 誤認識が生じているが、1の位は100%認識 できた
数字の認識 1)画面上の数字部分(位置固定)を切り抜き
2)縦・横のヒストグラムを生成し各文字の位置を特定
3)文字を検出用サンプルのサイズ(等幅)にリサイズ、 二値化
4)KNNにより既知の検出用サンプルと照らし合わせて 認識する
37
38
死因の認識
死因の認識
40
死因の認識
• 「数値が認識できているから、 死因もなんとかなるだろう」
• 数字認識との共通点 – 目的の情報が白色なので二値化しやすい
– 文字列の位置を特定し、切り抜きできる
• 数字認識との相違点 – アニメーションにより、常にサイズが変化
41
死因の認識(3) 死因のリスト
42
死因の認識(3) • 基本は数字の認識と一緒
– 1文字単位ではなく文字列を一組として処理
– 文字列は左寄せして処理(したほうがいいのかはよく判っていない)
• 認識率はそれほど高くないが、認識回数で精度を確保 – IkaLogは現在毎秒10フレームほど解析している
– 下記例では、死因のメッセージ合計49fを解析し、 最多頻度は96gal_deco (18f, 36%) だった → 結果的に正解
43
votes={ 'supershot': 6, 'carbon_deco': 1, 'bucketslosher': 1, 'octoshooter_replica': 1, 'splashshield': 1, 'sshooter_collabo': 5, 'hotblaster': 2, 'pablo': 1, 'nzap89': 6, 'sharp_neo': 3, 'hotblaster_custom': 2, '96gal_deco': 18, '52gal': 1, 'hokusai': 1 }
ブキの認識
スプラトゥーンのブキ
• スプラトゥーンでは、50種類を超えるブキから 好きなものを選んで利用できる
• 全体的にバランスが取れているゲームだが 戦略や戦術、ブキの選択で優劣が発生する
• 分析したい -> 画像認識
45
スプラトゥーンのブキ画像リスト
46
スプラトゥーンのブキ 59種類(現時点)
画像判別においてのチャレンジ
• ブキ画像が小さい(47x45ドット・外枠込み)
• 表示条件(背景・被る画像)が変わる
• 誤判定すると後の統計結果に多大な影響が出る
• 一回の判定に使えるのは画像1枚のみ
47
他の装備品が被っている 保護色(まだマシ) 保護色(マジつらい)
スペクトラムによるブキ特徴量の算出
48
(まだバグがあった頃のバージョンの表示なので色がずれているけども) こんなかんじで特徴量を抽出していた → 認識率97%台
ブキ認識テストの様子(かなり初期)
49
ブキ認識の正答率があがらない
• アルゴリズムの改善を繰り返して 認識率97%台に。しかし、その先で伸び悩み – 戦績画面一回あたり、認識対象となるブキが8個登場
– 98%だと12~3ゲームに1回は認識ミスする計算
• モツ鍋を食べながらアルゴリズムの 改善方法を議論 – ラプラシアンフィルタの活用を提案される
– トレーニングデータで.xxガロンの分類が間違っていたのを修正
50
ラプラシアンフィルタを用いた ブキ画像 特徴量の算出
• 新アルゴリズムを導入(@itoooon 作)
• ラプラシアンフィルタを利用し、 最終的に64次元の特徴量を算出
• ブキ1000個の事前学習で11000個以上の分類(正答率99.99%以上)を達成!
51
入力画像 ラプラシアン フィルタ適用 グレースケール 輪郭情報 特徴量画像
(合計64ドット)
@itoooon
新しい特徴量算出方法での分類結果(1)
52
新しい特徴量算出方法での分類結果(2)
53
テストデータは12000弱 正解の一覧は作っていないので目視で確認
多分、分類できている
Webcam サポート
※ ソースコードは GitHub にありますが、現在開発中の 機能であり、一般ユーザー向けには提供していません。
Webcamサポート
• HDMIキャプチャデバイスを持っている人は少ない – ゲーム実況をするニコ生主などなら 持っているが…
– 新たに購入しようとすると、約2万円の投資
• HDMIキャプチャの代わりにWebカメラを利用できないか?
55
Webcam サポート(イメージ)
56
1) TV、ディスプレイに Webcam を向ける 2) WiiU のホーム画面を表示
3) IkaLog で Webcam を介して ワープ キャリブレーション 4) 以後 IkaLog は画面と認識した範囲に対して処理を行う デモムービー hIps://www.youtube.com/watch?v=d91xyyA-‐exA
OpenCVサンプル find_obj.py (1)
57
OpenCVサンプル find_obj.py (2)
58
HDMIキャプチャと間接キャプチャの比較
59
HDMIキャプチャ (H264録画) Webcamによる間接キャプチャ 雑なカラーコレクション適用済み
データの活用
stat.ink (戦績SNS)
• IkaLogユーザのひとり @fetus_hina さんが開発、運営する Web サイト
• IkaLog からのプレイデータを受け取り、表示・集計する
61
62
63
stat.ink (全ユーザのプレイ結果からの統計)
64
自分が4回以上死ぬと 試合への勝率が大きく下がる
IkaLog + stat.ink のDAU、処理ゲーム数
65
データソース hIps://twiIer.com/fetus_hina/status/654681918131142657
【ピーク】 120ユーザ/日
5,000ゲーム/日を分析、ログ出力
毎日 約70ユーザが利用 24時間あたり1500ゲーム以上を処理
入門方法
必要なもの
67
必要なもの
68
HDMI キャプチャデバイス
HDMI スプリッタ
HDMI ケーブル x2
スプラトゥーンの始め方
• 必要なものを揃えられる アフィリエイトリンク集を作りました
69
http://d.ballade.jp/2015/10/IkaLogStore.html
(会場のみ)
70
(会場のみ)
71
ありがとうございました。
72