このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
NVIDIA DRIVE でのセマンティック セグメンテーション
この例では、深層学習を使用するイメージ セグメンテーション アプリケーションの CUDA® 実行可能ファイルを生成して展開する方法について説明します。これは MATLAB® Coder™ Support Package for NVIDIA® Jetson™ and NVIDIA DRIVE™ Platforms を使用して、NVIDIA DRIVE™ プラットフォーム上に実行可能ファイルを展開します。この例では、ホスト コンピューターでコード生成を実行し、生成されたコードを、サポート パッケージのリモート ビルド機能を使用して、ターゲット プラットフォーム上でビルドします。詳細については、セマンティック セグメンテーション ネットワークのコード生成を参照してください。
必要条件
ターゲット ボード要件
NVIDIA DRIVE PX2 組み込みプラットフォーム。
ターゲット ボードとホスト PC を接続するイーサネット クロスオーバー ケーブル (ターゲット ボードをローカル ネットワークに接続できない場合)。
ボードにインストールされている NVIDIA CUDA Toolkit。
ターゲット上の NVIDIA cuDNN ライブラリ (v5 以上)。
イメージを読み取って表示するためのターゲット上の OpenCV ライブラリ。
コンパイラおよびライブラリ用のターゲット上の環境変数。詳細については、Install and Setup Prerequisites for NVIDIA Boardsを参照してください。
開発用ホスト要件
CUDA コード生成の場合、ホスト上の NVIDIA CUDA Toolkit と、コンパイラおよびライブラリ用の環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
NVIDIA DRIVE への接続
このサポート パッケージは、生成された CUDA コードを DRIVE プラットフォームでビルドおよび実行している間、TCP/IP による SSH 接続を使用してコマンドを実行します。ターゲット プラットフォームをホスト コンピューターと同じネットワークに接続するか、イーサネット クロス ケーブルを使用してボードをホスト コンピューターに直接接続します。ボードを設定して構成する方法については、NVIDIA のドキュメントを参照してください。
Drive オブジェクトの作成
NVIDIA ハードウェアと通信するには、関数 jdrive
を使用してライブ ハードウェア接続オブジェクトを作成します。
hwobj = drive('drive-board-name','ubuntu','ubuntu');
ターゲット ボードに初めて接続するときは、ターゲット ボードのホスト名 (または IP アドレス)、ユーザー名、およびパスワードを提供しなければなりません。以降の接続では、アドレス、ユーザー名、パスワードを入力する必要はありません。ハードウェア オブジェクトは、最近 NVIDIA ボードに正常に接続されたときの設定を再利用します。
ハードウェア ライブ オブジェクトの作成時、サポート パッケージはハードウェアとソフトウェアのチェックを実行し、ターゲット ボードに MATLAB IO サーバーをインストールし、ターゲットに接続されている周辺デバイスの情報を収集します。この情報はコマンド ウィンドウに表示されます。接続に失敗した場合は、MATLAB コマンド ラインで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。
ターゲット ボードでの GPU 環境の検証
この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数coder.checkGpuInstall
を使用します。
envCfg = coder.gpuEnvConfig('drive');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);
事前学習済みの SegNet DAG ネットワーク オブジェクトの取得
net = getSegNet();
Downloading pre-trained SegNet (107 MB)...
この DAG ネットワークには、畳み込み層、バッチ正規化層、プーリング層、逆プーリング層、ピクセル分類出力層など、91 個の層が含まれています。ネットワークのすべての層を表示するには、関数 analyzeNetwork
を使用します。
GPU Coder を使用したターゲット ボード向けの CUDA コードの生成
この例では、segnet_predict.m
ファイルをコード生成用のエントリポイント関数として使用します。NVIDIA ターゲットに展開できる CUDA 実行可能ファイルを生成するには、実行可能ファイルを生成するための GPU コード構成オブジェクトを作成します。
cfg = coder.gpuConfig('exe');
異なるターゲットに対する複数のライブ接続オブジェクトがある場合、コード ジェネレーターは最新のライブ オブジェクトが作成されたターゲット ボードでリモート ビルドを実行します。リモート ビルドを実行するハードウェア ボードを選択するには、各ライブ ハードウェア オブジェクトの setupCodegenContext()
メソッドを使用します。ライブ接続オブジェクトが 1 つしか作成されていない場合は、このメソッドを呼び出す必要がありません。
hwobj.setupCodegenContext;
DRIVE プラットフォーム用の構成オブジェクトを作成し、それをコード構成オブジェクト cfg
の Hardware
プロパティに割り当てるには、関数coder.hardware
を使用します。
cfg.Hardware = coder.hardware('NVIDIA Drive');
ターゲット ボードでリモート ビルド プロセスを実行するフォルダーを指定するには、BuildDir
プロパティを使用します。指定したビルド フォルダーがターゲット ボード上にない場合は、指定した名前でフォルダーが作成されます。値が cfg.Hardware.BuildDir
に代入されない場合は、リモート ビルド プロセスは最後に指定されたビルド フォルダーで発生します。格納されているビルド フォルダー値がない場合、ビルド プロセスはホーム フォルダーで行われます。
cfg.Hardware.BuildDir = '~/remoteBuildDir';
複数の GPU を含む DRIVE PX2 などの NVIDIA プラットフォームでは、GPU 構成オブジェクトの SelectCudaDevice
プロパティを使用して特定の GPU を選択します。
cfg.GpuConfig.SelectCudaDevice = 0;
カスタム main.cu
ファイルは、生成コード内で関数 predict を呼び出すラッパーです。後処理手順は OpenCV インターフェイスを使用することによってメイン ファイルに追加されます。SegNet 予測の出力は 11 チャネル イメージです。ここでの 11 チャネルは、11 の異なるクラスの予測スコアを表しています。後処理で、各ピクセルに 11 チャネルのうちで最大のスコアをもつクラス ラベルが割り当てられます。各クラスには、可視化用の一意の色が関連付けられます。最終出力は OpenCV 関数 imshow
を使用して表示されます。
cfg.CustomSource = fullfile('main.cu');
この例では、コード生成でネットワークへの入力としてイメージが使用されます。ただし、カスタム メイン ファイルは、ビデオを入力として受け取ってそのビデオ シーケンスのフレームごとに SegNet 予測を実行するようにコード化されています。OpenCV ライブラリを使用して実行可能ファイルをビルドするために必要なコンパイラ フラグとリンカー フラグは、|segnet_predict.m| ファイル内の buildinfo
セクションで更新されます。
コード生成のためのサンプル イメージ入力を生成します。
img = imread('peppers.png');
img = imresize(img,[360 480]);
CUDA コードを生成するには、関数codegen
を使用して、GPU コード構成、入力サイズ、およびエントリポイント関数 segnet_predict.m
を渡します。ホストでコード生成が行われた後、生成されたファイルがターゲット ボードにコピーされ、そこでビルドされます。
codegen('-config ', cfg, 'segnet_predict', '-args', {img},'-report');
ターゲット ボードでの実行可能ファイルの実行
ハードウェア オブジェクトの workspaceDir
プロパティを使用して、入力テスト ビデオをターゲット ワークスペース フォルダーにコピーします。このプロパティには、ターゲット ボード上の codegen
フォルダーへのパスが含まれています。
hwobj.putFile('CamVid.avi', hwobj.workspaceDir);
ターゲット ハードウェアで実行可能ファイルを起動するには、ハードウェア オブジェクトの runApplication()
メソッドを使用します。
hwobj.runApplication('segnet_predict','CamVid.avi');
セグメント化されたイメージ出力が、ターゲット ボードに接続されたモニターのウィンドウに表示されます。
ターゲット ボード上で実行中の実行可能ファイルは、ハードウェア オブジェクトの killApplication()
メソッドを使用して、ホスト上の MATLAB 環境から停止できます。この方法では、実行可能ファイルの名前ではなく、アプリケーションの名前を使用します。
hwobj.killApplication('segnet_predict');