【リアルタム物体検知】YOLACT for Google Colab【YOLOを超えた？】

# ➊はじめに
**[YOLO](https://github.com/ultralytics/yolov5)**は「**`バウンディングボックス`**」の物体認識が**リアルタイム**でできて凄いなぁと思っていました。**[YOLACT](https://github.com/dbolya/yolact)**では「**`セグメンテーション`**」の物体認識が**リアルタイム**でできるようになっているとのことで、どんなものか試したいと思いました。
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/e2c2d113-2fa5-886d-2e26-204cedd08e8c.gif'>　<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/ba0787ad-475d-0eb9-2ed1-55c73617c4ee.gif'>


※`YOLO/YOLACT`を使用して**「じゃんけん」検出**を行った記事と、ローカルPC(`YOLACT`)＋webcamを使用して**リアルタイム性を確認**した記事もありますので、ご参考にどうぞ。

- [【YOLO V5】AIでじゃんけん検出](https://qiita.com/PoodleMaster/items/5f2cc3248c03b03821b8)
- [【YOLACT】AIでじゃんけん検出](https://qiita.com/PoodleMaster/items/70cf03c1750fb58debb1)
- [【リアルタム物体検知】YOLACT for win10+webcam【ワンコも驚愕】](https://qiita.com/PoodleMaster/items/583b841016babaa8e41a)

# ➋やること
今回は、`Google Colab`を使用して**`YOLACT (YOLACT++)`**をTrial Runします！**`YOLACT`**は、ありがたいことに**MITライセンス**です。

ここまで技術が高くなるとAI認識させるだけでもGPUは必須とのことなので、我らAI趣味人の強い味方である`Google Colab`を使ってやってみたいと思います。ただ、`Google Colab`を使用するとwebカメラは使えないので、リアルタイムではなく、**予め用意した画像ファイル、動画ファイルを使って**`YOLACT`**の試走**を実施したいと思います。

# ➌バウンディングボックスとセグメンテーションの違い
一応、違いをまとめておきます。
**`バウンディングボックス`**と**`セグメンテーション`**の**違い**を、以下にまとめました。

|物体検出|概要|物体検出サンプル|ツール|
|:-|:-|:-|:-|
|バウンディングボックス|画像内の物体の位置やクラスを検出|![1623304097.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/09205e7d-987a-19e8-c817-21989d539244.png)|[YOLO v5](https://github.com/ultralytics/yolov5)|
|セグメンテーション|画像内の各画素がどのカテゴリーに属するかを検出|![1623304143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/5528424c-c3e5-aa18-4838-cac9e4fcbe33.png)|[YOLACT](https://github.com/dbolya/yolact)|

# ➍Google Colabで試走
Google Colabで実施していきます。
Google Colabがよく分からないよという方は、『[0からはじめる「Python AIプログラミング」 for Google Colab](https://qiita.com/PoodleMaster/items/f6b7205c4c20948e9c0d)』で基礎が勉強できますので、こちらをご参照ください。

※サンプル画像、サンプル動画もこちらで用意し共有しています。ファイルはColab上にダウンロードするようにしておりますので、**`Google Colab`にコピペのみで動作確認できる**と思います。希望が多ければ、`Google Colb`の実行結果もSHAREしたいと思います。


## ■YOLACTインストール
詳細は、本家「[`YOLACT Installation`](https://github.com/dbolya/yolact#installation)」をご参照ください。

### (1) Google ColabのGPUを有効化
- [ランタイム]→[ランタイムのタイプを変更]→[ハードウェアアクセラレータ]
- [GPU]を有効→[保存]を押下

### (2) ライブラリのインストール
``` python:GoogleColab
!pip install cython
!pip install opencv-python pillow pycocotools matplotlib
!pip install torchvision==0.5.0
!pip install torch==1.4.0
```

### (3) YOLACTのダウンロード
``` python:GoogleColab
%cd /content
!git clone https://github.com/dbolya/yolact.git
```

### (4) DCNv2の有効化
YOLACT++を使用するためDCNv2を有効化します。

``` python:GoogleColab
%cd /content/yolact/external/DCNv2
!python setup.py build develop
```

### (5) 重み付けデータのダウンロード
YOLACT++ models(Resnet50-FPN)をダウンロードします。
こちらからも[ダウンロード]((https://drive.google.com/file/d/1ZPu1YR2UzGHQD0o1rEqy-j5bmEm3lbyP/view?usp=sharing))できます。

``` python:GoogleColab
%cd /content
!git clone https://github.com/chentinghao/download_google_drive.git

!mkdir -p '/content/yolact/weights'
weights = '/content/yolact/weights/yolact_plus_resnet50_54_800000.pth'

%cd download_google_drive
!python download_gdrive.py 1ZPu1YR2UzGHQD0o1rEqy-j5bmEm3lbyP '$weights'
```

## ■画像評価
### (1) 入力画像の設定
画像を取得します。

``` python:GoogleColab
inimgdir = '/content/yolact/in_img_files/'

!echo '$inimgdir'
!rm -r '$inimgdir'
!mkdir -p '$inimgdir'

%cd /content/download_google_drive
!python download_gdrive.py 19pvKhehjKsszhLAMLjujFQpsSswYOs2U '$inimgdir/pic1.jpg'
!python download_gdrive.py 13c8VOHdIxPzZSmenpxT31z3lnZemsPSo '$inimgdir/pic2.jpg'
```
画像を表示します。

``` python:GoogleColab
import os
import re
import matplotlib.pyplot as plt
import cv2

patternStr = '.+\.(jpg|png)'
pattern = re.compile(patternStr)
for item in os.listdir(inimgdir):
    result = pattern.match(item)
    if result:
        file = os.path.join(inimgdir,item)
        print(file)
        img = cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB)
        plt.figure(figsize=(10, 10))
        plt.imshow(img)
        plt.show()
```
元画像はこんな感じです。
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/63fde767-fef0-c4c1-2cdb-92726dea38e3.png'>
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/fb59bac4-73fb-7544-3109-0d828eb92338.png'>

### (2) 出力先の設定

``` python:GoogleColab
outimgdir = '/content/yolact/out_img_files/'

!echo '$outimgdir' 
!rm -r '$outimgdir'
!mkdir -p '$outimgdir'
```

### (3) 画像評価

``` python:GoogleColab
%cd /content/yolact
!echo '$weights'
!echo '$inimgdir'
!echo '$outimgdir'

!python eval.py --trained_model='$weights'\
                --config=yolact_plus_resnet50_config\
                --score_threshold=0.15\
                --top_k=15\
                --images='$inimgdir':'$outimgdir'
```

### (4) 画像評価結果

``` python:GoogleColab
import os
import re
import matplotlib.pyplot as plt
import cv2

patternStr = '.+\.(jpg|png)'
pattern = re.compile(patternStr)
for item in os.listdir(outimgdir):
    result = pattern.match(item)
    if result:
        file = os.path.join(outimgdir,item)
        print(file)
        img = cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB)
        plt.figure(figsize=(10, 10))
        plt.imshow(img)
        plt.show()
```
Good!!かなり認識率は良いですね！
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/865692f7-d9b6-65cc-6e88-561dc3bb94f9.png'>
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/3a6b32f2-179d-5948-a896-5a32ccf76b42.png'>

## ■動画評価結果
### (1) 入力動画の設定

``` python:GoogleColab
inmovdir = '/content/yolact/in_mov_files/'

!echo '$inmovdir'
!rm -r '$inmovdir'
!mkdir -p '$inmovdir'

inmovfile1 = inmovdir + 'video1.mov'
inmovfile2 = inmovdir + 'video2.mov'

%cd /content/download_google_drive
src1 = '1oM5O5fQEu9-cWrUj5EGqfU_TsScjKEMh'
src2 = '1NHjz_PguT1UVGzrsdJDpwM8AgoaTU7w2'

!python download_gdrive.py '$src1' '$inmovfile1'
!ls '$inmovfile1'
!python download_gdrive.py '$src2' '$inmovfile2'
!ls '$inmovfile2'
```

### (2) 出力先の設定

``` python:GoogleColab
outmovdir = '/content/yolact/out_mov_files/'

!echo '$outmovdir' 
!rm -r '$outmovdir'
!mkdir -p '$outmovdir'

outmovfile1 = outmovdir + 'video1_out.mov'
outmovfile2 = outmovdir + 'video2_out.mov'

!echo '$outmovfile1'
!echo '$outmovfile2'
```

### (3) 動画評価
`しきい値は0.6`としています。認識状態により、調整してくださいね。

``` python:GoogleColab
%cd /content/yolact/
!echo '$weights'
!echo '$inmovfile1'
!echo '$outmovfile1'

!python eval.py --trained_model='$weights'\
                --score_threshold=0.6\
                --top_k=15\
                --video_multiframe=1\
                --video='$inmovfile1':'$outmovfile1'
```

``` python:GoogleColab
%cd /content/yolact/
!echo '$weights'
!echo '$inmovfile2'
!echo '$outmovfile2'

!python eval.py --trained_model='$weights'\
                --score_threshold=0.6\
                --top_k=15\
                --video_multiframe=1\
                --video='$inmovfile2':'$outmovfile2'
```

### (4) 動画評価結果
以下フォルダに、動画評価結果のファイルができあがっているので、これをLocalPCへダウンロードし、動作を再生します。
> /content/yolact/out_mov_files/video1_out.mov
> /content/yolact/out_mov_files/video2_out.mov

`しきい値を0.6`と高めに設定したのにも関わらず、きちんと認識されています。
これはスゴい！ここまで技術が進歩しているとは…
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/e2c2d113-2fa5-886d-2e26-204cedd08e8c.gif'>　<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/ba0787ad-475d-0eb9-2ed1-55c73617c4ee.gif'>

# ➎OMAKE
おまけです😉

なお、動画評価後の「**movファイル**」を`Google Colab`から`ローカルPC`へダウンロードしなくても、以下のコマンドを叩き「**mp4ファイル**」へ変換することで、`Google Colab`上から動画（mp4）を直接参照することができます。

``` python:GoogleColab
chg_in ='/content/yolact/out_mov_files/video1_out.mov'
chg_out = '/content/yolact/out_mov_files/video1_out.mp4'

!echo '$chg_in'
!echo '$chg_out'

!ffmpeg -i '$chg_in' '$chg_out'
```
``` python:GoogleColab
from IPython.display import HTML
from base64 import b64encode

mp4 = open(chg_out, 'rb').read()
data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode()
HTML(f"""
<video controls>
      <source src="{data_url}" type="video/mp4">
</video>""")
```

`Google Colab`上から、**mp4ファイル**を直接参照するとこんな感じ…
<img width=400 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/3ee0620a-4882-8c67-6e55-1d88c8ca0b53.png'>

# ➏以上
**`YOLO`**も凄かったけど、**`YOLACT`**を使用すると、こんなにも簡単に**セグメンテーション検出**ができてしまうことに驚きました👀❗ちなみに[**`YOLACT EDGE`**](https://github.com/haotian-liu/yolact_edge)というよりFPSが高い改良版も公表されています。なんかワクワクしますよね😊

お疲れ様でした！