前回の記事でYOLOv9を使った顔検出器を作ることができました。今回はその際に生成した重みデータを利用して、顔追跡をしてみたいと思います。使うアルゴリズムはDeepSORTです。ちょこっとハマったので記事にします。機材はいつも通りのMacBook Pro。
YOLOv9を準備する
事前に準備した顔検出器の重みデータ
YOLOv9の学習データ(weight)は下記に格納されているものとします。
(base) $ ls /Users/shino/yolov9/yolov9/runs/train/exp14/weights
best.pt last.pt
YOLOv9のダウンロード
まず、顔検出器の準備をします。YOLOv9をgitからcloneして、重みデータ(weights)のディレクトリを準備します。
(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を準備します。こちらのソースコードを利用させていただきました。
前手順で利用したPython仮想環境(conda activate ./env
)のまま作業をしてください。YOLOv9とDeepSORT双方が必要なパッケージを仮想環境へインストールするためです。最後にYOLOv9をダウンロードしたディレクトリにobject_tracking.py
をコピーします。
(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で物体検出
それでは早速以下の動画の顔追跡をしてみます。
ディレクトリ構成を確認する
ダウンロードしたファイルをYOLOv9のディレクトリにpray.mp4
として保存しました。最終的なディレクトリの構成は以下のようになります。
(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を参照しました。
推論を実行する
推論は以下のコマンドで実行します。
# 推論を実行(Ctrl+Cで終了)
(env) $ python object_tracking.py --video play.mp4 --output ./output.mp4
# 推論結果を表示
(env) $ open output.mp4
顔を追跡できていますね!画面外に出た人物のバウンディングボックスが若干残るのですが、これは再度フレームインする可能性があるため…かもしれません。
お疲れ様でした!
さらなる評価
DeepSORTのオプションは下記のUsage
の7.Run the code
をご参考ください。