マルチオブジェクト・トラッキングUltralytics YOLO
ビデオ解析の領域におけるオブジェクトトラッキングは、フレーム内のオブジェクトの位置とクラスを識別するだけでなく、ビデオの進行に応じて検出された各オブジェクトの一意のIDを維持する重要なタスクです。監視やセキュリティからリアルタイムのスポーツ分析まで、アプリケーションは無限です。
物体追跡にUltralytics YOLO を選ぶ理由は?
Ultralytics トラッカーからの出力は、標準的な物体検出と一致しているが、物体IDという付加価値がある。これにより、ビデオストリーム内のオブジェクトを簡単に追跡し、その後の分析を実行することができます。オブジェクト追跡のニーズにUltralytics YOLO の使用を検討すべき理由は以下の通りです:
- 効率性: 精度を損なうことなく、ビデオストリームをリアルタイムで処理。
- 柔軟性:複数のトラッキングアルゴリズムと設定をサポート。
- 使いやすさ:シンプルなPython API とCLI オプションにより、迅速な統合と導入が可能。
- カスタマイズ性:カスタムトレーニングされたYOLO モデルで簡単に使用できるため、ドメイン固有のアプリケーションに統合できる。
見るんだ: Ultralytics YOLO による物体検出と追跡 .
実世界での応用
交通 | 小売 | 水産養殖 |
---|---|---|
車両追跡 | ピープル・トラッキング | 魚の追跡 |
特徴一覧
Ultralytics YOLO オブジェクト検出機能を拡張し、ロバストで多目的なオブジェクトトラッキングを提供します:
- リアルタイムトラッキング:ハイフレームレートビデオのオブジェクトをシームレスにトラッキング。
- 複数のトラッカーをサポート:確立された様々なトラッキングアルゴリズムから選択できます。
- カスタマイズ可能なトラッカー設定:様々なパラメータを調整することで、特定の要件に合わせてトラッキングアルゴリズムを調整します。
利用可能なトラッカー
Ultralytics YOLO は次のトラッキングアルゴリズムをサポートします。これらは次のような関連するYAML設定ファイルを渡すことで有効にできます tracker=tracker_type.yaml
:
- ボット・ソート - 用途
botsort.yaml
をクリックして、このトラッカーを有効にしてください。 - バイトトラック - 用途
bytetrack.yaml
をクリックして、このトラッカーを有効にしてください。
デフォルトのトラッカーはBoT-SORTである。
トラッキング
トラッカーしきい値情報
オブジェクトの信頼度スコアが低い場合、つまり、以下の場合である。 track_high_thresh
その場合、正常に返され更新されたトラックはない。
ビデオストリームでトラッカーを実行するには、YOLO11n、YOLO11n-seg、YOLO11n-poseなどの学習済みの検出、セグメント、ポーズモデルを使用する。
例
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo11n.pt") # Load an official Detect model
model = YOLO("yolo11n-seg.pt") # Load an official Segment model
model = YOLO("yolo11n-pose.pt") # Load an official Pose model
model = YOLO("path/to/best.pt") # Load a custom trained model
# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # with ByteTrack
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4" # Official Segment model
yolo track model=yolo11n-pose.pt source="https://youtu.be/LNwODJXcvt4" # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # Custom trained model
# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"
上記の使用方法からわかるように、トラッキングはビデオやストリーミングソース上で実行される全てのDetect、Segment、Poseモデルで利用可能です。
構成
トラッカーしきい値情報
オブジェクトの信頼度スコアが低い場合、つまり、以下の場合である。 track_high_thresh
その場合、正常に返され更新されたトラックはない。
引数の追跡
トラッキング設定は、次のようなプロパティを予測モードと共有している。 conf
, iou
そして show
.詳細な設定については 予測する のモデルページ。
例
トラッカーの選択
Ultralytics また、修正したトラッカー設定ファイルを使うこともできます。これを行うには、単純にトラッカー設定ファイルのコピー(例えば custom_tracker.yaml
より)。 ultralytics/トラッカーズ を除く)を変更する。 tracker_type
)をニーズに合わせて選択することができる。
例
トラッキング引数の包括的なリストについては、ultralytics/cfg/trackersページを参照して下さい。
Python 例
パーシステング・トラック・ループ
以下は、Python を使ったスクリプトである。 オープンCV (cv2
)とYOLO11を使って、ビデオフレームのオブジェクト・トラッキングを実行します。このスクリプトは、必要なパッケージ(opencv-python
そして ultralytics
).その persist=True
引数は、現在の画像またはフレームがシーケンスの次であり、現在の画像に前の画像からのトラックを期待することをトラッカーに伝えます。
トラッキング付きストリーミング・フォーループ
import cv2
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO11 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO11 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
からの変更にご注意ください。 model(frame)
への model.track(frame)
このスクリプトは、単純な検出の代わりにオブジェクト・トラッキングを可能にする。この修正スクリプトは、ビデオの各フレームに対してトラッカーを実行し、結果を視覚化してウィンドウに表示する。ループは'q'を押すことで終了できる。
経時的なトラックのプロット
連続するフレームにわたるオブジェクトの軌跡を視覚化することで、ビデオ内で検出されたオブジェクトの移動パターンや挙動に関する貴重な洞察を得ることができます。Ultralytics YOLO11では、これらの軌跡をシームレスかつ効率的にプロットすることができます。
以下の例では、YOLO11のトラッキング機能を利用して、複数のビデオフレームにわたって検出されたオブジェクトの動きをプロットする方法を示します。このスクリプトでは、ビデオファイルを開き、フレームごとに読み込み、YOLO のモデルを利用して、様々なオブジェクトを識別し、トラッキングします。検出されたバウンディングボックスの中心点を保持し、それらを接続することで、追跡されたオブジェクトがたどった経路を表す線を描くことができます。
複数のビデオフレームにトラックをプロットする
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(lambda: [])
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO11 tracking on the frame, persisting tracks between frames
results = model.track(frame, persist=True)
# Get the boxes and track IDs
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Plot the tracks
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y center point
if len(track) > 30: # retain 90 tracks for 90 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO11 Tracking", annotated_frame)
# Break the loop if 'q' is pressed
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Break the loop if the end of the video is reached
break
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()
マルチスレッド追跡
マルチスレッドトラッキングは、複数のビデオストリームに対して同時にオブジェクトトラッキングを実行する機能を提供します。これは、複数の監視カメラなどからの複数のビデオ入力を扱う場合に特に有効で、同時処理により効率とパフォーマンスが大幅に向上します。
提供されたPython スクリプトでは、Python の threading
モジュールを使って、トラッカーの複数のインスタンスを同時に実行することができる。各スレッドは1つのビデオファイルに対するトラッカーの実行を担当し、すべてのスレッドがバックグラウンドで同時に実行される。
各スレッドが正しいパラメータ(ビデオファイル、使用するモデル、ファイルインデックス)を受け取るようにするため、関数 run_tracker_in_thread
この関数はこれらのパラメータを受け取り、メイントラッキングループを含みます。この関数はビデオをフレームごとに読み込み、トラッカーを実行し、結果を表示します。
この例では2つの異なるモデルを使用している: yolo11n.pt
そして yolo11n-seg.pt
それぞれ異なるビデオファイルのオブジェクトを追跡する。ビデオファイルは video_file1
そして video_file2
.
について daemon=True
パラメータの threading.Thread
つまり、メイン・プログラムが終了すると同時に、これらのスレッドはクローズされる。次に、スレッドを start()
そして join()
を使うことで、両方のトラッカースレッドが終了するまでメインスレッドを待たせることができる。
最後に、すべてのスレッドがタスクを完了したら、結果を表示するウィンドウは cv2.destroyAllWindows()
.
トラッキング付きストリーミング・フォーループ
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""
Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO11 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()
この例は、より多くのスレッドを作成し、同じ方法を適用することによって、より多くのビデオファイルやモデルを扱うために簡単に拡張することができます。
新しいトラッカーを投稿する
あなたは多オブジェクトトラッキングに精通し、Ultralytics YOLO 、トラッキングアルゴリズムの実装や適応に成功したことがありますか?ultralytics/cfg/trackers の Trackers セクションへの投稿をお待ちしています!あなたの実際のアプリケーションやソリューションは、トラッキングタスクに取り組むユーザーにとって貴重なものとなるでしょう。
このセクションに貢献することで、Ultralytics YOLO フレームワークで利用可能なトラッキング・ソリューションの範囲を拡大し、コミュニティのために機能とユーティリティの新たなレイヤーを追加することができます。
あなたの貢献を開始するには、プルリクエスト (PR) 🛠️ を提出するための包括的な手順については、貢献ガイドを参照してください。私たちは、あなたが何をもたらしてくれるかを楽しみにしています!
一緒に、Ultralytics YOLO エコシステム🙏のトラッキング機能を強化しましょう!
よくあるご質問
マルチオブジェクト・トラッキングとは何ですか?また、Ultralytics YOLO はどのようにサポートしていますか?
Ultralytics YOLO は、オブジェクト ID とともにリアルタイムのトラッキングを提供することでこれをサポートし、セキュリティ監視やスポーツ分析などのタスクを容易にします。システムはBoT-SORTやByteTrackのようなトラッカーを使用し、YAMLファイルを介して設定することができる。
Ultralytics YOLO 用のカスタム・トラッカーを設定するには?
既存のトラッカー設定ファイル(例、 custom_tracker.yaml
)からである。 Ultralytics tracker設定ディレクトリ を除き、必要に応じてパラメータを変更する。 tracker_type
.このファイルをトラッキング・モデルで次のように使用する:
例
複数のビデオストリームで同時にオブジェクトトラッキングを実行するには?
複数のビデオストリームに対して同時にオブジェクトトラッキングを実行するには、Python の threading
モジュールを使用する。各スレッドは別々のビデオストリームを処理する。これをどのように設定するかの例を以下に示す:
マルチスレッド追跡
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"] # local video, 0 for webcam
def run_tracker_in_thread(model_name, filename):
"""
Run YOLO tracker in its own thread for concurrent processing.
Args:
model_name (str): The YOLO11 model object.
filename (str): The path to the video file or the identifier for the webcam/external camera source.
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
tracker_threads.append(thread)
thread.start()
# Wait for all tracker threads to finish
for thread in tracker_threads:
thread.join()
# Clean up and close windows
cv2.destroyAllWindows()
Ultralytics YOLO を用いた多オブジェクト追跡の実世界での応用とは?
Ultralytics YOLO によるマルチオブジェクト・トラッキングは、以下のような数多くの用途がある:
- 輸送:交通管理と自律走行のための車両追跡。
- 小売業店舗分析およびセキュリティのためのピープルトラッキング。
- 水産養殖:水生環境モニタリングのための魚類追跡。
これらのアプリケーションは、Ultralytics YOLO のハイフレームレートビデオをリアルタイムで処理する能力の恩恵を受ける。
Ultralytics YOLO を使って、複数のビデオフレームにまたがるオブジェクトの軌跡を視覚化するには?
複数のビデオフレームにわたるオブジェクトの軌跡を視覚化するために、YOLO モデルのトラッキング機能と OpenCV を使用することで、検出されたオブジェクトの軌跡を描画することができます。これを実演するスクリプトの例です:
複数のビデオフレームにトラックをプロットする
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True)
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
annotated_frame = results[0].plot()
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y)))
if len(track) > 30:
track.pop(0)
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
cv2.imshow("YOLO11 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
このスクリプトは、トラッキングされたオブジェクトの移動経路を示すトラッキングラインを時間経過とともにプロットします。