このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ビデオ分類ネットワーク向けのコード生成
この例では、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 コード構成オブジェクト cfg
の Hardware
プロパティに割り当てます。
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')");
参考
関数
coder.checkGpuInstall
|codegen
|coder.DeepLearningConfig
|coder.loadDeepLearningNetwork
|jetson
|runApplication
|killApplication
|VideoReader
オブジェクト
関連する例
- 深層学習を使用したビデオの分類 (Deep Learning Toolbox)
- Getting Started with the MATLAB Coder Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms