画像の二つの場所が同じ物を写しているかを判断するには、画像全体を比べるよりも、繰り返し見つかる小さな手掛かりを比べる方が効率的である。その手掛かりを選ぶ処理がFeature Detection、すなわち特徴点抽出だ。カメラの移動推定、パノラマ合成、3D復元、画像検索、外観検査まで、画像間の対応を必要とする処理の入口にある。本稿では「どこを選ぶか」と「選んだ点をどう照合するか」を分け、古典的アルゴリズムの考え方を数式と実装の観点から整理する。
30秒要約
- 特徴点は、平坦な壁ではなく、向きの異なる濃淡変化を持つ角、あるいは周囲と異なる明暗の塊に置く。小さな画像変換後にも同じ場所で再検出されること(再現性)が重要である。
- コーナー検出は局所勾配の二方向性を、Blob検出はあるスケールで周囲と異なる明暗の塊を捉える。DoGは複数スケールのぼかし画像の差からBlob候補を高速に探す。
- FASTは円周上の画素だけを比較して角を高速に判定する。ORBはFASTに画像ピラミッド、向き推定、回転したBRIEF二値記述子を組み合わせ、リアルタイム用途に向く。
- SIFTはDoGでスケールを選び、勾配方向ヒストグラムで向きを正規化し、128次元の記述子を作る。計算量とメモリは増えるが、尺度・回転の変化に強い。
- 検出だけでは対応は決まらない。記述子の距離、ratio test、RANSACによる幾何検証までを一つのパイプラインとして評価する。近年はSuperPoint、ALIKED、LightGlueのような学習ベースの検出・照合も実用化されている。
特徴点とは何か――「目立つ点」ではなく「再び見つかる点」
画素座標を \mathbf{x}=(x,y)^\mathsf{T}、画像を I(\mathbf{x}) とする。特徴点とは、近傍パッチを少し平行移動・回転・拡大しても、同じ物理的位置として安定して検出でき、さらに周囲の模様で他の点と区別できる位置である。前者を検出器(detector)、後者を数値ベクトルまたはビット列にするものを記述子(descriptor)と呼ぶ。
この二つは別物である。FASTは原則として検出器、BRIEFは記述子であり、ORBは両者を組み合わせた仕組みである。SIFTはDoG検出器と勾配ヒストグラム記述子の組である。名称だけを比べると混乱しやすいため、以降では常に「点を選ぶ」「周囲を表す」「点を照合する」の三段階として扱う。
図: Duskcoil作成。検出結果の数ではなく、最終的に幾何学的に整合する対応数がシステム品質を左右する。
コーナー: 二方向に変化する場所を選ぶ
まず最も直感的な特徴がコーナーである。画像パッチ W を微小な移動 \mathbf{u}=(u,v)^\mathsf{T} だけずらしたときの見た目の変化を、SSD(差分二乗和)で書く。
一階のTaylor近似では、局所構造行列(second-moment matrix)\mathbf{M} は次になる。
I_x,I_y は画像勾配、w はガウス窓などの重みである。\mathbf{M} の固有値を \lambda_1,\lambda_2 とすると、小さい方まで大きい点がコーナーとなる。一方向だけ勾配が大きいエッジでは、一方の固有値が小さくなる。平坦部では両方が小さい。Harris detectorは、固有値を毎画素で明示的に解かず、次の応答値を大きくする位置を局所最大として選ぶ。
k は典型的に0.04〜0.06程度である。Harrisは回転には比較的強いが、固定サイズの窓で見るため、被写体が大きく縮小・拡大したときに同じ点を選ぶ仕組みは持たない。Shi–Tomasiの \min(\lambda_1,\lambda_2) も、追跡に適したコーナーを選ぶ実務的な基準として広く使われる。
Blob: 角でなくても「塊」なら手掛かりになる
コーナーだけでは、丸いロゴ、斑点、暗い穴、明るい反射の中心を十分に拾えない。そこで、ある尺度で周囲と明暗が異なる局所的な塊をBlobとして検出する。ガウシアン G(\mathbf{x};\sigma) で平滑化した尺度空間を
と書く。* は畳み込み、\sigma は「どの大きさを見ているか」を表す。Laplacian of Gaussian(LoG)の正規化応答
は、明るい背景上の暗い円、または暗い背景上の明るい円で強く反応する。位置だけでなく \sigma 方向も含む三次元 (x,y,\sigma) 空間で極値を取れば、Blobの中心と特徴的な大きさを同時に選べる。半径がおおよそ \sqrt{2}\sigma の円形Blobに対応する、という尺度の解釈もできる。
LoGは優れた考え方だが、各尺度で二階微分を厳密に計算すると高価である。この近似と高速化がDoG、そしてSIFTへつながる。
DoG: ぼかしの差から尺度不変な候補を見つける
Difference of Gaussians(DoG)は、隣り合う二つのぼかし画像の差である。
ここで k>1 は隣接尺度の比である。DoGは定数係数を除いて尺度正規化LoGを近似するため、畳み込みを一段追加するだけでBlob候補を探せる。実装では画像を徐々にぼかしたGaussian pyramidを作り、各DoG画素を同じ尺度の8近傍と、上下の尺度の各9近傍、合計26個と比べる。最大または最小なら候補である。
候補はそのまま使わない。弱い極値はノイズなので棄却し、細長いエッジ上の極値も除く。DoG極値の周囲を三次元二次関数で補間すると、サブピクセルの位置と尺度を求められる。Hessian
について \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 をコーナーとする。
勾配や行列を計算せず、少数の画素比較と早期棄却で済むため非常に速い。円周の1、5、9、13時の画素を先に調べ、明暗の連続列が成立し得なければ即座に止める設計が重要である。一方、元のFASTは尺度も向きも与えず、エッジに多数反応しやすい。周辺との強度差をスコア化して非極大抑制(NMS)をかけ、画像ピラミッドと組み合わせて初めて実用的な多尺度検出器になる。
ORB: FASTを「速いが使いにくい」まま終わらせない
ORB(Oriented FAST and Rotated BRIEF)は、リアルタイムでの画像照合を狙ってFASTとBRIEFを補強した構成である。まず縮小率 s ごとの画像ピラミッドでFASTを実行し、各レベルから上位点を残す。これにより厳密ではないものの、倍率変化への耐性を得る。
次に、点 p の周囲パッチの強度重心を計算する。モーメント
から、中心 p から重心 \mathbf{c} への角度 \theta=\operatorname{atan2}(m_{01},m_{10}) を主方向とする。BRIEF記述子は、パッチ内の画素対 (\mathbf{a}_i,\mathbf{b}_i) を比較するビット列で、
を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でクリップして再正規化することで、局所的な照明変化への感度を抑える。
つまり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)を最も多く説明する仮説を選ぶ。物体が平面、またはカメラがその場で回転した場合は
というホモグラフィで整合を検査できる。一般の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)は概念的には
である。ただし同じ場所を拾えても記述子が区別できなければ役に立たない。そこで正しい対応の割合(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条件にそろえて比較するのが実践的である。
選定とチューニングのチェックリスト
- まず実画像対で、検出数、ratio test通過数、RANSAC inlier数、inlier比、処理時間をログに残す。検出数だけを増やしても誤対応が増えれば逆効果になる。
- 固定カメラに近い短時間追跡ならFAST/ORBを起点にし、
nfeatures、FAST閾値、ピラミッド段数を調整する。低テクスチャなら閾値を下げる前に、ぶれ・露出・焦点を見直す。 - 撮影距離や回転が大きく変わる静止画像の照合ではSIFTを基準線に置く。高速な方式がSIFTを上回るかは、必ず同じデータ・同じ幾何検証で確かめる。
- 夜間、強い逆光、季節変化、広い視点差では、学習ベース特徴も候補にする。ただし学習データと対象環境の差、モデル更新、GPUの有無を性能評価に含める。
- 反復模様、鏡面、動く物体、極端なモーションブラーは、特徴点の問題というより観測の曖昧さである。マスク、時間的追跡、センサー融合、撮影計画で補う。
特徴点抽出は、画像を理解する万能の分類器ではない。しかし「どの画素が幾何を支えられるか」を少ない計算で選び出す、今も有効な基盤技術である。コーナー、Blob、尺度空間、向き正規化という考え方を理解しておけば、古典的なORB/SIFTを調整するときも、学習ベースの特徴を評価するときも、数値の背後にある失敗原因を追えるようになる。
参考リンク
- Lowe, Distinctive Image Features from Scale-Invariant Keypoints(SIFT原論文、IJCV 2004)
- Rublee et al., ORB: an efficient alternative to SIFT or SURF(ICCV 2011)
- OpenCV Feature2D / ORB クラスリファレンス
- OpenCV SIFT クラスリファレンス
- OpenCV FAST Feature Detector チュートリアル
- HPatches: benchmark and evaluation of handcrafted and learned local descriptors(CVPR 2017)
- SuperPoint(CVPR Workshops 2018)
- DISK(NeurIPS 2020)
- ALIKED(arXiv 2023)
- LightGlue(ICCV 2023)
- COLMAP Feature Extraction and Matching documentation
- Kornia feature module documentation