DeepSORT+YOLOv9による顔追跡

前回の記事でYOLOv9を使った顔検出器を作ることができました。今回はその際に生成した重みデータを利用して、顔追跡をしてみたいと思います。使うアルゴリズムはDeepSORTです。ちょこっとハマったので記事にします。機材はいつも通りのMacBook Pro。

![deepsort_output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/9c9f5cf3-41d8-b886-2687-76d22e16139f.gif)

# YOLOv9を準備する

#### 事前に準備した顔検出器の重みデータ

YOLOv9の学習データ(weight)は下記に格納されているものとします。

```bash
(base) $ ls /Users/shino/yolov9/yolov9/runs/train/exp14/weights
best.pt	last.pt
```

https://qiita.com/xtrizeShino/items/297e1bf25bce824cf4bc

## YOLOv9のダウンロード

まず、顔検出器の準備をします。YOLOv9をgitからcloneして、重みデータ(weights)のディレクトリを準備します。

```bash
(base) $ cd ~
(base) $ pwd
/Users/shino

# 作業ディレクトリを作成する
(base) $ mkdir deepsort
(base) $ cd deepsort

# YOLOv9を入手する
(base) $ git clone https://github.com/WongKinYiu/yolov9.git
(base) $ cd yolov9

# conda仮想環境を作成する
(base) $ conda create --prefix ./env python=3.8
(base) $ conda activate ./env

# YOLOv9実行に必要なパッケージをインストールする
(env) $ pip install -r requirements.txt 

# 学習した重みデータをコピーする
# -->> DeepSORTのソースコードにyolov9-e.ptがハードコーディングされている
(env) $ cp /Users/shino/yolov9/yolov9/runs/train/exp14/weights/best.pt ./
(env) $ mkdir -p weights
(env) $ mv best.pt weights/yolov9-e.pt
```

# DeepSORTを準備する

続いてDeepSORTを準備します。こちらのソースコードを利用させていただきました。

https://github.com/sujanshresstha/YOLOv9_DeepSORT

前手順で利用したPython仮想環境(`conda activate ./env`)のまま作業をしてください。YOLOv9とDeepSORT双方が必要なパッケージを仮想環境へインストールするためです。最後にYOLOv9をダウンロードしたディレクトリに`object_tracking.py`をコピーします。

```bash
(env) $ cd ~/deepsort
(env) $ pwd
/Users/shino/deepsort

# DeepSORTを入手する
(env) $ git clone https://github.com/sujanshresstha/YOLOv9_DeepSORT.git
(env) $ ls 
YOLOv9_DeepSORT	yolov9
(env) $ cd ./YOLOv9_DeepSORT

# 仮想環境にDeepSORTが必要なパッケージを追加する
(env) $ pip install -r requirements.txt

# DeepSORTのソースコードをyolov9ディレクトリ内に格納する
(env) $ cp object_tracking.py ~/deepsort/yolov9
```

# DeepSORTで物体検出

それでは早速以下の動画の顔追跡をしてみます。

https://pixabay.com/ja/videos/%E5%86%8D%E7%94%9F-%E5%AD%90%E4%BE%9B%E9%81%94-%E5%AD%90%E4%BE%9B-%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC-28097/

#### ディレクトリ構成を確認する

ダウンロードしたファイルをYOLOv9のディレクトリに`pray.mp4`として保存しました。最終的なディレクトリの構成は以下のようになります。

```bash
(env) $ cd ~/deepsort/yolov9 

# object_tracking.pyとplay.mp4があるか確認
(env) $ ls
LICENSE.md		figure				tools
README.md		hubconf.py			train.py
benchmarks.py	models				train_dual.py
classify		object_tracking.py	train_triple.py
data			panoptic			utils
detect.py		play,mp4			val.py
detect_dual.py	requirements.txt	val_dual.py
env				scripts				val_triple.py
export.py		segment				weights

# weightsがあるか確認
(env) $ ls ./weights
yolov9-e.pt

# クラス名のリストがないので作成
# -->> 顔しか検出しないので1行目にfaceとだけ書く
(env) $ mkdir ../configs
(env) $ echo "face" > ../configs/coco.names
(env) $ cat ../configs/coco.names
face
```

クラスラベルについては下記issueを参照しました。

https://github.com/mystic123/tensorflow-yolo-v3/issues/22

#### 推論を実行する

推論は以下のコマンドで実行します。

```bash
# 推論を実行（Ctrl+Cで終了）
(env) $ python object_tracking.py --video play.mp4 --output ./output.mp4
# 推論結果を表示
(env) $ open output.mp4
```

顔を追跡できていますね！画面外に出た人物のバウンディングボックスが若干残るのですが、これは再度フレームインする可能性があるため…かもしれません。

![deepsort_output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/441bc18b-eb76-93a0-4b2e-a5df89667512.gif)

お疲れ様でした！

#### さらなる評価

DeepSORTのオプションは下記の`Usage`の`7.Run the code`をご参考ください。

https://github.com/sujanshresstha/YOLOv9_DeepSORT