Ultralytics YOLO27:
Get Started

Ultralytics YOLOによる複数オブジェクト追跡#

YOLO multi-object tracking with trajectory paths

動画分析におけるオブジェクト追跡は重要なタスクです。フレーム内のオブジェクトの位置とクラスを特定するだけでなく、動画の進行に合わせて検出された各オブジェクトに固有のIDを維持します。監視やセキュリティからリアルタイムのスポーツ分析まで、活用範囲は多岐にわたります。

追跡機能の今後の対応予定については、未リリースのYOLO27プレビューをご覧ください。

🚀 新しいトラッカー:OC-SORT、Deep OC-SORT、FastTracker、TrackTrack

ultralytics 8.4.63以降では、OC-SORT、Deep OC-SORT、FastTracker、TrackTrackをBoT-SORTおよびByteTrackと併せて使用できます。

オブジェクト追跡にUltralytics YOLOを選ぶ理由#

Ultralyticsのトラッカーの出力は標準的なオブジェクト検出と一貫性があり、オブジェクトIDが追加されています。そのため、動画ストリーム内のオブジェクトを簡単に追跡し、その後の分析に活用できます。オブジェクト追跡にUltralytics YOLOを使用するメリットは次のとおりです。

  • 効率性:精度を損なわず、動画ストリームをリアルタイムで処理できます。
  • 柔軟性:複数の追跡アルゴリズムと設定に対応しています。
  • 使いやすさ:シンプルなPython APIとCLIオプションにより、すばやく統合してデプロイできます。
  • カスタマイズ性:カスタム学習済みYOLOモデルを簡単に使用でき、特定の分野向けアプリケーションに統合できます。


視聴: Ultralytics YOLO26 でマルチオブジェクトトラッキングを実行する方法 | BoT-SORT と ByteTrack | VisionAI 🚀

実世界での活用例#

交通小売養殖
車両追跡人物追跡魚の追跡

クイックスタート#

デフォルトのTrackTrackトラッカーを使用して動画の追跡を実行します。tracker引数を変更すると、別のトラッカーに切り替えられます。

例
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# デフォルトのトラッカー(TrackTrack)
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)

# 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

# 公式モデルまたはカスタムモデルを読み込む
model = YOLO("yolo26n.pt")  # 公式Detectモデルを読み込む
model = YOLO("yolo26n-seg.pt")  # 公式Segmentモデルを読み込む
model = YOLO("yolo26n-pose.pt")  # 公式Poseモデルを読み込む
model = YOLO("path/to/best.pt")  # カスタム学習済みモデルを読み込む

# モデルで追跡を実行する
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # デフォルトのトラッカーで追跡
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # ByteTrackを使用

対応トラッカー#

Ultralytics YOLOには、6種類のトラッカーが組み込まれています。tracker引数にYAML設定ファイルを渡すと有効になります。

トラッカー設定ファイルモーションモデル外観 / ReIDカメラモーション補正オクルージョンへの対応
BoT-SORTbotsort.yaml線形カルマン任意(with_reid)設定可能(gmc_method)トラックバッファ + ReID再割り当て
ByteTrackbytetrack.yaml線形カルマンなしいいえ低信頼度検出を2段階で救済
OC-SORTocsort.yaml観測中心型カルマンなしいいえORU、OCM、OCRによる最終観測からの再更新
Deep OC-SORTdeepocsort.yaml観測中心型カルマン任意(with_reid)設定可能(gmc_method)OC-SORT + 任意の適応型外観EMA
FastTrackerfasttrack.yaml線形カルマン + ロールバックなしいいえカルマンロールバック + オクルージョン時のbbox拡大
TrackTracktracktrack.yaml線形カルマン(NSA)任意(with_reid)設定可能(gmc_method)複数の手掛かりによる反復的な対応付け + TAI

どのトラッカーを使えばよいですか?#

