このシリーズでは物体検出でお馴染みの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の利用ケースとしては、例えば動画から歩行者や自動車の数の数えるなどのタスクに利用することができます。

引用:https://github.com/wmuron/motpy

詳細はこちらの記事で紹介しておりますので、ご覧になっていない方はぜひご覧ください。

【物体追跡】motpyでMultiple Object Trackingを実装する

Multiple Object Trackingのライブラリであるをmotpyを試していきます。 動画から任意の物体追跡を実装してみましょう。 Google colabを使用して簡単に物体検出のモデルを…

Motpyとは

motpyは「Tracking by Detection」の”Tracking”の部分を実装するためのライブラリです。

任意の物体検出のデータを使って、簡単にMOT機能を実装することができます。

また、RaspberryPiでもリアルタイムのパフォーマンスを上回るほどの処理速度を誇ります。

公式の実装は以下のリンクよりご確認いただけます。

YOLOXとMotpyの導入

早速実装していきましょう。

以下、Google colab環境で進めていきます。

まずはGPUを使用できるように設定をします。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。

Open In Colab

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回の記事で紹介しております。

【物体検出】YOLOXまとめ|第1回:導入からチュートリアルまで

このシリーズでは物体検出でお馴染みのYOLOシリーズの最新版「YOLOX」について、導入から学習の方法までまとめます。YOLOXは2021年8月に公開された最新バージョンであり、…

!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の活用の幅が広がりそうですね。

コメントを残す