Main Content

NVIDIA Jetson TX2 開発者キットで不均一な背景の照度を除去するトップハット フィルター処理

この例では、GPU Coder™ Support Package for NVIDIA GPUs を使用して、Image Processing Toolbox™ アルゴリズムを NVIDIA® Jetson TX2 ボードに展開する方法を説明します。この概念を説明するための例として、関数 imtophat (Image Processing Toolbox) を使用します。この関数は、グレースケール イメージに対してモルフォロジー トップハット フィルター処理を実行します。トップハット フィルター処理を実行するとイメージのモルフォロジー オープニングが計算され (imopen (Image Processing Toolbox) を使用)、次に元のイメージから結果が減算されます。生成された CUDA® コードでは、GPU での演算を高速化するために共有メモリが使用されます。

必要条件

ターゲット ボード要件 *

  • NVIDIA Jetson TX2 組み込みプラットフォーム。

  • ターゲット ボードとホスト PC を接続するイーサネット クロスオーバー ケーブル (ターゲット ボードをローカル ネットワークに接続できない場合)。

  • ボードにインストールされている NVIDIA CUDA Toolkit。

  • イメージやビデオを読み取って表示するためのターゲット上の OpenCV ライブラリ。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。サポートされているコンパイラおよびライブラリのバージョンおよびその設定の詳細については、Install and Setup Prerequisites for NVIDIA Boards (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms) for NVIDIA boards を参照してください。

開発用ホスト要件

  • CUDA 対応 NVIDIA GPU。

  • NVIDIA CUDA Toolkit およびドライバー。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ ハードウェアを参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。

ホストでの NVIDIA サポート パッケージのインストールの検証

関数 checkHardwareSupportPackageInstall を使用して、ホスト システムに、この例を実行するための互換性があることを確認します。

checkHardwareSupportPackageInstall();

NVIDIA ハードウェアへの接続

GPU Coder Support Package for NVIDIA GPUs は、生成された CUDA コードを Jetson プラットフォームでビルドおよび実行している間、TCP/IP 経由の SSH 接続を使用してコマンドを実行します。そのため、ターゲット プラットフォームをホスト コンピューターと同じネットワークに接続するか、イーサネット クロスオーバー ケーブルを使用してボードをホスト コンピューターに直接接続しなければなりません。ボードの設定および構成方法については NVIDIA のドキュメンテーションを参照してください。

NVIDIA ハードウェアと通信するには、関数 jetson (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms) を使用してライブ ハードウェア接続オブジェクトを作成しなければなりません。ライブ ハードウェア接続オブジェクトを作成するには、ターゲット ボードのホスト名または IP アドレス、ユーザー名、およびパスワードを知っている必要があります。

hwobj= jetson('host-name','username','password');

異なるターゲットに対する複数のライブ接続オブジェクトがある場合、コード ジェネレーターは最新のライブ オブジェクトが作成されたターゲットでリモート ビルドを実行します。リモート ビルドを実行するハードウェア ボードを選択するには、各ライブ ハードウェア オブジェクトの setupCodegenContext() メソッドを使用します。ライブ接続オブジェクトが 1 つしか作成されていない場合、このメソッドを呼び出す必要はありません。

hwobj.setupCodegenContext;

GPU 環境の検証

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

envCfg = coder.gpuEnvConfig('jetson');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

エントリポイント関数 imtophat

imtophatDemo_gpu.m は内部で imtophat を呼び出します。関数 imtophat は、関数 imopen (Image Processing Toolbox) を使用してイメージに対してモルフォロジー オープニングを実行します。結果のイメージが元のイメージから減算されます。imopen 演算は、基本的に imerode (Image Processing Toolbox) 演算の後に imdilate (Image Processing Toolbox) が続きます。

入力グレースケール イメージでこの例を示します。

original = imread('rice.png');
imshow(original),title('Input to Top-Hat Filtering');

半径 12 の円盤型の構造化要素を作成します。この構造化要素の近傍 Nhood を関数 imtophat の入力引数として渡します。

