続編:プレイ動画から自動でタップ位置を推定する AI を作る(tap‑teacher 〜 推論CLIまで)
この記事はhttps://qiita.com/y4o4/items/a68163ca6c7f5cfe2596 の続きです。
前編では、scrcpy + mouse capture による tap teacher パイプライン(画面録画+タップログ取得)までを構築しました。
本稿ではその後の
- タップ位置ラベルの自動生成(diff + tap prior)
- 学習用 manifest の構築
- 位置分類モデルの学習
- 推論 CLI の実装と評価
までを一気通貫で解説します。
1. tap‑teacher を安定稼働させる
1.1 画面録画とタップログ取得
PowerShell から以下を実行します。
.\tools\run_tap_teacher_mouse.ps1 `
-Seconds 120 `
-OutDir runs `
-Scrcpy "C:\path\to\scrcpy.exe"
- scrcpy で画面を表示・録画
- マウス左クリックを frame 座標で記録
- 録画後に ROI(盤面領域)を手動選択
出力例:
runs\run_YYYYmmdd_HHMMSS\
video.mp4
actions_tap.jsonl
taps.csv
meta.json
debug_pos/
2. タップ位置ラベル付け(diff + prior)
動画と tap ログから、spawn 位置(cell_id) を推定します。
python tools\label_position_from_diff.py `
--video runs\run_xxx\video.mp4 `
--actions runs\run_xxx\actions_tap.jsonl `
--out runs\run_xxx\actions_tap_pos.jsonl `
--grid-w 18 --grid-h 11 --dt-ms 900 `
--tap-prior --tap-sigma-frac 0.20 `
--debug-dir runs\run_xxx\debug_pos
ポイント
- diff 強度ベースで候補セルを列挙
- tap 座標がある場合のみ距離 prior を適用
- 動画末尾など frame が取れない tap は 安全に skip(落ちない)
3. 学習用 manifest.jsonl の生成
学習では diff 画像パスと cell_id をまとめた manifest 形式を使います。
python tools\build_pos_dataset.py `
--input runs\run_xxx\actions_tap_pos.jsonl `
--debug-dir runs\run_xxx\debug_pos `
--out runs\run_xxx\manifest.jsonl `
--min-conf 0.7
複数 run を結合して大規模データセットにできます。
4. 位置分類モデルの学習
4.1 train / val split
python tools\build_pos_dataset.py `
--input all_manifest.jsonl `
--out-train train.jsonl `
--out-val val.jsonl `
--val-ratio 0.2 --seed 42
少量データで val=0 になる場合も、runner 側で安全に fallback します。
4.2 学習
python train_pos_model.py `
--train-manifest train.jsonl `
--val-manifest val.jsonl `
--grid-w 18 --grid-h 11 `
--img-size 224 `
--batch-size 32 `
--epochs 15 `
--lr 1e-3 `
--seed 42 `
--out runs\pos_train\exp_001
出力メトリクス
- top1 / top3
- mean_manhattan
- within1 / within2 / within3(実用指標)
5. 推論 CLI(infer_pos_model.py)
学習済みモデルで manifest → pred 付き JSONL を生成します。
python infer_pos_model.py `
--model runs\pos_train\exp_001\model.pt `
--manifest val.jsonl `
--grid-w 18 --grid-h 11 `
--img-size 224 `
--out pred_val.jsonl `
--topk 5
標準出力に集計結果が表示されます:
within1=0.23
within2=0.31
within3=0.35
→ 「正解セル±1〜2セル以内」にかなり寄っていることが分かります。
6. 評価の考え方
- top1 正解率だけを見ると低く見える
- 実運用では 近傍に当てることが重要
- withinK 指標が実用性を示す
7. 次のステップ(YouTube 転移)
この位置モデルは diff 画像入力なので、YouTube 動画にも適用可能です。
- YouTube 動画から frame 差分を切り出す
- infer_pos_model で cell_id を推定
- 自動ラベル → 再学習
これで 教師なしに近い大量データ生成ループが完成します。
おわりに
本記事では tap teacher から始まり、
ラベル生成 → 学習 → 推論までを一気通貫で構築しました。
ここまで来れば、精度改善(3ch入力、モデル拡張)はすべて“上積み”です。
次回は:
YouTube 動画から自動で位置ラベルを生成する推論パイプライン を解説予定です。