➊はじめに
YOLOは「バウンディングボックス
」の物体認識がリアルタイムでできて凄いなぁと思っていました。YOLACTでは「セグメンテーション
」の物体認識がリアルタイムでできるようになっているとのことで、どんなものか試したいと思いました。
※YOLO/YOLACT
を使用して**「じゃんけん」検出を行った記事と、ローカルPC(YOLACT
)+webcamを使用してリアルタイム性を確認**した記事もありますので、ご参考にどうぞ。
➋やること
今回は、Google Colab
を使用して**YOLACT (YOLACT++)
をTrial Runします!YOLACT
は、ありがたいことにMITライセンス**です。
ここまで技術が高くなるとAI認識させるだけでもGPUは必須とのことなので、我らAI趣味人の強い味方であるGoogle Colab
を使ってやってみたいと思います。ただ、Google Colab
を使用するとwebカメラは使えないので、リアルタイムではなく、予め用意した画像ファイル、動画ファイルを使ってYOLACT
の試走を実施したいと思います。
➌バウンディングボックスとセグメンテーションの違い
一応、違いをまとめておきます。
バウンディングボックス
とセグメンテーション
の違いを、以下にまとめました。
物体検出 | 概要 | 物体検出サンプル | ツール |
---|---|---|---|
バウンディングボックス | 画像内の物体の位置やクラスを検出 | YOLO v5 | |
セグメンテーション | 画像内の各画素がどのカテゴリーに属するかを検出 | YOLACT |
➍Google Colabで試走
Google Colabで実施していきます。
Google Colabがよく分からないよという方は、『0からはじめる「Python AIプログラミング」 for Google Colab』で基礎が勉強できますので、こちらをご参照ください。
※サンプル画像、サンプル動画もこちらで用意し共有しています。ファイルはColab上にダウンロードするようにしておりますので、Google Colab
にコピペのみで動作確認できると思います。希望が多ければ、Google Colb
の実行結果もSHAREしたいと思います。
■YOLACTインストール
詳細は、本家「YOLACT Installation
」をご参照ください。
(1) Google ColabのGPUを有効化
- [ランタイム]→[ランタイムのタイプを変更]→[ハードウェアアクセラレータ]
- [GPU]を有効→[保存]を押下
(2) ライブラリのインストール
!pip install cython
!pip install opencv-python pillow pycocotools matplotlib
!pip install torchvision==0.5.0
!pip install torch==1.4.0
(3) YOLACTのダウンロード
%cd /content
!git clone https://github.com/dbolya/yolact.git
(4) DCNv2の有効化
YOLACT++を使用するためDCNv2を有効化します。
%cd /content/yolact/external/DCNv2
!python setup.py build develop
(5) 重み付けデータのダウンロード
YOLACT++ models(Resnet50-FPN)をダウンロードします。
こちらからもダウンロードできます。
%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) 入力画像の設定
画像を取得します。
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'
画像を表示します。
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()
(2) 出力先の設定
outimgdir = '/content/yolact/out_img_files/'
!echo '$outimgdir'
!rm -r '$outimgdir'
!mkdir -p '$outimgdir'
(3) 画像評価
%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) 画像評価結果
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()
■動画評価結果
(1) 入力動画の設定
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) 出力先の設定
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
としています。認識状態により、調整してくださいね。
%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'
%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
と高めに設定したのにも関わらず、きちんと認識されています。
これはスゴい!ここまで技術が進歩しているとは…
➎OMAKE
おまけです😉
なお、動画評価後の「movファイル」をGoogle Colab
からローカルPC
へダウンロードしなくても、以下のコマンドを叩き「mp4ファイル」へ変換することで、Google Colab
上から動画(mp4)を直接参照することができます。
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'
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ファイルを直接参照するとこんな感じ…
➏以上
YOLO
も凄かったけど、YOLACT
を使用すると、こんなにも簡単にセグメンテーション検出ができてしまうことに驚きました👀❗ちなみにYOLACT EDGE
というよりFPSが高い改良版も公表されています。なんかワクワクしますよね😊
お疲れ様でした!