Main Content

複数オブジェクトの追跡

"追跡" は、ビデオ ストリーム内で時間の経過とともに移動する単一または複数のオブジェクトを特定するプロセスです。"オブジェクト検出" が対象オブジェクトの位置を単一フレーム内で特定するプロセスであるのに対し、追跡は複数のフレームにわたって検出されたオブジェクトを関連付けます。

複数のオブジェクトを追跡するには、検出、予測およびデータの関連付けが必要です。

  • 検出 — ビデオ フレーム内の対象オブジェクトを検出します。

  • 予測 — オブジェクトの次のフレームにおける位置を予測します。

  • データの関連付け — 予測位置を使用して、複数のフレームにわたる検出結果を関連付けてトラックを作成します。

検出

対象オブジェクトを追跡する方法は、追跡対象と、カメラが静止しているかどうかに応じて選択します。

静止カメラを使用したオブジェクトの検出

静止カメラを使用して動いているオブジェクトを検出するには、vision.ForegroundDetector System object™ を使用して背景差分を実行します。背景差分は効率的な手法ですが、カメラが静止状態でなければなりません。

移動カメラを使用したオブジェクトの検出

移動カメラを使用して動いているオブジェクトを検出するには、スライディング ウィンドウ検出手法を使用できます。通常、この方法は背景差分による手法よりも時間がかかります。特定カテゴリのオブジェクトを検出して追跡するには、次の表に説明されている System object または関数を使用します。

検出アルゴリズムの選択

追跡するオブジェクトのタイプカメラ機能
動くものすべて静止

顔、目、鼻、口、上半身静止、移動

歩行者静止、移動

YOLO ベース検出器の結果をフィルター処理して、"people" クラスのみを保持できます。詳細については、Detect People Using YOLO v4 Object Detectorの例を参照してください。

カスタムのオブジェクト カテゴリ静止、移動

予測

時間の経過とともにオブジェクトを追跡するには、次のフレームにおけるオブジェクトの位置を予測しなければなりません。最もシンプルな予測手法では、オブジェクトがその最後の既知の位置の近くに留まっていると仮定します。つまり、前の検出結果が次の予測として使用されます。この手法は特にフレーム レートが高い場合に効果があります。ただし、オブジェクトの移動速度が一定でない場合や、オブジェクトの移動速度に比べてフレーム レートが低い場合、この予測手法は失敗することがあります。

より高度な予測手法として、以前に観測されたオブジェクトの動きを使用する方法があります。カルマン フィルター (vision.KalmanFilter) は、オブジェクトが等速度や等加速度といった運動モデルに従って移動するものと仮定して、オブジェクトの次の位置を予測します。カルマン フィルターでは、プロセス ノイズおよび測定ノイズも考慮されます。"プロセス ノイズ" は、オブジェクトの実際の動きと、運動モデルの間に見られる偏差です。"測定ノイズ" は検出誤差です。

カルマン フィルターをより簡単に構成するには、関数 configureKalmanFilter を使用します。この関数は、直交座標系内を等速度と等加速度で移動する物理オブジェクトを追跡するためのフィルターを設定します。統計量はすべての次元に沿って同じです。カルマン フィルターを異なる仮定に基づいて構成するには、vision.KalmanFilter オブジェクトを直接作成しなければなりません。

カルマン フィルターは、運動モデルと測定モデルが線形であり、各モデルの不確実性がガウス分布に従うことを前提としています。これらの仮定が正しくなく、物体が運動する場合や測定値が不完全な場合は、別の追跡フィルターを使用しなければなりません。Sensor Fusion and Tracking Toolbox™ は、追加の追跡フィルターを提供します。詳細については、Introduction to Estimation Filters (Sensor Fusion and Tracking Toolbox)を参照してください。

データの関連付け

"データの関連付け" は、複数のフレームにわたる同じ物理オブジェクトの検出を関連付けるプロセスです。特定のオブジェクトの経時履歴は、"トラック" と呼ばれる複数の検出データで構成されます。トラック表現にはオブジェクトの以前の位置に関する完全な履歴を含めることができます。あるいは、オブジェクトの最後の既知の位置と現在の速度のみを含めることもできます。

検出からトラックへのマッチのコスト関数

検出データをトラックにマッチするには、マッチの評価基準を設定しなければなりません。コスト関数を定義することで、これらの基準を確立できます。検出をトラックにマッチさせるコストが大きいほど、検出がそのトラックに属している可能性は低くなります。予測されたオブジェクトと検出されたオブジェクトの各境界ボックスがオーバーラップする度合いとして、シンプルなコスト関数を定義することができます。走行中の自動車からの歩行者の追跡の例では、関数 bboxOverlapRatio を使用してこのタイプのコスト関数を実装します。vision.KalmanFilter オブジェクトの関数 distance を使用すると、予測の不確実性を考慮するなど、より高度なコスト関数を実装できます。オブジェクトのサイズと外観に関する情報を組み込むことが可能なカスタムのコスト関数を実装することもできます。

可能性の低いマッチの除去

"ゲーティング" は、コスト関数にしきい値を強制適用するなどして、可能性の低いマッチを候補から除去する手法です。コストが特定のしきい値を上回る場合、観測値をトラックとマッチしません。しきい値を使用したこの手法では、各予測の周りに円形の "ゲート領域" が作成され、マッチとみなされるにはその領域内で検出されなければなりません。ゲーティングの代替方法として、ゲート領域を予測の k 最近傍が収まる大きさに拡大する方法があります。

検出のトラックへの割り当て

データの関連付けは、最小重み 2 部マッチング問題 (グラフ理論の分野) に縮約されます。2 部グラフはトラックと検出を頂点として表します。また、検出とトラックのマッチング コストを、対応する頂点間の重み付きエッジとして表します。

関数 assignDetectionsToTracks は、ハンガリー法 2 部マッチング アルゴリズムの Munkres バリアントを実装します。関数への入力は "コスト行列" で、各行がトラックに対応し、各列は検出に対応します。各エントリには特定の検出を特定のトラックに割り当てる際のコストが含まれます。ゲーティングを実装するには、不可能なマッチのコストを無限大に設定します。

トラックの管理

データの関連付けでは、視野に新しいオブジェクトが出現する可能性や、追跡中のオブジェクトが視野から消えるという可能性を考慮しなければなりません。したがって、与えられたフレームに対して、いくつかの新しいトラックを作成したり、いくつかの既存のトラックを破棄したりする必要があるかもしれません。関数 assignDetectionsToTracks は、マッチしたペアに加えて、割り当てられなかったトラックと割り当てられなかった検出結果のインデックスも返します。

非マッチの検出結果を処理する方法の 1 つは、これらの各検出に新しいトラックを作成することです。あるいは、特定サイズを超える非マッチの検出からのみ新しいトラックを作成する、もしくは特定の位置や外観をもつ検出から新しいトラックを作成することができます。たとえば、シーンにドアなどの単一の出入口がある場合、出入口近くの非マッチの検出からのみ新しいトラックを開始するように指定し、それ以外のすべての非マッチの検出はすべてノイズとして破棄できます。

非マッチのトラックを処理するために、特定のフレーム数にわたって非マッチのトラックを削除することもできます。あるいは、非マッチのトラックが最後に認識された位置が出入口の近くである場合にこのトラックを削除するようにも指定できます。

参考

オブジェクト

関数

関連する例

詳細

外部の Web サイト