6

特徴抽出(sift ecc)を使用したオブジェクト検出の投稿をたくさん読んでいます。

両方の画像の記述子を計算した後、適切な一致を取得するために、crossCheckMatching を使用しています。( sample/cpp/descritpor_extractor_matcher.cppにあります)

この選択の理由を理解できますか?

なぜ両方を評価する必要があるのか

descriptorMatcher->knnMatch( descriptors1, descriptors2, matches12, knn );
descriptorMatcher->knnMatch( descriptors2, descriptors1, matches21, knn );

わかりません。

たとえば、ユークリア距離を計算すると、両方の方向で同じ結果が返されませんか?

4

2 に答える 2

28

通常、マッチャーでユークルーディアン距離が使用されるとは想定できません。たとえば、BFMatcher はさまざまな基準をサポートしています: L1、L2、ハミング...

詳細については、こちらのドキュメントを確認してください: http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html

とにかく、これらの距離測定はすべて対称的であり、質問に答えるためにどれを使用しても問題ありません.

答えは: 呼び出しknnMatch(A,B)は呼び出しと同じではありませんknnMatch(B,A)

あなたが私を信用しないなら、私はあなたにグラフィカルで直感的な説明をしようとします. knn==1簡単にするために、クエリされた記述子ごとに、アルゴリズムは1つの対応のみを見つけると仮定します(プロットがはるかに簡単です:-)

いくつかの 2D サンプルを無作為に選び、2 つのデータセット (赤と緑) を作成しました。最初のプロットでは、緑がクエリ データセットに含まれています。つまり、緑の点ごとに、最も近い赤の点を見つけようとします (各矢印は対応を表します)。

2 番目のプロットでは、クエリとトレーニングのデータセットが入れ替わっています。

crossCheckMatching()最後に、双方向の一致のみを保存する関数の結果もプロットしました。

図1

ご覧crossCheckMatching()のとおり、 の出力は、それぞれの単一の knnMatch(X,Y) / knnMatch(Y,X) よりもはるかに優れています。これは、最も強い対応のみが保持されているためです。

于 2012-07-14T15:23:02.303 に答える
2

私はあなたが使用している正確なモジュールを扱っていませんが、ドキュメントから:

http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html

2 番目の呼び出しはトレーニングをクエリと交換しているように見えるため、異なる結果セットが得られる可能性があります。これは、マッチ 12 の名前がマッチ 21 に変更されていることからも示唆されています。これは、双方向の関連付けではなく、方向の関連付けです。

これは、機械学習で大規模なデータセットをトレーニングする場合に見られます。データの 1 つのサブセットをトレーニングすると、データの別のサブセットでトレーニングするよりも優れたパフォーマンスが得られます。あなたが書いたステップの後に2つの一致がどのように使用されるかはわかりませんが、最良のトレーニングを選択するか、データからより良い共分散情報を取得できると思います.

ユークリッド距離は両方向で同じですが、double ベクトルの順序が変わるため、2 つの呼び出し間で関連付けの構造が変わります (記述子 1 == 記述子 2 の場合を除きます。これは対称行列を形成し、おそらく繰り返しても無駄になります)。

コードベースの後半でmatchs12とmatchs21の使用を投稿すると、おそらく両方向の関連付けを持つ正確な理由も明らかになるでしょう。

これが、繰り返される呼び出しを理解するための出発点になることを願っています。

*編集*

あなたがリンクを提供したソースコードを調べて、あなたの質問に答えて、距離は2つのポイント間で同じですが、特定のポイント(ポイントA)から別の特定のポイント(ポイントB)への最も近いポイントは必ずしもそうではありません反転可能なステートメント。したがって、B は A に最も近い点かもしれませんが、A は B に最も近い点ではないかもしれません。

フレデリックの投稿がグラフで示しているように、ユークリッド距離が 2 点間で変化するのではなく、比較のパースペクティブを変更すると、ユークリッド距離が最も近い点が変化する可能性があります。したがって、クロスチェックにより、最も近いポイント関係を共有するポイントを検証できます (A は B に最も近く、B は A に最も近い)。

ただし、これが最良のアプローチではないというあなたの直感は正しいですが、より複雑なアプローチでは、O(N^2) 時間ではなく O(N*ln(N)) 時間でそのような関係をすべて見つけることができます。 -- 特にヒューリスティック駆動の検索。しかし、(比較的) 少数のポイントの場合、期待されるパフォーマンスの向上はごくわずかであり、実装は (かなりの改善のために) より複雑になります。

于 2012-07-12T17:43:34.673 に答える