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 コード構成オブジェクト cfg
の Hardware
プロパティに割り当てます。
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');
参考
オブジェクト
jetson
(MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms) |drive
(MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms)
関連するトピック
- NVIDIA ハードウェアでの実行可能ファイルのビルドと実行
- GPU Coder アプリを使用した NVIDIA ハードウェアでの実行可能ファイルのビルドと実行
- Stop or Restart an Executable Running on NVIDIA Hardware (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms)
- Run Linux Commands on NVIDIA Hardware (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms)