Ultralytics YOLOによるマルチオブジェクトトラッキング#
ビデオ解析におけるオブジェクトトラッキングは、フレーム内のオブジェクトの位置とクラスを識別するだけでなく、ビデオの進行に合わせて検出された各オブジェクトの固有IDを維持する重要なタスクです。その応用範囲は、監視やセキュリティからリアルタイムのスポーツ解析まで無限に広がっています。
Ultralytics YOLO v8.4.63以降、新しい追跡アルゴリズム(OC-SORT、Deep OC-SORT、FastTracker、TrackTrack)が利用可能です。これらのトラッカーは、マルチオブジェクト追跡のパフォーマンスとIDの一貫性を向上させます。
なぜオブジェクトトラッキングにUltralytics YOLOを選ぶのか?#
Ultralyticsトラッカーの出力は標準的な物体検出と一貫していますが、オブジェクトIDという追加の価値があります。これにより、ビデオストリーム内のオブジェクトを簡単に追跡し、後続の分析を実行できます。Ultralytics YOLOをオブジェクト追跡のニーズに利用すべき理由は以下の通りです:
- 効率性:精度を妥協することなく、ビデオストリームをリアルタイムで処理します。
- 柔軟性: 複数のトラッキングアルゴリズムと構成をサポートしています。
- 使いやすさ: シンプルなPython APIとCLIオプションにより、迅速な統合とデプロイが可能です。
- カスタマイズ性: カスタム学習させたYOLOモデルで簡単に使用でき、ドメイン固有のアプリケーションへの統合が可能です。
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
実世界での応用#
| 交通 | 小売 | 水産養殖 |
|---|---|---|
| 車両トラッキング | 人物トラッキング | 魚類トラッキング |
クイックスタート#
デフォルトのBoT-SORTトラッカーを使用してビデオ上で追跡を実行します。tracker引数を変更して別のトラッカーに切り替えます。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (BoT-SORT)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)
# Switch to ByteTrack
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")ビデオストリームでトラッカーを実行するには、YOLO26n、YOLO26n-seg、YOLO26n-pose、YOLO26n-obbなどの、トレーニング済みのDetect、Segment、Pose、またはOBBモデルを使用します。カスタムモデルは、ローカルで、またはUltralytics Platformのクラウドトレーニングを使用してトレーニングできます。
from ultralytics import YOLO
# Load an official or custom model
model = YOLO("yolo26n.pt") # Load an official Detect model
model = YOLO("yolo26n-seg.pt") # Load an official Segment model
model = YOLO("yolo26n-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サポートされているトラッカー#
Ultralytics YOLOには、6つの組み込みトラッカーが付属しています。そのYAML設定ファイルをtracker引数に渡すことで有効にします。
| トラッカー | 設定ファイル | モーションモデル | 外観 / ReID | カメラモーション補正 | オクルージョン処理 |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | 線形カルマン | オプション(with_reid) | あり (sparseOptFlow / ECC) | トラックバッファ + ReID再バインド |
| ByteTrack | bytetrack.yaml | 線形カルマン | なし | いいえ | 2段階の低信頼度救済 |
| OC-SORT | ocsort.yaml | 観測中心カルマン | なし | いいえ | ORU、OCM、OCRの最終観測からの再更新 |
| Deep OC-SORT | deepocsort.yaml | 観測中心カルマン | オプション(with_reid) | オプション(gmc_method) | OC-SORT + 適応的外観EMA |
| FastTracker | fasttrack.yaml | 線形カルマン + ロールバック | なし | いいえ | カルマンロールバック + オクルージョン時のbbox拡大 |
| TrackTrack | tracktrack.yaml | 線形カルマン (NSA) | オプション (HMIoUフォールバック) | あり (sparseOptFlow / ECC) | 反復的なマルチキュー関連付け + TAI |
どのトラッカーを使うべきか?#
このフローを使用して出発点を選択してください:
- 最速かつ最もシンプルなベースラインが必要ですか? → ByteTrack (ReIDなし、カメラモーション補正なし、最小限のオーバーヘッド)。
- ハンドヘルド、ドローン、またはカメラが動く映像ですか? → BoT-SORT (デフォルト。カメラモーション補正とオプションのReIDを追加)。
- 非線形運動 (スポーツ、ダンス、急な方向転換) で、ReIDが不要ですか? → OC-SORT (外観コストなしの観測中心の補正)。
- ID交換が主な問題となる混雑した移動カメラのシーンですか? → Deep OC-SORT または TrackTrack (両者とも適応的外観融合を追加。TrackTrackはさらにマルチキュー関連付けと重複ID抑制を追加)。
- リアルタイムで頻繁に部分的な重なりが発生し、ReIDの予算がありませんか? → FastTracker (カルマンロールバックを備えたオクルージョン対応のByteTrackバリアント)。
トラッカーの切り替え#
トラッカー設定のファイル名をtracker=に渡します。他のすべてのコードは同じままです。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(source="path/to/video.mp4", tracker="bytetrack.yaml")
results = model.track(source="path/to/video.mp4", tracker="ocsort.yaml")
results = model.track(source="path/to/video.mp4", tracker="tracktrack.yaml")設定#
トラッキングの引数#
追跡設定は、conf、iou、showなどのPredictモードとプロパティを共有します。詳細な設定については、Predictモデルのページを参照してください。
from ultralytics import YOLO
# Configure the tracking parameters and run the tracker
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.1, iou=0.7, show=True)カスタムトラッカー設定#
Ultralyticsでは、修正したトラッカー設定ファイルを使用することもできます。ultralytics/cfg/trackersからトラッカー設定ファイル(例:custom_tracker.yaml)のコピーを作成し、必要に応じて(tracker_typeを除き)設定を変更するだけです。
from ultralytics import YOLO
# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo26n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")共有トラッカー引数#
以下のパラメータはほとんどのトラッカーYAMLファイルで共通です。すべての設定にすべてのパラメータが存在するわけではありません。
検出の信頼度スコアがtrack_high_threshを下回ると、トラッカーはそのオブジェクトを更新しないため、アクティブなトラックがなくなります。
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
tracker_type | botsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrack | トラッカーのタイプを指定します。 |
track_high_thresh | 0.0-1.0 | 最初の関連付けのための閾値。検出が既存のトラックにどれだけ自信を持って一致するかを決定します。 |
track_low_thresh | 0.0-1.0 | 低信頼度の検出に対する2回目の関連付けの閾値。OC-SORTおよびDeep OC-SORTの場合、これはuse_byte: Trueの場合のみ適用されます。 |
new_track_thresh | 0.0-1.0 | 検出が既存のトラックと一致しない場合に新しいトラックを初期化するための閾値。 |
track_buffer | >=0 | 失われたトラックが削除される前に維持されるフレーム数。高い値はオクルージョンに対する許容度が高いことを意味します。 |
match_thresh | 0.0-1.0 | トラックを一致させるための閾値。高い値ほど、一致の条件が緩くなります。 |
fuse_score | True、False | 一致させる前に信頼度スコアとIoU距離を融合させるかどうか。 |
gmc_method | sparseOptFlow, orb, sift, ecc, none | グローバルモーション補正メソッド。カメラの動きを考慮するのに役立ちます。 |
proximity_thresh | 0.0-1.0 | 有効なReID一致に必要な最小IoU。外観の手がかりを使用する前に空間的な近接性を確保します。 |
appearance_thresh | 0.0-1.0 | ReIDに必要な最小の外観類似度。 |
with_reid | True、False | オクルージョン全体でのトラッキングを向上させるため、外観ベースの照合を有効にします。BoT-SORT、Deep OC-SORT、およびTrackTrackでサポートされています。 |
model | autoまたはエクスポートされたファイルへのパス | ReIDモデル。autoは、利用可能な場合はネイティブのYOLOバックボーン機能を使用し、そうでない場合はyolo26n-cls.ptにフォールバックします。カスタムエンコーダーには、.torchscript、.onnx、.engine、.openvinoなどのファイルを渡します。 |
トラッカー固有の引数#
各アルゴリズムは、共有パラメータに加えて追加の調整項目を提供します。説明や調整のアドバイスについては、以下の各トラッカーのセクション、または直接コンフィグファイルを参照してください。
再識別(ReID)の有効化#
オーバーヘッドを最小限にするため、ReIDはデフォルトで無効になっています。トラッカー設定ファイルでwith_reid: Trueを設定して有効にします。
ReIDモデルのオプション:
model: auto— ネイティブのYOLO検出器機能を使用し、最小限のオーバーヘッドを追加します。パフォーマンスの大幅な低下なしにReIDが必要な場合に最適です。検出器が互換性のある機能を公開していない場合は、yolo26n-cls.ptにフォールバックします。- エクスポートされたReIDモデル — クロップごとに1つの追加フォワードパスというコストを犠牲にしてより識別力の高い埋め込みを得るには、
model:をエクスポートされたファイル(.torchscript、.onnx、.engine、.openvinoなど)に向けます。エンコーダーはAutoBackend経由でロードされるため、Ultralyticsがサポートするすべてのエクスポート形式がコード変更なしで機能します。
すぐに使用できるONNXエンコーダーがすべてのモデルサイズ向けに公開されています。model:をこれらの名前のいずれかに設定すると、トラッカーの初回実行時にファイルが自動的にダウンロードされ(YOLOの重みがフェッチされるのと同じ方法)、手動のエクスポートやダウンロードのステップは不要です:
# In your tracker config (e.g. tracktrack.yaml)
with_reid: True
model: yolo26n-reid.onnx # downloaded on first use; swap n→s/m/l/x for a larger encoder| モデル | サイズ (ピクセル) | パラメータ (M) | FLOPs (B) |
|---|---|---|---|
| YOLO26n-reid.onnx | 448 | 2.8 | 2.0 |
| YOLO26s-reid.onnx | 448 | 7.5 | 6.6 |
| YOLO26m-reid.onnx | 448 | 12.4 | 20.1 |
| YOLO26l-reid.onnx | 448 | 15.3 | 25.2 |
| YOLO26x-reid.onnx | 448 | 32.7 | 55.9 |
現在利用可能なのは、トラッカーの外観ブランチ用のONNX ReIDエンコーダーのみです。ReIDのtrain、val、predictモード、および専用のReIDエクスポートレシピは現在開発中です。
別の分類モデルを使用してパフォーマンスを向上させるには、TensorRTなどのより高速なバックエンドにエクスポートしてください:
from torch import nn
from ultralytics import YOLO
# Load the classification model
model = YOLO("yolo26n-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", quantize=16, dynamic=True, batch=32)エクスポートが完了したら、トラッカーのコンフィグ内でTensorRTモデルのパスを指定します。
トラッカーの詳細#
各トラッカーの設計、固有のパラメータ、チューニングのヒントについては、以下のセクションを展開してください。
BoT-SORT#
BoT-SORT(Aharon et al., 2022)はデフォルトのトラッカーです。これはByteTrackを拡張し、カメラの動きの補正とオプションのReIDを追加しています:
- カメラ動き補正 (CMC): フレームごとに推定されたアフィン変換(デフォルトはスパースオプティカルフロー。ORB / ECCも利用可能)が、IoUマッチングの前にKalman状態に適用されます。
- **オプションのReID:**外観の埋め込みをコスト行列に統合できます。デフォルトでは無効になっています。
with_reid: Trueで有効にします。
推奨用途: 汎用的なトラッキング。特にカメラが移動する場合。見た目が似ている群衆によってIDの入れ替わりが発生する場合にのみ、ReIDを追加してください。
BoT-SORT固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
gmc_method | sparseOptFlow, orb, sift, ecc, none | カメラの動き補正バックエンド。sparseOptFlowがデフォルトです。noneはCMCを無効にします。 |
with_reid | True、False | 外観ベースのマッチングを有効にします。デフォルトはオフです。 |
model | autoまたはReIDモデルへのパス | ReIDモデル。autoは利用可能な場合はネイティブのYOLO機能を使用し、そうでない場合は.torchscript / .onnx / .engineのパスを渡します。 |
proximity_thresh | 0.0-1.0 | 外観特徴量を考慮する前の最小IoUしきい値。 |
appearance_thresh | 0.0-1.0 | ReIDマッチングに必要な最小のコサイン類似度。IDの入れ替わりを減らすには値を上げてください。 |
チューニングのヒント:
- 静止カメラ:
gmc_method: noneを設定して、フレームあたり数ミリ秒を節約します。 - 激しいカメラの動き:
sparseOptFlowを維持します。eccはより正確ですが遅くなります。 - 似た外見の群衆:
with_reid: Trueをオンにし、appearance_threshを上げます(例:0.85+)。
ByteTrack#
ByteTrack(Zhang et al., ECCV 2022)は軽量のベースラインです。線形カルマンフィルターとIoUを使用し、2段階の関連付けを行います:
- ステージ1: 高スコアの検出結果とアクティブなトラックをマッチングします。
- ステージ2: マッチしなかったトラックに対し、低スコアの検出結果で再試行し、一時的な部分オクルージョンからの回復を図ります。
外観モデルやカメラ動き補正はありません。
推奨用途: 静止カメラまたはほぼ静止しているカメラ。検出器の負荷が支配的で、トラッカーのオーバーヘッドを最小限に抑えたい場合。
ByteTrack固有の引数:共有トラッカー引数以外にはありません。
チューニングのヒント:
- **ノイズの多い検出器:**第2ステージの候補を増やすために、
track_low_threshを下げます。 - **高リコール検出器:**断片化したIDを減らすために、
track_high_threshを上げます。 - **頻繁なIDのちらつき:**短時間見失ったトラックが生き残るように、
track_bufferを上げます。
OC-SORT#
OC-SORT(Cao et al., CVPR 2023)は、SORTの観測中心の拡張です。SORTの軽量なデザイン(外観機能なし)を維持し、3つの修正を追加しています:
- 観測中心型再更新 (ORU): 前回の観測と現在の検出結果の間に仮想的な軌跡を再計算し、Kalman更新をやり直すことで、ドリフトした速度を修正します。
- 観測中心型モメンタム (OCM): 速度の一貫性項を用いて、誤った方向に移動する検出結果をペナルティ化します。
- 観測中心型回復 (OCR): マッチしなかった検出結果に対し、予測状態ではなく前回の観測値を使用して、最近失われたトラックとの再照合を行います。
推奨用途: ReIDモデルの計算コストをかけずに非線形な動きを追跡したい場合。
OC-SORT固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
delta_t | >=1 | OCMにおける速度方向計算の時間窓(フレーム数)。値を大きくすると平滑化されます。 |
inertia | 0.0-1.0 | 速度の一貫性コストの重み。値を大きくすると、急激な方向転換がより強くペナルティ化されます。 |
use_byte | True、False | 低信頼度の検出結果に対し、ByteTrack形式の第2アソシエーションパスを有効にします。 |
チューニングのヒント:
- 非線形運動:
inertiaを上げます(例:0.3-0.4)。 - スパースな検出:
use_byte: Trueを有効にします。 - **長期のオクルージョン:**OCRが再結合するための失われたトラックを増やすために、
track_bufferを上げます。
Deep OC-SORT#
Deep OC-SORTは、OC-SORTに外観情報とカメラの動き補正を追加したものです:
- 適応型外観融合: 検出結果の埋め込みが、検出の信頼度と重複度によって重みが変調されたコスト行列に融合されます。
- 動的外観EMA: トラックの埋め込みがEMAで更新され、その平滑化係数は検出信頼度に応じて適応的に変化します。
- カメラ動き補正: Kalman状態がスパースオプティカルフロー、ORB、またはECCを介してフレーム間でワープされます。
推奨用途: 群衆や移動カメラのシーンなど、視覚的には異なるが空間的に近い物体間でIDの入れ替わりが頻発する場合。
Deep OC-SORT固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
with_reid | True、False | 外観ベースのマッチングを有効にします。デフォルトはオフです。 |
model | auto、エクスポートされたReIDモデルファイル | ReIDモデル。autoはネイティブのYOLO機能を再利用し、そうでない場合はエクスポートされたファイル(.torchscript、.onnx、.engineなど)を渡します。 |
proximity_thresh | 0.0-1.0 | 外観特徴量を考慮する前の最小IoUしきい値。 |
appearance_thresh | 0.0-1.0 | ReIDマッチングに必要な最小のコサイン類似度。 |
alpha_fixed_emb | 0.0-1.0 | トラック埋め込み更新のための基本EMA係数。値を大きくすると、古い埋め込みがより長く保持されます。 |
gmc_method | sparseOptFlow, orb, sift, ecc, none | グローバルな動き補正手法。 |
delta_t | >=1 | OCMにおける速度方向計算の時間窓(フレーム数)(OC-SORTから継承)。 |
inertia | 0.0-1.0 | 速度一貫性コストの重み(OC-SORTから継承)。 |
use_byte | True、False | 低信頼度検出結果に対するByteTrack形式の第2アソシエーションパスを有効にします(OC-SORTから継承)。 |
チューニングのヒント:
- **群衆の中でのアイデンティティの入れ替わり:**埋め込みがよりゆっくり適応するように、
appearance_threshを上げ(例:0.92-0.95)、alpha_fixed_embを下げます。 - 動くカメラ:
gmc_method: sparseOptFlowを設定します(Deep OC-SORTのデフォルトはnoneです)。 - **低レイテンシ:**動きとCMCのみのために
with_reid: False(デフォルト)を維持し、IDの入れ替ありがエラーの大部分を占める場合にのみReIDを有効にします。
FastTracker#
FastTrackerは、外観モデルを持たない、オクルージョンを認識するByteTrackのバリアントです:
- **オクルージョン検出:**他のアクティブなトラックによるカバレッジが
occ_cover_threshを超える場合に、トラックが遮られているとフラグ付けします。 - オクルージョン時のKalmanロールバック: リングバッファされた履歴を使用して、Kalman状態をオクルージョン発生前のフレームに戻します。
- 動きの減衰と探索範囲の拡大: オクルージョン中は速度が減衰し、予測されたbboxが拡大されます。
- Init-IoU抑制: 新しいトラックがアクティブなトラックの上に発生することを防ぎます。
推奨用途: リアルタイムの検出専用パイプラインで、ターゲット同士の重複が頻発する場合(群衆、行列、スポーツ)。
FastTracker固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
reset_velocity_offset_occ | >=0 | オクルージョン発生時にKalman速度を復元するための履歴フレーム数。 |
reset_pos_offset_occ | >=0 | オクルージョン発生時にKalman位置を復元するための履歴フレーム数。 |
enlarge_bbox_occ | >=1.0 | オクルージョン中に予測bboxに適用される高さの倍率(幅はXYAHアスペクト比に従ってスケーリングされます)。 |
dampen_motion_occ | 0.0-1.0 | オクルージョン中の速度の倍率。値を小さくすると、オクルージョン中にトラックが「減速」するように見えます。 |
active_occ_to_lost_thresh | >=1 | アクティブなトラックが失われた状態に移動されるまでの、連続するオクルージョンフレームの最大値。 |
occ_cover_thresh | 0.0-1.0 | オクルージョン(遮蔽)を判定するために、あるトラックの面積が他のアクティブなトラックによって覆われる割合。 |
occ_reappear_window | >=0 | 最近オクルージョンが発生して見失ったトラックが、優先的に再検出可能となるフレーム数。 |
init_iou_suppress | 0.0-1.0 | 任意のアクティブなトラックとのIoUがこれを超える場合、新しいトラックの初期化を抑制します。無効にするには1.0に設定します。 |
チューニングのヒント:
- 頻繁な部分的なオクルージョン:
occ_cover_threshを下げます(例:0.5-0.6)。 - 重なり周辺での重複ID:
init_iou_suppressを下げます(例:0.5)。 - 長期のオクルージョン:
occ_reappear_windowとtrack_bufferを同時に上げます。 - 高速で移動するターゲット:
dampen_motion_occを上げ(1.0に近づけ)、enlarge_bbox_occを下げます。
TrackTrack#
TrackTrack(Shim et al., CVPR 2025)は、マルチキュー反復アソシエーションを使用して各トラックの視点から推論します:
- トラック視点ベースのアソシエーション (TPA): HMIoU、コサインReID距離、信頼度投影距離、コーナー角度距離を組み合わせます。割り当ては緩和閾値を用いて反復的に解決されます。
- トラック認識初期化 (TAI): 新しいIDが作成される前に、重複する生成を抑制します。
用途: 重複IDが問題となる、頻繁にオクルージョンが発生する混雑したシーンに最適です。
TrackTrack固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
iou_weight | 0.0-1.0 | マルチキューコスト行列におけるHMIoU距離の重み。 |
reid_weight | 0.0-1.0 | コサインReID距離の重み。ReIDが無効な場合はHMIoUにフォールバックします。 |
conf_weight | 0.0-1.0 | 信頼度投影距離の重み。 |
angle_weight | 0.0-1.0 | コーナー角度距離の重み。 |
penalty_p | 0.0-1.0 | 低信頼度検出に対するコストペナルティ。 |
penalty_q | 0.0-1.0 | 二次的なNMSによって回復された検出に対するコストペナルティ。 |
reduce_step | 0.0-1.0 | 反復ごとのマッチング閾値の緩和幅。 |
tai_thr | 0.0-1.0 | トラック認識初期化(TAI)NMSのIoU閾値。 |
min_track_len | >=0 | 新しいトラックが確定されるまでに必要な最小の連続更新回数。 |
lost_match_thr | 0.0-1.0 | 緩和されたロスト再結合パスのためのより緩いコストゲート。0はこれを無効にします。 |
with_reid | True、False | コサインReIDの外観マッチングを有効にします(ネイティブのYOLO特徴を使用)。デフォルトではオフです。 |
model | auto、ReIDファイル | ReIDモデル。autoはネイティブのYOLO機能を使用し、そうでない場合はエクスポートされたReIDファイルを使用します。 |
gmc_method | sparseOptFlow, orb, sift, ecc, none | グローバルな動き補正手法。 |
チューニングのヒント:
- **混雑した歩行者:**重複するスポーンをより多く抑制するために
tai_thrを下げ(例:0.45)、より長期のオクルージョンに対してtrack_bufferを上げます。 - 高速なカメラの動き:
gmc_method: sparseOptFlowを有効に維持します。 - 小型/高速オブジェクト:
angle_weightを少し上げ、min_track_lenを下げます。 - 必要な時のみReIDを有効にする: ReIDは推論コストを増加させます。短いオクルージョンの場合、デフォルトのマルチキューコストで通常は十分です。
Pythonの例#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
トラックの永続化ループ#
以下は、OpenCV(cv2)とYOLO26を使用してビデオフレームでオブジェクト追跡を実行するPythonスクリプトです。このスクリプトは、必要なパッケージ(opencv-pythonおよびultralytics)がすでにインストールされていることを前提としています。persist=True引数は、現在または次の画像がシーケンス内の次の画像であり、現在の画像内の前の画像からのトラックを期待することをトラッカーに伝えます。
persist=Trueは、同じビデオストリームからの連続するフレームをmodel.track()に渡す場合にのみ使用してください。これにより、トラッカーは以前のフレームの状態を再利用し、時間の経過とともに一貫したトラックIDを維持できます。前のトラックの状態が持ち越される可能性があるため、関連のない画像や異なるストリームに跨がってpersist=Trueを使用しないでください。
また、tracker="botsort.yaml"、tracker="bytetrack.yaml"、tracker="tracktrack.yaml"などのトラッカー設定ファイルを渡すことで、トラッカーバックエンドを選択することもできます。
import cv2
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.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 YOLO26 tracking on the frame, persisting tracks between frames
# and using the BoT-SORT tracker backend
results = model.track(frame, persist=True, tracker="botsort.yaml")
# Visualize the results on the frame
annotated_frame = results[0].plot()
# Display the annotated frame
cv2.imshow("YOLO26 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 YOLO26を使用すれば、これらのトラックのプロットはシームレスかつ効率的なプロセスとなります。
以下の例では、YOLO26のトラッキング機能を利用して、複数のビデオフレームにわたって検出されたオブジェクトの動きをプロットする方法を説明します。このスクリプトは、ビデオファイルを開き、フレームごとに読み取り、YOLOモデルを利用して様々なオブジェクトを識別・追跡するものです。検出されたバウンディングボックスの中心点を保持し、それらを接続することで、追跡対象のオブジェクトが辿った経路を示す線を引くことができます。
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
# Store the track history
track_history = defaultdict(list)
# Loop through the video frames
while cap.isOpened():
# Read a frame from the video
success, frame = cap.read()
if success:
# Run YOLO26 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("YOLO26 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つの異なるモデル(yolo26n.ptとyolo26n-seg.pt)が使用されており、それぞれが異なるビデオファイル内のオブジェクトを追跡します。ビデオファイルはSOURCESで指定されます。
threading.Threadにおけるdaemon=Trueパラメータは、メインプログラムが終了し次第、これらのスレッドが閉じられることを意味します。次に、start()でスレッドを開始し、join()を使用して両方のトラッカースレッドが完了するまでメインスレッドを待機させます。
最後に、すべてのスレッドがタスクを完了した後、結果を表示するウィンドウがcv2.destroyAllWindows()を使用して閉じられます。
import threading
import cv2
from ultralytics import YOLO
# Define model names and video sources
MODEL_NAMES = ["yolo26n.pt", "yolo26n-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 YOLO26 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エコシステムのトラッキング機能を強化しましょう 🙏!
よくある質問 (FAQ)#
マルチオブジェクトトラッキングとは何か、またUltralytics YOLOはそれをどのようにサポートしていますか?#
ビデオ分析におけるマルチオブジェクト追跡には、オブジェクトの特定と、ビデオフレーム全体で検出された各オブジェクトの一意のIDの維持の両方が含まれます。Ultralytics YOLOは、オブジェクトIDとともにリアルタイム追跡を提供することでこれをサポートし、セキュリティ監視やスポーツ分析などのタスクを容易にします。システムは、BoT-SORT、ByteTrack、OC-SORT、Deep OC-SORT、FastTracker、TrackTrackなどのトラッカーを使用し、YAMLファイルを介して設定できます。
トラッカーをYOLOモデルファイル内に保存することはできますか?#
いいえ。標準のUltralytics .ptファイルはYOLOモデルの重みを保存しますが、トラッカーは推論時にmodel.track()によって作成されます。トラックIDは連続するフレーム間のトラッカーの状態に依存するため、単一のスタンドアロン画像はボックス、クラス、信頼度などの検出を返すことはできますが、それ単体では意味のある持続的な追跡IDを生成することはできません。
デプロイ時には、アプリケーション内で検出器とトラッカーをパッケージ化し、フレームが同じビデオストリームからのものである場合はpersist=Trueを指定してフレーム単位でmodel.track()を呼び出します。動画間で状態が持ち越されないように、関連のないストリームには別々のモデルまたはトラッカーインスタンスを使用してください。
Ultralytics YOLO用のカスタムトラッカーを設定するにはどうすればよいですか?#
Ultralyticsトラッカー設定ディレクトリから既存のトラッカー設定ファイル(例:custom_tracker.yaml)をコピーし、tracker_typeを除いて必要に応じてパラメータを変更することで、カスタムトラッカーを設定できます。トラッキングモデルでは、このファイルを次のように使用します。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.track(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 = ["yolo26n.pt", "yolo26n-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 YOLO26 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("yolo26n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(list)
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("YOLO26 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()このスクリプトは、時間の経過に伴う追跡対象オブジェクトの移動経路を示すトラッキングラインをプロットし、オブジェクトの行動やパターンに関する貴重な洞察を提供します。