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.m は、非最大抑制を実行し、前に取得した応答から有益な関心点のみをフィルターで取り出します。

  • 関数 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');
codegen -config cfg SurfDetect -args {inputImage}
Code generation successful: View report

MATLAB および GPU での SURF 検出の実行

MATLAB で SurfDetect コマンドを実行します。

disp('Running SURF Detection on MATLAB...');
Running SURF Detection on MATLAB...
tic;
interestPoints = SurfDetect(inputImage);
execTime = toc;
fprintf('Found %d SURF interest points in %f seconds.\n',length(interestPoints),execTime);
Found 249 SURF interest points in 7.777913 seconds.

生成された MEX 関数 SurfDetect_mex を呼び出して GPU 上で実行します。

disp('Running GPU Coder SURF');
Running GPU Coder SURF
tic;
interestPointsGPU = SurfDetect_mex(inputImage);
execTime = toc;
fprintf('GPU Coder SURF found %d interest points in %f seconds.\n',length(interestPointsGPU),execTime);
GPU Coder SURF found 249 interest points in 0.436629 seconds.

抽出された関心点の描写

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

DrawIpoints(imageFile, interestPointsGPU);

参考文献

[1] Notes on the OpenSURF Library by Christopher Evans.

[2] Bay, H., A. Ess, T. Tuytelaars, and L. Van Gool. "SURF:Speeded Up Robust Features." Computer Vision and Image Understanding (CVIU).Vol. 110, No. 3, pp. 346-359, 2008.

参考

関数

オブジェクト

関連するトピック