マルチオブジェクト・トラッキング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モデルで利用可能です。
構成
引数の追跡
トラッキング設定は、次のようなプロパティを予測モードと共有している。 conf
, iou
そして show
.詳細な設定については 予測する のモデルページ。
例
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show
トラッカーの選択
Ultralytics また、修正したトラッカー設定ファイルを使うこともできます。これを行うには、単純にトラッカー設定ファイルのコピー(例えば、 custom_tracker.yaml
より)。 ultralytics/トラッカーズ を除く)を変更する。 tracker_type
)をニーズに合わせて選択することができる。
例
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
各パラメータの詳細については、「Tracker Arguments」のセクションを参照のこと。
トラッカーの主張
いくつかのトラッキング動作は、各トラッキングアルゴリズムに特化したYAML設定ファイルを編集することで微調整することができます。これらのファイルは閾値、バッファ、マッチングロジックなどのパラメータを定義します:
以下の表は、各パラメータの説明である:
トラッカーしきい値情報
オブジェクトの信頼度スコアが低い場合、つまり、以下の場合である。 track_high_thresh
その場合、正常に返され更新されたトラックはない。
パラメータ | 有効な値または範囲 | 説明 |
---|---|---|
tracker_type |
botsort , bytetrack |
トラッカー・タイプを指定する。オプションは botsort または bytetrack . |
track_high_thresh |
0.0-1.0 |
トラッキング中の最初の関連付けのしきい値。検出が既存のトラックとどの程度確実に照合されるかに影響する。 |
track_low_thresh |
0.0-1.0 |
トラッキング中の2番目の関連付けのしきい値。最初の関連付けが失敗したときに、より甘い基準で使用される。 |
new_track_thresh |
0.0-1.0 |
検出が既存のトラックと一致しない場合に新しいトラックを初期化するためのしきい値。新しいオブジェクトがいつ現れるとみなされるかを制御します。 |
track_buffer |
>=0 |
失われたトラックが削除される前に生かされるべきフレーム数を示すために使用されるバッファ。値が大きいほど、オクルージョンに対する耐性が高いことを意味する。 |
match_thresh |
0.0-1.0 |
トラックのマッチングのしきい値。値を大きくするとマッチングが甘くなります。 |
fuse_score |
True , False |
マッチング前に信頼度スコアとIoU距離を融合するかどうかを決定する。関連付け時に空間情報と信頼度情報のバランスをとるのに役立つ。 |
gmc_method |
orb , sift , ecc , sparseOptFlow , None |
グローバルモーション補正に使用される方法。トラッキングを向上させるためにカメラの動きを考慮するのに役立つ。 |
proximity_thresh |
0.0-1.0 |
ReID(再識別)との有効な一致に必要な最小IoU。外観の手がかりを使用する前に、空間的な近接性を確保する。 |
appearance_thresh |
0.0-1.0 |
ReIDに必要な最小外観類似度。2つの検出がリンクされるために必要な視覚的類似度を設定します。 |
with_reid |
True , False |
ReIDを使用するかどうかを示す。アピアランスベースのマッチングを有効にし、オクルージョンを越えたトラッキングを向上させる。BoTSORTでのみサポートされる。 |
model |
auto , yolo11[nsmlx]-cls.pt |
使用するモデルを指定する。デフォルトは auto 検出器がYOLO場合はネイティブのフィーチャーを使用し、そうでない場合は yolo11n-cls.pt . |
再同定(ReID)を可能にする
デフォルトでは、パフォーマンスのオーバーヘッドを最小限に抑えるためにReIDはオフになっている。有効にするのは簡単だ。 with_reid: True
での トラッキング設定.をカスタマイズすることもできます。 model
ReIDに使用することで、ユースケースに応じて精度とスピードをトレードオフすることができる:
- ネイティブの機能
model: auto
):YOLO ディテクターの機能をそのままReIDに活用し、オーバーヘッドを最小限に抑えます。パフォーマンスに大きな影響を与えることなく、ある程度のReIDが必要な場合に最適です。ディテクターがネイティブ機能をサポートしていない場合は、自動的にyolo11n-cls.pt
. - YOLO 分類モデル:分類モデルを明示的に設定することができます。
yolo11n-cls.pt
)を用いてReID特徴抽出を行う。これは、より識別性の高い埋め込みを提供しますが、推論ステップが追加されるため、追加の待ち時間が発生します。
パフォーマンスを向上させるために、特にReIDのために別の分類モデルを使用する場合は、TensorRTような高速なバックエンドにエクスポートすることができます:
ReIDモデルをTensorRTエクスポートする
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo11n-cls.pt")
# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool
# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)
一旦エクスポートされると、trackerの設定でTensorRT モデルのパスを指定することができ、トラッキング中のReIDに使用されます。
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
result = model.track(frame, persist=True)[0]
# Get the boxes and track IDs
if result.boxes and result.boxes.id is not None:
boxes = result.boxes.xywh.cpu()
track_ids = result.boxes.id.int().cpu().tolist()
# Visualize the result on the frame
frame = result.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 30 tracks for 30 frames
track.pop(0)
# Draw the tracking lines
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# Display the annotated frame
cv2.imshow("YOLO11 Tracking", 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
それぞれ異なるビデオファイルのオブジェクトを追跡する。ビデオファイルは SOURCES
.
について 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 はどのようにサポートしていますか?
ビデオ分析におけるマルチオブジェクト追跡は、オブジェクトの識別と、ビデオフレーム全体で検出された各オブジェクトの一意のIDの維持の両方を含みます。Ultralytics YOLO 、オブジェクトIDと共にリアルタイムのトラッキングを提供することでこれをサポートし、セキュリティ監視やスポーツ分析などのタスクを容易にします。システムはBoT-SORTや ByteTrackのようなトラッカーを使用し、YAMLファイルを介して設定することができます。
Ultralytics YOLO 用のカスタム・トラッカーを設定するには?
既存のトラッカー設定ファイル(例、 custom_tracker.yaml
)からである。 Ultralytics tracker設定ディレクトリ を除き、必要に応じてパラメータを変更する。 tracker_type
.このファイルをトラッキングモデルで次のように使用する:
例
from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
複数のビデオストリームで同時にオブジェクトトラッキングを実行するには?
複数のビデオストリームに対して同時にオブジェクトトラッキングを実行するには、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()
このスクリプトは、トラッキングされたオブジェクトの移動経路を経時的に示すトラッキングラインをプロットし、オブジェクトの挙動やパターンに関する貴重な洞察を提供します。