画像の二つの場所が同じ物を写しているかを判断するには、画像全体を比べるよりも、繰り返し見つかる小さな手掛かりを比べる方が効率的である。その手掛かりを選ぶ処理がFeature Detection、すなわち特徴点抽出だ。カメラの移動推定、パノラマ合成、3D復元、画像検索、外観検査まで、画像間の対応を必要とする処理の入口にある。本稿では「どこを選ぶか」と「選んだ点をどう照合するか」を分け、古典的アルゴリズムの考え方を数式と実装の観点から整理する。

30秒要約

特徴点とは何か――「目立つ点」ではなく「再び見つかる点」

画素座標を \mathbf{x}=(x,y)^\mathsf{T}、画像を I(\mathbf{x}) とする。特徴点とは、近傍パッチを少し平行移動・回転・拡大しても、同じ物理的位置として安定して検出でき、さらに周囲の模様で他の点と区別できる位置である。前者を検出器(detector)、後者を数値ベクトルまたはビット列にするものを記述子(descriptor)と呼ぶ。

この二つは別物である。FASTは原則として検出器、BRIEFは記述子であり、ORBは両者を組み合わせた仕組みである。SIFTはDoG検出器と勾配ヒストグラム記述子の組である。名称だけを比べると混乱しやすいため、以降では常に「点を選ぶ」「周囲を表す」「点を照合する」の三段階として扱う。

特徴点ベース対応付けの流れ二枚の画像から特徴点と記述子を抽出し、候補対応をRANSACで幾何学的に検証して確かな対応を得る図 画像 A入力フレーム検出 + 記述keypoints / descriptors尺度・向きも保存候補照合距離・ratio test幾何検証RANSAC対応 / 姿勢画像 Bにも同じ抽出を行う

図: Duskcoil作成。検出結果の数ではなく、最終的に幾何学的に整合する対応数がシステム品質を左右する。

コーナー: 二方向に変化する場所を選ぶ

まず最も直感的な特徴がコーナーである。画像パッチ W を微小な移動 \mathbf{u}=(u,v)^\mathsf{T} だけずらしたときの見た目の変化を、SSD(差分二乗和)で書く。

E(\mathbf{u})=\sum_{\mathbf{x}\in W} w(\mathbf{x})\left[I(\mathbf{x}+\mathbf{u})-I(\mathbf{x})\right]^2 \simeq \mathbf{u}^{\mathsf{T}}\mathbf{M}\mathbf{u}

一階のTaylor近似では、局所構造行列(second-moment matrix)\mathbf{M} は次になる。

\mathbf{M}=\sum_{\mathbf{x}\in W}w(\mathbf{x}) \begin{bmatrix}I_x^2&I_xI_y\\I_xI_y&I_y^2\end{bmatrix}

I_x,I_y は画像勾配、w はガウス窓などの重みである。\mathbf{M} の固有値を \lambda_1,\lambda_2 とすると、小さい方まで大きい点がコーナーとなる。一方向だけ勾配が大きいエッジでは、一方の固有値が小さくなる。平坦部では両方が小さい。Harris detectorは、固有値を毎画素で明示的に解かず、次の応答値を大きくする位置を局所最大として選ぶ。

R=\det(\mathbf{M})-k\,\mathrm{trace}(\mathbf{M})^2 =\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2

k は典型的に0.04〜0.06程度である。Harrisは回転には比較的強いが、固定サイズの窓で見るため、被写体が大きく縮小・拡大したときに同じ点を選ぶ仕組みは持たない。Shi–Tomasiの \min(\lambda_1,\lambda_2) も、追跡に適したコーナーを選ぶ実務的な基準として広く使われる。

Blob: 角でなくても「塊」なら手掛かりになる

コーナーだけでは、丸いロゴ、斑点、暗い穴、明るい反射の中心を十分に拾えない。そこで、ある尺度で周囲と明暗が異なる局所的な塊をBlobとして検出する。ガウシアン G(\mathbf{x};\sigma) で平滑化した尺度空間を

L(\mathbf{x};\sigma)=G(\mathbf{x};\sigma)*I(\mathbf{x})

と書く。* は畳み込み、\sigma は「どの大きさを見ているか」を表す。Laplacian of Gaussian(LoG)の正規化応答

\sigma^2\nabla^2L=\sigma^2(L_{xx}+L_{yy})

は、明るい背景上の暗い円、または暗い背景上の明るい円で強く反応する。位置だけでなく \sigma 方向も含む三次元 (x,y,\sigma) 空間で極値を取れば、Blobの中心と特徴的な大きさを同時に選べる。半径がおおよそ \sqrt{2}\sigma の円形Blobに対応する、という尺度の解釈もできる。

