YouTube動画からアクション候補認識まで:行動提案AIの前処理パイプライン構築
※ 本記事では特定のゲーム名は伏せ、技術的な構成と設計判断に焦点を当てています。
目的
リアルタイム対戦型モバイルゲームのプレイ動画から、
-
画面に映るアクション候補UI(固定スロット数)を安定して認識し
-
その結果を使って、将来的に
- 「次に何を出すべきか」を提案するAI
を作るための 前処理・学習パイプライン を構築する。
本記事は、そのうち YouTube動画 → アクション候補認識モデル(CNN) までをまとめたものです。
全体構成(今回到達した地点)
※ 本記事では、画面下部に表示される「同時に選択可能なUI群」を
アクション候補UI と呼ぶ。
本実験環境では 4スロット構成 だが、設計自体は固定スロット数のUI一般に適用できる。
YouTube動画(mp4)
↓
ROI抽出(手札領域)
↓
4スロット分割・クロップ
↓
ラベリング(人手)
↓
CNN学習(8クラス)
↓
in_hand(8次元)を動画から推論
動画取得方法(著作権配慮)
- YouTubeを スマホで再生
- scrcpy でPCにミラーリング
- Snipping Tool で ローカルに mp4 録画
この方法により:
- 動画はローカル処理のみ
- 画像データを公開せずに研究可能
学習用アクション集合(固定構成)の選択
なぜ「学習用アクション集合(固定構成)」が必要か
行動模倣(Behavior Cloning)では、
上手いプレイ動画が大量に存在することが極めて重要。
→ 学習用として、YouTubeに動画が豊富な
**固定構成系の定番アクション集合(固定構成)**を採用。
アクションID定義(固定クラス数・一般化)
※ 本記事では、画面上で選択可能な各操作単位を アクション と呼び、
それらを抽象的な アクションID として管理する。(8クラス分類・一般化)
ACTION_1
ACTION_2
ACTION_3
ACTION_4
ACTION_5
ACTION_6
ACTION_7
ACTION_8
- 実際のアクション名・役割は内部定義のみで扱う
- 記事・ログ・学習データ上は抽象IDのみを使用
- これにより、ゲーム固有情報から切り離した設計が可能
ROI設計(最大の山場・一般化)
※ 上図は 特定のゲームに依存しない模式図 であり、
フルフレームから画面下部の「アクション候補UI(固定スロット数)」のみを
ROI(Region of Interest)として切り出す考え方を示している。
※ ROI(Region of Interest) とは、画面全体の中から「解析対象として切り出す領域」のことを指す。
本記事では、動画フレーム全体を直接解析するのではなく、
操作に関係するUIが存在する画面下部のみをROIとして切り出すことで、
計算量削減と精度向上の両立を図っている。
課題
- 画面下部に「使用可能リソースUI」が存在
- 手札は横並び(固定枚数)
- 選択操作によりUIが一時的に移動する
方針
- リソースUIは除外(学習ノイズ)
- ただし操作時のUI移動は吸収する
確定したROIパラメータ(相対指定・一般化)
y_ratio = 0.80
height_ratio = 0.14
x_margin = 0.13
x_offset = 0.09
- すべて画面サイズに対する比率指定
- 固有UI解像度に依存しない
- 他ゲーム・他動画でも再調整しやすい
クロップ収集
python -m scripts.collect_hand_crops \
--video XXXX.mp4 \
--video-fps 4 \
--max-frames 400 \
--y-ratio 0.80 \
--height-ratio 0.14 \
--x-margin-ratio 0.13 \
--x-offset-ratio 0.09
- 4fps × 400フレーム
- 各フレームから 4 枚 = 約1600画像
ラベリング設計
操作
1–8 : アクション割当
n : スキップ(空・補充中・見切れ)
b : 戻る
q : 終了
重要ルール
- 迷ったら必ず n
- 空スロット/補充中フレームは教師にしない
CNN学習
python -m scripts.train_hand_cnn --labels data/hand_labels.jsonl
- image_size: 96
- augment: ON
- session単位で train/valid split
学習結果は runs/yyyymmdd_xxxxxx/ に保存。
動画に対する推論
python -m scripts.infer_hand \
--video XXXX.mp4 \
--video-fps 4 \
--max-frames 200 \
--model runs/XXXX/model.pt \
--y-ratio 0.80 \
--height-ratio 0.14 \
--x-margin-ratio 0.13 \
--x-offset-ratio 0.09 \
--smoothing majority \
--history 5
- 各時刻で
in_hand(8次元)が出力 - YouTube動画でも概ね安定
得られた知見(一般化)
-
ROI設計が全体難易度の大半を占める
-
不要UI(リソースバー等)は積極的に除外する
-
行動提案AIでは
- 画像そのものより
- 構造化された state(JSON)が強力
これらは特定のゲームに限らず、
リアルタイムUIを持つ多くのゲーム解析に共通する
次のステップ(次回記事)
-
in_handの変化から- 「アクションを出した瞬間」を自動検出
-
card_id → ROLE 変換
-
state → ROLE の Proposal Model 学習
まとめ
YouTube動画という制約のある入力でも、
- ROI設計
- 安定化
- 構造化
を丁寧に行えば、
実用的な教師データ生成パイプラインを構築できる。
次はこの土台の上で、
「考えるAI」側に進む。
続編予告(次回記事)
次回は、本記事で得られた アクション候補UIの時系列データ を用いて、
- UIの変化から「操作イベント」を自動抽出する方法
- ノイズ(誤認識・一時的な欠損)に強い判定ルール
- 抽出したイベントを学習用データに変換する設計
についてまとめる予定です。
動画から直接「いつ・何を操作したか」を復元することで、
行動提案AI(Proposal Model) の学習データを自動生成するところまでを扱います。
この記事が、
- ゲーム解析
- 操作ログ復元
- UI解析
といった分野に取り組む方の参考になれば幸いです。
アクション抽出ロジック図解(続編用)
以下は、動画から推論した アクション候補UIの時系列状態 から、
実際の「操作イベント(action)」を抽出するロジックの全体像です。
動画フレーム
│
▼
[UI領域クロップ]
│
▼
[各スロット分類CNN]
│
▼
時系列 state
(in_hand: 固定次元ベクトル)
│
│ 例: t_ms ごとに
│ [1,0,1,1,0,1,0,1]
│
▼
[前フレームとの差分]
│
│ 1 → 0 の変化を検出
│
▼
操作候補イベント
(card_id, t_ms)
│
│ ・単発ノイズ除去
│ ・連続フレーム確認
│
▼
確定 action
(used_action_id, t_ms)
差分検出の考え方
t = 1000ms : [1,1,0,1,0,1,0,1]
t = 1266ms : [1,0,0,1,0,1,0,1]
↑
このスロットが 1→0
- 1 → 0 : 操作によって消費された可能性
- 0 → 1 : 新しい候補が補充された(actionではない)
ノイズ耐性のためのルール
- 同じ 1→0 変化が Nフレーム連続(例: N=3)した場合のみ確定
- 一時的な欠損(3枚になる等)は無視
- 直後の 0→1 変化は「補充」として区別
出力される action データ(例)
{
"t_ms": 4800,
"used_action_id": "ACTION_3"
}
この action データと、同時刻の state を組み合わせることで、
(state_t) → (action_t)
という 行動模倣(Behavior Cloning)用データセット を自動生成できる。
※ 本図解は、特定のゲームに依存しない
リアルタイムUI操作ログ復元 の一般的な手法を示している。
