このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
半精度でのソーベル法によるエッジ検出
この例では、MATLAB® 関数から生成された CUDA® MEX 関数を使用したイメージ内のエッジ検出について説明します。エッジ検出アルゴリズムは、半精度データ型で実装されます。
サードパーティの必要条件
必須
この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。
Compute Capability 6.0 以上の CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA Toolkit。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
GPU 環境の検証
この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数coder.checkGpuInstall
を使用します。
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
ソーベル エッジ検出アルゴリズム
ソーベル エッジ検出アルゴリズム sobelEdgeDetectionAlg.m
では、グレー スケール イメージで 2 次元の空間勾配演算が行われます。この演算は、イメージ内のエッジに相当する空間周波数の高い領域を強調します。
type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection Example MATLAB function for edge detection. % Copyright 2018 The MathWorks, Inc. kern = half([1 2 1; 0 0 0; -1 -2 -1]); % Finding horizontal and vertical gradients. h = conv2(img(:,:,2),kern,'same'); v = conv2(img(:,:,2),kern','same'); % Finding magnitude of the gradients. e = sqrt(h.*h + v.*v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end
ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル maskX
と maskY
を使用して、入力イメージの水平方向勾配 resX
と垂直方向勾配 resY
を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。
イメージの読み取りと RGBA パックされた列優先の順序へのデータのパック
標準の imread
コマンドを使用してイメージを読み取ります。imread
は、イメージの RGB チャネルをピクセルごとに 1 つの整数で表します。整数の範囲は 0 ~ 255 です。単純に入力を half 型にキャストするだけでは、畳み込み時にオーバーフローになる可能性があります。この場合、イメージを 0 ~ 1 の値にスケーリングできます。
im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;
関数の CUDA MEX の生成
関数 sobelEdgeDetectionAlg
の CUDA MEX を生成するには、GPU コード構成オブジェクトを作成し、codegen
コマンドを実行します。半精度データ型を含むコードの生成と実行には、CUDA Compute Capability 6.0 以上が必要です。コード構成オブジェクトの ComputeCapability
プロパティを '6.0'
に設定します。半精度の場合、CUDA コードを生成するためのメモリ割り当て (malloc) モードは 'Discrete' に設定しなければなりません。
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.
MEX 関数の実行
MEX 関数を生成した後に、その関数に元の MATLAB エントリポイント関数と同じ機能があることを検証できます。生成された sobelEdgeDetectionAlg_mex
を実行し、結果をプロットします。
out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh); imagesc(out_disp);
MEX メモリのクリア
メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。
clear mex;
参考
関数
codegen
|coder.gpu.kernel
|coder.gpu.kernelfun
|gpucoder.matrixMatrixKernel
|coder.gpu.constantMemory
|gpucoder.stencilKernel
|coder.checkGpuInstall