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のパッケージ構成
起動引数
> 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程度で動作していた。