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公式アカウントや他の開発者からも結構活発にコメントが付いているので解決しやすい印象です。
以上です。
Tweet