Multiple Object Trackingのライブラリであるをmotpyを試していきます。

動画から任意の物体追跡を実装してみましょう。

Google colabを使用して簡単に物体検出のモデルを実装することができますので、ぜひ最後までご覧ください。

今回の目標

・Multiple Object Trackingの概要

・motpyによる物体追跡

・motpyの実装

Multiple Object Trackingとは

Multiple Object Tracking(MOT)とは、動画に写っている複数の物体を追跡する手法の総称です。

MOTではそれぞれの追跡物体にIDを割り当てますが、同じ対象物にはなるべく同じIDを与え続けることを目指します。

MOTの利用ケースとしては、例えば動画から歩行者や自動車の数の数えるなどのタスクに利用することができます。

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

MOTの中でも「Tracking by Detection」と呼ばれる手法があります。

これは、物体検出モデルによって動画の各フレームから追跡対象の物体を検出した後、フレーム間ごとに同じ物体に対して同一のIDを与えていきます。

動画の各フレームで検出された同じ物体の矩形(Bounding Box)に対してなIDを割り振ることによって、物体を「追跡」します。

motpyとは

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

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

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

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

MOTには他にもモデルがありますが、ベンチマークにはMOT Challengeで提供されているデータセットが利用されています。

このMOTのベンチマークを見ることで、モデルの性能を比較することができます。

興味がある方はリンク先からご覧ください。

motpyの導入

早速motpyとは使用していきましょう。

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

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

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

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

Open In Colab

導入

from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/wmuron/motpy
%cd motpy 

必要なライブラリをインストールします。

!pip install -r requirements.txt
!pip install -r requirements_dev.txt
!pip install motpy
!make install-develop

以上で導入が完了しました。

「detect_and_track_in_video.py」の修正

出力結果を動画で保存できるように「detect_and_track_in_video.py」を修正します。

def run()の中身を以下のように修正しました。

def run(video_path: str, detect_labels,
        video_downscale: float = 1.,
        architecture: str = 'ssdlite320',
        confidence_threshold: float = 0.5,
        tracker_min_iou: float = 0.25,
        show_detections: bool = False,
        track_text_verbose: int = 0,
        device: str = 'cpu',
        viz_wait_ms: int = 1):
    # setup detector, video reader and object tracker
    detector = CocoObjectDetector(class_ids=get_class_ids(detect_labels), confidence_threshold=confidence_threshold, architecture=architecture, device=device)
    cap, cap_fps = read_video_file(video_path)
    tracker = MultiObjectTracker(
        dt=1 / cap_fps,
        tracker_kwargs={'max_staleness': 5},
        model_spec={'order_pos': 1, 'dim_pos': 2,
                    'order_size': 0, 'dim_size': 2,
                    'q_var_pos': 5000., 'r_var_pos': 0.1},
        matching_fn_kwargs={'min_iou': tracker_min_iou,
                            'multi_match_min_iou': 0.93})


    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    size = (w,h)
    frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    frame_rate = cap.get(cv2.CAP_PROP_FPS)
    fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    writer = cv2.VideoWriter('out.mp4', fmt, float(frame_rate),(w,h))
    num = 0
    while True:
        ret, frame = cap.read()
        
        if not ret:
            break

        frame = cv2.resize(frame, fx=video_downscale, fy=video_downscale, dsize=None, interpolation=cv2.INTER_AREA)

        # detect objects in the frame
        detections = detector.process_image(frame)

        # track detected objects
        _ = tracker.step(detections=detections)
        active_tracks = tracker.active_tracks(min_steps_alive=3)

        # visualize and show detections and tracks
        if show_detections:
            for det in detections:
                draw_detection(frame, det)

        for track in active_tracks:
            draw_track(frame, track, thickness=2, text_at_bottom=True, text_verbose=track_text_verbose)
        writer.write(frame)
        num += 1

これにより、結果を「out.mp4」として動画で出力することができようになります。

motpyでMultiple Object Tracking

まずはサンプル動画を使って実装してみましょう。

動画はすでに用意されていますので、コードを実行します。

「–detect_labels=[‘car’,’truck’]」とすることで、追跡対象を指定します。

!python examples/detect_and_track_in_video.py \
            --video_path=./assets/video.mp4 \
            --detect_labels=['car','truck'] \
            --tracker_min_iou=0.15 \
            --device=cuda

実際に結果を見てみましょう。

自動車とトラックを追跡できていることがわかりました。

Multiple Object Tracking

自動車の追跡

次にオリジナル動画でも追跡をしてみます。

先ほどとは違い、定点カメラで自動車の追跡をしてみましょう。

動画を「motpy/assets/」にアップして実行します。

「–video_path=」をvideo_car.mp4に変更しています。

!python examples/detect_and_track_in_video.py \
            --video_path=./assets/road.mp4 \
            --detect_labels=['car'] \
            --tracker_min_iou=0.15 \
            --device=cuda

動画出典:https://pixabay.com/videos/id-1900

移動する自動車の追跡ができています。

自動車の台数や進行方向を把握できそうですね。

人物の追跡

人物を対象とすることもできます。

!python examples/detect_and_track_in_video.py \
            --video_path=./assets/Market.mp4 \
            --detect_labels=['person'] \
            --tracker_min_iou=0.15 \
            --device=cuda

動画出典:https://pixabay.com/videos/id-44860

こちらも同様に人数と進行方向を把握できそうです。

検出対象は物体検出モデルのクラスによりますので、必要によりモデルを変更してください。

まとめ

最後までご覧いただきありがとうございました。

今回はMultiple Object Trackingのライブラリであるをmotpyを紹介しました。

様々なタスクに活用できそうですね。

コメントを残す