このシリーズでは物体検出でお馴染みのYOLOシリーズの最新版「YOLOX」について、環境構築から学習の方法までまとめます。
YOLOXは2021年8月に公開された最新バージョンであり、速度と精度の面で限界を押し広げています。
第5回目である今回は、YOLOXとMotpyによる物体追跡を実装する方法を紹介します。
Google colabを使用して簡単に物体検出のモデルを実装することができますので、ぜひ最後までご覧ください。
今回の目標
・Multiple Object Tracking(MOT)とMotpyの概要
・YOLOXとMotpyの導入
・YOLOXによるMultiple Object Trackingの実装
Multiple Object Tracking(MOT)とMotpy
Multiple Object Tracking(MOT)とは
Multiple Object Tracking(MOT)とは、動画に写っている複数の物体を追跡する手法の総称です。
MOTではそれぞれの追跡物体にIDを割り当てますが、同じ対象物にはなるべく同じIDを与え続けることを目指します。
MOTの利用ケースとしては、例えば動画から歩行者や自動車の数の数えるなどのタスクに利用することができます。
詳細はこちらの記事で紹介しておりますので、ご覧になっていない方はぜひご覧ください。
Motpyとは
motpyは「Tracking by Detection」の”Tracking”の部分を実装するためのライブラリです。
任意の物体検出のデータを使って、簡単にMOT機能を実装することができます。
また、RaspberryPiでもリアルタイムのパフォーマンスを上回るほどの処理速度を誇ります。
公式の実装は以下のリンクよりご確認いただけます。
YOLOXとMotpyの導入
早速実装していきましょう。
以下、Google colab環境で進めていきます。
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。
YOLOXの導入
まずはYOLOXの準備をしていきます。
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
今回初めてYOLOXを使用する方は公式よりcloneしてきます。
!git clone https://github.com/Megvii-BaseDetection/YOLOX
必要なライブラリをインストールします。
%cd YOLOX
!pip install -U pip && pip install -r requirements.txt
!pip install -v -e .
!pip install cython
!pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
以上で導入が完了しました。
YOLOXのテスト
通常の物体検出とmotpyによる物体追跡を比較するため、まずは物体検出の結果をみてみましょう。
「sample_yolox.mp4」の動画に対してテストをします。
なお、テスト実行時の引数は第1回の記事で紹介しております。
!python tools/demo3.py video -n yolox-x -c yolox_x.pth --path assets/sample_yolox.mp4 --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
結果の動画は以下の通りです。
Motpyの導入
次にMotpyを導入します。
YOLOXの中にmotpyをクローンしてきます。
!git clone https://github.com/wmuron/motpy
必要なライブラリをインストールします。
!pip install -r motpy/requirements.txt
!pip install -r motpy/requirements_dev.txt
!pip install motpy
以上で導入が完了しました。
YOLOXでMotpyを実装
demo.pyファイルを編集する
まずは「YOLOX/tools」にある「demo.py」を編集します。
「demo.py」を「demo_motpy.py」としてコピーしましょう。
コピーしたファイルに以下のコードを追加します。
from motpy import Detection, MultiObjectTracker
from motpy.testing_viz import draw_track
class MOT:
def __init__(self):
self.tracker = MultiObjectTracker(dt=0.1)
def track(self, outputs, ratio):
if outputs[0] is not None:
outputs = outputs[0].cpu().numpy()
outputs = [Detection(box=box[:4] / ratio, score=box[4] * box[5], class_id=box[6]) for box in outputs]
else:
outputs = []
self.tracker.step(detections=outputs)
tracks = self.tracker.active_tracks()
return tracks
次に「def imageflow_demo()」の関数を以下のように修正します。
def imageflow_demo(predictor, vis_folder, current_time, args):
mot = MOT()
cap = cv2.VideoCapture(args.path if args.demo == "video" else args.camid)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # float
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # float
fps = cap.get(cv2.CAP_PROP_FPS)
if args.save_result:
save_folder = os.path.join(
vis_folder, time.strftime("%Y_%m_%d_%H_%M_%S", current_time)
)
os.makedirs(save_folder, exist_ok=True)
if args.demo == "video":
save_path = os.path.join(save_folder, os.path.splitext(args.path.split("/")[-1])[0] + '.mp4')
else:
save_path = os.path.join(save_folder, "camera.mp4")
logger.info(f"video save_path is {save_path}")
vid_writer = cv2.VideoWriter(
save_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (int(width), int(height))
)
while True:
ret_val, frame = cap.read()
if ret_val:
outputs, img_info = predictor.inference(frame)
#result_frame = predictor.visual(outputs[0], img_info, predictor.confthre)
result_frame = frame
tracks = mot.track(outputs, img_info['ratio'])
for trc in tracks:
draw_track(result_frame, trc, thickness=1)
if args.save_result:
vid_writer.write(result_frame)
else:
cv2.imshow('frame', result_frame)
ch = cv2.waitKey(1)
if ch == 27 or ch == ord("q") or ch == ord("Q"):
break
else:
break
以上で編集が完了しました。
Multiple Object Trackingの実装
いよいよYOLOXによるMultiple Object Trackingの実装です。
先ほど編集したファイルを実行しましょう。
比較のため、先ほど使用した動画でテストをします。
!python tools/demo_motpy.py video -n yolox-x -c yolox_x.pth --path assets/sample_yolox.mp4 --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu
Trackingを実装することができました。
物体検出とは異なり、一つの物体に対してIDが割り振られており、追跡できていることがわかるかと思います。
まとめ
最後までご覧いただきありがとうございました。
今回はYOLOXとMotpyによる物体追跡を実装する方法を紹介しました。
学習済モデルはもちろん、これまで紹介してきた方法で作成したモデルでも使用することが可能です。
YOLOXの活用の幅が広がりそうですね。