Jetson Nano DeepStream SDK カメラ映像から検出&RTSP配信

DeepStream SDK 4.0からJetson Nanoに対応されたようです。

Jetson NanoでDeepStream SDK USBカメラ映像をリアルタイムで物体検出してRTSP配信をする

DeepStream SDK とは? (説明抜粋)


カメラ、センサー、IoTゲートウェイからのデータをリアルタイムで分析
NVIDIAのDeepStream SDKは、マルチセンサー処理だけでなく、AIベースのビデオおよび画像を理解するための完全なストリーミング分析ツールキットを提供します。
DeepStreamは、ピクセルとセンサーデータを実用的な洞察に変換するためのエンドツーエンドのサービスとソリューションを構築するプラットフォームであるNVIDIA Metropolisの不可欠な部分です。

複雑なストリーム処理パイプラインをシームレスに開発
DeepStreamを使用すると、開発者はエッジツークラウドのストリーミング分析アプリケーションを構築できます。
SDKは、オープンソースのGStreamerを使用して、低レイテンシのストリーミングフレームワークで高いスループットを実現します。
ランタイムシステムはパイプライン化されており、ディープラーニング機能に加えて、ストリーミングアプリケーションでの画像およびセンサー処理と融合アルゴリズムを可能にします。


Jetson Nano DeepStream SDK セットアップ

基本は公式手順で進めます。
https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html

セットアップ

DeepStream SDKを環境インストールする前にJetsonデバイスを準備します。

Jetson Nano
– JetPack 4.2.1
– DeepStream 4.0

JetPack 4.2.1(L4T 32.2リリースに対応) から DeepStream 4.0からがサポートされたようです。
前回 JetPack 4.2 でJetson Nano を構築したので再構築します。

https://developer.nvidia.com/embedded/jetpack から JetPack 4.2.1 のイメージをダウンロードしEtcherでSDカードに焼いてクリーンインストールします。
時間はかかりますが一度やっているので特に問題なくスムーズにいきます。

事前に諸々のパッケージインストール

次のコマンドを入力して、DeepStream SDKをインストールするための関連パッケージをインストールします。

$ sudo apt install \
    libssl1.0.0 \
    libgstreamer1.0-0 \
    gstreamer1.0-tools \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libgstrtspserver-1.0-0 \
    libjansson4 = 2.11-1

事前にlibrdkafkaをインストール

librdkafkaをインストール

$ sudo apt-get install librdkafka1 = 0.11.3-1build1

DeepStream SDKをインストール

DeepStream SDKをインストール

3種類の手順があります。

• 方法1:SDKマネージャーを使用する
• 方法2:DeepStream tarパッケージを使用する
• 方法3:DeepStream Debianパッケージを使用する

今回は「方法3:DeepStream Debianパッケージを使用する」でいきます。

https://developer.nvidia.com/deepstream-download から
「 I Agree To the Terms of the NVIDIA DeepStream SDK 4.0 Software License Agreement」 にチェックを入れて、
「DeepStream 4.0 for Jetson」の .debファイルをJetsonデバイスにダウンロードします。

ダウンロードしてきたら以下コマンドの入力でインストールされます。

$ sudo apt-get install ./deepstream-4.0_4.0-1_arm64.deb

インストールされましたので、確認を兼ねてヘルプを表示させてみます。

$ deepstream-app --help

Jetson Nano クロックをブースト

DeepStream SDKをインストールしたら、Jetsonデバイスで次のコマンドを実行してクロックをブーストしておきます。

$ sudo nvpmodel -m 0 
$ sudo jetson_clocks

サンプルconfigアプリケーションの実行

debインストールの場合、saampleの構成ファイルは /opt/nvidia/deepstream/deepstream-4.0/samples ディレクトリにありますので移動します。

$ cd /opt/nvidia/deepstream/deepstream-4.0/samples/

次のコマンドを入力して、sample参照アプリケーションを実行します。

ここでの [path_to_config_file] は、./configs/deepstream-app/ 以下にあるconfigファイルへパスになります。

$ deepstream-app -c [path_to_config_file] 

ここでconfigファイル(.txt)がいくつか用意されていますので一覧を見てみます。

$ ls  ./configs/deepstream-app/

config_infer_primary_nano.txt
config_infer_primary.txt
config_infer_secondary_carcolor.txt
config_infer_secondary_carmake.txt
config_infer_secondary_vehicletypes.txt
iou_config.txt
source12_1080p_dec_infer-resnet_tracker_tiled_display_fp16_tx2.txt
source1_csi_dec_infer_resnet_int8.txt
source1_usb_dec_infer_resnet_int8.txt
source2_csi_usb_dec_infer_resnet_int8.txt
source30_1080p_dec_infer-resnet_tiled_display_int8.txt
source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt


