Ultralytics YOLO による複数物体追跡#
動画解析の領域における物体追跡は、フレーム内の物体の位置とクラスを特定するだけでなく、動画の進行に伴って検出された各物体の一意のIDを維持する重要なタスクです。応用範囲は監視やセキュリティからリアルタイムスポーツ解析まで無限に広がります。
トラッキングのサポート予定については、未発表の YOLO27 プレビューをご参照ください。
ultralytics 8.4.63以降では、OC-SORT、Deep OC-SORT、FastTracker、およびTrackTrackがBoT-SORTやByteTrackと併用できるようになります。
物体追跡に Ultralytics YOLO を選ぶ理由#
Ultralytics トラッカーからの出力は標準の物体検出と一貫していますが、物体IDという追加の価値があります。これにより、ビデオストリーム内の物体を簡単に追跡し、後続の解析を実行できます。物体追跡のニーズに Ultralytics YOLO の使用を検討すべき理由は次のとおりです。
- 効率性: 精度を妥協することなく、ビデオストリームをリアルタイムで処理します。
- 柔軟性: 複数の追跡アルゴリズムと設定をサポートします。
- 使いやすさ: 迅速な統合とデプロイのためのシンプルな Python API と CLI のオプション。
- カスタマイズ性: カスタムトレーニングされた YOLO モデルで簡単に使用でき、ドメイン固有のアプリケーションへの統合が可能です。
Watch: How to Run Multi-Object Tracking with Ultralytics YOLO26 | BoT-SORT & ByteTrack | VisionAI 🚀
実世界でのアプリケーション#
| 交通 | 小売 | 水産養殖 |
|---|---|---|
| 車両追跡 | 人物追跡 | 魚の追跡 |
クイックスタート#
デフォルトの TrackTrack トラッカーを使用して、ビデオ上で追跡を実行します。tracker 引数を変更して、別のトラッカーに切り替えます。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Default tracker (TrackTrack)
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 引数に渡すことで、1つ有効にします。
| トラッカー | 設定ファイル | モーションモデル | 外観 / ReID | カメラ動き補正 | オクルージョン処理 |
|---|---|---|---|---|---|
| BoT-SORT | botsort.yaml | 線形カルマン | オプション (with_reid) | 設定可能 (gmc_method) | トラックバッファ + 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) | オプション (with_reid) | 設定可能 (gmc_method) | 反復マルチキュー関連付け + TAI |
どのトラッカーを使用すべきか?#
このフローを使用して開始点を選択します。tracktrack.yaml は、tracker を渡さない場合に使用されます:
- 最速かつ最もシンプルなベースラインが必要ですか? → 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 以上での検出は、最初の関連付けステージに入ります。track_low_thresh と track_high_thresh の間の検出は、選択されたトラッカーが低確信度の関連付けを有効にしている場合に既存のトラックを回復できますが、新しいトラックを開始しません。track_low_thresh 以下での検出は無視されます。
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
tracker_type | botsort、bytetrack、ocsort、deepocsort、fasttrack、tracktrack | トラッカータイプを指定します。 |
track_high_thresh | 0.0-1.0 | 最初の関連付けのしきい値。検出が既存のトラックにどれほど確信度高くマッチングされるかに影響します。 |
track_low_thresh | 0.0-1.0 | 低確信度の回復検出の下限。OC-SORT および Deep OC-SORT は use_byte: True の場合のみこれらを使用します。TrackTrack はペナルティ付き関連付けプールにこれらを含めます。 |
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 モデルのパス | ReID モデル。auto は利用可能な場合にネイティブの YOLO バックボーン機能を使用し、そうでない場合は yolo26n-cls.pt にフォールバックします。カスタムエンコーダーは、.pt チェックポイント、.torchscript、.onnx、.engine などのエクスポートされたモデル、または OpenVINO モデルディレクトリのいずれかです。 |
トラッカー固有の引数#
各アルゴリズムは、共有パラメータに加えて追加のノブを公開します。説明とチューニングのアドバイスについては以下のトラッカーごとのセクションを参照するか、設定ファイルを直接参照してください:
再識別 (ReID) の有効化#
オーバーヘッドを最小限に抑えるため、ReID はデフォルトで無効になっています。トラッカー設定ファイルで with_reid: True を設定して有効にします。
ReID モデルのオプション:
model: auto— ネイティブの YOLO 検出器機能を使用し、最小限のオーバーヘッドを追加します。大きなパフォーマンスヒットなしで ReID が必要な場合に理想的です。検出器が互換性のある機能を公開していない場合は、yolo26n-cls.ptにフォールバックします。- カスタム ReID モデル —
model:を.ptチェックポイント、または.torchscript、.onnx、.engineなどの互換性のあるエクスポート済み埋め込みモデル、あるいは OpenVINO モデルディレクトリに向けます。エクスポートされたモデルはAutoBackendを介してロードされ、埋め込みテンソルを直接出力する必要があります。
すぐに使用できる ONNX エンコーダーがすべてのモデルサイズに対して公開されています。model: をこれらの名前の1つに設定すると、トラッカーが最初に実行されるときにファイルが自動的にダウンロードされ (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 モデルのパスを指定します。
トラッカーの詳細#
以下のセクションでは、各トラッカーの設計、固有のパラメータ、およびチューニングのヒントについて説明します。
Watch: Which Object Tracker Performs Better? | Speed, FPS & ID Stability | Ultralytics YOLO26 📊
BoT-SORT#
BoT-SORT (Aharon et al., 2022) は、ByteTrack をカメラ動き補正とオプションの ReID で拡張します:
- カメラ動き補正 (CMC): 各フレームで推定されるアフィンワープ (デフォルトではスパースオプティカルフロー。ORB / ECC も利用可能) が、IoU マッチングの前にカルマン状態に適用されます。
- オプションの 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 モデルのパス | autoは利用可能な場合にネイティブのYOLO機能を使用します。カスタムモデルは.ptチェックポイントまたは互換性のあるエクスポートにすることができます。 |
proximity_thresh | 0.0-1.0 | 外観特徴が考慮されるまでの最小IoU。 |
appearance_thresh | 0.0-1.0 | ReIDマッチに求められる最小の正規化された外観類似度。マッチングを厳しくするには大きくします。 |
チューニングのヒント:
- 固定カメラ:
gmc_method: noneを設定して、フレームあたり数ミリ秒節約します。 - 激しいカメラの動き:
sparseOptFlowを維持します。eccは精度が高いですが低速です。 - 類似した人混み:
with_reid: Trueをオンにし、appearance_threshを上げます(例:0.85+)。
ByteTrack#
ByteTrack(Zhang et al., ECCV 2022)は軽量なベースラインです。2段階のアソシエーションを持つ線形カルマンフィルター+IoUを使用します:
- ステージ1: スコアの高い検出結果をアクティブなトラックとマッチングします。
- ステージ2: マッチしなかったトラックをスコアの低い検出結果に対して再試行し、短い部分オクルージョンを回復します。
外観モデルやカメラモーション補正はありません。
最適な用途: 検出器のコストが支配的であり、トラッカーのオーバーヘッドを最小限に抑えたい静止カメラまたはほぼ静止しているカメラ。
ByteTrack固有の引数: 共有トラッカー引数以外にはありません。
チューニングのヒント:
- ノイズの多い検出器:
track_low_threshを下げることで、2段階目に多くの候補を残します。 - 高リコール検出器:
track_high_threshを上げて、断片化したIDを減らします。 - 頻繁なIDのちらつき:
track_bufferを上げて、短時間見失ったトラックを維持できるようにします。
OC-SORT#
OC-SORT(Cao et al., CVPR 2023)は、SORTの観測中心の拡張です。SORTの軽量な設計(外観特徴なし)を維持し、3つの修正を追加しています:
- 観測中心型再更新(ORU): 最後の観測と現在の検出の間に仮想的な軌跡を再生し、カルマン更新を再実行してドリフトした速度を修復します。
- 観測中心型モメンタム(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を上げます。
OBBモデルの場合、OCRはカルマン予測された指向性ボックスを使用します。これは、指向性の最後の観測履歴が保持されないためです。
Deep OC-SORT#
Deep OC-SORTは、OC-SORTに外観情報とカメラモーション補正を追加したものです:
- 外観マッチング: コサイン埋め込み距離は、オーバーラップによってゲート制御され、モーションコストと融合されます。
- 動的外観EMA: トラックの埋め込みは、検出信頼度に適応する平滑化係数を持つEMAで更新されます。
- カメラモーション補正: カルマン状態は、スパースオプティカルフロー、ORB、またはECCを介してフレーム間でワープされます。
最適な用途: 視覚的に異なるが空間的に近いオブジェクト間のIDの入れ替わりが一般的な、混雑したシーンやカメラが移動するシーン。
Deep OC-SORT固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
with_reid | True、False | 外観ベースのマッチングを有効にします。デフォルトではオフです。 |
model | auto または互換性のある ReID モデルのパス | autoは利用可能な場合にネイティブのYOLO機能を使用します。カスタムモデルは.ptチェックポイントまたは互換性のあるエクスポートにすることができます。 |
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を超えた場合に、トラックがオクルージョンされているとフラグ付けします。 - オクルージョン時のカルマンロールバック: リングバッファ化された履歴を使用して、カルマン状態をオクルージョン前のフレームにロールバックします。
- モーション減衰と検索の拡張: オクルージョン中、速度が減衰し、予測されたバウンディングボックスが拡大されます。
- Init-IoU抑制: アクティブなトラックの上に新しいトラックが生成されるのを防ぎます。
最適な用途: ターゲット同士の重複が頻繁に発生するリアルタイムの検出専用パイプライン(群衆、待ち行列、スポーツ)。
FastTracker固有の引数:
| パラメータ | 有効な値または範囲 | 説明 |
|---|---|---|
reset_velocity_offset_occ | >=0 | オクルージョン発生時にカルマン速度を復元するために戻る履歴フレーム。 |
reset_pos_offset_occ | >=0 | オクルージョン発生時にカルマン位置を復元するために戻る履歴フレーム。 |
enlarge_bbox_occ | >=1.0 | オクルージョン中に予測されたバウンディングボックスに適用される高さのスケール(幅は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 | ReIDが有効な場合のHMIoU距離の重み。そうでない場合はHMIoUが直接使用されます。 |
reid_weight | 0.0-1.0 | ReIDが有効な場合のコサインReID距離の重み。そうでない場合は無視されます。 |
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 | トラック認識初期化NMSのIoU閾値。 |
min_track_len | >=0 | 新しいトラックが確認されるまでの最小履歴長。 |
lost_match_thr | 0.0-1.0 | 緩和されたロスト再バインドパスのゆるいコストゲート。0はこれを無効にします。 |
with_reid | True、False | コサインReID外観マッチングを有効にします(ネイティブのYOLO機能を使用)。デフォルトではオフです。 |
model | auto または互換性のある ReID モデルのパス | autoは利用可能な場合にネイティブのYOLO機能を使用します。カスタムモデルは.ptチェックポイントまたは互換性のあるエクスポートにすることができます。 |
gmc_method | sparseOptFlow、orb、sift、ecc、none | グローバルモーション補正手法。 |
チューニングのヒント:
- 混雑した歩行者: より多くの重複生成を抑制するために
tai_thrを下げ(例:0.45)、より長いオクルージョンに対してはtrack_bufferを上げます。 - 高速なカメラの動き:
gmc_method: sparseOptFlowを有効に維持します。 - 小さく高速なオブジェクト:
angle_weightをわずかに上げ、min_track_lenを下げます。 - 必要な場合にのみReIDを有効にする: 推論コストが追加されます。短いオクルージョンに対しては、デフォルトのマルチキューコストで通常十分です。
SegmentモデルおよびPoseモデルでは、マスクとキーポイントが検出と整合した状態を維持するように、TrackTrackは緩いNMS検出リカバリをスキップします。
Pythonの例#
Watch: How to Build Interactive Object Tracking with Ultralytics YOLO | Click to Crop & Display ⚡
トラッキングループの永続化#
これは、OpenCV(cv2)とYOLO26を使用してビデオフレーム上でオブジェクトトラッキングを実行するPythonスクリプトです。このスクリプトは、必要なパッケージ(opencv-pythonおよびultralytics)がすでにインストールされていることを前提としています。persist=True引数は、現在処理中の画像またはフレームがシーケンス内の次のものであること、および現在の画像で前の画像からのトラックを期待することをトラッカーに伝えます。
同じビデオストリームからの連続したフレームをmodel.track()に渡す場合にのみ、persist=Trueを使用します。これにより、トラッカーは以前のフレームからの状態を再利用し、時間の経過にわたって一貫したトラック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 関数を定義します。この関数は、ビデオファイルをフレーム単位で読み込み、トラッカーを実行し、結果を表示します。
この例では、yolo26n.pt と yolo26n-seg.pt の 2 つの異なるモデルが使用され、それぞれが異なるビデオファイル内のオブジェクトを追跡します。ビデオファイルは 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): Model checkpoint name or path loaded inside the thread.
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()この例は、より多くのスレッドを作成し同じ方法論を適用することにより、より多くのビデオファイルやモデルを処理するように簡単に拡張できます。
新しいトラッカーのコントribute#
マルチオブジェクト追跡に精通しており、Ultralytics YOLO で追跡アルゴリズムを正常に実装または適応させましたか?ultralytics/cfg/trackers のトラッカーセクションへのコントributeをお待ちしております。実際のアプリケーションやソリューションは、追跡タスクに取り組むユーザーにとって非常に価値のあるものになります。
このセクションにコントributeすることで、Ultralytics YOLO フレームワーク内で利用可能な追跡ソリューションの範囲が広がり、コミュニティにとって別のレイヤーの機能性と有用性が追加されます。
コントributeを開始するには、Pull Request (PR) 🛠️ の送信に関する包括的な手順について コントリビューションガイド を参照してください。皆様のご参加をお待ちしております。
Ultralytics YOLO エコシステムの追跡機能を一緒に強化しましょう 🙏。
FAQ#
いいえ。標準の Ultralytics
.ptファイルには YOLO モデルの重みが保存されますが、トラッカーはmodel.track()によって推論時に作成されます。トラック ID は連続するフレームにわたるトラッカーの状態に依存するため、単一のスタンドアロン画像では、ボックス、クラス、信頼度などの検出結果を返すことはできますが、それ単体では意味のある持続的な追跡 ID を生成することはできません。デプロイの場合は、アプリケーション内で検出器とトラッカーを一緒にパッケージ化し、フレームが同じビデオストリームからのものである場合は
persist=Trueを使用してmodel.track()をフレーム単位で呼び出します。ビデオ間で状態が持ち越されないように、関連のないストリームには個別のモデルまたはトラッカーインスタンスを使用してください。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): Model checkpoint name or path loaded inside the thread. 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 の能力の恩恵を受けています。
複数のビデオフレームにわたるオブジェクトの軌跡を可視化するには、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: result = model.track(frame, persist=True)[0] annotated_frame = result.plot() if result.boxes and result.boxes.is_track: boxes = result.boxes.xywh.cpu() track_ids = result.boxes.id.int().cpu().tolist() 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()このスクリプトは、時間の経過に伴う追跡されたオブジェクトの移動パスを示す追跡線をプロットし、オブジェクトの動作やパターンに関する貴重なインサイトを提供します。