テニスの試合映像を分析するオープンソースのAIモデルを試してみた

# 1. はじめに
最近ロボットの記事ばかりでしたので、少し違ったものに挑戦したいなと考えておりました。そして自分はスポーツ観戦が好きなので、何かスポーツ関連のことはできないかなと調査していたところ以下のGitHubリポジトリを見つけました。

https://github.com/ArtLabss/tennis-tracking

これは硬式テニスの試合分析を映像からできる（と言っている）オープンソースです。

私は最近スポーツデータアナリストに関する書籍を読み、「自動でなんらかの試合のスタッツを記録できれば、試合の分析に大いに役立つのでは」とも思っていましたし、私自身、ソフトテニスの経験者なのでルールも知ってるから理解しやすいかも、ということでこれを試してみることにしました。

この記事では、👆のリポジトリを自分の環境にどのように構築したのかと、サンプルの試合映像をどこまで解析できたのかについて紹介していきたいと思います。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)

# 3. 構築手順
## 3.1. システムアップデート
```terminal:terminal(1)
sudo apt update && sudo apt upgrade -y
```
## 3.2. Python3 と仮想環境のセットアップ
```terminal:terminal(1)
sudo apt install python3 python3-venv python3-pip -y
python3 -m venv ~/tennis_env
source ~/tennis_env/bin/activate
```

## 3.3. Git リポジトリのクローン
```terminal:terminal(1)
git clone https://github.com/ArtLabss/tennis-tracking.git
cd tennis-tracking
```
## 3.4. YOLOv3 のウェイトファイルのダウンロード
YOLOv3 の学習済みウェイトファイルをダウンロードする必要があります。

```terminal:terminal(1)
wget -O Yolov3/yolov3.weights https://pjreddie.com/media/files/yolov3.weights
```

## 3.5. CUDA と cuDNN のインストール（トラブルシューティング）
まずこれがなんで必要だったかというと
```terminal:terminal(1)
python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))" 
```
👆を実行した際に `[]`（空だということ）が出力され、（GPUが認識されていない） ことが判明しました。


```terminal:terminal(1)
nvidia-smi 
```
の出力では CUDA 12.2 が表示されていましたが、nvcc --version を確認したところ CUDA 11.5 がインストール されていました。


```terminal:terminal(1)
ls /usr/local/cuda/lib64 | grep cudnn
```
の出力では cuDNN が未インストール であることが判明しました。

ということで、**仮想環境からは一旦出て、仮想環境ではない環境で**以下の対応を行いました。

### 3.5.1. CUDA 11.8 のインストール
```terminal:terminal(1)
sudo apt-get remove --purge -y cuda-* nvidia-cuda-toolkit
sudo apt-get autoremove -y

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run --silent --toolkit
```

### 3.5.2. cuDNN 8.6 のインストール
NVIDIA cuDNN ダウンロードページ から cudnn-local-repo-ubuntu2204-8.6.0.163_1.0-1_amd64.deb を取得して、そして以下のコマンドでインストールしました。

```terminal:terminal(1)
cd ~/Downloads
sudo dpkg -i cudnn-local-repo-ubuntu2204-8.6.0.163_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-ubuntu2204-8.6.0.163/cudnn-local-*.gpg /usr/share/keyrings/
sudo apt update
sudo apt install -y libcudnn8 libcudnn8-dev libcudnn8-samples
```

### 3.5.3. 環境変数の設定
CUDA と cuDNN をシステムに認識させるために、以下のコマンドを実行しました。

```terminal:terminal(1)
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
```

## 3.6. 依存ライブラリのインストール
requirements.txt に記載されたライブラリをインストールします。

```terminal:terminal(1)
pip install --upgrade pip
pip install -r requirements.txt
pip install sktime
```

またrequirements.txtの内容は以下のようにしました。

```txt:
requests==2.23.0
opencv_contrib_python==4.5.5.64
scipy==1.9.3
keras==2.14.0
pandas==1.1.5
torch==2.1.2
Flask==1.1.4
tensorflow==2.14.0
imutils==0.5.4
numpy==1.23.5
gradio==2.1.0
Pillow==8.3.0
filterpy==1.4.5
#sktime==0.8.0
sympy==1.9
scikit-image==0.18.3
```

## 3.7. TensorFlow が GPU を認識しているか確認
仮想環境 (tennis_env) に入った状態で、TensorFlow が GPU を認識しているか確認しました。

```terminal:terminal(1)
python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
```

そして、以下の期待される出力が出たのでOKとしました。
```terminal:terminal(1)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
```

# 4. サンプル動画を処理して動作を解析
ここまでで環境を構築できたら、以下のコマンドで**クローンしてきたリポジトリの中にあるサンプル動画**の解析をしてみます。
```terminal:terminal(1)
python3 predict_video.py --input_video_path=VideoInput/video_input3.mp4 --output_video_path=VideoOutput/video_output.mp4 --minimap=0 --bounce=0
```

そしてアウトプットされたファイルを以下のコマンドで確認しました。

```terminal:terminal(1)
ffplay VideoOutput/video_output.mp4
```
そして出てきた結果がこちらです。左がインプットファイル、右がアウトプットファイルの結果（写真）です。

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/871c34fc-b61b-486f-89c5-c23dec075c93.png)

クローンしてきたリポジトリのReadmeで紹介されているのと同じようにプレイヤーがBoxで認識されるとともに、ボールの軌道とコートのラインも認識されていることが確認できました。

# 5. まとめ
公開されているリポジトリを利用し、硬式テニスの試合を映像から分析できるオープンソースを自分の環境に構築し、サンプル動画の解析をすることができました。今後は、他の試合映像でも同様の解析が可能か検証していきたいと考えています。