次の手順を参考に、最初に使うトラッカーを選んでください。trackerを渡さない場合は、tracktrack.yamlが使用されます。

  1. 最速でシンプルなベースラインが必要ですか? → ByteTrack(ReIDなし、カメラモーション補正なし、オーバーヘッド最小)。
  2. 手持ち、ドローン、または移動カメラで撮影した映像ですか? → BoT-SORT(カメラモーション補正と任意のReIDを追加)。
  3. 非線形な動き(スポーツ、ダンス、急な方向転換)があり、ReIDは不要ですか? → OC-SORT(外観特徴の計算コストなしで、観測中心の補正を実行)。
  4. 移動カメラによる混雑したシーンで、IDの入れ替わりが主な問題ですか? → Deep OC-SORTまたはTrackTrack(どちらも任意の外観照合に対応し、TrackTrackは複数の手掛かりによる対応付けと重複IDの抑制も追加)。
  5. リアルタイム処理で部分的な重なりが頻繁に発生し、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")

設定#

追跡の引数#

追跡設定ではPredictモードと同じプロパティ(conf、iou、showなど)を使用します。その他の設定については、モデルのPredictページをご覧ください。

例
from ultralytics import YOLO

# 追跡パラメーターを設定してトラッカーを実行する
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

# モデルを読み込み、カスタム設定ファイルでトラッカーを実行する
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_typebotsort, bytetrack, ocsort, deepocsort, fasttrack, tracktrackトラッカーの種類を指定します。
track_high_thresh0.0-1.0最初の関連付けのしきい値です。検出結果を既存のトラックにどの程度確実に対応付けるかに影響します。
track_low_thresh0.0-1.0低信頼度の復帰検出に対する下限値です。OC-SORTとDeep OC-SORTでは、use_byte: Trueの場合にのみ低信頼度の復帰検出を使用します。TrackTrackでは、低信頼度の復帰検出をペナルティ付きの関連付け候補プールに含めます。
new_track_thresh0.0-1.0検出結果が既存のどのトラックにも一致しない場合に、新しいトラックを初期化するためのしきい値です。
track_buffer>=0消失したトラックを削除せずに維持するフレーム数です。値が大きいほど、オクルージョンに対する許容度が高くなります。
match_thresh0.0-1.0トラック照合のしきい値です。値が大きいほど、照合が緩やかになります。
fuse_scoreTrue, False照合の前に、信頼度スコアとIoU距離を融合するかどうかを指定します。
gmc_methodsparseOptFlow, orb, sift, ecc, noneグローバルモーション補償の方式です。カメラの動きを考慮するのに役立ちます。
proximity_thresh0.0-1.0有効なReID照合に必要な最小IoUです。外観情報を使用する前に、位置が十分近いことを確認します。
appearance_thresh0.0-1.0ReIDに必要な最小正規化外観類似度です。
with_reidTrue, Falseオクルージョンをまたいだ追跡の精度を高めるため、外観ベースの照合を有効にします。BoT-SORT、Deep OC-SORT、TrackTrackでサポートされています。
modelautoまたは互換性のある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:に以下のいずれかの名前を設定すると、トラッカーの初回実行時にファイルが自動的にダウンロードされます(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.onnx4482.82.0
YOLO26s-reid.onnx4487.56.6
YOLO26m-reid.onnx44812.420.1
YOLO26l-reid.onnx44815.325.2
YOLO26x-reid.onnx44832.755.9
ReIDは追跡専用です

現在利用できるのは、トラッカーの外観ブランチ向けONNX ReIDエンコーダーのみです。ReIDのtrain、val、predictモードと、専用のReIDエクスポート手順は、現在開発中です。

別の分類モデルを使ってパフォーマンスを高めるには、TensorRTなどの高速なバックエンド向けにエクスポートしてください。

ReIDモデルをTensorRTにエクスポートする
from torch import nn

from ultralytics import YOLO

# 分類モデルを読み込みます
model = YOLO("yolo26n-cls.pt")

# 平均プーリング層を追加します
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

# TensorRTにエクスポートします
model.export(format="engine", quantize=16, dynamic=True, batch=32)

エクスポート後、トラッカー設定でTensorRTモデルのパスを指定します。

トラッカーの詳細#

以下の各セクションでは、トラッカーごとの設計、固有のパラメーター、調整のヒントについて説明します。



視聴: どのオブジェクトトラッカーが優れているか? | 速度、FPS、ID 安定性 | 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_methodsparseOptFlow, orb, sift, ecc, noneカメラモーション補償のバックエンドです。sparseOptFlowがデフォルトです。noneではCMCが無効になります。
with_reidTrue, False外観ベースの照合を有効にします。デフォルトでは無効です。
modelautoまたは互換性のあるReIDモデルのパスautoでは、利用可能な場合はネイティブYOLOの特徴を使用します。カスタムモデルには.ptチェックポイントや互換性のあるエクスポート済みモデルを指定できます。
proximity_thresh0.0-1.0外観特徴を考慮する前に必要な最小IoUです。
appearance_thresh0.0-1.0ReIDの照合に必要な最小正規化外観類似度です。値を大きくすると、照合が厳格になります。

調整のヒント:

  • 固定カメラ: gmc_method: noneを設定すると、1フレームあたり数ミリ秒を節約できます。
  • カメラの動きが大きい場合: sparseOptFlowを維持してください。eccの方が精度は高くなりますが、処理は遅くなります。
  • 外見の似た物体が多い場合: with_reid: Trueを有効にし、appearance_threshを大きくします(例: 0.85+)。

ByteTrack#

ByteTrack(Zhang et al., ECCV 2022)は、軽量なベースラインです。線形カルマンフィルターとIoUを用いた2段階の関連付けを行います。

  • ステージ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>=1OCMで速度方向を計算する際の時間窓(フレーム数)です。値が大きいほど平滑化が強くなります。
inertia0.0-1.0速度一貫性コストの重みです。値が大きいほど、急な方向転換へのペナルティが強くなります。
use_byteTrue, False低信頼度の検出結果を対象に、ByteTrack方式の第2段階の関連付けを有効にします。

調整のヒント:

  • 非線形の動き: inertiaを上げます(例: 0.3-0.4)。
  • 検出がまばらな場合: use_byte: Trueを有効にします。
  • 長時間のオクルージョン: track_bufferを上げると、OCRが再関連付けできる消失トラックが増えます。

OBBモデルでは、方向付きボックスの最後の観測履歴が保持されないため、OCRはカルマンフィルターが予測した方向付きボックスを使用します。

Deep OC-SORT#

Deep OC-SORTは、OC-SORTに外観情報とカメラモーション補償を追加したものです。

  • 外観照合: コサイン埋め込み距離を重なり具合で制限し、動きのコストと融合します。
  • 動的な外観EMA: トラックの埋め込みをEMAで更新します。平滑化係数は検出信頼度に応じて変化します。
  • カメラモーション補償: スパースオプティカルフロー、ORB、またはECCを用いて、フレーム間でカルマン状態を変換します。

適した用途: 視覚的には異なるものの位置が近い物体間でIDの入れ替わりが頻発する、混雑したシーンやカメラが動くシーンに適しています。

Deep OC-SORT固有の引数:

パラメーター有効な値または範囲説明
with_reidTrue, False外観ベースの照合を有効にします。デフォルトでは無効です。
modelautoまたは互換性のあるReIDモデルのパスautoでは、利用可能な場合はネイティブYOLOの特徴を使用します。カスタムモデルには.ptチェックポイントや互換性のあるエクスポート済みモデルを指定できます。
proximity_thresh0.0-1.0外観特徴を考慮する前に必要な最小IoUです。
appearance_thresh0.0-1.0ReIDの照合に必要な最小正規化外観類似度です。
alpha_fixed_emb0.0-1.0トラック埋め込みの更新に使う基本EMA係数です。値が大きいほど、古い埋め込みが長く維持されます。
gmc_methodsparseOptFlow, orb, sift, ecc, noneグローバルモーション補償の方式です。
delta_t>=1OCMで速度方向を計算する際の時間窓(フレーム数)です(OC-SORTから継承)。
inertia0.0-1.0速度一貫性コストの重みです(OC-SORTから継承)。
use_byteTrue, False低信頼度の検出結果を対象に、ByteTrack方式の第2段階の関連付けを有効にします(OC-SORTから継承)。

調整のヒント:

  • 混雑時のID入れ替わり: 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を超えた場合、そのトラックをオクルージョン状態として判定します。
  • オクルージョン時のカルマン状態のロールバック: リングバッファに保存した履歴を使って、カルマン状態をオクルージョン前のフレームに戻します。
  • 動きの減衰と探索範囲の拡大: オクルージョン中は速度を減衰させ、予測したbboxを拡大します。
  • 初期化時のIoUによる抑制: アクティブなトラックに重なる位置から新しいトラックが生成されるのを防ぎます。

適した用途: 対象同士の重なりが頻繁に発生する(混雑、行列、スポーツなど)、リアルタイムの検出専用パイプラインに適しています。

FastTracker固有の引数:

パラメーター有効な値または範囲説明
reset_velocity_offset_occ>=0オクルージョン開始時にカルマン速度を復元するための、遡る履歴フレーム数です。
reset_pos_offset_occ>=0オクルージョン開始時にカルマン位置を復元するための、遡る履歴フレーム数です。
enlarge_bbox_occ>=1.0オクルージョン中に予測bboxへ適用される高さのスケーリングです(幅はXYAHのアスペクト比に応じてスケーリングされます)。
dampen_motion_occ0.0-1.0オクルージョン中の速度乗数です。値を小さくすると、トラックはオクルージョン中に「減速」します。
active_occ_to_lost_thresh>=1アクティブなトラックがlostに移行するまでの、連続してオクルージョン状態となる最大フレーム数です。
occ_cover_thresh0.0-1.0オクルージョンを宣言するための、別のアクティブなトラックに覆われたトラック面積の割合です。
occ_reappear_window>=0最近オクルージョン状態になったlostトラックを、優先的に再検出できる状態に保つフレーム数です。
init_iou_suppress0.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_weight0.0-1.0ReIDが有効な場合のHMIoU距離の重みです。それ以外の場合はHMIoUがそのまま使用されます。
reid_weight0.0-1.0ReIDが有効な場合のコサインReID距離の重みです。それ以外の場合は無視されます。
conf_weight0.0-1.0信頼度投影距離の重みです。
angle_weight0.0-1.0コーナー角度距離の重みです。
penalty_p0.0-1.0信頼度の低い検出に対するコストペナルティです。
penalty_q0.0-1.0セカンダリNMSによって再検出された対象に対するコストペナルティです。
reduce_step0.0-1.0反復ごとのマッチしきい値の緩和量です。
tai_thr0.0-1.0トラック対応初期化NMSのIoUしきい値です。
min_track_len>=0新しいトラックを確定するまでに必要な最小履歴長です。
lost_match_thr0.0-1.0緩和されたlost再関連付けパスに適用する、より緩いコストゲートです。無効にするには0を設定します。
with_reidTrue, FalseコサインReIDによる外観マッチングを有効にします(ネイティブのYOLO特徴を使用)。デフォルトでは無効です。
modelautoまたは互換性のあるReIDモデルのパスautoでは、利用可能な場合はネイティブYOLOの特徴を使用します。カスタムモデルには.ptチェックポイントや互換性のあるエクスポート済みモデルを指定できます。
gmc_methodsparseOptFlow, orb, sift, ecc, noneグローバルモーション補償の方式です。

調整のヒント:

  • 混雑した場所の歩行者: tai_thrを小さくして(例: 0.45)、重複するトラックの生成をさらに抑制します。長時間のオクルージョンではtrack_bufferを大きくします。
  • カメラが高速に動く場合: gmc_method: sparseOptFlowを有効にしたままにします。
  • 小型または高速の物体: angle_weightを少し大きくし、min_track_lenを小さくします。
  • 必要な場合にのみReIDを有効にします: 推論コストが増加するため、短時間のオクルージョンには、通常、デフォルトの複数手掛かりコストで十分です。

SegmentモデルとPoseモデルでは、TrackTrackは緩いNMSによる検出の再取得をスキップするため、マスクとキーポイントが対応する検出とずれません。

Pythonの例#



視聴: Ultralytics YOLO でインタラクティブなオブジェクトトラッキングを構築する方法 | クリックして切り抜き・表示 ⚡

トラックを維持するループ#

以下は、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"などのトラッカー設定ファイルを渡して、トラッカーのバックエンドを選択することもできます。

トラッキングを行うストリーミングforループ
import cv2

from ultralytics import YOLO

# YOLO26モデルを読み込む
model = YOLO("yolo26n.pt")

# ビデオファイルを開く
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# ビデオフレームをループ処理する
while cap.isOpened():
    # ビデオからフレームを読み込む
    success, frame = cap.read()

    if success:
        # フレーム間でトラックを維持しながら、フレーム上でYOLO26のトラッキングを実行する
        # BoT-SORTトラッカーのバックエンドを使用する
        results = model.track(frame, persist=True, tracker="botsort.yaml")

        # フレーム上に結果を可視化する
        annotated_frame = results[0].plot()

        # 注釈付きフレームを表示する
        cv2.imshow("YOLO26 Tracking", annotated_frame)

        # 'q'が押された場合にループを終了する
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # ビデオの最後に到達した場合にループを終了する
        break

# ビデオキャプチャオブジェクトを解放し、表示ウィンドウを閉じる
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

# YOLO26モデルを読み込む
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:
        # フレーム間でトラックを維持しながら、フレーム上でYOLO26のトラッキングを実行する
        result = model.track(frame, persist=True)[0]

        # ボックスとトラックIDを取得する
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # フレーム上に結果を可視化する
            frame = result.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)))  # 中心点のx座標、y座標
                if len(track) > 30:  # 30フレームにわたって30個のトラックを保持する
                    track.pop(0)

                # トラッキングラインを描画する
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # 注釈付きフレームを表示する
        cv2.imshow("YOLO26 Tracking", frame)

        # 'q'が押された場合にループを終了する
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # ビデオの最後に到達した場合にループを終了する
        break

