supervision (byte-track) お試し

roboflowが提供している、supervisionというアプリを試してみましたので、記録します。

元ネタ: https://github.com/roboflow/supervision

今回は、[tracking](https://github.com/roboflow/supervision/tree/develop/examples/tracking)について試しました。これは、yolov8とbyte-trackを利用して、動くオブジェクトにIDを割り振りつつ、できるだけ同一IDを割り当てようと試みるアプリです。

著作者の[提供動画](https://user-images.githubusercontent.com/26109316/207858600-ee862b22-0353-440b-ad85-caa0c4777904.mp4)は、このような感じになっています。Qiitaの画像サイズ制限の中GIF化したので、カクカクしています。
![supervision_football.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/ad33ba36-3f21-6c84-8b40-08f403935b74.gif)

著作者のアピールは、以下の点だと思われます。
- これだけの人数が画面にいても、トラッキングIDが割り振れている
  - (思うところ) Yolov8を使うので、それなりに検知できるでしょ
  - (思うところ) それでも、なにかチューニングはしていそうだ
- プレイヤーがクロスしても、トラッキングIDが変わらない。安定して割当ができている
  - トラッキングは入れ替わりが弱い
  - (思うところ) Byte Trackの実力って、すごいのか!?


# 準備編
必要な環境をダウンロードしてきます。
- supervision 本体
- Yolov8 重みファイル (weights file)

## supervision

以下から、cloneします。
https://github.com/roboflow/supervision

## Yolov8 重みファイル

以下をたどって、お好みのサイズのモデルをダウンロードします。
https://github.com/ultralytics/ultralytics#models

ここでは、[Yolov8x](https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8x.pt)を利用しました。実行時、どこにおいたか指定するので、保管場所はどこでも可。

## インストール

今回使うのは、examples/tracking/script.pyになります。同じフォルダに、requirements.txtがあるので、トライエラーを好まない場合、以下で入れてください。

```
pip install -r requirements.txt
```

venv環境でも動くので、メイン環境を汚したくない場合は、適宜、venvで環境を作成してから実行してください。

中身は、このようになっています。
```
supervision
tqdm
ultralytics
```

このため、実行すると、supervisionとultralytics(Yolov8)がインストールされてしまいます。上記改造を行うので、supervisionは不要です。Yoloも、すでに他のところにclone済みの環境があれば、不要です。別にインストールしたパスから読み込むようにscript.pyを改造して、読み込ませればよいです。


# 改造編
トライした時点(2023/11)では、左肩に表示される情報が、期待通り(トラッキングID)ではなかったです。上で示した著作者の例や、次に示す実行例のように、トラッキング情報などを表示するには、改造が必要です。改造のポイントだけ記載します。

- annotators/core.py 内、textという変数
  - このテキストに、期待する文字列が入るように、変更
  - トラッキングIDは、detections.tracker_id で、取得することが可能
  - モデルID、モデル名は、modelオブジェクトで管理されている
    - これは、cocoモデルの番号なので、引き渡してもいいし、必要な番号を埋め込んでも取得可能
- 上記改造に伴って、副次的に改造する箇所が発生　


# 実行編
いくつか、事例を用意しました。いずれも、YouTubeの映像を処理して、GIF化しました。パッと見は、正しく動いているように見えるのですが、不意にトラッキングIDがずれます。GIFが小さすぎて見えない例で、すみません。


## city walk編
固定物で、最初から最後まで同じIDだったものは、左側にあるID8:信号と、ID15:信号くらいです。動いていない、という状況を考慮できれば、もう少し安定する気がします。(他力本願モード)
同じ方向に動いているものは、それなりに追えていると見えます。ただ、左から来て奥に進む車のように、形が変わったりすると、どうしてもIDが変わってしまうのかなぁ、という感想です。あと、bounding boxが変わると、IDが変わるように見えますね。

![out2-640](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/d28f9f8c-3d9c-7bb8-49ee-50cba7744e53.gif)

<iframe width="640" height="320" src="https://www.youtube.com/embed/bwJ-TNu0hGM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy"></iframe>

## shopping mall編
こちらの事例は、かなり正確に追跡できているように見えています。ID番号の消費が多いので、たくさんミスっているように思われますが、パッと見、ずれているようには見えないです。もともと、次の位置を直線的に予測しているので、このような直線的に移動する人物の検知は得意なのかもしれないです。

![out3-1280.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/bf99e72c-5927-167e-ef44-69791833d493.gif)

<iframe width="560" height="315" src="https://www.youtube.com/embed/WvhYuDvH17I" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

## crossing編
こちらは、Shopping Mallと同じように、直線的に右から左・左から右で移動が発生しています。が、人の密度が多いパターンです。どのboudning boxにどのIDを割り当てるのかは、IoUで決めているので、重なりが頻発すると、ロストしやすいのかもしれないです。(コードの確認まではしていないので、想像です) 多くの重なりがあっても、その重なりまるごと同じ方向に動き続ける場合は、大丈夫の場合もあるようです。ID10とID13は、右から左へ移動しますが、同じIDが維持されています。同様に、ID6、ID7、ID43も、右から左へ移動しますが、ID7が最後の最後でID274に変わってしまいます。このあたり、なにか調整係数をいじって対応できるのであれば、もう少し良さげな結果になるかもしれないです。(他力本願モード)

![out_4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213097/8ff9926f-99a0-db3e-b810-d813f41c2812.gif)

<iframe width="560" height="315" src="https://www.youtube.com/embed/E0lcUhfv8aQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

# まとめ
公開されているアリモノのコードで、ここまで物体検知して、トラックできるのは、すごいですね。IDを気にせず、人流を捉えるといったケースでは、活用できそうです。注意点としては、supervisionのままですと、GPLに引っかかってしまうところでしょうか。
パッと見、うまく動いていそうなケースがいろいろあるので、そのあたりの調整作業も、本格活用に向けて、何かしないといけないかもですね。なにに使うかで、仕上げ方が色々あるということです。

いろいろと他力本願とした課題がありますが、この話題はここまでです。

おしまい