LoGは優れた考え方だが、各尺度で二階微分を厳密に計算すると高価である。この近似と高速化がDoG、そしてSIFTへつながる。

DoG: ぼかしの差から尺度不変な候補を見つける

Difference of Gaussians(DoG)は、隣り合う二つのぼかし画像の差である。

D(\mathbf{x};\sigma)=L(\mathbf{x};k\sigma)-L(\mathbf{x};\sigma)

ここで k>1 は隣接尺度の比である。DoGは定数係数を除いて尺度正規化LoGを近似するため、畳み込みを一段追加するだけでBlob候補を探せる。実装では画像を徐々にぼかしたGaussian pyramidを作り、各DoG画素を同じ尺度の8近傍と、上下の尺度の各9近傍、合計26個と比べる。最大または最小なら候補である。

候補はそのまま使わない。弱い極値はノイズなので棄却し、細長いエッジ上の極値も除く。DoG極値の周囲を三次元二次関数で補間すると、サブピクセルの位置と尺度を求められる。Hessian

\mathbf{H}=\begin{bmatrix}D_{xx}&D_{xy}\\D_{xy}&D_{yy}\end{bmatrix}

について \mathrm{Tr}(\mathbf{H})^2/\det(\mathbf{H}) が大きいものは、一方の主曲率だけが強いエッジ応答であり除外する。これは「エッジ上の点は横方向にずれても似ているので、対応が一意に決まりにくい」というコーナー検出と同じ問題への対策である。

FAST: 円周だけを見て速く角を判定する

Features from Accelerated Segment Test(FAST)は、画素 p の周囲、半径3のBresenham円上にある16画素を使う。閾値 t を決め、連続する n 個(典型的には9または12)がすべて I_p+t より明るい、または I_p-t より暗いなら p をコーナーとする。

\exists\,S_n:\quad \forall q\in S_n,\quad I_q>I_p+t\quad\text{または}\quad I_q<I_p-t

勾配や行列を計算せず、少数の画素比較と早期棄却で済むため非常に速い。円周の1、5、9、13時の画素を先に調べ、明暗の連続列が成立し得なければ即座に止める設計が重要である。一方、元のFASTは尺度も向きも与えず、エッジに多数反応しやすい。周辺との強度差をスコア化して非極大抑制(NMS)をかけ、画像ピラミッドと組み合わせて初めて実用的な多尺度検出器になる。

ORB: FASTを「速いが使いにくい」まま終わらせない

ORB(Oriented FAST and Rotated BRIEF)は、リアルタイムでの画像照合を狙ってFASTとBRIEFを補強した構成である。まず縮小率 s ごとの画像ピラミッドでFASTを実行し、各レベルから上位点を残す。これにより厳密ではないものの、倍率変化への耐性を得る。

次に、点 p の周囲パッチの強度重心を計算する。モーメント

m_{pq}=\sum_{x,y}x^py^q I(x,y),\qquad \mathbf{c}=\left(\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}}\right)

から、中心 p から重心 \mathbf{c} への角度 \theta=\operatorname{atan2}(m_{01},m_{10}) を主方向とする。BRIEF記述子は、パッチ内の画素対 (\mathbf{a}_i,\mathbf{b}_i) を比較するビット列で、

\tau_i=\begin{cases}1&I(\mathbf{a}_i)<I(\mathbf{b}_i)\\0&\text{otherwise}\end{cases}

を256回程度並べる。ORBでは点対の座標を \theta だけ回転してから比較するので、回転後も同じビットパターンになりやすい。相関の低い比較対を学習的に選ぶ rBRIEF も、ビットの情報量を保つ工夫である。二値列どうしの距離はXORの1数、Hamming距離で高速に計算できる。

ORBはCPU・組み込み機器での速度とメモリ効率が強みであり、Visual-SLAMで広く採用されている。ただし大きな倍率差、強いぼけ、著しい視点変化では、より豊富な勾配記述を持つSIFTや学習ベース特徴が有利になる場合がある。

SIFT: 尺度、向き、記述を一貫して正規化する

Scale-Invariant Feature Transform(SIFT)は、DoGで (x,y,\sigma) の極値を検出し、低コントラスト点とエッジ応答を除去する。各点の近傍で勾配の大きさと方向を計算し、ガウス重み付きの方向ヒストグラムを作る。最大ピークを主方向にしてパッチをその向きへ正規化し、最大値の80%を超える副ピークにも別の向きを割り当てる。これが回転に対する頑健性の中心である。

記述子では、正規化した 16\times16 程度の窓を 4\times4 のセルに分け、各セルで8方向の勾配ヒストグラムを作る。ゆえに次元数は 4\times4\times8=128 となる。ベクトル \mathbf{d} をL2正規化し、大きすぎる要素を0.2でクリップして再正規化することで、局所的な照明変化への感度を抑える。

