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 Toolkit。

  • ターゲット ボード上の NVIDIA cuDNN ライブラリ。

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

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

開発用ホスト要件

ホストでの 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,ocvFlag) %#codegen
% Wrapper function to call ResNet50 predict function.

%   Copyright 2019-2021 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.
if ocvFlag
    opencv_link_flags = '`pkg-config --libs opencv4`';
    opencv_compile_flags = '`pkg-config --cflags  opencv4`';
else
    opencv_link_flags = '`pkg-config --libs opencv`';
    opencv_compile_flags = '`pkg-config --cflags --libs opencv`';
end

coder.updateBuildInfo('addLinkFlags',opencv_link_flags);
coder.updateBuildInfo('addCompileFlags',opencv_compile_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

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

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

isOpenCV4 = 1;
ocvVersion = hwobj.OpenCVVersion();
if (str2double(ocvVersion(1)) <= 3)
   isOpenCV4 = 0;
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,coder.Constant(isOpenCV4)} resnet50_wrapper -report

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

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

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

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

runApplication(hwobj,'resnet50_wrapper');

ターゲット ボードでウェブカメラ ウィンドウが表示されない場合、誤ったディスプレイが指定されている可能性があります。関数 setDisplayEnvironment を使用して、ターゲット上のディスプレイをリダイレクトするために使用される表示環境を設定します。値は、ボードに設定されている $DISPLAY 環境変数と同じにしなければなりません。

Jetson TX2 での ResNet 分類出力

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

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

killApplication(hwobj,'resnet50_wrapper');

参考

オブジェクト

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

関連するトピック