SIFT

SIFT (Scale-Invariant Feature Transform) は、David Loweによって2004年に発表された、スケールおよび回転に不変な局所特徴のランドマーク的アルゴリズムである。ORB、AKAZE、SuperPointなどが今も従う検出器+記述子というテンプレートを定義し、マッチング精度において今も金標準であり続けている(例えばCOLMAP方式のオフライン再構成において)。

キーポイント検出: スケール空間中のブロブ

SIFTはコーナーではなくブロブを検出し、それを複数のスケールにわたって行うため、同じ実世界の構造が画像中で大きく写っても小さく写っても発見される。ガウシアンスケール空間は、増加するスケールσ\sigmaを持つガウス関数で画像を畳み込むことで構築される。

L(x,y,σ)=G(x,y,σ)I(x,y)L(x, y, \sigma) = G(x, y, \sigma) * I(x, y)

隣接するスケール間の**差分ガウシアン(Difference of Gaussians, DoG)**は、スケール正規化されたLaplacian of Gaussian(ブロブ検出器)を、わずかな計算コストで近似する。

D(x,y,σ)=L(x,y,kσ)L(x,y,σ)D(x, y, \sigma) = L(x, y, k\sigma) - L(x, y, \sigma)

スケール空間はオクターブ(octaves)(オクターブ間で画像を2倍ダウンサンプリング)に、オクターブあたり複数のスケールを持つように構成される。つまり、ピラミッドの各レベルに複数のブラー段階を持つ画像ピラミッドである。

キーポイントは、空間とスケール両方における**DDの局所極値**である。各サンプルは(x,y,σ)(x, y, \sigma)にわたる3×3×33 \times 3 \times 3の立方体内の26個の近傍と比較される。候補は以下のように処理される。

  1. 極値周りで2次関数(DDの二次テイラー展開)をフィッティングすることでサブピクセル/サブスケール精度に精密化される。
  2. コントラストによるフィルタリングD|D|が小さい極値は不安定であり除外される。
  3. エッジ応答によるフィルタリング — DoGはエッジに沿って強く応答するが、そこでは位置決めが不良である。Harrisテストと同様に、主曲率の比(すなわちDD2×22 \times 2ヘッシアンの固有値の比)を閾値処理することで、ブロブらしく位置決めの良い点のみを保持する。

記述子: 128次元の勾配ヒストグラム

マッチング

SIFT記述子は浮動小数点ベクトルであり、L2距離で比較される。曖昧なマッチはLoweの比率テストでフィルタリングされる。最近傍を採用するのは、d1,d2d_1, d_2を第1・第2最近傍への距離として、d1/d2<0.8d_1 / d_2 < 0.8の場合のみである。大規模データベースでは、近似最近傍構造(kd木、FLANN)がブルートフォースを置き換える。SIFTの128次元は、kd木にとって実用上の限界に近い。

コスト

SIFTは非常に精度が高いが遅い。CPU上では高解像度画像1枚あたり1秒程度かかる。そのため、リアルタイムSLAMは歴史的にFAST/ORBを代わりに採用してきた。オンラインでSIFT級のロバスト性が必要な場合は、GPU実装やバイナリの代替が用いられる。

SLAMにおける意義

ハンズオン

関連ノート