Ultralytics YOLO を使用した Multi-Object Tracking
ビデオ解析の分野における物体追跡は、フレーム内の物体の位置とクラスを識別するだけでなく、ビデオの進行に合わせて検出された各物体に一意のIDを維持する重要なタスクです。その応用範囲は、監視やセキュリティからリアルタイムのスポーツ分析まで、無限に広がります。
オブジェクト追跡に Ultralytics YOLO を選ぶ理由
Ultralyticsトラッカーからの出力は、標準的な物体検出と一貫性がありますが、オブジェクトIDという付加価値があります。これにより、ビデオストリーム内のオブジェクトを簡単に追跡し、その後の分析を実行できます。Ultralytics YOLOをオブジェクト追跡に使用することを検討すべき理由は次のとおりです。
- 効率: 精度を損なうことなく、ビデオストリームをリアルタイムで処理します。
- 柔軟性: 複数の追跡アルゴリズムと構成をサポートします。
- 使いやすさ: 迅速な統合とデプロイメントのためのシンプルなPython APIとCLIオプション。
- カスタマイズ性: カスタムトレーニングされたYOLOモデルで簡単に使用でき、ドメイン固有のアプリケーションへの統合が可能です。
見る: Ultralytics YOLOによる物体検出と追跡
実世界のアプリケーション
輸送 | 小売 | 水産養殖 |
---|---|---|
車両追跡 | 人物追跡 | 魚の追跡 |
機能一覧
Ultralytics YOLOは、その物体検出機能を拡張し、堅牢で汎用性の高い物体追跡を提供します。
- リアルタイム追跡: 高フレームレートのビデオでオブジェクトをシームレスに追跡します。
- 複数のトラッカーサポート: 確立されたさまざまな追跡アルゴリズムから選択します。
- カスタマイズ可能なトラッカー構成: さまざまなパラメータを調整して、特定の要件を満たすように追跡アルゴリズムを調整します。
利用可能なトラッカー
Ultralytics YOLOは、以下のトラッキングアルゴリズムをサポートしています。これらは、次のような関連するYAML構成ファイルを渡すことで有効にできます。 tracker=tracker_type.yaml
:
デフォルトのトラッカーはBoT-SORTです。
追跡
ビデオストリームでトラッカーを実行するには、YOLO11n、YOLO11n-seg、YOLO11n-poseなどのトレーニング済みのDetect、Segment、または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モデルでトラッキングを利用できます。
構成
追跡引数
追跡構成は、Predictモードと同様のプロパティを共有します。例: 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/cfg/trackers および構成を修正します(ただし、 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
): これは、ReIDのためにYOLO検出器から直接機能を活用し、最小限のオーバーヘッドを追加します。パフォーマンスに大きな影響を与えることなく、ある程度の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)
エクスポートが完了したら、トラッカー設定で TensorRT モデルのパスを指定すると、トラッキング中に ReID に使用されます。
pythonのサンプル
永続化されたトラックループ
以下は、を使用したpythonスクリプトです。 OpenCV (cv2
)と、ビデオフレーム上でオブジェクト追跡を実行するYOLO11です。このスクリプトは、必要なパッケージ(opencv-python
および ultralytics
)。 persist=True
引数は、現在の画像またはフレームがシーケンスの次の画像であることをトラッカーに伝え、現在の画像内の前の画像からのトラックを予期するように指示します。
トラッキング付きストリーミングforループ
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.is_track:
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
.
The 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のトラッカーセクションに貢献しませんか?あなたの実世界のアプリケーションとソリューションは、トラッキングタスクに取り組むユーザーにとって非常に貴重なものとなるでしょう。
このセクションに貢献することで、Ultralytics YOLOフレームワーク内で利用可能なトラッキングソリューションの範囲を拡大し、コミュニティに別の機能とユーティリティの層を追加できます。
貢献を開始するには、貢献ガイドを参照して、プルリクエスト(PR)の送信方法に関する包括的な手順をご確認ください🛠️。皆様からのご貢献を楽しみにしております!
Ultralytics YOLOエコシステムの追跡機能を強化しましょう!🙏!
よくある質問
マルチオブジェクトトラッキングとは何ですか?また、Ultralytics YOLOはどのようにサポートしていますか?
ビデオ分析におけるマルチオブジェクトトラッキングでは、オブジェクトの識別と、ビデオフレーム全体で検出された各オブジェクトの一意のIDの維持の両方が必要です。Ultralytics YOLOは、オブジェクトIDとともにリアルタイムトラッキングを提供することでこれをサポートし、セキュリティ監視やスポーツ分析などのタスクを容易にします。このシステムは、BoT-SORTやByteTrackなどのトラッカーを使用しており、これらはYAMLファイルを介して構成できます。
Ultralytics YOLOのカスタムトラッカーを構成するにはどうすればよいですか?
既存のトラッカー構成ファイル(例: custom_tracker.yaml
) から Ultralyticsトラッカー設定ディレクトリ 必要に応じてパラメータを変更します(ただし、 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()
このスクリプトは、追跡されたオブジェクトの時間の経過に伴う移動経路を示す追跡ラインをプロットし、オブジェクトの動作とパターンに関する貴重な洞察を提供します。