# ビデオキャプチャオブジェクトを解放し、表示ウィンドウを閉じる
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

# モデル名とビデオソースを定義する
MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # ローカルビデオ。ウェブカメラの場合は0

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

# forループを使ってトラッカースレッドを作成し、開始する
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()

# すべてのトラッカースレッドが終了するまで待機する
for thread in tracker_threads:
    thread.join()

# 後処理を行い、ウィンドウを閉じる
cv2.destroyAllWindows()

スレッドを追加して同じ方法を適用すれば、この例を簡単に拡張し、より多くのビデオファイルやモデルを扱えます。

新しいトラッカーのコントリビューション#

マルチオブジェクトトラッキングに精通し、Ultralytics YOLOを使用してトラッキングアルゴリズムを実装または適応した経験はありますか?ultralytics/cfg/trackersのトラッカーセクションへのコントリビューションをお待ちしています。実際のアプリケーションやソリューションは、トラッキングタスクに取り組むユーザーにとって大きな助けとなります。

このセクションにコントリビューションすることで、Ultralytics YOLOフレームワークで利用できるトラッキングソリューションの範囲が広がり、コミュニティに新たな機能と価値が加わります。

コントリビューションを始めるには、プルリクエスト(PR)の提出方法を詳しく説明したコントリビューションガイドをご覧ください 🛠️。皆様からのコントリビューションを楽しみにしています。