\hat{\mathbf{d}}=\frac{\mathbf{d}}{\|\mathbf{d}\|_2},\qquad d_i\leftarrow\min(\hat d_i,0.2),\qquad \mathbf{d}\leftarrow\frac{\mathbf{d}}{\|\mathbf{d}\|_2}

つまりSIFTの「不変性」は魔法ではない。画像ピラミッドで尺度を選び、主方向で座標系を回し、正規化でコントラストを吸収するという、各変動要因に対応した明示的な設計である。アフィン変形や大きな視点差については完全ではなく、後段のRANSACや複数視点幾何が必要になる。

最小の実装擬似コード

特徴点処理は、抽出だけで完結させず対応検証まで実装する。下はORBまたはSIFTのいずれにも当てはまる骨格である。

function match_images(imageA, imageB, method):
    grayA, grayB = to_gray(imageA), to_gray(imageB)
    detector = create(method)        # ORB: FAST+pyramid+rBRIEF / SIFT: DoG+gradient
    keyA, descA = detector.detect_and_compute(grayA)
    keyB, descB = detector.detect_and_compute(grayB)

    metric = HAMMING if method == ORB else L2
    tentative = []
    for each descriptor a in descA:
        b1, b2 = two_nearest(a, descB, metric)
        if distance(a, b1) < 0.75 * distance(a, b2):
            tentative.append((a.keypoint, b1.keypoint))

    H, inlier_mask = RANSAC_HOMOGRAPHY(tentative, reproj_threshold=3px)
    return tentative[inlier_mask], H

最近傍だけを採ると、窓枠・格子・反復模様のような曖昧な点まで残る。Loweのratio testは最良距離 d_1 と二番手 d_2 の比を使い、二番手との差が十分でない候補を捨てる。さらにRANSACはランダムな少数対応からホモグラフィ \mathbf{H} や基本行列を仮説として推定し、再投影誤差が小さい対応(inlier)を最も多く説明する仮説を選ぶ。物体が平面、またはカメラがその場で回転した場合は

\tilde{\mathbf{x}}'\sim\mathbf{H}\tilde{\mathbf{x}}

というホモグラフィで整合を検査できる。一般の3次元シーンでは基本行列・必須行列を使う。ここまで通過したinlier数と比率が、実際に使える特徴の量である。

照明・スケール・回転に、何がどこまで強いか

照明変化に対して、単純な明るさオフセット I'(x,y)=I(x,y)+b は画素差を壊すが、勾配や二値比較の相対関係には影響が小さい。一様なコントラスト変化 I'=aI+b にも、SIFTの記述子正規化は比較的強い。しかし露出飽和、影の境界、反射、昼夜のように局所構造そのものが変わると、古典的手法だけでの保証はない。撮影時は露出を固定または狭く管理し、必要ならCLAHEなどの局所コントラスト補正を両画像に同じ条件で適用する。過剰な補正はノイズを特徴として増やすので注意がいる。

スケール変化には、単一解像度のHarrisやFASTは本質的に弱い。画像ピラミッドで候補を探すORBは実用上の耐性を持つが、DoGで連続的な尺度極値を選ぶSIFTほどの正規化ではない。縮小側でテクスチャが消えれば、どの手法でも対応不能になる。入力解像度、ピラミッド段数、最小パッチサイズは、想定する撮影距離の変化から決めるべきである。

回転にはHarrisの応答自体は比較的安定でも、記述子側の座標系を回さなければ照合できない。ORBは強度重心、SIFTは勾配方向ヒストグラムで向きを割り当てる。90度単位でしか回転を見ない記述子より、こうした連続角の正規化が有効である。一方、強い斜視は回転・拡大ではなくアフィン/射影変形なので、複数の視点からのデータ、アフィン共変特徴、あるいは学習ベースの特徴と幾何検証を検討する。

評価指標: 点の多さではなく、使える対応を測る

既知のホモグラフィ H がある画像対では、画像Aの点 \mathbf{x}_i をBへ写し、検出点集合 K_B の中に距離 \epsilon 以内の点があれば再検出成功と定められる。再現率(repeatability)は概念的には

