SIFTの原理と使い方

ヒント:記事作成後に目次を自動生成することもできますが、生成方法については右のヘルプを参照してください。


1. はじめに

SIFT アルゴリズムの基本的な考え方は、画像内のキー ポイントを検出し、各キー ポイントの記述子を計算することです。
具体的には、SIFT アルゴリズムには次のステップが含まれます。

  • キー ポイントの検出: ガウス ピラミッドと DOG (ガウスの差) を使用して、さまざまなスケールでキー ポイントを検出します。
  • キー ポイントの説明: 各キー ポイントの周囲のピクセルの勾配ヒストグラムを計算して、キー ポイントを説明します。
  • キーポイントの一致: 記述子を使用してキーポイントを一致させる

SIFT アルゴリズムの利点は、画像内のキー ポイントを検出でき、スケール不変性と回転不変性があることです。つまり、SIFT アルゴリズムは、画像のスケールや回転が変化しても同じキー ポイントを検出できるため、多くのアプリケーションで非常に役立ちます。

1 キーポイントの検出

SIFT アルゴリズムのキーポイント検出には、主にガウス ピラミッドと DOG (Difference of Gaussian) が使用されます。

  • ガウス ピラミッド: まず、ガウス フィルターを使用して画像をダウンサンプリングし、さまざまなスケールの画像を取得します。これらの画像をラプラシアン ピラミッドで微分することにより、スケールの異なる微分画像が得られ、この微分画像を DoG 画像と呼びます。
  • DOG: DoG 画像内のキー ポイントを検出し、各ピクセルで現在のレイヤーと隣接レイヤーの差を計算します。ピクセルが極点である場合、そのピクセルはキー ポイントとみなされます。
  • スクリーニング: 検出されたキーポイントについて、ピクセル値の比較や形態学的演算など、さらに厳しいスクリーニング基準を使用してさらにスクリーニングします。
  • 正確な位置決め: フィルターされたキー ポイントに対して、テイラー拡張を使用して正確な位置決めを実行し、キー ポイントの座標を決定します。

SIFT アルゴリズムは、これらのステップでスケールの不変性を非常に慎重に考慮し、画像スケールが変化しても検出されたキー ポイントを繰り返し検出できることを保証し、アルゴリズムを非常に堅牢にします。

2 要点の説明

キー ポイントの記述とは、SIFT アルゴリズムにおいて、検出されたキー ポイントごとに記述子が計算され、キー ポイントの周囲のピクセル情報を表すことを意味します。この記述子は、キーポイントの特性を表すために使用でき、キーポイントを他の画像内のキーポイントと照合するために使用できます。

SIFT アルゴリズムにおけるキー ポイントの記述は、キー ポイントの周囲のピクセルの勾配ヒストグラムを計算することによって実現されます。

具体的には、SIFT アルゴリズムはキーポイントの近くに小さなウィンドウを設定し、このウィンドウ内で勾配計算を実行します。次に、計算された勾配ヒストグラムを 8 つの方向と 4 つのスケールに分割し、各方向とスケールの勾配ヒストグラムを個別に計算します。最後に、これらのヒストグラムは、キー ポイントの記述子として高次元ベクトルに結合されます。

これらの記述子で構成されるベクトルは、キー ポイントの周囲のピクセルの勾配情報を含むため、キー ポイントの特徴を表すために使用できます。これらの記述子を使用して、キーポイントを他の画像のキーポイントと一致させることができます。

マッチングでは、2つのキー点が似ているほど、その記述子も類似するため、記述子の類似性を比較することで、2つのキー点が同じ特徴点であるかどうかを判定することができる。

この記述子の高次元ベクトルは特徴ベクトルとも呼ばれ、画像内の特徴を表すために使用でき、画像認識、画像検索、その他のアプリケーションに使用できます。

3つのキーポイントのマッチング

SIFT アルゴリズムにおけるキーポイント マッチングは、2 つの画像内のキーポイント記述子の類似性を比較することによって実現されます。

