【2024年度エラー修正版】BoT-SORTを使ってYOLOv7のモデルで物体追跡を実装する

# はじめに
日本語のサイトが2つしかなく、以下のサイトを読みながら実装しましたが、エラーが頻発しサイト通りに進まなかったです。

この記事を読めば、エラーなく実装までいけると思います。

同じようにつまづく人もいるかと思い、備忘録として投稿します。初投稿なのでお手柔らかに...

## 参考文献

この記事は以下の情報を参考にして執筆しました。1番目のサイトは学習済みモデル(yolov7-d6.pt)のダウンロードのコードが抜けているので、2番目のサイトが良いです。

- [【物体検出2022】BoT-SORTを使ってYOLOv7のモデルで物体追跡(MOT)を実装する](https://qiita.com/hkwsdgea_ttt2/items/0517bd323c341e7d38fe)
- [【物体検出2022】YOLOv7まとめ第8回 BoT-SORTで物体追跡(MOT)を実装する](https://tt-tsukumochi.com/archives/5582)

# 環境構築
Google Colabで実装します。

:::note warn
ランタイムのタイプはGPUにしてください。(最初TPUに設定してエラー出たので)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/1f611599-c67f-adf1-af89-b36d0aea23f2.png)

```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
```
以上で導入は完了です。
# 学習済みモデルをダウンロードする
次に今回使用する学習済みモデルをダウンロードします。

```ruby:python
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-d6.pt
```

モデルを格納する「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
```
以上で必要なモデルが揃いました。

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

動画は自分で好きなものをBoT-SORTフォルダの直下に配置してください。名前はTraffic.mp4に変更しておいてください。

「–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

```

# 実行したが、エラー発生！！！

:::note warn
発生したエラーと解決方法を記します。合計4つ+番外編1つ
:::

### 1. 追加で必要なライブラリをインポート

```ruby:python
!pip install lap yacs tabulate
```

### 2. Mapping関数の修正

再度実行すると新しいエラーが発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/3550bd7f-f5f8-bd05-ae3c-9ebb717eb587.png)

fast_reid/fastreid/evaluation/testing.py ファイルの 5 行目を以下のように修正。

```ruby:python
from collections import OrderedDict
from collections.abc import Mapping
```

### 3.  torch._six モジュールの修正
再度実行すると新しいエラーが発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/dffb6333-66a7-c59c-839f-332bbdc2e5ee.png)

fast_reid/fastreid/data/build.py ファイルの 12 行目を以下のように修正。
```ruby:python
from collections.abc import Mapping
```

### 4.  Numpyのnp.floatをfloatに修正
再度実行すると新しいエラーが発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/80e55ba0-1e1d-3afd-42c7-c9bf5e5a2a4a.png)

NumPy 1.20以降、np.floatは非推奨となり、代わりに組み込みのfloatまたはnp.float64を使用することが推奨されているそう。

そのため、np.floatをfloatまたはnp.float64に置き換えれば良い。

いちいち探すのは大変なので、VScodeで検索したところ、以下の3つのPythonファイルを書き換えれば良さそう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/c18cd3db-f6b8-3f73-3be6-7bf38e30cd62.png)

# 🚀無事、実行できた！🚀
再度、以下のコマンドを実行すると、
```ruby:python
!python tools/mc_demo_yolov7.py --weights pretrained/yolov7-d6.pt --source Traffic_4.mp4 --fuse-score --agnostic-nms --with-reid
```
こんな感じで物体検知が進みます。私の場合、1分30秒(89MB)の動画が8分ほどで完了しました。そもそもColabに動画をアップロードするのにも時間がかかった...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/f2f3e41a-55b0-d848-ecd4-cfacfca2e27e.png)
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/9cd74805-04ad-38c1-751a-db0384055a9d.gif)



## 番外編(そもそもYOLOが動かない場合)
最初に実行した時、このようなエラーが発生した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810395/ec21049c-1957-7d1c-ef69-600d557efeef.png)

まずは以下のコマンドで確認したが、ディレクトリは問題なく、本来ならモジュールをインポートできるはずだった。
```ruby:
pwd
```
```ruby:
cd /content/drive/MyDrive/BoT-SORT
```

# 解決法
Google Colabで新しくファイルを作成し、もう一度最初から同じ手順で実行するとこのようなエラーは消えた。なんだったんだ。。