このタスクでは、物体検出モデルYOLOv5での学習を活かして、物体の追跡を行います。
このコンテンツでは、Yolov5を用いた物体検出で学んだことを前提に学習を進めます。
そのため、学習に入る前にYolov5を用いた物体検出を受講することをお勧めします。
物体追跡とは
動画などの連続した画像データ(フレーム)を入力値として、動画中で変化・移動する物体(オブジェクト)の追跡をする技術です。
物体検出との違いで、物体検出ではその瞬間の物体の情報(dog)を検出しますが、物体追跡では各物体を一意のモノとして追跡します。
例えば、車両の交通量調査を行いたい場合、物体検出ではその瞬間に画像に移っている車両の数はわかりますが、次の瞬間に検出した車両の情報を保持していないため、再度別の車両として検出してしまいます。
これに対して、物体追跡では前後フレームで一意の物体かどうかを分析しています。それによって動画を通して特定車両の情報を保持することができ、正しく交通量をカウントすることが出来ます。
物体追跡の使用される場面としては以下が考えられます。
- 動画中で、特定の物体の数をカウントしたい。
- 動画中で、特定の物体がどのような経路で動いたか分析したい。
などです。
YOLOv8環境構築
ここからは学習フェーズになります。
開発環境はローカルでも良いのですが、GPUを使いたいのでGoogle Colaboratory を使用することにします。
virtualbox上でGoogle driveとcolabratoryを開く。
1.colabratoryのランタイムというタブをクリックします。
2.ランタイムタイプの変更をクリックします。
3.GPUを選択し、保存する
4.ドライブをマウント
これは、Googleドライブにアップロードするデータセットや学習結果を永続的に保存したいため、Googleドライブをマントします。
1 2 3 |
from google.colab import drive drive.mount('/content/drive') %cd /content/drive/MyDrive/ |
5.YOLOv8環境構築
YOLOv8を利用するためultralyticsというリポジトリをクローンします。 また、必要なライブラリのインストールも行います。
1 2 3 4 5 |
import locale locale.getpreferredencoding = lambda: "UTF-8" !pip install ultralytics !pip install -U lap |
6.テスト動画のアップロード
以下ultralytics配下に追跡に使用するテスト用動画をアップロードします。
今回は、こちらのテスト動画を使用してください。
test.mp4
7.Yolov8での物体追跡
では、実際に物体追跡を使って、テスト動画内の人を追跡していきます。
今回は物体追跡時の推論結果を可視化するために、OpencvのVideoCapture
とVideoWriter
を使います。
以下スクリプトを実行して、Yolov8が追跡した結果を動画ファイルに書き出して確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import cv2 from google.colab.patches import cv2_imshow from ultralytics import YOLO file_path = "/content/drive/MyDrive/ultralytics/test.mp4" output_file_path = "/content/drive/MyDrive/ultralytics/test_tracking_2.mp4" # テスト動画の読み込み cap = cv2.VideoCapture(file_path) CLIP_FPS = cap.get(cv2.CAP_PROP_FPS) BG_COLOR = ( 79, 62, 70) H = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) W = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) codec = cv2.VideoWriter_fourcc('m','p','4', 'v') video = cv2.VideoWriter(output_file_path, codec, CLIP_FPS, (W, H)) model = YOLO("yolov8s.pt") # テスト動画に対してperson classのみで推論 results = model.track(source="/content/drive/MyDrive/ultralytics/test.mp4", tracker="bytetrack.yaml", classes=[0], persist=True) for result in results: ret, frame = cap.read() if not ret: break boxes = result.boxes.xyxy.cpu().numpy().astype(int) # 物体が検知されなかった場合 try: ids = result.boxes.id.cpu().numpy().astype(int) except Exception as e: print(e) print("There are no objects") continue cls_list = result.boxes.cls.cpu().numpy().astype(int) for box, id, cls in zip(boxes, ids, cls_list): cls_name = model.names[cls] cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2) cv2.putText( frame, f"#{id} {cls_name}", (box[0], box[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, ) video.write(frame) # videoの書き込み/読み込み終了 video.release() cap.release() |
書き出された動画を開いて、以下が確認できれば物体追跡は成功です。
- 物体ごとにIDが付与されているか
- フレームごとに移動している物体のIDが変わっていない
Challenge
- yolov8xなどのより重いモデルを試して、精度が向上されるか試してみましょう。
- Yolov5を用いた物体検出で学習したようにyolov8で特定のクラスを学習させて、任意の物体を追跡してみましょう。
終わりに
物体追跡は技術としては新しく、特有の課題もあります。
より興味がある方は以下を調べて見ることをおススメします!
- 一意の物体を追跡する際の課題について(物体と物体が交差した、物体が障害物に隠れた時など)
- 追跡用のアルゴリズムについて
参照
What is Object Tracking in Computer Vision?
マルチオブジェクト・トラッキングUltralytics YOLO