6
5

More than 1 year has passed since last update.

[Python] YOLOを用いた物体検出と行動パターンの可視化 [Splatoon]

Posted at

はじめに

あるゲームにおける上位勢と中級者の違いを可視化できないかと考えて、行動パターンの可視化を試みました。
今回はTPS (Third-Person Shooter)ゲームとして、Splatoon3を選択しました。

Splatoon3とは

インクを撃ち合う、任天堂のシューティングゲーム『Splatoon』シリーズの3作目。インクを撃って自分の陣地を広げるという斬新なゲームシステムだけでなく、BGMやSEもイカしています。筆者のウデマエはXP2500程度で、中級者~ぐらいだと思います。

YOLOとは

YOLO (You Only Look Once)は、一枚の画像から複数の物体を検出できるアルゴリズムで、検出した物体のクラスも分類できます。その他のアルゴリズムと比べて、YOLOは処理が高速で、リアルタイムのアプリケーションも可能です。

image.png
You Only Look Once:Unified, Real-Time Object Detectionより引用
上記はYOLOの例です。人がairplaneとして検出されてしまっている箇所がありますが、おおむね精度よく検出できていることがわかります。

image.png
YOLOV5より引用

今回は比較的小さなモデルであるYOLOv5sを使います。
コードなどは別の記事でまとめたのでこちらでどうぞ。

LabelImgと学習データ

キャプチャーボードで自分のプレイ動画を録画しデータとしました。異なるステージやインク色で学習を行いたかったので、10試合の動画を使いました。
各試合から15枚ずつ、合計150枚の画像を取り出します。訓練用に100枚、検証用に50枚に分け、モデルの学習を行います。その際に、画像内から検出するものとして、以下のように8種類のラベルを手作業で作成しました。

  • イカ移動
  • 人移動
  • メインウェポン
  • サブウェポン
  • マップ
  • デス
  • 潜伏
  • スペシャルウェポン

LabelImg.png
LabelImgを用いたラベル作成例。図の場合は"メインウェポン"。

学習にはある程度時間がかかりますが、そのモデルを使って物体検出するのは非常に高速です。
run_time.png
実行中の画像ですが、1枚あたり10msほどです。

結果

このように学習させたモデルで、1試合分の行動検出を行ってみました。
trained_exp.gif

学習データで使っていたブキは、ボトルガイザーとドライブワイパー、ジムワイパーでしたが、ロングブラスターでも検出できていますね。
また、飛沫の上がっていないイカ移動を潜伏(hide)としましたが、ある程度検出できて驚いています。

ただし、今回は動画から適当に選んだ画像で学習したので、イカ移動やメインウェポンの学習データが多く、サブウェポンやスペシャルのデータがほとんど学習できなかったと思います。集めるデータを工夫すれば、精度はもっと改善すると思います。

次は

  • 自チームと敵チームの人数差をを有利 or 不利状況の度合いとし、各状況における行動パターン or 俯瞰視点から見た移動量の可視化(+上位勢と中級者の比較)
  • 自チームと敵チームのデスのタイミングとカウントの進行から、寄与の大きい行動の可視化

などを行いたいと思います。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5