【リアルタム物体検知】YOLACT for win10+webcam【セグメンテーション検出】

# ➊はじめに
`Google Colab`にて**YOLACT**のパワーを確認できたけど、やっぱり`ローカルPC`＋`webcam`を使用して、セグメンテーション検出の**リアルタイム性**を確認してみたいと思いました。
![yolact](https://user-images.githubusercontent.com/69660581/122188431-e83d9e00-ceca-11eb-99b9-dd0a34657088.gif)

※`NVIDIA製GPU`を持っていないという方、`Google Colab`のみで楽しめる記事もありますので、こちらをご参照ください。

- [【リアルタム物体検知】YOLACT for Google Colab【YOLOを超えた？】](https://qiita.com/PoodleMaster/items/d0bf9cac77e5af61c972)

# ➋やること
ノートパソコンである`DELL XPS15`（ win10 ＋ CUDA10.1 ＋ webcam ）で、**YOLACT（YOLACT++）**を試走させます。

|カテゴリ|SPEC|
|:-:|:-|
|OS|Windows 10 Pro(21H1)|
|CPU|[Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz × 4](https://ark.intel.com/content/www/jp/ja/ark/products/97185/intel-core-i7-7700hq-processor-6m-cache-up-to-3-80-ghz.html)|
|RAM|16.0 GB|
|GPU|[NVIDIA GeForce GTX 1050](https://www.techpowerup.com/gpu-specs/dell-gtx-1050-mobile-4-gb.b5910)|

# ➌YOLACT試走
詳細は、本家「[YOLACT](https://github.com/dbolya/yolact)」をご参照ください。

## (1)CUDAの確認
コマンドプロンプトから、CUDAのバージョンを確認します。
CUDAが既にインストールされている場合は(2)へお進みください。

``` cmd:CommandPrompt
nvcc -V
```
>**【結果】**
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.1, V10.1.243

NVIDIA社製のGPUがあるものの、まだ`CUDA`をインストールしていなかったら、以下、`Build Tool`と`CUDA`を落とし、順にインストールしてください。

|順番|ツール|ダウンロード|
|:-:|:-:|:-|
|1|Build Tool|[Build Tools for Visual Studio 2019](https://visualstudio.microsoft.com/ja/downloads/#build-tools-for-visual-studio-2019)|
|2|CUDA|[cuda-toolkit-archive](https://developer.nvidia.com/cuda-toolkit-archive)|

### ■Build Toolインストール
ダウンロードはこちらから。
<img width=400 src='https://user-images.githubusercontent.com/69660581/122312832-fb468180-cf4f-11eb-8dd3-1621249643ee.png'>

※Build Toolをインストールした際に、コンパイラである`cl.exe`に、PATHが通っていることを確認してください。`where cl`コマンド結果が、以下の様に表示されればPATHは通っています。PATHが通っていない場合は、PATHを通してください。

``` cmd:CommandPrompt
where cl
```

>**【結果】**
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x64\cl.exe

### ■CUDA10.1インストール
ダウンロードはこちらから。インストールするのは、`CUDA10.1 update2`で良いと思います。
<img width=400 src='https://user-images.githubusercontent.com/69660581/122312844-fe417200-cf4f-11eb-8915-3d2d56f3e2c0.png'>



## (2)python環境の構築
Anacondaを利用し、Pythonの仮想実行環境を構築します。

``` cmd:CommandPrompt
conda create -n yolact37 python=3.7
conda activate yolact37
```

## (3)yolactインストール
YOLACTをgitからCLONEします。

``` cmd:CommandPrompt
git clone https://github.com/dbolya/yolact
cd yolact
```

YOLACTを動作させるためのライブラリを追加します。

``` cmd:CommandPrompt
pip install cython matplotlib opencv-python "pillow<7.0" PyQt5
pip install "git+https://github.com/philferriere/cocoapi.git#egg=pycocotools&subdirectory=PythonAPI"
pip install torch==1.2.0 torchvision==0.4.0 -f https://download.pytorch.org/whl/torch_stable.html
```

## (4)モデル、画像、映像のダウンロード
`google drive`からダウンロードするツールをインストールします。

### ■download_google_driveインストール
``` cmd:CommandPrompt
git clone https://github.com/chentinghao/download_google_drive.git
pip install requests tqdm
```
### ■格納ディレクトリの作成
|ディレクトリ名|使用用途|
|:-|:-|
|d_sample|サンプル画像、動画を格納|
|d_sample_out|評価画像、動画の出力先|
|d_weights|モデルを格納|

``` cmd:CommandPrompt
mkdir d_sample d_sample_out d_weights
```

### ■YOLACTモデルのダウンロード
``` cmd:CommandPrompt
python download_google_drive/download_gdrive.py 1yp7ZbbDwvMiFJEq4ptVKTYTI2VeRDXl0 d_weights/yolact_resnet50_54_800000.pth
```

### ■画像＆動画のダウンロード
``` cmd:CommandPrompt
python download_google_drive/download_gdrive.py 13c8VOHdIxPzZSmenpxT31z3lnZemsPSo d_sample/pic01.jpg
python download_google_drive/download_gdrive.py 1NHjz_PguT1UVGzrsdJDpwM8AgoaTU7w2 d_sample/mov01.mov
```
<img width=300 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/a8b2e828-8ce9-45a2-5129-d3da723448c7.jpeg'> <img width=300 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/122c456c-a77d-2d9d-8048-46e22d0d55c9.gif'>


## (5)評価
### ■画像
``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --image=d_sample/pic01.jpg:d_sample_out/pic01.jpg
```
>**【結果】**
`--score_threshold=0.15`で実行。う～ん………手前側（写真左側）にいる`person`を認識できていないようです。
![pic01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/469a75cb-a914-09a5-8b7d-cdd85b23096f.jpeg)

### ■動画
``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_resnet50_54_800000.pth --score_threshold=0.5 --top_k=15 --video_multiframe=1 --video=d_sample/mov01.mov:d_sample_out/mov01.mov
```
>**【結果】**
`--score_threshold=0.5`で実行。かなり認識率は良いですね。`sports ball`の認識率が少々低いです。
Processing FPS: 0.00 | Video Playback FPS: 8.82 | Frames in Buffer: 0    %)     8.82 fps
![mov01.mov](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/90e155fa-e93c-2f8d-583c-28e50d011575.gif)

### ■webcam
`--video=0`の数値を1とか2へ変更すると、PCに接続されている別のwebcamのデバイスに切り替えることができます。

``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_resnet50_54_800000.pth --score_threshold=0.5 --top_k=15 --video_multiframe=1 --video=0
```
>**【結果】**
認識率は、かなり良い結果です！お手をしたときでも、きちんと`dog`、`person`を認識しています。もっと性能の良いGPUを使用するとヌルヌル動作すると思うとワクワクします。
Processing FPS: 9.61 | Video Playback FPS: 9.53 | Frames in Buffer: 2
![yolact](https://user-images.githubusercontent.com/69660581/122188431-e83d9e00-ceca-11eb-99b9-dd0a34657088.gif)

# ➍YOLACT++試走
**YOLACT++**は、**YOLACT**よりも、`mAP値`が高いモデルです。
**YOLACT++**を使用するには、`DCNv2`コードをコンパイルする必要があります。

## (1)DCNv2を有効化
### ■DCNv2コンパイル
なぜか`.../external/DCNv2`までカレントを移動しないと、`eval.py`がうまく動作しなかったので、きちんと「`cd`」で移動することをオススメします。`setup.py`実行後「`yolact`」ディレクトリまで戻ります。

``` cmd:CommandPrompt
cd external/DCNv2/
python setup.py build develop
cd ../../
```

### ■YOLACT++モデルのダウンロード
``` cmd:CommandPrompt
python download_google_drive/download_gdrive.py 1ZPu1YR2UzGHQD0o1rEqy-j5bmEm3lbyP d_weights/yolact_plus_resnet50_54_800000.pth
```

## (2)評価
### ■画像
``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_plus_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --image=d_sample/pic01.jpg:d_sample_out/pic01++.jpg
```
>**【結果】**
`--score_threshold=0.15`で実行。YOLACTよりもYOLACT++の方が、多くの`person`を認識していますね！
![pic01++.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/591de9be-df6a-c87a-e232-03cf10e826ac.jpeg)

### ■動画
``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_plus_resnet50_54_800000.pth --score_threshold=0.5 --top_k=15 --video_multiframe=1 --video=d_sample/mov01.mov:d_sample_out/mov01++.mov
```
>**【結果】**
`--score_threshold=0.5`で実行。`sports ball`の認識率がかなり良くなって、バランスが良いです。
Processing FPS: 0.00 | Video Playback FPS: 6.48 | Frames in Buffer: 0    %)     6.48 fps
![mov01++.mov](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/af8d36c4-f584-e003-8cdd-cb033c71aec5.gif)

### ■webcam
`--video=0`の数値を1とか2へ変更すると、PCに接続されている別のwebcamのデバイスに切り替えることができます。

``` cmd:CommandPrompt
python eval.py --trained_model=d_weights/yolact_plus_resnet50_54_800000.pth --score_threshold=0.5 --top_k=15 --video_multiframe=1 --video=0
```
>**【結果】**
Processing FPS: 7.40 | Video Playback FPS: 7.26 | Frames in Buffer: 2
動画の記事アップロードは割愛します。

# ➎以上
やっぱりですが、自分のNotePC搭載のへっぽこ**GPU**では、**8～9FPS**くらいしかでませんでした。数年後にはモバイル端末からでも**ヌルヌル動作**するものがでてくるんでしょうね。そろそろPCの買い替えをしたくなってきました。とはいえ性能の良いGPUを入れると**爆音**がなっちゃうのヤダなぁ…

お疲れ様でした😊