具体的には、2 つの画像のキーポイントごとに記述子ベクトルが存在します。2 つの画像内の記述子ベクトルを照合して、最もよく一致する 2 つのベクトルを見つけ、それらの類似性を計算します。類似性が十分に高い場合、2 つのキー ポイントは対応していると見なされます。

SIFT アルゴリズムでは、通常、2 つのベクトルの類似度を測定するためにユークリッド距離が使用され、類似度が小さいほど、2 つのベクトルは類似しています。

照合の精度を向上させるために、キーポイント照合に RANSAC アルゴリズムを使用することもできます。RANSAC は、いくつかの一致するペアをランダムに選択することによって変換行列を推定し、残りの一致するペアを検証することによって最適な変換行列を決定するランダム サンプリング コンセンサス アルゴリズムです。これにより、不一致を効果的に排除し、マッチング精度を向上させることができます。

要約すると、SIFT アルゴリズムのキー ポイント マッチング ステップは次のとおりです。

  • 2 つの画像内の各キーポイントの記述子ベクトルを計算します。
  • 2 つの画像内の記述子ベクトルを照合して、最もよく一致する 2 つのベクトルを見つけます。
  • 2 つのベクトルの類似度を計算します。類似度が十分に高ければ、2 つのキー ポイントは対応していると見なされます。
  • RANSACアルゴリズムによるキーポイントマッチング

このようにして、2 つの画像内で対応するキー ポイントを見つけることができ、画像のスプライシング、画像認識、その他のアプリケーションに使用できます。


2. SVM を使用して SIFT 機能を分類する

1 原則

SIFT アルゴリズムによって抽出される特徴には、キー ポイントと記述子が含まれます。キー ポイントは画像内の特徴の位置を決定するために使用でき、記述子は画像内の特徴に関する特定の情報を表すために使用できます。

SVM では数値的な特徴ベクトルが必要ですが、キーポイントの情報は離散的であり、座標上で表現する必要があり、明らかに分類に直接使用することはできません。記述子は数値特徴ベクトルに直接変換できるため、一般に記述子は SVM 分類に使用されます。SIFTで抽出される記述子は高次元のベクトルであるため。したがって、SIFT によって抽出された特徴は次元削減される必要があります。

最も一般的に使用される次元削減手法の 1 つは PCA (主成分分析) です。PCA は一般的に使用されるデータ次元削減手法であり、元のデータを新しい座標系セットに投影して、新しい座標系のデータの変動性を最大限に高めることができます。

PCA 次元削減後の特徴ベクトルは連続的であり、SVM 分類を容易にするために離散化する必要があります。一般的に使用される離散化方法には、均一量子化と不均一量子化が含まれます。均一量子化ではデータが等しいサイズのいくつかの間隔に分割されますが、不均一量子化ではデータの分布特性に従って間隔が分割されます。

さらに、SVM アルゴリズムが分類決定曲面を正しく計算できるように、すべての特徴ベクトルを標準化する必要があります。

次元削減、離散化、標準化の後、SIFT によって抽出された特徴は、SVM によって必要な入力に変換できます。これらのフォーマットされた特徴とラベルは、トレーニングと分類のための SVM への入力として使用できます。

2 コードサンプル (Python)

以下に例を示します。

import cv2
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# 读取图像
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()

# 提取特征
keypoints, descriptors = sift.detectAndCompute(gray, None)

# 将描述符和标签分别存放在X和y中
X = descriptors
y = labels

# 创建PCA对象
pca = PCA(n_components=k) #n_components表示降维后的维度数

# 进行降维
X_pca = pca.fit_transform(X)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca , y, test_size=0.2)

# 创建SVM分类器
clf = SVC(kernel='linear')

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

上記のコードは単なる例であり、実際のアプリケーションでは、トレーニング、モデルの保存、呼び出しに大量の画像が必要になります。

おすすめ

転載: blog.csdn.net/Naturino/article/details/128660077