まず第一に、OpenCV VideoSurveillanceプロジェクトは、質問に対処するための良い方法です。
あなたが言ったように、検出応答のデータ関連付けを行います。また、単純化されたメカニズム(初期化はフレームのしきい値と削除にも基づいています)によって誤検知(あなたが言ったように1つのオブジェクトに2つのブロブ)を処理します。もう1つの問題は、あなたが言及したように、通常、2つのオブジェクトに対応する約1つのブロブがオクルージョンと呼ばれます(VideoSurveillanceプロジェクトでは「衝突」という用語が使用されますが、現在は廃止されています)。VideoSurveillance は、3D カラー ヒストグラム モデリングに基づくパーティクル フィルタの実装を使用して、この状況を解決しています。
簡単な説明: 見た目 (服装) に基づいて 2 つの異なるターゲットをどのように区別できますか? 色ヒストグラムを保存して、後で将来のフレームで使用できますよね? でも、どうやって検索するの?次のフレームで考えられるすべての重心を検索するか、オブジェクトがあると思われる領域の周りに散在する 200 のランダムなポイントを使用できます。この200点が粒子です。それらはどのように機能しますか?それらは、焦点を合わせている領域を比較し、オブジェクトがそこにある確率を生成します。距離が近ければ近いほど、その可能性は高くなります。最後に、すべての可能性を合計して、「平均」重心を見つけます。
簡単に言えば、各ターゲットの衣服は確率関数内でモデル化され、粒子フィルタリングのアイデアのおかげでほぼリアルタイムの計算が実現されます。
最後に、カルマン フィルターは予測子であり、モーション データのみを使用してトラッカーを支援します。パーティクル フィルタの結果が本来よりもクレイジーになった場合に備えて、極端な動きの動作を「フィルタリング」します。VideoSurveillance にはこれも含まれます。両方を使用すると、外観が補完され、トラッカーがより洗練されます。
編集:マルチターゲット追跡にどのように役立ちますか? データが関連付けられた単純なトラッカーがあると仮定して、2 つのオブジェクトが「衝突」しようとしているとします。オブジェクトがマージされるまで、トラッカーは正常に動作します。「マージ」中、トラッカーは 1 つのオブジェクトのみを認識します。もう1つは失われます。しばらくすると、それらは分割され、トラッカーは古いオブジェクトを新しいオブジェクトとして検出します! どうすればこれを修正できますか? 今回は、パーティクル フィルタリングと外観モデリングからやり直しましょう。
マージする前に、2 つのオブジェクトが互いに近づいています。オブジェクトは独立しており、トラッカーはそれらをはっきりと見ることができます。この間、外観モデラー (オブジェクトがどのように見えるかを「記憶」するメカニズム) は、これら 2 つのオブジェクトがどのように見えるかを学習しています。もちろん、フレームが進むにつれて、両方のオブジェクトの外観がわずかに変化します。だからこそモデラーには、時間の経過とともに「記憶」を適応させる「学習率」があります。
今回は、マージ中にトラッカーをより辛抱強く設定し、以前のように 2 番目のオブジェクトを簡単には殺さないようにしました。トラッカーは両方のオブジェクトをアクティブにします。遮られていないオブジェクトは以前と同様に正常に追跡され、他のオブジェクト バウンディング ボックスはターゲットの再配置を試みます。運が良ければ*、しばらくすると、遮られた (隠れた) オブジェクトが再表示 (分割) され、バウンディング ボックスがパーティクルのおかげでそこに引き付けられます。
*前述のように、遮られたターゲットのバウンディング ボックスはモデラーによってモデル化されます。遮られた人物が隠れている時間が長すぎると、モデラーは古いオブジェクトを忘れて、遮られた領域の前にあるもの (つまり、遮られていないオブジェクト) を学習するか、孤児の箱のようにさまよってしまいます (これは漂流と呼ばれます)。VideoSurveillance にはそのためのメカニズムがありません。簡単な解決策の 1 つは、オクルージョン中にモデラーの適応を停止することです。どのように?2 つのバウンディング ボックスが重なっている場合。