力を合わせて、Ultralytics YOLOエコシステムのトラッキング機能を向上させましょう 🙏!

よくある質問#

  • ビデオ解析におけるマルチオブジェクトトラッキングでは、物体を識別するとともに、ビデオフレーム間で検出された各物体に固有のIDを維持します。Ultralytics YOLOは、物体IDとともにリアルタイムトラッキングを提供することでこれをサポートし、セキュリティ監視やスポーツ解析などのタスクを実現します。このシステムでは、BoT-SORT、ByteTrack、OC-SORT、Deep OC-SORT、FastTracker、TrackTrackなどのトラッカーを使用し、YAMLファイルで設定できます。

  • いいえ。標準の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
    
    # モデル名とビデオソースを定義する
    MODEL_NAMES = ["yolo26n.pt", "yolo26n-seg.pt"]
    SOURCES = ["path/to/video.mp4", "0"]  # ローカルビデオ。ウェブカメラの場合は0
    
    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
    
    # forループを使ってトラッカースレッドを作成し、開始する
    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()
    
    # すべてのトラッカースレッドが終了するまで待機する
    for thread in tracker_threads:
        thread.join()
    
    # 後処理を行い、ウィンドウを閉じる
    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()

    このスクリプトは、時間経過に伴う追跡対象の移動経路を示すトラッキングラインをプロットし、物体の挙動やパターンを把握するうえで役立つ情報を提供します。

コメント