kdtreeを使用せずに、最初に低速の機能マッチングを理解することをお勧めします。
- 入力:顔や花などの1000個の参照フィーチャ。これらをF1と呼びます..F1000
- クエリ機能Q:どの顔または花の機能が最も似ているか、最も近いか、Q?
ご存知のように、
SIFT
は画像の特徴を128個の8ビット数に減らし、
類似度(特徴F、特徴Q)=ユークリッド距離(SIFT(F)、SIFT(Q))になるようにスケーリングします。
F1 .. F1000のどれがQに最も似ているかを見つける最も簡単な方法は、F1、F2...を1つずつ調べることです。
# find the feature of F1 .. F1000 nearest Q
nearestdistance = infinity
nearestindex = 0
for j in 1 .. 1000:
distance = Euclideandistance( SIFT(Fj), SIFT(Q) ) # 128 numbers vs. 128 numbers
if distance < nearestdistance:
nearestdistance = distance
nearestindex = j
(もちろん、ループの外側でSIFT番号を計算します。)
Kdtree
は、近くのベクトルをすばやく見つける方法にすぎません。一致しているもの(...を表す数値のベクトル)や方法(ユークリッド距離)とはほとんど関係ありません。現在、kdtreeは2d、3d ...おそらく20dまでは非常に高速ですが、20dを超えるすべてのデータの線形スキャンよりも高速ではない可能性があります。では、kdtreeは128dの機能に対してどのように機能するのでしょうか?主なトリックは、検索を早期に終了することです。MujaとLoweによる論文、
自動アルゴリズム構成を使用した高速近似最近傍、 2009、10pは、128dSIFT機能を照合するための複数のランダム化kdtreeについて説明しています。(LoweはSIFTの発明者です。)
2つの画像IとQを比較するために、それぞれの特徴ベクトルのセット(数百から数千のSIFTベクトル)を見つけ、これらのセットのほぼ一致するものを探します。(画像を分子、特徴を原子と考えることができます。ほぼ一致する分子は、ほぼ一致する原子よりもはるかに困難ですが、原子をすばやく一致させるのに役立ちます。)
お役に立てれば。