このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
"追跡"は、ビデオ ストリーム内で時間の経過とともに移動する単一または複数のオブジェクトを特定するプロセスです。オブジェクトの追跡は、オブジェクトの検出とは異なります。オブジェクトの検出は、関心のあるオブジェクトを単一フレーム内で見つけるプロセスです。これに対して追跡は、複数のフレームにわたり検出されたオブジェクトを関連付けます。
複数のオブジェクトを追跡するには、検出、予測およびデータの関連付けが必要です。
検出: ビデオ フレーム内で関心のあるオブジェクトを検出します。
予測: オブジェクトの次のフレームにおける位置を予測します。
データの関連付け: 予測位置を使用して、複数のフレームにわたる検出結果を関連付けて"トラック" を作成します。
関心のあるオブジェクトを追跡する方法は、追跡対象と、カメラが静止しているかどうかに応じて選択します。
静止カメラを使用して動いているオブジェクトを検出するには、vision.ForegroundDetector
System object を使用して背景差分を実行します。背景差分は効率的な手法ですが、カメラが静止状態でなければなりません。
移動カメラを使用して動いているオブジェクトを検出するには、スライディング ウィンドウ検出手法を使用できます。通常、この方法は背景差分による手法よりも時間がかかります。特定カテゴリのオブジェクトを検出して追跡するには、次の表に説明されている System object または関数を使用します。
追跡するオブジェクトのタイプ | カメラ | 機能 |
---|---|---|
動くものすべて | 静止 |
|
顔、目、鼻、口、上半身 | 静止、移動 |
|
歩行者 | 静止、移動 |
|
カスタムのオブジェクト カテゴリ | 静止、移動 | 関数 |
時間の経過とともにオブジェクトを追跡するには、次のフレームにおけるオブジェクトの位置を予測しなければなりません。最もシンプルな予測手法では、オブジェクトがその最後の既知の位置の近くにあると仮定します。つまり、前の検出結果が次の予測として使用されます。この手法は特にフレーム レートが高い場合に効果があります。ただし、オブジェクトの移動速度が一定でなかったり、オブジェクトの移動速度に比べてフレーム レートが低い場合、この予測手法は失敗することがあります。
より高度な予測手法として、以前に観測されたオブジェクトの動きを使用する方法があります。カルマン フィルター (vision.KalmanFilter
) では、オブジェクトの次の位置を予測できます。ここではオブジェクトが等速度や等加速度などの運動モデルに基づいて移動するものと仮定されます。カルマン フィルターでは、プロセス ノイズおよび測定ノイズも考慮されます。"プロセス ノイズ"は、オブジェクトの実際の動きと、運動モデルの間に見られる偏差です。"測定ノイズ"は検出誤差です。
カルマン フィルターの構成を容易にするには、configureKalmanFilter
を使用します。この関数は、直交座標系内を等速度と等加速度で移動する物理オブジェクトを追跡するためのフィルターを設定します。統計量はすべての次元に沿って同じです。カルマン フィルターを異なる仮定に基づいて設定するには、vision.KalmanFilter
オブジェクトを直接作成しなければなりません。
"データの関連付け"は、複数のフレームにわたる同じ物理オブジェクトの検出を関連付けるプロセスです。特定のオブジェクトの経時履歴は複数の検出データで構成され、"トラック" と呼ばれます。トラック表現にはオブジェクトの以前の位置に関する完全な履歴を含めることができます。あるいは、オブジェクトの最後の既知の位置と現在の速度のみを含めることも可能です。
検出データをトラックにマッチするには、マッチの評価基準を設定しなければなりません。通常、この基準を設定するには、コスト関数を定義します。検出をトラックにマッチさせるコストが大きいほど、検出がそのトラックに属している可能性は低くなります。シンプルなコスト関数は、予測されたオブジェクトと検出されたオブジェクトの各境界ボックスがオーバーラップする度合いとして定義することができます。走行中の自動車からの歩行者の追跡の例では,関数bboxOverlapRatio
を使用してこのコスト関数を実装しています。vision.KalmanFilter
オブジェクトの関数distance
を使用すると、予測の不確実性を考慮する、さらに高度なコスト関数を実装できます。また、オブジェクトのサイズと外観に関する情報を組み込んだカスタムのコスト関数を実装することもできます。
"ゲーティング"は、コスト関数にしきい値を強制適用するなどして、可能性の低いマッチを候補から除去する手法です。コストが特定のしきい値を上回る場合、観測値をトラックにマッチすることはできません。しきい値を用いたこの手法では、各予測値の周りに円形の "ゲート領域"が設定され、マッチする検出をその領域内で見つけます。ゲーティングの代替方法として、ゲート領域を予測の k 最近傍が収まる大きさに拡大する方法があります。
データの関連付けは、最小重み 2 部マッチング問題です。これはグラフ理論でも詳しく研究されている分野です。2 部グラフはトラックと検出を頂点として表します。また、検出とトラックのマッチング コストを、対応する頂点間の重み付きエッジとして表します。
関数assignDetectionsToTracks
は、ハンガリー法 2 部マッチング アルゴリズムの Munkres バリアントを実装します。関数への入力は "コスト行列"で、各行がトラックに対応し、各列は検出に対応します。各エントリには特定の検出を特定のトラックに割り当てる際のコストが含まれます。ゲーティングを実装するには、不可能なマッチのコストを無限大に設定します。
データの関連付けでは、視野に新しいオブジェクトが出現する可能性や、追跡中のオブジェクトが視野から消えるという可能性を考慮しなければなりません。これは、どのフレームについても新しいトラックがいくつか作成される可能性があること、そして既存のトラックのうち破棄されるものもあることを示します。関数assignDetectionsToTracks
は、マッチしたペアに加えて、割り当てられなかったトラックと割り当てられなかった検出結果のインデックスも返します。
マッチしなかった検出結果を処理する方法の 1 つは、これらの各検出に新しいトラックを作成することです。あるいは、特定サイズを超えるマッチしなかった検出や、特定の位置や外観をもつ検出から新しいトラックを作成する方法もあります。たとえば、シーンにドアなどの単一の出入口がある場合、出入口近くのマッチしない検出からのみ新しいトラックを開始するように指定して、それ以外の検出はすべてノイズとみなすことができます。
マッチしないトラックを処理する別の方法として、特定のフレーム数にわたってマッチしないトラックを削除することも可能です。あるいは、マッチしないトラックが最後に認識された位置が出入口の近くである場合にこのトラックを削除するようにも指定できます。
assignDetectionsToTracks
|vision.KalmanFilter
|bboxOverlapRatio
|configureKalmanFilter
|vision.ForegroundDetector
|vision.PeopleDetector
|vision.CascadeObjectDetector
|trainCascadeObjectDetector
|extractHOGFeatures
|vision.PointTracker
|selectStrongestBbox