ABEJA Tech Blog

中の人の興味のある情報を発信していきます

NVIDIA DeepStream SDK on Jetson の紹介

DeepStream SDKとは

NVIDIA社が提供している、DNNのためのメディア・ストリーム処理フレームワークで、物体認識等のDNN推論を低レイテンシ&ハイパフォーマンスでビデオストリームに適用できます。

f:id:toshitanian:20180116144826j:plain
引用: https://developer.nvidia.com/deepstream-sdk

また今回はJetsonを利用したエッジ・デバイス上での事例を紹介していますが、通常のNVIDIAのGPUを搭載したサーバでも利用でき、例えばライブ配信等にリアルタイムでDNN推論を適用できたりします。

Jetson とは

NVIDIAのSoCが搭載されている、ハードウェア・プラットフォームの事で、モバイルやロボティクス等のエッジ・デバイス上でGPUを使用した推論を走らせることができ、現在、Maxwell世代のアーキテクチャを搭載したTX1と、Pascal世代のアーキテクチャを採用したTX2が存在しています。

TX2 TX1
GPU NVIDIA Pascal™, 256 CUDA cores NVIDIA Maxwell ™, 256 CUDA cores
CPU HMP Dual Denver 2/2 MB L2 + Quad ARM® A57/2 MB L2 Quad ARM® A57/2 MB L2
Video 4K x 2K 60 Hz Encode (HEVC) 4K x 2K 60 Hz Decode (12-Bit Support) 4K x 2K 30 Hz Encode (HEVC) 4K x 2K 60 Hz Decode (10-Bit Support)
Memory 8 GB 128 bit LPDDR4 59.7 GB/s 4 GB 64 bit LPDDR4 25.6 GB/s
Display 2x DSI, 2x DP 1.2 / HDMI 2.0 / eDP 1.4 2x DSI, 1x eDP 1.4 / DP 1.2 / HDMI
CSI Up to 6 Cameras (2 Lane) CSI2 D-PHY 1.2 (2.5 Gbps/Lane) Up to 6 Cameras (2 Lane) CSI2 D-PHY 1.1 (1.5 Gbps/Lane)

DeepStream SDK on Jetson

概要