se = strel('disk',12);
Nhood = se.Neighborhood;
type imtophatDemo_gpu
function [out]  = imtophatDemo_gpu(img,Nhood,ocvFlag) %#codegen

%   Copyright 2019-2021 The MathWorks, Inc.   

coder.gpu.kernelfun;

% This example uses OpenCV for reading an image 
% and displaying output image. Update buildinfo to link with 
% OpenCV library available on target.
if ocvFlag 
    % OpenCV 4 flags
    opencv_compile_flags = '`pkg-config --cflags --libs opencv4`';
    opencv_link_flags = '`pkg-config --libs opencv4`';
else 
    % OpenCV 3 flags
    opencv_compile_flags = '`pkg-config --cflags --libs opencv`';
    opencv_link_flags = '`pkg-config --libs opencv`';
end

coder.updateBuildInfo('addLinkFlags',opencv_link_flags);
coder.updateBuildInfo('addCompileFlags',opencv_compile_flags);

out = imtophat(img,Nhood);

end

ターゲットでの OpenCV バージョンの取得

pkg-config 補助ツールを使用して、OpenCV 4.x がターゲット ボードにインストールされているかどうかを照会します。この例では、この情報を使用してビルド情報を更新し、ターゲットで使用できる適切な OpenCV ライブラリにリンクします。

try
    OpenCVver = strtrim(system(hwobj,'pkg-config --modversion opencv4'));
    isOpenCV4 = 1;
catch
    OpenCVver = strtrim(system(hwobj,'pkg-config --modversion opencv'));
    isOpenCV4 = 0;
end

ターゲットでの CUDA コードの生成と展開

この例では、imtophatDemo_gpu.m をコード生成用のエントリポイント関数として使用します。CUDA 実行可能ファイルを生成するために、GPU コード構成オブジェクトを作成します。

cfg = coder.gpuConfig('exe');

関数 coder.hardware を使用して Jetson プラットフォーム用の構成オブジェクトを作成し、それを GPU コード構成オブジェクト cfgHardware プロパティに割り当てます。

cfg.Hardware = coder.hardware('NVIDIA Jetson');

カスタム main_tophat.cu ファイルは、生成コード内でエントリポイント関数 imtophatDemo_gpu を呼び出すラッパーです。後処理手順は OpenCV インターフェイスを使用してメイン ファイルに追加されています。エントリポイント関数 imtophatDemo_gpu.m には Build Flags for OpenCV ライブラリが含まれています。

cfg.CustomSource = fullfile('main_tophat.cu');

CUDA コードを生成するには、関数codegenを使用して、入力引数と共に GPU コード構成オブジェクトを渡します。この手順で、CUDA コードがホストで生成され、生成されたファイルがターゲット上のワークスペース ディレクトリにコピーされてビルドされます。ワークスペース ディレクトリは、ハードウェア オブジェクト hwobj のプロパティ workspaceDir として利用できます。

codegen -args {original,coder.Constant(Nhood),coder.Constant(isOpenCV4)} -config cfg imtophatDemo_gpu -report

ターゲットでのアプリケーションの実行

このアプリケーションはグレースケール イメージを入力として受け取ります。putFile コマンドを使用して、rice.png ファイルをホストからターゲット デバイスにコピーします。

imgLoc = which('rice.png');
hwobj.putFile(imgLoc,hwobj.workspaceDir);

ハードウェア オブジェクトの runApplication メソッドを使用して、ターゲット ハードウェアでアプリケーションを起動します。

hwobj.runApplication('imtophatDemo_gpu','rice.png');

Jetson TX2 でのトップハット フィルター済みイメージ

アプリケーションの強制終了

ハードウェア オブジェクトの killApplication メソッドを使用して、ターゲット上で実行中のアプリケーションを強制終了します。

hwobj.killApplication('imtophatDemo_gpu');

参考

オブジェクト

  • (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms) | (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms)

関連するトピック