質問

私はモーションアプリケーションの構造に取り組んでおり、オブジェクトの剛性構造を決定するためにオブジェクトに配置された多くのマーカーを追跡しています。

このアプリは、基本的に、複数のカメラビューで標準のLevenberg-Marquardtの最適化を使用しており、予想されるマーカーポイントと各ビューから2Dで得られたマーカーポイントの違いを最小限に抑えています。

各マーカーポイントと各ビューについて、次の関数が最小化されます。

double diff = calculatedXY[index] - observedXY[index]

計算されたxy値は、最適化を介して見つける必要がある多くの未知のパラメーターに依存し、観察されたxyは2dのマーカーポイント位置です。合計で、私が最小化することを目指しているような関数の数(マーカーポイント *ビュー)があります。

すべてのマーカーポイントを見るカメラのシミュレーションをコーディングしましたが、照明、オクルージョン、またはカメラビューにないためにポイントが表示されない場合、ケースを処理する方法を疑問に思っていました。アプリの実際の実行では、すべてのマーカーが一度に表示されるわけではなく、コンピュータービジョンアルゴリズムがどれだけ堅牢になるかによっては、すべてのマーカーが一度に表示されるわけではない可能性が高いため、オブジェクトを表示します。常にマーカー。

マーカーポイントを観察できなかった場合に、diff値を0(Sigma Squared Difference = 0)に設定することを考えましたが、これは結果を歪める可能性がありますか?

私が気づいたもう1つのことは、あまりにも多くのビューで提示された場合、アルゴリズムがそれほど良くないということです。あまりにも多くのビューが表示された場合、悪い解決策を推定する可能性が高くなります。これは、ビューが多すぎると表示されたときにローカルの最小値に達する可能性が高くなるため、バンドル調整の一般的な問題ですか?

役に立ちましたか?

解決

欠落しているマーカーに対応する用語を除外するだけで、一般的な慣行です。すなわち。最小化しようとしないでください calculateXY-observedXY ない場合 observedXY 学期。何もゼロに設定する必要はありません。そもそもこの用語を検討するべきではありません - スキップするだけです(または、コードでは、エラーをゼロに設定することに相当すると思います)。

バンドルの調整は、単に多数の観測を投げると、ひどく失敗する可能性があります。最初にいくつかのビューで解くことにより、ソリューションを徐々に構築してから、追加し続けます。

ある種の「堅牢な」アプローチを試してみたいと思うかもしれません。最小二乗を使用する代わりに、「損失関数」を使用します1. 。これらは、間違っている観測が一握りであっても、最適化が生き残ることができます。これは、Levenberg-Marquardtフレームワークで引き続き行うことができます。損失関数の導関数をヤコビアンに組み込むだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top