Jetson TX2,Jetson AGX Xavierむけのconfigもあり、このままJetson Nano で使える記述でないものがほとんどです。
Nanoでの各エラーメッセージは今回は追わずにさしあたりすぐ動かせる「source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt」をもとに進めます。

次のコマンドを入力すると 2*4のタイル形式でサンプルmp4に対して約30FPSの物体検知の動画が表示されます。

$ deepstream-app -c ./configs/deepstream-app/source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt

カメラ映像をリアルタイム検出してRTSP配信&iPhoneで見る

マニュアルや他のconfigを参考に編集していきます。
https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html#page/DeepStream_Development_Guide%2Fdeepstream_app_config.3.2.html

・入力
[source0]
USBカメラ(FPS30)のLIVE映像

・検出モデル
[primary-gie]
resnet10.caffemodel_b12_fp16.engine 
(提供されているものを利用します)

・出力
[sink1]
RTSPStreaming h264 bitrate=2000000 rtsp-port=8554

・クライアント
iPhone VLC App

配信されるRTSPstreamを同ネットワーク内にいるiPhoneのVLCアプリでを捕まえてみます。
今回デバイスのIPは 192.168.100.31 なので、以下アドレスをVLCのネットワークストリームから確認します。

rtsp://192.168.100.31:8554/ds-test

今回のcongfig.txt

# Copyright (c) 2019 NVIDIA Corporation.  All rights reserved.
#
# NVIDIA Corporation and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto.  Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA Corporation is strictly prohibited.

[application]
enable-perf-measurement=1
perf-measurement-interval-sec=5
gie-kitti-output-dir=streamscl


[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI
type=1
camera-width=1080
camera-height=720
camera-fps-n=30
camera-fps-d=1
camera-v4l2-dev-node=0
#num-source=1

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming
type=4
#1=h264 2=h265
codec=1
sync=0
source-id=0
bitrate=2000000
# set below properties in case of RTSPStreaming
rtsp-port=8554
udp-port=5400
#1=mp4 2=mkv
container=1

[osd]
enable=1
gpu-id=0
border-width=5
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Serif
show-clock=0
clock-x-offset=800
clock-y-offset=820
clock-text-size=12
clock-color=1;0;0;0
nvbuf-memory-type=0

[streammux]
gpu-id=0
##Boolean property to inform muxer that sources are live
live-source=1
batch-size=4
##time out in usec, to wait after the first buffer is available
##to push the batch even if the complete batch is not formed
batched-push-timeout=40000
## Set muxer output width and height
width=1920
height=1080
##Enable to maintain aspect ratio wrt source, and allow black borders, works
##along with width, height properties
enable-padding=0
nvbuf-memory-type=0

# config-file property is mandatory for any gie section.
# Other properties are optional and if set will override the properties set in
# the infer config file.
[primary-gie]
enable=1
gpu-id=0
model-engine-file=../../models/Primary_Detector_Nano/resnet10.caffemodel_b12_fp16.engine
batch-size=12
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
interval=8
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary_nano.txt

[tracker]
enable=1
tracker-width=480
tracker-height=272
#ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_mot_iou.so
ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_mot_klt.so
#ll-config-file required for IOU only
#ll-config-file=iou_config.txt
gpu-id=0

[tests]
file-loop=0

まとめ

Jetson NanoにDeepStream SDK 4.0をインストールし、USBカメラ映像からリアルタイムで物体検出してRTSP配信を行いました。
DeepStream SDK によってエッジコンピューティングによる検出と配信迄がお手軽にできました。
今後はYOLOサンプルや複数入力/出力なども試していきたいです。

他、上には書いていない内容で、

・動画のフレームレートや画素数にもよりますがサンプル動画の推論は30FPSあたりをキープしていました。また映像中に同時に多数の検出対象があった場合でもそれほど大きくは落ちませんでした。

・Jetson Nano のGUI画面に結果動画を表示しながら作業の場合、動画がカクついたりマシンが固まってしまったりすることがありました。上のFPSの事から端末自体の描画に負荷が結構かかっているようです。

・多数の検出対象がある動画ではRTSP配信先の画面でカクつきが見られました。確認した中ではパケットロスは無いようなので、推論後のGsteramでのフレームの取り回しが追い付いていないのかもしれません。要チューニング。

困ったら公式フォーラムを確認するのが近道ですね。NVIDIA公式アカウントや他の開発者からも結構活発にコメントが付いているので解決しやすい印象です。

以上です。

最新ブログ一覧