Main Content

カスタム特徴抽出器の作成

bag-of-features (BoF) フレームワークはさまざまなタイプのイメージ特徴に使用できます。既定の Speeded-Up Robust Features (SURF) による特徴抽出器の代わりにカスタムの特徴抽出器を使用するには、bagOfFeatures オブジェクトの CustomExtractor プロパティを使用します。

カスタム特徴抽出器の例

この例では、bagOfFeatures を使用するカスタム特徴抽出器関数を作成する方法を説明します。MATLAB® コマンド プロンプトに以下のコマンドを入力すると、この例の関数ファイルを開いてテンプレートとして使用できます。

edit('exampleBagOfFeaturesExtractor.m')

  • 手順 1: イメージ セットを定義します。

  • 手順 2: 新しい抽出器関数ファイルを作成します。

  • 手順 3: イメージの前処理をします。

  • 手順 4: 特徴抽出の点の位置を選択します。

  • 手順 5: 特徴を抽出します。

  • 手順 6: 特徴メトリクスを計算します。

一連のイメージとラベルの定義

カテゴリ イメージを読み取ってイメージ セットを作成します。

setDir  = fullfile(toolboxdir('vision'),'visiondata','imageSets');
imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource',...
    'foldernames');

新しい抽出器関数ファイルの作成

抽出器関数は次のように関数ハンドルとして指定しなければなりません。

extractorFcn = @exampleBagOfFeaturesExtractor;
bag = bagOfFeatures(imgSets,'CustomExtractor',extractorFcn)
exampleBagOfFeaturesExtractor は、MATLAB 関数です。次に例を示します。
function [features,featureMetrics] = exampleBagOfFeaturesExtractor(img)
...
オプションで location 出力を指定することもできます。
function [features,featureMetrics,location] = exampleBagOfFeaturesExtractor(img)
...

関数はパス上にあるか、現在の作業フォルダー内になければなりません。

引数 入力/出力説明
img入力
  • バイナリ、グレースケールまたはトゥルーカラー イメージ。

  • 入力イメージは最初に bagOfFeatures に渡されたイメージ セットから取得されます。

features出力

  • binaryFeatures オブジェクト。

  • MN 列のイメージ特徴の数値行列。M は特徴の数、N は各特徴ベクトルの長さを示します。

  • 特徴の長さ N は、ゼロより大きくなければならず、bagOfFeatures の作成プロセスの間に処理されるすべてのイメージにおいて同じでなければなりません。

  • イメージから特徴を抽出できない場合、空の特徴行列と、空の特徴メトリクス ベクトルを指定してください。空の行列とベクトルは、たとえば特徴抽出用のキーポイントが見つからなかった場合などに使用します。

  • 数値、実数および非スパース。

featureMetrics出力

  • 各特徴ベクトルの強さを示す特徴メトリクスからなる、M 行 1 列のベクトル。

  • bagOfFeatures フレームワークの 'SelectStrongest' 基準を適用するために使用されます。

  • 数値、実数および非スパース。

location出力

  • 1 ベースの [x y] 値からなる、M 行 2 列の行列。

  • [x y] 値には小数値も指定できます。

  • 数値、実数および非スパース。

イメージの前処理

特徴抽出を行う前に、入力イメージの前処理が必要な場合もあります。SURF 特徴量を抽出したり、関数 detectSURFFeatures または関数 detectMSERFeatures を使用するには、イメージがグレースケールでなければなりません。イメージがグレースケールでない場合、関数 im2gray を使用して変換できます。

grayImage = im2gray(I);

特徴抽出の点の位置の選択

点位置の一定間隔のグリッドを使用します。イメージにグリッドを重ねて使用することで、高密度の SURF 特徴量抽出が可能になります。グリッドの間隔はピクセル単位です。

gridStep = 8;
gridX = 1:gridStep:width;
gridY = 1:gridStep:height;

[x,y] = meshgrid(gridX,gridY);

gridLocations = [x(:) y(:)];

異なるスケールの複数の SURFPoints オブジェクトを手動で連結させて、マルチスケールの特徴抽出を行うことができます。

multiscaleGridPoints = [SURFPoints(gridLocations,'Scale',1.6);
    SURFPoints(gridLocations,'Scale',3.2);
    SURFPoints(gridLocations,'Scale',4.8);
    SURFPoints(gridLocations,'Scale',6.4)];
あるいは、detectSURFFeaturesdetectMSERFeatures などの特徴検出器を使用して点位置を選択することもできます。

multiscaleSURFPoints = detectSURFFeatures(I);

特徴の抽出

選択した点位置から特徴を抽出します。既定では bagOfFeatures は正立の SURF 特徴量を抽出します。

features = extractFeatures(grayImage,multiscaleGridPoints,'Upright',true);

特徴メトリクスの計算

特徴メトリクスは各特徴の強さを示します。強い特徴には高いメトリクス値が代入されます。bagOfFeatures を使用してイメージ セットのビジュアル ボキャブラリを学習する前に、特徴メトリクスを用いて弱い特徴を特定し削除します。特徴ベクトルに適した特徴メトリクスを使用してください。

たとえば、SURF 特徴量の分散を特徴メトリクスとして使用できます。

featureMetrics = var(features,[],2);

特徴検出器を使って点を選択した場合には、代わりに検出メトリクスを使用してください。

featureMetrics = multiscaleSURFPoints.Metric;

オプションで、特徴の位置情報を返すこともできます。特徴の位置は、空間または幾何学的な検証イメージ探索のアプリケーションに使用できます。関数 estimateGeometricTransform2D を使用した幾何学的な検証の例を参照してください。関数 retrieveImages および関数 indexImages は、コンテンツ ベースの画像検索システムに使用されます。

if nargout > 2
    varargout{1} = multiscaleGridPoints.Location;
end