2020年にアクセプトされた物体追跡(MOT)論文の実装を動かす

複数の物体追跡(Multi Object Tracking)の実装を試そうと思い、『[多人数トラッキング論文解説　Deep Affinity Network for Multiple Object Trackingを読む](https://qiita.com/pacifinapacific/items/9e45fdb0da03312c00aa)』を参考にしようと思ったのですが、Pytorch0.3を使用していて環境構築が難しそうだったので諦めました。代わりにこの論文を引用している論文を探して、Pytorch1.5.1でも動く実装を見つけたのでそのデモを動かしてみました。ここでは実行方法とその結果を紹介します。

#### 環境

- OS: Ubuntu 20.04
- CUDA 10.2

### 論文情報

- 論文: [Towards Real-Time Multi-Object Tracking](https://arxiv.org/abs/1909.12605)
- 実装: https://github.com/Zhongdao/Towards-Realtime-MOT

### docker

CUDA10.2を利用しているので、Dockerfileを自分で用意しました。動作検証はしていませんが、CUDA10.1の場合のDockerfileはgithubに公開されています。

```Dockerfile:Dockerfile
FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes
WORKDIR /build/
COPY scripts/provisioning-*.bash scripts/
RUN chmod 775 scripts/*.bash \
    && scripts/provisioning-base.bash  \
    && scripts/provisioning-python.bash    
RUN rm -rf /build

RUN groupadd -g 1000 admin
RUN useradd -m --uid 1000 --gid 1000 admin
USER admin
RUN mkdir /home/admin/note
WORKDIR /home/admin/note/
RUN jupyter notebook --generate-config
COPY jupyter_notebook_config.py /home/admin/.jupyter/jupyter_notebook_config.py
CMD ["jupyter" , "notebook" , "--ip=0.0.0.0"]
```

```bash:scripts/provisioning-base.bash
#!/bin/bash

apt-get update && apt-get upgrade -y --no-install-recommends \
 && apt-get install -y --no-install-recommends python3.6 
apt-get install -y --no-install-recommends python3-pip \
                    python3-setuptools \
                    python3-dev
apt-get install -y --no-install-recommends ffmpeg libsm6 libxrender-dev
apt-get install -y --no-install-recommends libgtk2.0-dev
apt-get install -y llvm-9

```

```bash:scripts/provisioning-python.bash
#!/bin/bash

pip3 install wheel==0.35.1
pip3 install opencv-python==4.2.0.34
pip3 install pandas==1.1.1
pip3 install matplotlib==3.3.1
pip3 install motmetrics==1.2.0
pip3 install Cython==0.29.21
pip3 install cython-bbox==0.1.3
pip3 install lap==0.4.0
pip3 install torch==1.5.1 torchvision==0.6.1
pip3 install jupyterlab==2.2.6
LLVM_CONFIG=/usr/bin/llvm-config-9 pip3 install llvmlite==0.34.0
LLVM_CONFIG=/usr/bin/llvm-config-9 pip3 install numba==0.51.2
```

###  デモを動かす

```
docker run --gpus 0 --rm -it --shm-size=256m -v "$(pwd):/home/admin/note" nabeyang/mot bash
```

READMEの"Pretrained model and baseline models"にあるリンクから学習済みモデルをダウンロードします。1088x608なら[ここ](https://drive.google.com/open?id=1nlnuYfGNuHWZztQHXwVZSL_FvfE551pA)からダウンロードできます(日本ではBaiduのリンクからダウンロードは出来ないと思います)。ダウンロードしたptファイルをプロジェクトのトップから`./weights/latest.pt`と置きます(オプションで指定するのでどこでも大丈夫です)。

動画を[ここ](https://www.pexels.com/video/rainy-weather-video-854204/)(ライセンスCC0)からダウンロードして`test.mp4`という名前でプロジェクトトップに置きます。そして、次のようにするとデモを動かすことができます。

```
python3 demo.py  --input-video ./test.mp4  --weights ./weights/latest.pt --output-format video --output-root ./root/
```

すると`./root`以下に実行結果が出力されます。僕の環境では`./root/result.mp4`はエンコードがうまくいかなかったので、後から次のようにしてmp4ファイルを作成しました。

```
ffmpeg -r 20 -i ./root/frame/%05d.jpg -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4
```

`demo.py`の中でも外部コマンドとして`ffmpeg`を使ってmp4ファイルを生成しているだけなので、そこを直せば手間が省けそうです。最後に実行結果をgif形式にして載せておきます。

**[元動画](https://www.pexels.com/video/rainy-weather-video-854204/)**
![in.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227/1c80fa16-b5ac-23ff-160b-a6061b4518df.gif)
**変換後**
![out5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227/3891bce7-89a1-01a6-d2de-e45d3db0b466.gif)