Nvidia Jetson NanoでDeepStreamを使う

Jetson NanoでDeepStreamを使う

L4T,JetPackなどのパッケージバージョンの確認

以下のコマンドで、JetPackやCUDAなどの主要ミドルウェアのバージョンが確認できる。

> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Mon_Mar_11_22:13:24_CDT_2019
Cuda compilation tools, release 10.0, V10.0.326
> git clone https://github.com/jetsonhacks/jetsonUtilities
> cd jetsonUtilities
> python jetsonInfo.py

 NVIDIA Jetson TX1
 L4T 32.2.0 [ JetPack 4.2.1 ]
 Ubuntu 18.04.3 LTS
 Kernel Version: 4.9.140-tegra
 CUDA 10.0.326

各種リンク

JetPack

https://developer.nvidia.com/embedded/jetpack

DeepStream Quick Start

https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html

DeepStreamのインストール

注意点としては、JetPackのバージョンとDeepStreamのバージョン
が対応づいているので、不一致のバージョンをインストールすると動作しない。

JetPack DeepStream SDK
4.2.1 4.0
4.2.2 4.0.1
4.3 4.0.2

前提ライブラリのインストール

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

sudo apt install librdkafka1=0.11.3-1build1
  • DeepStreamのインストール

DeepStream 4.0 for Jetsonのソース(tar版)をダウンロードする
(deb版はインストールに失敗したので)

https://developer.nvidia.com/deepstream-download

Windows10でダウンロードした場合、SCPでリモートのJetsonにコピー

scp -r deepstream_sdk_v4.0_jetson.tbz2 jetson:~/

Jetsonで解凍してビルド&インストール

> tar -xpvf deepstream_sdk_v4.0_jetson.tbz2
> cd deepstream_sdk_v4.0.2_jetson/
> sudo tar -xvpf binaries.tbz2 -C /
> sudo ./install.sh
> sudo ldconfig

インストールファイルの確認

> ls /opt/nvidia/deepstream/deepstream-4.0/bin/
deepstream-app*                    deepstream-nvof-app*          deepstream-test3-app*
deepstream-dewarper-app*           deepstream-perf-demo*         deepstream-test4-app*
deepstream-gst-metadata-app*       deepstream-segmentation-app*  deepstream-test5-app*
deepstream-image-decode-app*       deepstream-test1-app*         deepstream-user-metadata-app*
deepstream-infer-tensor-meta-app*  deepstream-test2-app*

> which deepstream-app
/usr/bin/deepstream-app

バージョン確認出来たらOK

> deepstream-app --version
deepstream-app version 4.0
DeepStreamSDK 4.0

Q1. バージョン確認したところ、以下のエラーがでる場合

DeepStreamとJetPackのバージョンが一致してないのが原因

> deepstream-app --version
deepstream-app: error while loading shared libraries: libnvinfer.so.6: cannot open shared object file: No such file or directory

簡単な動作確認

DeepStreamのパッケージ構成

https://docs.nvidia.com/metropolis/deepstream/dev-guide/index.html#page/DeepStream%20Development%20Guide%2Fdeepstream_quick_start.html%23wwpID0E0BB0HA

起動引数

> deepstream-app -c {config file}

configファイルは、samples/configs/deepstream-appフォルダの下にあるが、Jetsonの機種ごとに最適化されているようなので、該当機種のファイルを選択する。

> cd deepstream_sdk_v4.0_jetson/samples/configs/deepstream-app
> ls
config_infer_primary.txt
config_infer_primary_nano.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
source6_csi_dec_infer_resnet_int8.txt
source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_tx1.txt
tracker_config.yml

Jetson Nano用のサンプルで確認

> deepstream-app -c source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt

DeepstreamでYoloモデルを使う

sources/objectDetector_Yoloにプラグインソースがあるので、これをビルドして実行してみる。

prebuild.shを実行すると、Yoloの学習済みモデルがダウンロードされるので、結構時間かかる。

> cd deepstream_sdk_v4.0_jetson/sources/objectDetector_Yolo
> ./prebuild.sh

CUDAバージョンはnvcc -Vで確認してXX.Xまでを環境変数に指定してビルドする

> export CUDA_VER=10.0
> make -C nvdsinfer_custom_impl_Yolo

ビルドが成功すると、libnvdsinfer_custom_impl_Yolo.soというライブラリが生成される。これが、YoloモデルとDeepStreamの間に入って処理をする。

試しに、ここのフォルダにあるサンプルのconfigファイルを使って、サンプルの推論を実行してみる。

  • Yolo v3 tinyのモデル結果
> deepstream-app -c deepstream_app_config_yoloV3_tiny.txt

おおよそFPS=25ぐらいで推論しているが、検出率はちょっと低い。Yolo v3だと検出率は高いが、FPS=2程度でNanoだと実用的じゃない。

独自に学習させたYoloモデルを使う

Yoloプラグインのソースの修正してクラス数を反映する

Yoloモデルをカスタイズして、認識するクラス数が変更になった場合は、どうもこのプラグインのソースを変更して再ビルドしないといけない。

Yoloプラグインのソースの一つであるnvdsparsebbox_Yolo.cppをみると、クラス数が定義されているので、カスタマイズしたYoloモデルのクラス数に変更する。

例としてクラス数=3の場合、

static const int NUM_CLASSES_YOLO = 3;

あと、Yoloモデルのcfgの内容にもよるが、maskの値を一致させる必要がある。

以下の例だと、{0,1,2}を有効にしている。

extern "C" bool NvDsInferParseCustomYoloV3Tiny(
    std::vector<NvDsInferLayerInfo> const& outputLayersInfo,
    NvDsInferNetworkInfo const& networkInfo,
    NvDsInferParseDetectionParams const& detectionParams,
    std::vector<NvDsInferParseObjectInfo>& objectList)
{
    static const std::vector<float> kANCHORS = {
        10, 14, 23, 27, 37, 58, 81, 82, 135, 169, 344, 319};
    static const std::vector<std::vector<int>> kMASKS = {
        {3, 4, 5},
        {0, 1, 2}}; // as per output result, select {1,2,3}
        //{1, 2, 3}};

    return NvDsInferParseYoloV3 (
        outputLayersInfo, networkInfo, detectionParams, objectList,
        kANCHORS, kMASKS);
}

もう一度プラグインをビルドして、libnvdsinfer_custom_impl_Yolo.soを更新する。

> export CUDA_VER=10.0
> make -C nvdsinfer_custom_impl_Yolo

もう一か所修正があって、config内のnum-detected-classesも新しいクラス数に変更する。

network-mode=0
#num-detected-classes=80
num-detected-classes=3

これでカスタマイズしたYoloモデルでも推論できるはず。

DeepStreamでUSBカメラを使う

今度はUSBのWebカメラの映像ソースを入力とする方法をメモ。

サンプルにあるsource1_usb_dec_infer_resnet_int8.txtが参考になる。

[source0]

#Type - 1=CameraV4L2 2=URI 3=MultiURI
type=1
camera-width=640
camera-height=480
camera-fps-n=30
camera-fps-d=1
camera-v4l2-dev-node=0

#uri=file://handsign01.mp4
#num-sources=1
#gpu-id=0

# (0): memtype_device   - Memory type Device
# (1): memtype_pinned   - Memory type Host Pinned
# (2): memtype_unified  - Memory type Unified
#cudadec-memtype=0

source0の項目を動画ファイルからCameraに変更する内容になる。

大体FPS=15程度で動作していた。