\mathrm{Repeatability}=\frac{\#\{\mathbf{x}_i\in K_A: \min_{\mathbf{y}\in K_B}\|H\mathbf{x}_i-\mathbf{y}\|<\epsilon\}}{\min(|K_A|,|K_B|)}

である。ただし同じ場所を拾えても記述子が区別できなければ役に立たない。そこで正しい対応の割合(matching precision)、正しい対応数、RANSAC後のinlier ratio、姿勢推定の回転・並進誤差、処理時間、メモリを併記する。HPatchesは、照明変化と視点変化を分けてパッチ照合・検出器・ホモグラフィ推定を評価できる代表的ベンチマークである。用途の幾何(平面か、広いベースラインの3Dか)に沿ったデータで測らなければ、単一スコアの順位をそのまま採用してはいけない。

方式 検出の核 記述子 尺度・回転 照合距離 強み 主な注意点
Harris + patch 構造行列 生パッチなど 尺度×・回転は別途 SSD/NCC 原理が明快 照明・尺度に弱い
LoG / DoG 尺度空間のBlob極値 別途必要 尺度◎・回転は別途 記述子に依存 Blobと尺度を得る ピラミッド計算が必要
FAST + BRIEF 円周の連続明暗 二値比較 単体では両方× Hamming 非常に高速 視点・尺度に弱い
ORB ピラミッドFAST 回転rBRIEF 尺度○・回転○ Hamming 軽量、実時間向け 大変形には限界
SIFT DoG極値 128次元勾配ヒストグラム 尺度◎・回転◎ L2 堅実で検証例が多い CPU負荷・メモリが大きい
学習ベース ネットワークで学習 学習済みベクトル データ依存で強化 L2 / learned 難条件で高い対応率 モデル、GPU、再現性管理

表の○や◎は絶対評価ではなく、典型的な実装と想定範囲での相対的な目安である。たとえばSIFTでも同じ格子が画面を埋めれば曖昧であり、ORBでも適度な条件なら十分なinlierを得られる。

現行ライブラリと実製品における位置づけ

最初の試作にはOpenCVのcv::ORB::create()cv::SIFT::create()cv::FastFeatureDetector::create()が扱いやすい。ORBにはBFMatcher(NORM_HAMMING)、SIFTにはL2距離のBFMatcherまたはFLANN系を組み合わせる。検出器と記述子を別にしたい場合も、OpenCVのFeature2D APIで同じ流れに載せられる。学習ベースの実験・GPU処理ではPyTorch上のKorniaが、SIFT、ORB、DISK、KeyNet/HardNet、LightGlueなどを部品として提供する。

フォトグラメトリと3D復元の実務ではCOLMAPが代表的で、現行の公式ドキュメントでは標準のSIFTに加え、ONNX有効ビルドでALIKEDを選べる。SIFT/ALIKEDの両方を総当たり照合またはLightGlue照合へ接続できるため、再構成の入口で古典・学習ベースを比較しやすい。製品やライブラリを選ぶ際は「モデル名が新しいか」より、CPUだけで動かす必要があるか、レイテンシ予算、オフラインで重い照合を許せるか、再現可能なバージョン固定が必要かを先に決めるのがよい。

近年の研究: 検出・記述・照合を共同で最適化する

学習ベースの転換点の一つがSuperPointである。全畳み込みネットワークが、興味点の確率マップと記述子マップを一度に出力し、Homographic Adaptationで幾何変換後にも再現する点を自己教師ありで学ぶ。手設計の「角らしさ」だけでなく、対応に役立つ場所をデータから学ぶ発想である。

DISKは、疎な点の選択と照合が離散的で微分しにくい問題に対し、正しい対応数を報酬とする方策勾配で検出・記述をエンドツーエンドに最適化した。ALIKEDは各キーポイントの周囲から変形可能な支持位置を学習するSparse Deformable Descriptor Headを用い、密な特徴マップ全体ではなく疎な点で記述子を取り出すことで、表現力と効率の両立を狙う。

さらに照合器も独立した最近傍探索から変わりつつある。LightGlueは、二組の局所特徴の間で注意機構を用いて対応を推定し、画像対が容易なら早く停止する適応的な計算を採る。これは特徴点抽出器そのものではないが、抽出器単体の「記述子距離」が良くても最終対応が良いとは限らないことを示す重要な流れである。現在は、古典的な特徴を軽量な照合器で使う構成と、SuperPoint/ALIKEDなどの学習特徴をLightGlueで照合する構成を、対象データで同一のRANSAC条件にそろえて比較するのが実践的である。

選定とチューニングのチェックリスト

特徴点抽出は、画像を理解する万能の分類器ではない。しかし「どの画素が幾何を支えられるか」を少ない計算で選び出す、今も有効な基盤技術である。コーナー、Blob、尺度空間、向き正規化という考え方を理解しておけば、古典的なORB/SIFTを調整するときも、学習ベースの特徴を評価するときも、数値の背後にある失敗原因を追えるようになる。

参考リンク

#特徴点抽出 #Feature Detection #SIFT #ORB #コンピュータビジョン