Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ビデオ分類ネットワーク向けのコード生成

この例では、MATLAB® Coder™ Support Package for NVIDIA Jetson and NVIDIA DRIVE® Platforms を使用して、ビデオを分類する深層学習ネットワーク用の CUDA® コードを生成し、その生成コードを NVIDIA® Jetson™ Xavier ボードに展開する方法を示します。この深層学習ネットワークには、畳み込み層と双方向長短期記憶 (BiLSTM) 層の両方が含まれています。生成されたアプリケーションは、ビデオ フレームのシーケンスとして指定されたビデオ ファイルからデータを読み取り、そのビデオ内のアクティビティを分類するラベルを出力します。この例では、Deep Learning Toolbox™ の「深層学習を使用したビデオの分類」の例で学習させたネットワーク用のコードを生成します。詳細については、深層学習を使用したビデオの分類 (Deep Learning Toolbox)を参照してください。

サードパーティの必要条件

ターゲット ボード要件

  • NVIDIA Jetson ボード。

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

  • CUDA ライブラリと cuDNN ライブラリを含む、サポートされている Jetpack SDK

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

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

コードを生成して NVIDIA Jetson Xavier ボードに展開するには、MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms が必要です。関数 checkHardwareSupportPackageInstall を使用して、ホスト システムに、この例を実行するための互換性があることを確認します。関数がエラーをスローしなければ、サポート パッケージは正しくインストールされています。

checkHardwareSupportPackageInstall();

NVIDIA ハードウェアへの接続

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

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

hwobj = jetson('jetson-name','ubuntu','ubuntu');

Jetson オブジェクトは、最近 Jetson ハードウェアに正常に接続されたときの設定を再利用します。この例では、メモリに保存されている設定を使用して、Jetson ハードウェアへの SSH 接続を確立します。

hwobj = jetson;
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
Checking for cuDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for prerequisite libraries is complete.
Gathering hardware details...
Checking for third-party library availability on the Target...
Gathering hardware details is complete.
 Board name              : NVIDIA Jetson AGX Xavier Developer Kit
 CUDA Version            : 11.4
 cuDNN Version           : 8.4
 TensorRT Version        : 8.4
 GStreamer Version       : 1.16.3
 V4L2 Version            : 1.18.0-2build1
 SDL Version             : 1.2
 OpenCV Version          : 4.5.4
 Available Webcams       : Logitech Webcam C925e
 Available GPUs          : Xavier
 Available Digital Pins  : 7  11  12  13  15  16  18  19  21  22  23  24  26  29  31  32  33  35  36  37  38  40

メモ:

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

GPU 環境の検証

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

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

エントリポイント関数 net_classify

エントリポイント関数 net_classify は、ビデオ ファイルの名前をハードコードします。このハードコードされるパスは、ターゲット ハードウェア上のビデオ ファイルの場所に調整する必要があります。そうすれば、エントリポイント関数がVideoReaderオブジェクトを使用してファイルからデータを読み取ります。データは、イメージ (ビデオ フレーム) のシーケンスとして MATLAB に読み取られます。その後、このデータは、中央でトリミングされ、最終的に、予測用の学習済みネットワークに入力として渡されます。具体的には、この関数は "深層学習を使用したビデオの分類" の例で学習させたネットワークを使用します。この関数は、ネットワーク オブジェクトを net.mat ファイルから永続変数に読み込み、後続の予測呼び出しでその永続オブジェクトを再利用します。

type('net_classify.m')
function out = net_classify() %#codegen

if coder.target('MATLAB')
    videoFilename = 'situp.mp4';
else
    videoFilename = '/home/ubuntu/VideoClassify/situp.mp4';
end

frameSize = [1920 1080];

% read video
video = readVideo(videoFilename, frameSize);

% specify network input size
inputSize = [224 224 3];

% crop video
croppedVideo = centerCrop(video,inputSize);

% A persistent object mynet is used to load the series network object. At
% the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is
% reused to call predict on inputs, thus avoiding reconstructing and
% reloading the network object.

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('net.mat');
end

% pass in cropped input to network
out = classify(mynet, croppedVideo); 


%   Copyright 2019-2021 The MathWorks, Inc.

ネットワークについて

ビデオ入力の分類に使用されるネットワークは、いくつかの注目すべき機能を備えています。

1.ネットワークには、入力としてイメージ シーケンスを受け取るシーケンス入力層があります。

2.ネットワークは、畳み込み層が後に続くシーケンス折りたたみ層を使用して、畳み込み演算を各ビデオ フレームに個別に適用することにより、各フレームから特徴を抽出します。

3.ネットワークは、シーケンス展開層とフラット化層を使用して、シーケンス構造を復元し、BiLSTM 層を想定して出力の形状をベクトル シーケンスに変更します。

4.最後に、ネットワークは、出力層が後に続く BiLSTM 層を使用して、ベクトル シーケンスを分類します。

ネットワーク アーキテクチャの対話的な可視化とネットワーク層についての詳細情報を表示するには、関数analyzeNetwork (Deep Learning Toolbox)を使用します。

MATLAB での net_classify の実行

ビデオ分類ネットワークをダウンロードします。

getVideoClassificationNetwork();

situp.mp4 の個々のフレームに対してループ処理を行い、MATLAB にテスト ビデオを表示します。

videoFileName = 'situp.mp4';
video = readVideo(videoFileName);

numFrames = size(video,4);
figure
for i = 1:numFrames
    frame = video(:,:,:,i);
    imshow(frame/255);
    drawnow
end

net_classify を実行して、出力ラベルをメモします。ホスト GPU が使用可能な場合は、net_classify の実行時にそれが自動的に使用されることに注意してください。

net_classify()
ans = categorical
     situp 

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

NVIDIA ターゲットに展開できる CUDA 実行可能ファイルを生成するには、実行可能ファイルを生成するための新しい GPU Coder 構成オブジェクトを作成します。ターゲット深層学習ライブラリを 'cudnn' に設定します。

clear cfg
cfg = coder.gpuConfig('exe');
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');

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

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

ターゲット ハードウェア上でビルド ディレクトリを設定します。以下のサンプル パスを、生成されたコードを配置するターゲット ハードウェア上の場所に変更します。

cfg.Hardware.BuildDir = '/home/ubuntu/VideoClassify';

カスタム メイン ファイル main.cu は、生成されたライブラリ内で関数 net_classify を呼び出すラッパーです。

cfg.CustomInclude = '.';
cfg.CustomSource = fullfile('main.cu');

codegen コマンドを実行します。これにより、コードが生成され、ターゲット ボードにコピーされます。その後で、ターゲット ボード上で実行可能ファイルがビルドされます。

codegen -config cfg net_classify
Code generation successful: View report

ターゲットでの生成されたアプリケーションの実行

putFile コマンドを使用して、テスト ビデオ ファイル situp.mp4 をホスト コンピューターからターゲット デバイスにコピーします。このビデオ ファイルが、必ずエントリポイント関数 net_classify でハードコードされた場所に配置されるようにしてください。この例では、この場所がターゲット ハードウェアのビルド ディレクトリになっています。

putFile(hwobj,videoFileName,cfg.Hardware.BuildDir);

runApplication を使用して、ターゲット ハードウェアでアプリケーションを起動します。ラベルがターゲット上の出力端末に表示されます。

status = evalc("runApplication(hwobj,'net_classify')");

参考

関数

オブジェクト

関連する例

詳細