Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

SURF を使用した特徴抽出

Speeded-Up Robust Features (SURF) を使用したオブジェクト認識は 3 つのステップで構成されます。特徴抽出、特徴記述、および特徴マッチングです。この例では、SURF アルゴリズムの最初のステップである特徴抽出を実行します。ここで使用されるアルゴリズムは、OpenSURF ライブラリの実装に基づきます。この例では、GPU Coder™ を使用し、CUDA® コード生成を通じてこの計算量が多い問題を解く方法を示します。

サードパーティの必要条件

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数 coder.checkGpuInstall を使用します。

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

特徴抽出

特徴抽出は、オブジェクト認識アルゴリズムの基本的なステップです。これは、入力イメージから "特徴" と呼ばれる役立つ情報を抽出するプロセスを表します。抽出された特徴は代表的な性質を持ち、イメージの重要かつ固有の特性が伴っていなければなりません。

関数 SurfDetect.m はメイン エントリポイントであり、特徴抽出を実行します。この関数は 8 ビットの RGB イメージまたは 8 ビットのグレースケール イメージを入力として受け入れます。返される出力は、抽出された関心点の配列です。この関数は、GPU 並列化に適した計算を含む次の関数呼び出しで構成されます。

  • 関数 Convert32bitFPGray.m は、8 ビットの RGB イメージを 8 ビットのグレースケール イメージに変換します。与えられた入力が既に 8 ビットのグレースケール形式の場合、このステップをスキップします。このステップ後、GPU での高速計算を有効にするために 8 ビットのグレースケール イメージは 32 ビットの浮動小数点表現に変換されます。

  • 関数 MyIntegralImage.m は、前のステップで取得した 32 ビットの浮動小数点グレースケール イメージの積分イメージを計算します。積分イメージは、イメージの四角形領域に囲まれたピクセルの和の求解を簡略化するのに役立ちます。ピクセルの和を求めることで、次のステップで実行する畳み込みの速度を改善しやすくなります。

  • 関数 FastHessian.m は、さまざまなサイズのボックス フィルターを使用してイメージの畳み込みを実行し、計算された応答を格納します。この例の場合、次のパラメーターを使用します。

    Number of Octaves: 5
    Number of Intervals: 4
    Threshold: 0.0004
    Filter Sizes: Octave 1 -  9,  15,  21,  27
                  Octave 2 - 15,  27,  39,  51
                  Octave 3 - 27,  51,  75,  99
                  Octave 4 - 51,  99, 147, 195
                  Octave 5 - 99, 195, 291, 387
  • 関数 NonMaxSuppression_gpu.m は、非最大抑制を実行し、前に取得した応答から有益な関心点のみをフィルターで取り出します。atomicAdd 演算を使用するカーネルを生成するには、coder.ceval 構造体を使用します。MATLAB® から直接呼び出す場合はこの構造体に互換性がないため、2 つの異なる関数呼び出しがあります。関数 NonMaxSuppression_gpu.m は、GPU コード生成が有効な場合に呼び出され、NonMaxSuppression.m は、MATLAB 内で直接アルゴリズムを実行する場合に呼び出されます。

  • 関数 OrientationCalc.m は、前のステップにおける関心点の向きを計算して割り当てます。

最終結果は関心点の配列です。ここで、関心点は次のフィールドで構成される構造体です。

    x, y (coordinates), scale, orientation, Laplacian

入力イメージの読み取り

関数 imread を使用して入力イメージを MATLAB に読み取ります。

imageFile = 'peppers.png';
inputImage = imread(imageFile);
imshow(inputImage);

関数の CUDA MEX の生成

関数 SurfDetect の CUDA MEX を生成するには、GPU Coder 構成オブジェクトを作成し、関数 codegen を実行します。

cfg = coder.gpuConfig('mex');
evalc('codegen -config cfg SurfDetect -args {inputImage}');

GPU での MEX 関数の実行

次のように、生成された MEX 関数 SurfDetect_mex を呼び出して GPU 上で実行できます。

disp('Running GPU Coder SURF');
interestPointsGPU = SurfDetect_mex(inputImage);
fprintf('    GPU Coder SURF found: %d interest points\n',length(interestPointsGPU));
Running GPU Coder SURF
    GPU Coder SURF found: 249 interest points

抽出された関心点の描写

出力 interestPointsGPU は、抽出された関心点の配列です。これらの関心点は、Figure ウィンドウの入力イメージ全体に示されます。

DrawIpoints(imageFile, interestPointsGPU);

参考文献

  1. 『Notes on the OpenSURF Library』(Christopher Evans 著)。

  2. 『SURF: Speeded-Up Robust Features』(Herbert Bay、Tinne Tuytelaars、および Luc Van Gool 共著)。