メインコンテンツ

Jetson 上の IP カメラ ストリームからの深層学習車両検出器

この例では、車両検出を実行する Simulink® モデルから、畳み込みニューラル ネットワーク (CNN) を使用して CUDA® アプリケーションを開発する方法を説明します。この例では、IP カメラ ストリームを入力として受け取り、フレーム内の車両を検出します。この例では、Computer Vision Toolbox™ の「YOLO v2 深層学習を使用したオブジェクト検出」の例の事前学習済み車両検出ネットワークを使用します。詳細については、YOLO v2 深層学習を使用したオブジェクトの検出 (Computer Vision Toolbox)を参照してください。

この例では、次の概念を説明します。

  • Simulink で車両検出アプリケーションをモデル化。事前学習済みの YOLO v2 検出器が、IP カメラ ストリームからのフレームを処理します。このネットワークは、ビデオ内の車両を検出し、その車両の境界ボックスの座標と信頼スコアを出力します。

  • NVIDIA Jetson TX2 ターゲット用のコード生成と展開に向けたモデルの構成。

  • NVIDIA Jetson TX2 ターゲット上の Simulink モデル用の CUDA 実行可能ファイルの生成。

ターゲット ボード要件

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

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

  • ターゲットと同じネットワークに接続された IP カメラ。

  • ターゲットのディスプレイ ポートに接続されたモニター。

  • ターゲット上の SDL (v1.2) ライブラリ。

  • ターゲット上の GStreamer ライブラリ。

  • NVIDIA CUDA Toolkit およびドライバー。

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

  • コンパイラおよびライブラリ用のターゲット上の環境変数。詳細については、Prerequisites for Generating Code for NVIDIA Boardsを参照してください。

NVIDIA ハードウェアへの接続

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

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

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

ハードウェア ライブ オブジェクトの作成中に、サポート パッケージが、ハードウェアとソフトウェアのチェック、I/O サーバーのインストールの実行、およびターゲット上の周辺装置情報の収集を行います。この情報はコマンド ウィンドウに表示されます。

ターゲット ボードでの GPU 環境の検証

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

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

事前学習済みの車両検出ネットワークの取得

この例では、事前学習済みのネットワークを含む yolov2ResNet50VehicleExample MAT ファイルを使用します。ファイルのサイズは約 98 MB です。MathWorks の Web サイトからファイルをダウンロードします。

vehiclenetFile = matlab.internal.examples.downloadSupportFile('vision/data','yolov2ResNet50VehicleExample.mat');

車両検出 Simulink モデル

IP カメラ ストリームで車両検出を実行するための Simulink モデルが表示されます。モデルが展開され、ターゲット上で実行されると、SDL Video Display ブロックによって IP カメラ ストリームが車両の注釈とともに表示されます。

open_system('VehicleDetectionOnJetson');

Simulink モデルの予測と検出器のブロックで、ダウンロードしたネットワーク モデルのファイル パスを設定します。

set_param('VehicleDetectionOnJetson/Vehicle Detector','DetectorFilePath',vehiclenetFile)

IP カメラ

Simulink モデルで IP カメラからのストリームを使用するように構成するには、Network Video Receive ブロックをダブルクリックします。[ビデオ ソース] リストから Network device を選択します。Network device を選択した後、[URL] パラメーターに IP カメラ ストリームの URL を設定します。

URL はネットワーク設定によって異なります。この例では、CP PLUS IP カメラを使用しています。カメラの URL の例は rtsp://username:password@192.168.0.110:554/Streaming/Channels/1 です。

車両検出

YOLO v2 オブジェクトの検出ネットワークは、特徴抽出ネットワークと、その後に続く検出ネットワークという、2 つのサブネットワークで構成されます。事前学習済みのネットワークは、特徴抽出に ResNet-50 を使用します。検出サブネットワークは特徴抽出ネットワークと比べて小さい CNN であり、少数の畳み込み層と YOLO v2 に固有の層で構成されます。Simulink モデルは、Computer Vision Toolbox の Object Detector ブロックを使用して車両検出を実行します。このブロックは、イメージを入力として受け取り、境界ボックス座標をイメージ内の車両の信頼度スコアと共に出力します。

IP カメラ ストリーム内の車両境界ボックスの注釈

VehicleAnnotation MATLAB Function ブロックは、関数 vehicle_annotation を定義します。この関数は、車両境界ボックスに対して信頼度スコアとともに注釈を付けます。

type vehicle_annotation
function In = vehicle_annotation(bboxes,scores,In)

% Copyright 2022 The MathWorks, Inc.

if ~isempty(bboxes)
    In = insertObjectAnnotation(In, 'rectangle', bboxes, scores, 'color',[255 255 0]);
end

end

Jetson での展開に向けたモデルの構成

CUDA コードを生成するには、次の設定でモデルを有効にしなければなりません。

set_param('VehicleDetectionOnJetson','TargetLang','C++');
set_param('VehicleDetectionOnJetson','GenerateGPUCode','CUDA');

この例のモデルは、CUDA コードを生成するように事前構成されています。

Simulink で GPU コードを生成する方法の詳細については、GPU Coder を使用した Simulink モデルからのコード生成を参照してください。

深層学習ターゲット ライブラリは、コード生成時に 'CuDNN' として設定しなければなりません。

set_param('VehicleDetectionOnJetson', 'DLTargetLibrary','cudnn');

詳細については、MATLAB Function ブロックを使用した深層学習ネットワーク用の GPU コード生成Deep Neural Networks ライブラリ ブロック用の GPU コード生成を参照してください。

モデル コンフィギュレーション パラメーターにより、ビルド プロセスと展開のオプションを指定できます。

1.[コンフィギュレーション パラメーター] ダイアログ ボックスの [ハードウェア実行] ペインを開きます。[ハードウェア ボード][NVIDIA Jetson] (または [NVIDIA Drive]) として選択します。

2.[Target hardware resources] セクションで、NVIDIA Jetson ターゲット ボードの [デバイス アドレス][ユーザー名]、および [パスワード] を入力します。

3.[ビルド アクション][ビルド ディレクトリ][表示] を以下のように設定します。[表示] は表示環境を表し、環境に対応したデバイスに出力を表示することができます。

4.[適用] をクリックし、[OK] をクリックします。

モデルの生成およびターゲット ボードへの展開

1.モデルの CUDA コードを生成し、コードをターゲットに展開して実行可能ファイルを実行するには、Simulink エディターの [ハードウェア] タブを開きます。

2.[ビルド、展開、起動] を選択します。コードが生成され、ハードウェアに展開されます。

Jetson TX2 での車両検出

アプリケーションがターゲット上で起動すると、[SDL Video] ウィンドウが開き、IP カメラによってキャプチャされたビデオ ストリームの各フレームに対する車両検出結果が表示されます。

アプリケーションの停止

ターゲットでアプリケーションを停止するには、ハードウェア オブジェクトの stopModel メソッドを使用します。

stopModel(hwobj,'VehicleDetectionOnJetson');