DeepStream SDKとは
NVIDIA社が提供している、DNNのためのメディア・ストリーム処理フレームワークで、物体認識等のDNN推論を低レイテンシ&ハイパフォーマンスでビデオストリームに適用できます。
また今回は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アーキテクチャ図
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つまで)を同時に扱う事ができるので、その特色を活かしたユースケースが考えられます。
Deep Stream SDK on Jetsonのアーキテクチャ
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のアーキテクチャ
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への対応などにより、導入のハードルが下がる事が期待できそうです。
宣伝
以下の職種で積極採用中です!
また、1/22(月)に ABEJA Cloud AI Night 〜エッジコンピューティング編〜 を開催します。エッジコンピューティングに興味のある方は是非ご参加ください。
ABEJAが発信する最新テクノロジーに興味がある方は、是非ともブログの読者に!