Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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 Boards (MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms) for NVIDIA boards を参照してください。

開発用ホスト要件

  • NVIDIA CUDA ツールキットおよびドライバー。

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

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

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

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

ホストでの 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');

メモ:

接続に失敗した場合、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 コードの生成と展開

NVIDIA ターゲットに展開できる CUDA 実行可能ファイルを生成するには、実行可能ファイルを生成するための GPU Coder 構成オブジェクトを作成します。

cfg = coder.gpuConfig('exe');

関数 coder.hardware を使用して Jetson プラットフォーム用の構成オブジェクトを作成し、それを GPU コード構成オブジェクト 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]);

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

cfg.CustomSource=fullfile('main_resnet50.h');
cfg.CustomSource=fullfile('main_resnet50.cu');

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

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

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

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

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

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

hwobj.runApplication('resnet50_wrapper');

Jetson TX2 での Resnet 分類出力

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

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

hwobj.killApplication('resnet50_wrapper');