【物体検出2022】BoT-SORTを使ってYOLOv7のモデルで物体追跡(MOT)を実装する

# はじめに

物体検出でお馴染みのYOLOシリーズの最新版「YOLOv7」について、動かしながら試していきます。
YOLOv7は2022年7月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。
今回の記事では、YOLOv7とBoT-SORTによる物体追跡(MOT)の実装方法を紹介します。
Google colabで簡単に最新の物体検出モデルを実装することができますので、ぜひ最後までご覧ください。

（詳細）

https://tt-tsukumochi.com/archives/5582

# YOLOv7とは
YOLOv7は2022年7月に公開された最新バージョンであり、5FPSから160FPSの範囲で速度と精度の両方ですべての既知のオブジェクト検出器を上回り、速度と精度の面で限界を押し広げています。
これまでのYOLOR、YOLOX、Scaled-YOLOv4、YOLOv5、 DETR、Deformable DETR、DINO-5scale-R50、ViT-Adapter-Bなどと比較しても速度と精度における他の多くのオブジェクト検出器を上回る結果を出しています。
特にYOLOv7-E6オブジェクト検出器（56 FPS V100、55.9％AP）は、トランスフォーマーベースの検出器SWIN-LカスケードマスクR-CNN（9.2 FPS A100、53.9％AP）よりも速度が509％、精度が2％が上回っており、畳み込みベースの検出器ConvNeXt-XLカスケードマスクR-CNN（8.6 FPS A100、55.2％AP）に対しても、速度が551％、精度が0.7％上回る性能を誇ります。
リアルタイム物体検出器に対して、パラメータを効果的に利用できる「拡張」及び「複合スケーリング」手法により、リアルタイム物体検出器のパラメータを約40%、計算量を約50%削減することができるとしています。


![yolov7_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/9ae526d8-f2cd-83d3-0235-d548d9da8f36.png)
（引用：https://arxiv.org/pdf/2207.02696.pdf）

YOLOv7のベンチマーク結果は以下となっています。
![yolov7_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/4b736cdd-b941-8c28-bc0a-8ea76e63865b.png)

詳細は以下のリンクよりご覧ください。

```
URL：https://arxiv.org/abs/2207.02696
コード：https://github.com/WongKinYiu/yolov7
```

なお、ライセンスは「GNU General Public License v3.0」となっています。

# Multiple Object Tracking（MOT）とは
Multiple Object Tracking（MOT）とは、動画に写っている複数の物体を追跡する手法の総称です。
MOTではそれぞれの追跡物体にIDを割り当てますが、同じ対象物にはなるべく同じIDを与え続けることを目指します。
MOTの利用ケースとしては、例えば動画から歩行者や自動車の数の数えるなどのタスクに利用することができます。

# Tracking by Detectionとは
MOTの中でも「Tracking by Detection」と呼ばれる手法があります。
これは、物体検出モデルによって動画の各フレームから追跡対象の物体を検出した後、フレーム間ごとに同じ物体に対して同一のIDを与えていきます。
動画の各フレームで検出された同じ物体の矩形（Bounding Box）に対してなIDを割り振ることによって、物体を「追跡」します。

# BoT-SORTの概要
BoT-SORT(Robust Associations Multi-Pedestrian Tracking)は2022年6月に発表された物体追跡の手法です。
カメラの動き補償に基づく特徴量トラッカーや、より良いボックスの位置決めのための適切なカルマンフィルタの状態ベクトルなどの改良を加えることで、検出による追跡を大幅に改善しています。
詳細は公式実装をご確認ください。

```
論文：https://arxiv.org/abs/2206.14651
コード：https://github.com/niraharon/bot-sort
```

# 環境構築

早速YOLOv7を使って動かしていきましょう。
ここからはGoogle colabを使用して実装していきます。
まずは「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更して、GPUが使えるようにしましょう。
GPUの設定が終わったら、Googleドライブをマウントします。

```ruby:python
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
```
公式よりcloneしてきます。

```ruby:python
!git clone https://github.com/NirAharon/BoT-SORT.git
%cd BoT-SORT
```

次に必要なライブラリをインポートします。

```ruby:python
!pip install -r requirements.txt
!python setup.py develop
!pip install cython
!pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
# Cython-bbox
!pip install cython_bbox
# faiss cpu / gpu
!pip install faiss-cpu
!pip install faiss-gpu
```
以上で導入は完了です。


# 学習済みモデルをダウンロードする
次に今回使用する学習済みモデルをダウンロードします。

モデルを格納する「pretrained」フォルダを作成します。



```ruby:python
!mkdir pretrained
```

「pretrained」フォルダにモデルを移動します。

```ruby:python
mv yolov7-d6.pt ./pretrained
```

MOT17のモデルをダウンロードします。

```ruby:python
!gdown 'https://drive.google.com/uc?id=1QZFWpoa80rqo7O-HXmlss8J8CnS7IUsN'
```

「pretrained」フォルダにモデルを移動します。
```ruby:python
mv mot17_sbs_S50.pth ./pretrained
```
以上で必要なモデルが揃いました。

# BoT-SORTでMultiple Object Trackingで実装する
BoT-SORTでMultiple Object Trackingで実装します。

今回はYOLOv7をベースとしています。

「–source Traffic.mp4」とすることで、Traffic.mp4動画に対して物体追跡を実装することができます。

```ruby:python
!python tools/mc_demo_yolov7.py --weights pretrained/yolov7-d6.pt --source Traffic.mp4 --fuse-score --agnostic-nms --with-reid

```

https://youtu.be/hlF7t0AZIQ4

# まとめ
最後までご覧いただきありがとうございました。
2022年7月に公開されたのYOLOシリーズの最新バージョンである「YOLOv7」について、Object Trackingの実装方法を紹介しました。
物体検出の活用の幅がさらに広がりそうですね。