最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

NVIDIA Jetson TX2 プラットフォームでの Web カメラ イメージの配布と分類

この例では、GPU Coder™ Support Package for NVIDIA GPUs を使用して、DAGNetwork オブジェクトから CUDA® コードを生成し、その生成コードを NVIDIA® Jetson TX2 ボードに展開する方法を説明します。この例では、resnet50 深層学習ネットワークを使用して、USB Web カメラのビデオ ストリームのイメージを分類します。

必要条件

ターゲット ボード要件

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

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

  • USB カメラ (TX2 に接続するため)。

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

  • ターゲット上の NVIDIA cuDNN ライブラリ (v5 以上)。

  • ターゲット上の OpenCV 3.0 以上のライブラリ (イメージとビデオの読み取りおよび表示用)。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。サポートされているコンパイラおよびライブラリのバージョンとそれぞれの設定の詳細は、Install and Setup Prerequisites for NVIDIA Borards を参照してください。

開発用ホスト要件

  • GPU Coder (コードを生成するため)。概要とチュートリアルについては、GPU Coder の製品ページを参照してください。

  • Deep Learning Toolbox™ (DAGNetwork オブジェクトを使用するため)。

  • GPU Coder Interface for Deep Learning Libraries サポート パッケージ。このサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

  • ホスト上の NVIDIA CUDA ツールキット。

  • コンパイラおよびライブラリ用のホスト上の環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、Third-party Products を参照してください。環境変数の設定は、Environment Variables を参照してください。

フォルダーの作成と関連ファイルのコピー

次のコード行は、現在の作業ディレクトリ (ホスト) にフォルダーを作成し、すべての関連ファイルをこのフォルダーにコピーします。このフォルダーにファイルを生成できない場合は、現在の作業ディレクトリを変更し、次のコマンドを再度実行します。

gpucoderdemo_setup('gpucoderdemo_resnet50');

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

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

checkHardwareSupportPackageInstall();

NVIDIA ハードウェアへの接続

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

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

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

メモ:

接続に失敗した場合、MATLAB コマンド ラインで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。

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

hwobj.setupCodegenContext;

ターゲットの GPU 環境の検証

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

envCfg = coder.gpuEnvConfig('jetson');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

ResNet-50 ネットワークについて

関数 resnet50_wrapper.m は、事前学習済みの ResNet-50 ネットワークを使用してイメージを分類します。ResNet-50 は、ImageNet データベースの 100 万枚を超えるイメージで学習済みの DAG ネットワークです。この出力には、イメージが属する各クラスのカテゴリカル スコアが含まれます。

type resnet50_wrapper
function out = resnet50_wrapper(im) %#codegen
% Wrapper function to call ResNet50 predict function.

%   Copyright 2019 The MathWorks, Inc.   

% This example uses OpenCV for reading frames from a web camera 
% and displaying output image. Update buildinfo to link with 
% OpenCV library available on target.
opencv_link_flags = '`pkg-config --cflags --libs opencv`';
coder.updateBuildInfo('addLinkFlags',opencv_link_flags);

% To avoid multiple loads of the network for each run, we use 
% persistent rnet
persistent rnet;
if isempty(rnet)
    rnet = resnet50();
end
out = rnet.predict(im);



end

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

このプログラムは、resnet50_wrapper.m をコード生成用のエントリポイント関数として使用します。NVIDIA ターゲットに展開できる CUDA 実行可能ファイルを生成するには、実行可能ファイルを生成するための GPU Coder 構成オブジェクトを作成します。

cfg = coder.gpuConfig('exe');

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

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

深層学習構成を 'cudnn' または 'tensorrt' に設定します。

cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');

この例では、イメージを入力として使用してコード生成を行います。ただし、Web カメラ ストリームは展開後の実行可能ファイルの入力に渡されます。

コード生成のサンプル イメージの入力

im=single(imread('peppers.png'));
im=imresize(im,[224,224]);

カスタム メイン ファイルは、ビデオを入力として受け取ってそのビデオ シーケンスの各フレームを分類するようにコード化されています。カスタム メイン ファイルは、生成コード内で関数 predict を呼び出すラッパーです。入力フレームに出力を表示するなどの後処理手順は OpenCV インターフェイスを使用してメイン ファイルに追加されています。

cfg.CustomSource=fullfile('codegen','exe','resnet50_wrapper','examples','main.h');
cfg.CustomSource=fullfile('main.cu');

CUDA コードを生成してターゲットに展開するには、関数 codegen を使用し、GPU コード構成オブジェクトを渡します。ホストでコード生成が行われた後、生成されたファイルがターゲット上のワークスペース ディレクトリにコピーされてビルドされます。

codegen -config cfg -args {im} resnet50_wrapper -report

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

putFile コマンドを使用して、synsetWords テキスト ファイルをホスト コンピューターからターゲット デバイスにコピーします。

hwobj.putFile('synsetWords.txt',hwobj.workspaceDir);

ハードウェア オブジェクトの runApplication メソッドを使用して、ターゲット ハードウェアでアプリケーションを起動します。アプリケーションはワークスペース ディレクトリ内に配置されます。

hwobj.runApplication('resnet50_wrapper');

Jetson TX2 での Resnet 分類出力

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

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

hwobj.killApplication('resnet50_wrapper');

関数 cleanup を実行して生成されたファイルを削除し、元のフォルダーに戻します。

cleanup