カスタム特徴抽出器の作成
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 | 入力 |
|
features | 出力 |
|
featureMetrics | 出力 |
|
location | 出力 |
|
イメージの前処理
特徴抽出を行う前に、入力イメージの前処理が必要な場合もあります。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)];
detectSURFFeatures
や detectMSERFeatures
などの特徴検出器を使用して点位置を選択することもできます。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