DeepStream SDK on Jetson はその名の通りDeepStream SDKをJetsonで使用できるようにした物で、利用する上で素のDeepStream SDKとの大きな違いは、組み込み分野でよく使用されるメディア・フレームワークであるGStreamer(https://gstreamer.freedesktop.org/) に対応している所です。

GStreamerアーキテクチャ図

f:id:toshitanian:20180116144925p:plain
引用: https://en.wikipedia.org/wiki/GStreamer

GStreamerは、パイプラインでメディア処理を行うフレームワークで、既に様々なプラグインが存在し、DeepStream SDK on JetsonでもDeepStream SDKの機能と組み合わせてそれらを利用できます。またDeepStreamの機能その物もGStreamerのelement(パイプラインを構成する要素)として提供され、通常のGStreamerアプリケーションを開発するのと同じインターフェースで開発できます。

利用方法

この記事を書いている2018年1月14日現在、DeepStream SDK on Jetsonはearly access programとして提供されており、まずこちら(https://developer.nvidia.com/deepstream-jetson) から必要情報を記入して申し込む必要があります。 DeepStream SDKには簡単に機能を試す&開発のベースに成るアプリケーション・コードが付属されており、それをベースに開発を進めることが出来ます。また、モデル部は現在Caffeがサポートされており、Caffeでトレーニング済みモデルを生成すれば、SDKに組み込まれている専用のGStreamer elementから簡単に利用できます。

ユースケース

DeepStream SDK on Jestonは例えば以下のようなユースケースで利用できます。 * ホームデバイス * ロボティクス分野 * 防犯カメラ等のリアルタイム監視

Jetsonは複数のカメラ(最大6つまで)を同時に扱う事ができるので、その特色を活かしたユースケースが考えられます。

f:id:toshitanian:20180116145310p:plain
引用: https://developer.nvidia.com/deepstream-jetson

Deep Stream SDK on Jetsonのアーキテクチャ

f:id:toshitanian:20180116192935j:plain
引用: NVIDIA DeepStream SDK on Jetson Development Guideより

Deep Stream SDKは前述の通りMedia FrameworkにGStreamer(以下gst)を採用しており、gstのAPIを使用して開発できます。また勿論独自のgst pluginも作成する事ができ、独自のメディア処理elementを追加できます。Deep Stream SDK固有のgst pluginとして主に以下の物が用意されています。

  • GST-nvcaffeGIE - caffeのモデルを走らせるためのelement
  • GST-nvtracker - object tracking API
  • GST-nvosd - camera等の入力にoverlayで画面を構成する(一般的にcameraのlive viewにoverlay表示する画面の事はOSDと言う)

gstで提供されている機能はgstを介さないlow layer APIとしても使用できます。

開発環境構築の流れ

Deep Stream SDK on Jetsonのインストール

TX2(Target)上で以下を実行します。

 $ tar xpvf DeepStream_SDK_on_Jetson_1.0_pre-release.tbz2
 $ sudo tar xpvf deepstream_sdk_on_jetson.tbz2 -C /
 $ sudo tar xpvf deepstream_sdk_on_jetson_models.tbz2 -C /
 $ sudo tar xpvf R28.1_patch_TX2.tbz2 -C /
 $ sudo ldconfig

動作確認

同じくTX2上で以下の実行を行います。

$ nvgstiva-app -c ${HOME}/configs/PGIE-FP16-CarType-CarMake-CarColor.txt

※注意 pipelineでエラーが出たら

sudo rm -rf ${HOME}/.cache/*

とcacheを削除してやる必要があります。

Deep Stream SDK exampleの実行

Example pluginのbuild & install

TX2上で必要なライブラリをinstallします。

 $ sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \
     libegl1-mesa-dev
 $ sudo ln -sf /usr/lib/aarch64-linux-gnu/tegra-egl/libEGL.so.1 \
     /usr/lib/aarch64-linux-gnu/libEGL.so

build & install

$ cd gst-dsexample_sources
$ make && sudo make install

Example appのbuild

  $ sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
  $ sudo ln -s /usr/lib/aarch64-linux-gnu/tegra/libnvid_mapper.so.1.0.0 \
             /usr/lib/aarch64-linux-gnu/libnvid_mapper.so
  $ cd nvgstiva-app_sources/nvgstiva-app
  $ make
  $ ./nvgstiva-app -c ${HOME}/configs/PGIE-FP16-CarType-CarMake-CarColor.txt

Example appのアーキテクチャ

f:id:toshitanian:20180116193735j:plain
引用: NVIDIA DeepStream SDK on Jetson Development Guideより

Example appの簡単な検証

Example appを付属の動画ファイル or CSIで接続されているcameraで動かした所、上限の30fpsでの推論ができました。

NvMMLiteOpen : Block : BlockType = 261
TVMR: NvMMLiteTVMRDecBlockOpen: 7907: NvMMLiteBlockOpen
NvMMLiteBlockCreate : Block : BlockType = 261
TVMR: cbBeginSequence: 1223: BeginSequence  1280x720, bVPR = 0
TVMR: LowCorner Frequency = 100000
TVMR: cbBeginSequence: 1622: DecodeBuffers = 5, pnvsi->eCodec = 4, codec = 0
TVMR: cbBeginSequence: 1693: Display Resolution : (1280x720)
TVMR: cbBeginSequence: 1694: Display Aspect Ratio : (1280x720)
TVMR: cbBeginSequence: 1762: ColorFormat : 5
TVMR: cbBeginSequence:1776 ColorSpace = NvColorSpace_YCbCr601
TVMR: cbBeginSequence: 1904: SurfaceLayout = 3
TVMR: cbBeginSequence: 2005: NumOfSurfaces = 12, InteraceStream = 0, InterlaceEnabled = 0, bSecure = 0, MVC = 0 Semiplanar = 1, bReinit = 1, BitDepthForSurface = 8 LumaBitDepth = 8, ChromaBitDepth = 8, ChromaFormat = 5
TVMR: cbBeginSequence: 2007: BeginSequence  ColorPrimaries = 2, TransferCharacteristics = 2, MatrixCoefficients = 2
Allocating new output: 1280x720 (x 12), ThumbnailMode = 0
OPENMAX: HandleNewStreamFormat: 3464: Send OMX_EventPortSettingsChanged : nFrameWidth = 1280, nFrameHeight = 720
** INFO: <bus_callback:115>: Pipeline running

TVMR: FrameRate = 30
TVMR: NVDEC LowCorner Freq = (100000 * 1024)
TVMR: FrameRate = 30.252152

**PERF: FPS 0 (Avg)
**PERF: 32.73 (32.73)
TVMR: FrameRate = 29.508274
**PERF: 30.03 (31.33)
TVMR: FrameRate = 30.000030
**PERF: 29.99 (30.87)
TVMR: FrameRate = 29.752076

学習済みModel

Caffe等、TensorRT2がサポートしているmodel formatであれば独自にpluginを書く必要もなく、DeepStream SDKのelementを介して推論を動かすことが出来ます。

まとめ

DeepStream SDK on Jetsonを使う事によりエッジサイドでのDeep Learningを使ったリアルタイムビデオ解析アプリケーション開発がより簡単にできそうです。今後TensorRT3への対応などにより、導入のハードルが下がる事が期待できそうです。

宣伝

以下の職種で積極採用中です!

www.wantedly.com

www.wantedly.com

また、1/22(月)に ABEJA Cloud AI Night 〜エッジコンピューティング編〜 を開催します。エッジコンピューティングに興味のある方は是非ご参加ください。

eventregist.com

ABEJAが発信する最新テクノロジーに興味がある方は、是非ともブログの読者に!