【Python】サッカーの試合映像から選手をトラッキングする

今回は、サッカーの試合映像から選手を検出してトラッキングする方法を紹介します。

出来上がりのgif動画がこちらです。

※本動画は、Kaggleで公開されているDFL – Bundesliga Data Shootoutのデータセットに対して物体検出を行った結果です。
https://kaggle.com/competitions/dfl-bundesliga-data-shootout

完成版のコードはこちらです。該当のファイルパスを指定してご利用ください。

# パッケージをインストールする
%pip install ultralytics

# ライブラリをインポートする
from ultralytics import YOLO

# デフォルトのモデルをロードする
model = YOLO('yolov8n.pt')

# モデルを学習させる
model.train(data='data.yamlのファイルパス', batch=16)

# モデルを使って予測する
model.track('動画のファイルパス', save=True, show_conf=False)

それでは、順番にコードを解説していきます。

Pythonパッケージ、ライブラリをインストールする

# パッケージをインストールする
%pip install ultralytics

# ライブラリをインポートする
from ultralytics import YOLO

今回紹介する方法では、物体検出ライブラリ「YOLO」を使用します。
YOLOは「You Only Look Once」の略語で、2015年から存在する代表的な物体検出の手法です。
今回使用するのは「YOLOv8」で、2023年1月にUltralytics社からリリースされた最新版のライブラリです。
https://docs.ultralytics.com/

モデルに学習させるデータセットを用意する

今回の目的である、サッカーの試合映像から選手やボールを検出するためには、デフォルトの物体検知モデルに教師データを与えて学習させる必要があります。この場合の教師データは、試合の画像データと、その画像内に選手やボールの位置が記された(アノテーションされた)正解データが対になったものです。

この教師データをモデルに学習させることで、初見の画像に対しても選手やボールの位置を予測することができる、というのが物体検出モデルの基本的な仕組みです。そのため、十分な量の教師データを集められるかどうかが、モデルの精度向上のカギとなります。

しかし、自分でイチから画像データを集めて、そこに手作業でアノテーションするのは、とても時間のかかる大変な作業です。そこで便利なのが、世界中のユーザーが作成したデータセットを公開しているRoboflow Universeです。
https://universe.roboflow.com/

Roboflowはアメリカのベンチャー企業が提供するAI開発プラットフォームで、アノテーションから教師データ作成やモデル作成まで一気通貫で行うことができるサービスです。世界中のユーザーがRoboflowで作成した教師データやモデルを公開して、無料で利用することができるのがRoboflow Universeです。

今回はこちらの教師データをダウンロードして利用させていただきました。
https://universe.roboflow.com/roboflow-jvuqo/football-players-detection-3zvbc

データセットをダウンロードするまでの手順は以下の通りです。

①Roboflowのアカウントを作成します(無料です)

出典:Roboflow Universe(https://universe.roboflow.com/

②データセットを検索します

出典:Roboflow Universe(https://universe.roboflow.com/

③Download this Datasetをクリックします

出典:Roboflow Universe(https://universe.roboflow.com/

④「YOLOv8」のフォーマットを選択して、zip形式でダウンロードします

出典:Roboflow Universe(https://universe.roboflow.com/

モデルを学習させる

# YOLO公式から提供されている学習済みモデルをロードする
model = YOLO('yolov8n.pt')

# モデルを学習させる
model.train(data='data.yamlのファイルパス')

モデルを学習させるコードは非常にシンプルで、dataの変数に学習させたい教師データのパスを指定するだけです。
Roboflowのデータセットを使用する場合は、ダウンロードしたフォルダ内のdata.yamlという名前のファイルをパスに指定します。

さらに、以下のハイパーパラメータを設定することで、モデルの精度を向上させることができます。

  • batch:1回の学習あたりのデータを抽出する件数(デフォルトは16件)
  • epoch:学習の回数(デフォルトは100回)

学習済みのモデルは、/weightsの配下にbest.pt(最も精度の高いモデル)とlast.pt(最後に作られたモデル)の2つ作成されますので、いずれかのファイルをダウンロードして保存しておくことがおススメです。ちなみに、私の環境ではデフォルトの設定での学習に半日近くかかりました。

保存した学習済みのモデルをロードするコードは以下の通りです。

# 学習済みのモデルを読み込む
model = YOLO('モデルのファイルパス')

モデルを使用して試合映像から選手の動きをトラッキングする

サッカーの試合映像は、Kaggle上で公開されているDFL – Bundesliga Data Shootoutのデータセットを使用させていただきました。
https://kaggle.com/competitions/dfl-bundesliga-data-shootout

元の映像がこちらです。

出典:DFL – Bundesliga Data Shootout(https://kaggle.com/competitions/dfl-bundesliga-data-shootout

学習させたモデルを使用して映像から選手の動きをトラッキングするコードは以下の通りです。

# モデルを使ってトラッキングする
model.track('動画のファイルパス', save=True)

model.trackの引数に、物体検出を行う対象の動画を指定して、save=Trueとすることで検出結果を動画で保存することができます。
以下は、batch数16、epoch数100で学習させたモデルを使用して、物体検出を行った結果の動画です。

※本動画は、Kaggleで公開されているDFL – Bundesliga Data Shootoutのデータセットに対して物体検出を行った結果です
https://kaggle.com/competitions/dfl-bundesliga-data-shootout

デフォルトでは、検出されたオブジェクトが四角い枠で囲われ、そこにラベルと信頼度スコアが表示されています。
非表示にするには、show_labelsとshow_confのパラメータをそれぞれFalseに変更すればOKです。

今回は以上です。