6/27/2019

TensorRT 5.0 (Jetson AGX Xavier)

1. NVIDIA DEEP LEARNING SOFTWARE

가장 중요한 사이트 같으며, 며칠사이에 못보던 것들이 늘어, 이를 일일히 정리하는 것은 의미가 없을 것 같어 링크만 연결한다. (못보고 지나친건지?)
추후 이 기술들이 어떻게 통합될지도 현재 잘 모르겠으며, 변화 중이라 이 사항들은 개발관련 것만 알아두도록 하자.
  1. Mixed precision in AI frameworks (Automatic Mixed Precision)
  2. Deep Learning Primitives (cuDNN)
  3. Input Data Processing (DALI)
  4. Multi-GPU Communication (NCCL)
  5. Deep Learning Inference Engine (TensorRT)
  6. Deep Learning for Video Analytics (DeepStream SDK)
  7. Optical Flow for Video Inference (Optical Flow SDK)
  8. High level SDK for tuning domain specific DNNs (Transfer Learning Toolkit)
  9. AI enabled Annotation for Medical Imaging (AI-Assisted Annotation SDK)
  10. Deep Learning GPU Training System (DIGITS) 
  11. Linear Algebra (cuBLAS)
  12. Sparse Matrix Operations (cuSPARSE)

  https://developer.nvidia.com/deep-learning-software

1.1 TensorRT의  inference 최적화



( X축은 처리량(throughput), Y축은 응답시간(Latency) ,상위 숫자는 Batch Size)

GPU 와 CPU를 비교를 해보면, Batch Size가 두배씩 커질때마다 Latency만 비교해 보면 GPU는 크게 차이는 나지는 않지만, CPU는 많이 차이가 난다.
(GPU의 중요성)

최근에 찾은자료로 TensorRT Engine 관련내용으로 비록 오랜된 자료지만, 충분히 볼만한 것 같다.

출처:
  https://www.slideshare.net/deview/232-dl-inference-optimization-using-tensor-rt-1-119162975


2. Jetson AGX Xavier 의 TensorRT 

Jetson TX2의 TensorRT와 거의 유사하지만, 다른점은 DLA은 HW적 지원GPU의 성능이 다르므로, 관련 지원사항을 반드시 확인해야한다.
그리고 더불어 AGX Xavier에서는 TensorRT 이외 Vision Accelerator 가 존재하므로, 이 것이 Visionwork 혹은 OpenCV 기능 지원가능한지 파악을 해야겠다.
OpenVX기능을 Vision Accelerator라고 하는 것 같음

현재  문서로봐서는 VisionWork에서만 지원이 되는 것 같은데, 세부소스를 보고 분석한 다음 좀 파악을 해야할 것 같다.
HW적으로 TensorCore도 지원을 해준다고 한다.

그리고 더불어 TensorRT의 Manual update되고 있으므로, 관련기술들을 이해하기가 쉬워지는 것 같다.


ONNX Model로 TensorRT를 사용한다면, 아래와 같이 동작
  1. ONNX Model import 하고 Build TensorRT Engine 생성하여, Serialized Engine 생성
  2. Inference 로 사용될 경우, Deserialize Engine을 진행하고 이를 Inference 수행 


세부내용은 아래문서를 참조

출처:
  https://devblogs.nvidia.com/speed-up-inference-tensorrt/


2.1  TensorRT Release 정보 및 Version 
관련 특징과 필요 Package들을 파악하며, DLA 검색해서 관련 기능 파악

  • TensorRT Version 및 Package 확인
Xavier의 기본 TensorRT Package 확인 ( JetPack 4.1.1,  추후 4.2와 비교)

$  dpkg -l | grep TensorRT     // TensorRT의 Version Check 
ii  libnvinfer-dev                             5.0.3-1+cuda10.0                             arm64        TensorRT development libraries and headers
ii  libnvinfer-samples                         5.0.3-1+cuda10.0                             all          TensorRT samples and documentation
ii  libnvinfer5                                5.0.3-1+cuda10.0                             arm64        TensorRT runtime libraries
ii  tensorrt                                   5.0.3.2-1+cuda10.0                           arm64        Meta package of TensorRT

TensorRT 5.0.3 Release
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-release-notes/tensorrt-5.html#rel_5-0-3

TensorRT 5.x.x Release
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-release-notes/tensorrt-5.html#tensorrt-5


2.2 TensorRT Install Guide 

TensorRT를 사용하기 위해서 설치해야할 부분 (X86전용 Manual이므로 참조만 )
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

Jetson TX2에서 설치한 Package 설명 (상위 Manual 기반)
  https://ahyuo79.blogspot.com/2019/05/jetpack-42.html

2.3 TensorRT의 주요기능  

TensorRT Engine의 구성은 C++로 구현이되었으며, 현재 Python API도 지원이 가능하다고 한다. 하지만 기본이 C++ 이므로 이점을 잊지말아야한다.

TensorRT의 Layers
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#layers

  • TensorRT의 Key Interface
  1. Network Definition: Network Layer를 직접 추가하고 이를 설정가능한 interface
  2. Builder: Builder는 Network Definition에서 최적화된 Engine 부터 다른 최적화기능 Interface 제공 
  3. Engine : Inference를 실행할수 있는 Engine 생성하는 Interface 
  4. Caffe Parser : Caffe Model의 Parser 기능 
  5. UFF Parser :  UFF Model의 Parser 기능 
  6. ONNX Parser : ONNX Model Parser 기능  


TensorRT의 Key Interface 설명
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#api


  • Network Definition/Builder/Engine C++ API  
Network Definition (INetworkDefinition, C++ API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_network_definition.html

Builder (IBuilder, C++ API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_builder.html

Engine( ICudaEngine, C++ API )
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_cuda_engine.html


2.4 TensorRT의 C++/Python API 

우선 아래의 사이트에서 C++로 TensorRT를 작성하는 예제를 이해를 해보자.
우선 TensorRT Inference Engine을 실행하기 위해서는 IExecutionContext Object필요하며,
IExecutionContext를 만들기 위해서는 상위 ICudaEngine(Engine) 을 생성해야한다고 한다.

IExecutionContext (C++API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_execution_context.html


  • Engine 만드는 법은 두가지 방법 중 하나로 생성가능 
  1. User Model에서 직접 Network Definition을 생성, 이 경우 Engine은 옵션으로 Serialize하여 나중에 사용을 위해서 저장  
  2. disk에서 Serizilized Engine을 읽어서 실행하는 경우로 이게 성능이 좋다고하며, Model을 Pasreing하는 단계 이후에 가능  


  • 1번째방법
아래의 예제를 보면, C++ iLogger를 생성만들고 이를 iBuilder에 넣어 생성후 직접 NetworkDefinition 생성

  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#create_network_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#create_network_python


  • 2번째방법
상위 3가지 Parser중 Model을 구문분석하여, NetworkDefinition 생성
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#import_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#import_model_python


  • Creating the TensorRT Engine
iBuilder는 iCudaEngine을 생성
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#build_engine_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#build_engine_python


  • Creating the TensorRT Engine
Engine은 옵션으로 Serialize 하고 이를 File로 저장
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_python

  • Creating an execution context
Execution context는 Inference를 실행에 사용되어진다고 한다. (실제 inference 실행)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#perform_inference_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#perform_inference_python


  • Creating TensorRT runtime
만약 Serialized Engine File로 존재하면, 상위의 단계를 넘어갈수가 있다.
createInferRuntime(gLogger)는 아래의 iRuntime를 생성할 수 있다고 한다.


이는 DeserializeCudaEngine을 실행하면서 실제 실행을 진행한다고 하는데, 상위를 보면 Serialized를 했을 경우인것 만 같다.
(Engine은 Serialize로 File 저장)

  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_c
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#serial_model_python


iRuntime
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/c_api/classnvinfer1_1_1_i_runtime.html


TensorRT C++ API
세부내용아래참조
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#c_topics

TensorRT API (C++ API/ Python API)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-api/index.html


3. TensorRT 의 Sample

기존 Jetson TX2와 거의 동일하며, 차이라면, 상위에서 설명한 DLA가 trtexec 에서 HW적으로 지원을 해준다는 것이다.

아래의 소스를 다 검토해보는 시간이 없기에, 이전에 Jetson TX2에서 실행해본 것을 참조하고 넘어가자.


$ cd /usr/src/tensorrt/samples   // Jetson TX2 의 Sample 과 거의유사함 
$ ls
common     Makefile         sampleCharRNN     sampleGoogleNet  sampleINT8API  sampleMNIST     sampleMovieLens  sampleOnnxMNIST  sampleSSD       sampleUffSSD
getDigits  Makefile.config  sampleFasterRCNN  sampleINT8       sampleMLP      sampleMNISTAPI  sampleNMT        samplePlugin     sampleUffMNIST  trtexec

$ sudo make -j4    // Build Sample , Jetson TX2와 동일 

$ cd  /usr/src/tensorrt/bin   // 실행해보면, model을 못찾는데,  이것이 tensorrt 내에도 없다. Jetpack.4.1.1 말고 추후 4.2에서 테스트 

$ ls 
chobj                     sample_fasterRCNN        sample_int8_api_debug  sample_mnist_api_debug  sample_onnx_mnist        sample_uff_mnist
dchobj                    sample_fasterRCNN_debug  sample_int8_debug      sample_mnist_debug      sample_onnx_mnist_debug  sample_uff_mnist_debug
download-digits-model.py  sample_googlenet         sample_mlp             sample_movielens        sample_plugin            sample_uff_ssd
giexec                    sample_googlenet_debug   sample_mlp_debug       sample_movielens_debug  sample_plugin_debug      sample_uff_ssd_debug
sample_char_rnn           sample_int8              sample_mnist           sample_nmt              sample_ssd               trtexec
sample_char_rnn_debug     sample_int8_api          sample_mnist_api       sample_nmt_debug        sample_ssd_debug         trtexec_debug


Xavier TensorRT Sample
  https://developer.ridgerun.com/wiki/index.php?title=Xavier/Deep_Learning/TensorRT/Building_Examples

TensorRT Sample Guide
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-sample-support-guide/index.html

3.1 DIGITS(the Deep Learning GPU Training System)

DIGITS가 아래의 Deep Learning GPU Training System이며, 숫자(DIGITS)하고 혼동하지말자
이 부분은 Training 관련부분이기때문에 이곳에서 생략하고, 추후에 사용할 경우 자세히 읽고 사용방법을 알아보자.

  https://docs.nvidia.com/deeplearning/digits/digits-installation/index.html

DIGITS Source ( DIGITS Server 운영)
  https://github.com/NVIDIA/DIGITS/releases

NVIDIA GPU Cloud와 사용가능한 것 같으며, 이전에 파악했던것으로 NVIDIA GPU Gloud는 ARM은 미지원으로 Training 위주로 사용되어진것으로 알고 있다.
(추후 GPU Cloud 접속후 지속적으로확인)
그리고 더불어 NVIDIA Docker 역시 ARM은 미지원인것으로 알고 있는데, 추후 확인하자.

  https://developer.nvidia.com/digits
  https://github.com/NVIDIA/DIGITS/blob/master/docs/ModelStore.md
  https://github.com/NVIDIA/DIGITS/tree/master/docs

DIGIST SERVER 관련 Manual
  https://docs.nvidia.com/deeplearning/digits/digits-installation/index.html#startingserver

  • Xavier의 DIGITS Model Download 기능 
이 기능을 보면, Training System을 구축한 곳에  DIGITS Server를 구축하여 이를 쉽게 Model을 가져오는 기능같다.
현재 Training System 부분의 Server가 없으므로 무용지물

$ cd /usr/src/tensorrt/bin     // DIGIT 의 기능 
$ ls 
download-digits-model.py  giexec  trtexec   

// Jetson TX2와 동일 상위 참조 , 상위 python 실행을 위해 기본설치 
$ sudo apt-get install -y python-pip python-dev  // python2    상위소스가 python 2이므로 이것만설치 
$ sudo apt-get install -y python3-pip python3-dev // python3  , 다른 소스는 python3 이므로 설치  
$ pip install wget

$ pip install requests

$ python download-digits-model.py             
usage: download-digits-model.py [-h] [-n HOSTNAME] [-p PORT] output_file
download-digits-model.py: error: too few arguments

$ python download-digits-model.py -h           // 상위 DIGITS Source는 보면, Server 돌리는 것이며, 이 python은 Local에서 DIGITS Server 주소와 연결하는 기능같다.  
usage: download-digits-model.py [-h] [-n HOSTNAME] [-p PORT] output_file

Download a DIGITS model tarball

positional arguments:
  output_file           output file (should end with .zip, .tar, .tar.gz or
                        .tar.bz2)

optional arguments:
  -h, --help            show this help message and exit
  -n HOSTNAME, --hostname HOSTNAME
                        hostname for the DIGITS server [default=127.0.0.1]
  -p PORT, --port PORT  port for the DIGITS server [default=80]


3.2 TensorRT의 DLA(Deep Learning Accelerator) 

이전의 Jetson TX2의 SW적으로 지원하던 gieexec와 trtexec기능이 Xavier에서는 HW적으로 DLA로 지원가능하며,
상위 Sample에서도 README 글을 읽어보면 지원이 가능하다.


$  cd /usr/src/tensorrt/bin     // DLA 의 기능 
$ ls 
download-digits-model.py  giexec  trtexec   

$ ./trtexec  // 옵션 과 사용법도 거의 유사

Mandatory params:
  --deploy=      Caffe deploy file
  OR --uff=      UFF file
  OR --onnx=     ONNX Model file

Mandatory params for UFF:
  --uffInput=,C,H,W Input blob name and its dimensions for UFF parser (can be specified multiple times)
  --output=      Output blob name (can be specified multiple times)

Mandatory params for Caffe:
  --output=      Output blob name (can be specified multiple times)

Optional params:
  --input=          Input blob name (can be specified multiple times)
  --model=          Caffe model file (default = no model, random weights used)
  --batch=N               Set batch size (default = 1)
  --device=N              Set cuda device to N (default = 0)
  --iterations=N          Run N iterations (default = 10)
  --avgRuns=N             Set avgRuns to N - perf is measured as an average of avgRuns (default=10)
  --percentile=P          For each iteration, report the percentile time at P percentage (0<=P<=100, with 0 representing min, and 100 representing max; default = 99.0%)
  --workspace=N           Set workspace size in megabytes (default = 16)
  --fp16                  Run in fp16 mode (default = false). Permits 16-bit kernels
  --int8                  Run in int8 mode (default = false). Currently no support for ONNX model.
  --verbose               Use verbose logging (default = false)
  --engine=         Engine file to serialize to or deserialize from
  --calib=          Read INT8 calibration cache file.  Currently no support for ONNX model.
  --useDLACore=N          Specify a DLA engine for layers that support DLA. Value can range from 0 to n-1, where n is the number of DLA engines on the platform.
  --allowGPUFallback      If --useDLACore flag is present and if a layer can't run on DLA, then run on GPU. 
  --useSpinWait           Actively wait for work completion. This option may decrease multi-process synchronization time at the cost of additional CPU usage. (default = false)



TensorRT의 DLA 사용법
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_topic

TensorRT의 DLA 실제 사용예제
  https://devtalk.nvidia.com/default/topic/1041768/jetson-agx-xavier/tensorrt-5-docs-and-examples-solved-/

TensorRT의 DLA 가 지원하는 Layers
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#dla_layers

Xavier 관련 한글사이트 발견
  https://goodtogreate.tistory.com/entry/TensorRT%EC%9D%B4%EC%9A%A9%ED%95%9C-Xavier-DLA-NVDLA-%EC%8B%A4%ED%96%89

성능설정 부분 Jetson TX2와 거의 동일
  https://goodtogreate.tistory.com/entry/Jetson-AGX-Xavier-%EB%8F%99%EC%9E%91-%EB%AA%A8%EB%93%9C-%EB%B3%80%EA%B2%BD-%EB%B0%8F-TensorFlowGPU-%EC%84%A4%EC%B9%98%EC%99%80-%EC%8B%A4%ED%96%89-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%84%B1%EB%8A%A5-%EB%B6%84%EC%84%9D

  • TensorRT의 최적화 와 Profile 방법 (NSIGHT 이용 및 TensorRT의 batch등등)
  https://docs.nvidia.com/deeplearning/sdk/tensorrt-best-practices/index.html

4. Visionworks  sample

Visionworks는  Khronos OpenVX 지원을 하고 있다고 한다. Sample 예제들은 Jetson TX2의 예제들과 거의 비슷하다.
현재 HW적으로, Xavier는 Vision 관련부분이 지원하므로,  성능문제라면, Visionworks를 사용해야할지 모르겠다.

OpenVX
  https://www.khronos.org/openvx/

$  /usr/share/visionworks/sources/install-samples.sh ~/
$ cd ~/VisionWorks-1.6-Samples/
$ make -j4 # add dbg=1 to make debug build 

$ cd  ~/VisionWorks-1.6-Samples/bin/aarch64/linux/release
$ ls 
nvx_demo_feature_tracker        nvx_demo_motion_estimation  nvx_sample_nvgstcamera_capture   nvx_sample_opengl_interop
nvx_demo_feature_tracker_nvxcu  nvx_demo_stereo_matching    nvx_sample_object_tracker_nvxcu  nvx_sample_player
nvx_demo_hough_transform        nvx_demo_video_stabilizer   nvx_sample_opencv_npp_interop

$ ./nvx_demo_feature_tracker  // Jetson TX2 와 거의 비슷하다. 

$ cd  ~/VisionWorks-SFM-0.90-Samples/bin/aarch64/linux/release
nvx_sample_sfm


  https://developer.ridgerun.com/wiki/index.php?title=Xavier/JetPack_4.1/Components/VisionWorks

6/26/2019

JetPack 4.1.1 설치

1. NVIDIA AGX Xavier 의 JetPack

AGX Xavier의 DeepStream 3.0을 위해 별도로 이 Version을 설치

  https://developer.nvidia.com/embedded/jetpack-4-1-1
  https://developer.nvidia.com/embedded/downloads#?search=JetPack%204.1.1

아래 파일을 Download 하여 아래와 같이 실행

./JetPack-L4T-4.1.1-linux-x64_b57.run 





Full로 선택하자, Custom으로 선택을 해도, Host App들은 설치가 된다.




ifconfig 로 확인해서 interface에서 인터넷되는 ethernet 선택



Force USB Recovery Mode 변경모드 변경 후 엔터 치면, Flash Writing 시작
Jetson OS 부터 Jetson SDK component까지 설치를 진행


Jetson OS를 Flash가 된 후 자동으로 Mass Storge가 잡히고, README가 나온다.
그 후 SDK가 설치가 진행을 한다.

처음에는 아래와 같이 CUDA 부분이 미 설치되는 에러발생 (인터넷이 안되어서 그런것 같다)
그래서 아래와 같이 손 수 apt install 로 각 package 설치하라고 하는데,  왠지 찜찜해서 전부 다시 설치를 진행을 한다.


제대로 설치되면, 아래와 같이 Install이 끝났다는 표시와 함께 X Term을 닫으라는 메세지가 나옴


그리고 전부 창을 닫고 종료하고 Reboot 하자


$ cd ~/Jetpack/jetpack4.1.1/Xavier/Linux_for_Tegra

$ lsusb // 반드시 Jetson 연결 확인 후, Recovery Mode 변경
..
Bus 001 Device 055: ID 0955:7019 NVidia Corp.

$ sudo ./flash.sh -r -k APP -G cloneX.img  jetson-xavier mmcblk0p1    // Jetson AGX Xavier의 APP Partition Image를 Backup  (cloneX.img) ( Filesystem

$ ls   // 파일 두 개 확인
cloneX.img  cloneX.img.raw  

JetPack 4.2 와 동일하게 문제발생 ( NVIDIA에서는 추후 버전에서 수정한다고함)
  https://devtalk.nvidia.com/default/topic/1039548/jetson-agx-xavier/xavier-cloning/


상위 README를 보면 VNC Mode가 새로워서 이 부분을 아래와 같이 정리

----------------------------------------------------------------------
Installing the VNC Server
----------------------------------------------------------------------

It is expected that the VNC server software is pre-installed. Execute the
following commands to ensure that it is:

sudo apt update
sudo apt install vino
----------------------------------------------------------------------
Enabling the VNC Server
----------------------------------------------------------------------

Execute the following commands to enable the VNC server:

# Inform the system which graphic display to interact with
export DISPLAY=:0
# Enable the VNC server
gsettings set org.gnome.Vino enabled true
gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false
# Reboot the system so that the settings take effect
sudo reboot

----------------------------------------------------------------------
Connecting to the VNC server
----------------------------------------------------------------------

Use any standard VNC client application to connect to the VNC server that is
running on Linux for Tegra. Popular examples for Linux are gvncviewer and
remmina. Use your own favorite client for Windows or MacOS.

To connect, you will need to know the IP address of the Linux for Tegra system.
Execute the following command to determine the IP address:

ifconfig

Search the output for the text "inet addr:" followed by a sequence of four
numbers, for the relevant network interface (e.g. eth0 for wired Ethernet,
wlan0 for WiFi, or l4tbr0 for the USB device mode Ethernet connection).

Once you are connected to the VNC server, execute the following command to
display the VNC server's graphical configuration tool, and then configure a
password for the VNC connection:

vino-preferences

6/25/2019

DeepStream SDK 3.0 기본자료 및 설치/실행 (Jetpack 4.2 와 4.1.1 )

1. DeepStream SDK 3.0 설치 및 기본자료수집  

  • Jetson TX2의 DeepStream 관련기능 및 세부내용 
Jetson TX2에서도 TensorRT의 확장성을 위해서 Multimedia 자료를 테스트 진행했고,  NVIDIA의 Manual을 읽는 도중에 DeepStream기능을
알게되었으며, 현재 Jetson TX2 의 DeepStream 관련자료를 정리한다.
아래의 자료를 보면 쉽게 이해를 할수 있다.

TensorRT 와 Deepstream 관련부분
  https://ahyuo79.blogspot.com/2019/06/tensorrt-50-deepstream.html

TensorRT 와 Multimedia Sample 의 기본이해
  https://ahyuo79.blogspot.com/2019/06/tensorrt-50-multimedia-sample.html

Deepstream SDK 1.5의 에러사항
  https://ahyuo79.blogspot.com/2019/06/deepstream-sdk-15-jetson-tx2-test.html


  • Jeston AGX Xavier 의 DeepStream SDK 3.0 
현재 Jetson AGX Xavier에서는 DeepStream 3.0 beta version 지원하며, Telsa 경우와는 다르지만 비교적 괜찮게 동작된다고 한다. ( 라이센스를 보면 정식버전이 아님)
물론 x86기반의 Tesla version 안정화되어있으며, NVIDIA에서 Docker까지 제공해주는 것으로 보인다.

DeepStream의 Version은 각각의 HW에 따라 지원사항이 다르며, 구성도 다르므로, 관련 HW에 따라서 반드시 확인을 하자.
(Tesla (x86) , Jetson-x 보드에 따라 다름)

Jetson AGX Xavier에 이미 설치된 JetPack 4.2에서 테스트를 진행 후 JetPack 4.1.1를 재설치 후 다시 진행예정

Jetpack 4.1.1
   https://developer.nvidia.com/embedded/jetpack-4-1-1

1.1  NVIDIA DeepStream SDK 관련자료수집 

DeepStream SDK
  https://developer.nvidia.com/deepstream-sdk

DeepStream  SDK for Jetson 과 Manual Download
  https://developer.nvidia.com/embedded/deepstream-on-jetson-downloads

DeepStream  (중국/일본) GTC 자료로추정
 http://on-demand.gputechconf.com/gtc-cn/2018/pdf/CH8307.pdf
 https://www.slideshare.net/NVIDIAJapan/1-jetson

DeepStream 2.0 Webinar 자료
 https://docplayer.net/98984804-Deepstream-sdk-2-0-webinar-james-jeun-july-2018.html

NVIDIA Deepstream Youtube 자료 ( GTC자료와 중복)
  https://www.youtube.com/watch?v=Hdew1P1nXBc
  https://www.youtube.com/watch?v=H2blB7MGnx4

NVIDIA AGX Xavier Deepstream 3.0 동작 (현재 동일하게 확인가능)
  https://www.youtube.com/watch?v=gbjUW_4l-hw

NVIDIA Webinar 자료 (무료)
  https://www.nvidia.com/en-us/about-nvidia/webinar-portal/

NVIDIA GTC Keynote
  https://on-demand-gtc.gputechconf.com/gtcnew/on-demand-gtc.php

NVIDIA GTC on Demand
- Using the Deepstream SDK for AI-Based Video Analytics
  http://on-demand-gtc.gputechconf.com/gtc-quicklink/hqGEv


1.2 DeepStream SDK 3.0  설치방법 

Jetson AGX Xavier에서 Deepstream 3.0을 각 Jetpack Version 마다 설치를 진행

  • DeepStream 3.0 SDK 설치방법 (Host)
Host에서 Key 중복 및 상위에서 download한 file target copy

$ ssh-keygen -R 192.168.55.1  // Key 재발행 후 재접속, 기존에 Jetson TX2사용  

$ scp ./DeepStreamSDK-Jetson-3.0_EA_beta5.0.tbz2 nvidia@192.168.55.1:~

$ ssh -X nvidia@192.168.55.1   // Jetson USB로 연결됨  ( Target 접속)


  • DeepStream 3.0 SDK 설치방법 (Target)
아래와 같이 직접 Deepstream Binary File을 설치하여 기본적인 테스트를 진행하자.
$ cd ~  // Jetson TX2 

$ tar xpvf DeepStreamSDK-Jetson-3.0_EA_beta5.0.tbz2

$ cd deepstream_sdk_on_jetson                   //deepstream app 설치된 장소 

$ sudo tar -xvf binaries.tbz2 -C /       //deepstream binary package 설치 
usr/
usr/lib/
usr/lib/aarch64-linux-gnu/
usr/lib/aarch64-linux-gnu/tegra/
usr/lib/aarch64-linux-gnu/tegra/libnvds_msgconv.so.1.0.0  //sources/libs/nvmsgconv 참고
usr/lib/aarch64-linux-gnu/tegra/libnvll_infer.so.1.0.0
usr/lib/aarch64-linux-gnu/tegra/libnvds_logger.so                  //sources/libs/nvds_logger 참고 
usr/lib/aarch64-linux-gnu/tegra/libgstnvquery.so
usr/lib/aarch64-linux-gnu/tegra/libnvds_kafka_proto.so           //sources/libs/kafka_protocol_adaptor 참고 (config에서 [message-broker]  설정가능)
usr/lib/aarch64-linux-gnu/tegra/libnvtracker.so.1.0.0
usr/lib/aarch64-linux-gnu/libgstnvdsmeta.so
usr/lib/aarch64-linux-gnu/gstreamer-1.0/
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libnvdsgst_msgbroker.so       //sources/gst-plugins/gst-nvmsgbroker  
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvtracker.so
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvmultistream.so
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libnvdsgst_msgconv.so             //sources/gst-plugins/gst-nvmsgconv
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvinfer.so
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvdsexample.so             //sources/gst-plugins/gst-dsexample
usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvosd.so
usr/bin/
usr/bin/deepstream-test2-app  // source 의 deepstream-app 4 종류 
usr/bin/deepstream-test1-app
usr/bin/deepstream-test3-app
usr/bin/deepstream-app

$ tree -L 3               //Deepstream SDK 3.0 전체 구조 파악 
.
├── binaries.tbz2         // DeepStream Binary Package , 아래의 Source 부분의 app들  관련 Library 들 
├── LicenseAgreement.pdf
├── README                // 설치전 Deepstream 설치참고 Manual   
├── samples                // DeepStream Model/Sample/Config File 구성 
│   ├── configs
│   │   └── deepstream-app   // Config File 상위 README 에서 확인
│   ├── models    //GIE의 Primary 와 Secondary 설정옵션이 다름                                 
│   │   ├── Primary_Detector            // Caffe Model 및 label 과   1st GIE(TensorRT Engine) 생성
│   │   ├── Secondary_CarColor        // Caffe Model 및 label 과  2nd GIE(TensorRT Engine) 생성
│   │   ├── Secondary_CarMake        // Caffe Model 및 label 과  3th GIE(TensorRT Engine) 생성
│   │   └── Secondary_VehicleTypes  // Caffe Model 및 label 과  4th GIE(TensorRT Engine) 생성
│   └── streams
│       ├── sample_720p.h264
│       └── sample_720p.mp4
└── sources                 // DeepStream 관련 전체소스 
    ├── apps
    │   ├── apps-common
    │   └── sample_apps
    ├── gst-plugins          // 상위 binaries.tbz2 에서 이미설치되고, 아래의 Libs와 연결 
    │   ├── gst-dsexample       // openCV로 ROI형식으로 지정하는 예제이며, 이기반으로 PlugIn을 만들수 있다.
    │   ├── gst-nvmsgbroker    // Source code for a plugin to send data to the server using the Kafka protocol adapter 
    │   └── gst-nvmsgconv      //Source code for a plugin to convert metadata to schema format
    ├── includes
    │   ├── gstnvdsinfer.h
    │   ├── gstnvdsmeta.h
    │   ├── gst-nvquery.h
    │   ├── gstnvstreammeta.h
    │   ├── nvbuffer.h
    │   ├── nvbuf_utils.h
    │   ├── nvdsinfer_custom_impl.h
    │   ├── nvdsinfer.h
    │   ├── nvds_logger.h
    │   ├── nvdsmeta.h
    │   ├── nvds_msgapi.h
    │   └── nvosd.h
    ├── libs     // library와 별도의 test program 존재  (Kafka 추후에 사용예정)
    │   ├── kafka_protocol_adaptor  // (상위binaries.tbz2 설치)  test_kafka_proto_async, test_kafka_proto_sync Test Program 가능 
    │   ├── nvds_logger           // (상위binaries.tbz2 설치)  Test Program 별도 존재 
    │   ├── nvdsparsebbox         // 미설치된 library , 추가설치가능 
    │   └── nvmsgconv             // (상위binaries.tbz2 설치) 
    ├── objectDetector_FasterRCNN              // FasterRCNN IPlugIn 관련부분 연결 (공유 Library 연결필요) 
    │   ├── config_infer_primary_fasterRCNN.txt
    │   ├── deepstream_app_config_fasterRCNN.txt
    │   ├── labels.txt
    │   ├── nvdsinfer_custom_impl_fasterRCNN
    │   └── README
    └── objectDetector_SSD                 // SSD IPlugIn 관련부분 연결  (공유 Library 연결필요) 
        ├── config_infer_primary_ssd.txt
        ├── deepstream_app_config_ssd.txt
        ├── nvdsinfer_custom_impl_ssd
        └── README                              // check README , 상위에서 요약



  • Manual 참조 (상위 SDK Download 와 별도로 Manual 로 Download가능)
(NVIDIA_DeepStream_SDK_on_Jetson_References.tar)

Sample
Path inside sources directory
Description
DsExample plugin
gst-plugins/gst-dsexample
Template plugin for integrating custom algorithms in DeepStream SDK graph.
NvMsgConv plugin
gst-plugins/gst-nvmsgconv
Source code for the NvMsgConv plugin for converting metadata to schema format.
NvMsgBroker plugin
gst-plugins/gst-nvmsgbroker
Source code for the NvMsgBroker plugin for sending data to the server.
NvMsgConv library
libs/nvmsgconv
NvMsgConv library required by the NvMsgConv plugin.
Kafka protocol adapter
libs/kafka_protocol_adapter
Protocol adapter for Kafka.
nvdsparsebbox
libs/nvdsparsebbox
Custom model bounding box parsing library example.
Simple test application 1
apps/sample_apps/deepstream-test1
Simple demonstration of how to use DeepStream SDK elements in the pipeline and extract meaningful insights from a video stream. Uses a single primary detector.
Simple test application 2
apps/sample_apps/deepstream-test2
This example builds on test application 1 to add more elements in the pipeline and extract even more information from the stream.
Simple test application 3
apps/sample_apps/deepstream-test3
Builds on test application 1 to demonstrate how to:
Use multiple sources in the pipeline
Use a uridecodebin to accept any type of input (e.g. RTSP/File), any supported container format, and any codec
Configure stream-muxer to generate a batch of frames and infer on it for better resource utilization
Extract the stream metadata, which contains useful information about the frames in the batched buffer
Simple test application 4
apps/sample_apps/deepstream-test4
Demonstrates how to generate metadata payload and transmit it to the Cloud.
DeepStream reference application
apps/sample_apps/deepstream-app
Source code for the DeepStream reference application.
UFF SSD detector
objectDetector_SSD
Configuration files and custom library implementation for the SSD detector model.
Faster RCNN detector
objectDetector_FasterRCNN
Configuration files and custom library implementation for the FasterRCNN model.

  • README 체크 (요약)
 $ vi README  // 필요사항 및 설치사항 확인  (반드시 JetPack 4.1.1, 기반)
README 관련사항 요약 
=======================================================================
Installing prerequisites on Jetson development board:
=======================================================================
Packages to be installed:
$ sudo apt-get 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

=======================================================================
Installing librdkafka to use kafka protocol adaptor with message broker
=======================================================================
Use one of the following steps.

  sudo apt-get install librdkafka1=0.11.3-1build1

=======================================================================
Running the samples
=======================================================================
1. Go to samples directory and run:
   deepstream-app -c 
2. Application config files included in `configs/deepstream-app/`:
   a. source30_720p_dec_infer-resnet_tiled_display_int8.txt (30 Decode + Infer)
   b. source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
      (4 Decode + Infer + SGIE + Tracker)
3. Configuration files for "nvinfer" element in `configs/deepstream-app/`:
   a. config_infer_primary.txt (Primary Object Detector)
   b. config_infer_secondary_carcolor.txt (Secondary Car Color Classifier)
   c. config_infer_secondary_carmake.txt (Secondary Car Make Classifier)
   d. config_infer_secondary_vehicletypes.txt (Secondary Vehicle Type Classifier)


$ dpkg -l  xxxx  // 확인해보면, 이미 아래의 것이 설치되었지만, 재설치 



  • 상위 README 와 같이 설치 진행 
 $ sudo apt-get 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

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

$ sudo ldconfig 


  • Jetson의 성능 최상으로 변경 후 테스트 진행 
$ sudo nvpmodel -m 0 
$ sudo ~/jetson_clocks.sh

처음에는 nvpmodel의 현재 상태를 확인하고, 최상으로 테스트 진행하지 말고 진행하고 두번째 최상으로 변경하고 테스트 진행하자.

1.3 deepstream-app 의 config의 구성과 이해  

실제 구동 가능한  config파일은 1/2번의 config이며, 두개의 gstreamer의 구성이 다르다.


  • deepstream-app -c   config.txt 아래 둘 중 선택 
  1. source30_720p_dec_infer-resnet_tiled_display_int8.txt (30 streams processed with Decode + Primary Infer)
  2. source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt (four streams processed with Decode + Primary Infer + Tracker + 3 Secondary GIE)

  • gst-nvinfer config file ( GIE 의 primary 와 secondary 구성)
  1. config_infer_primary.txt (sample configuration file to configure an nvinfer element as primary detector)
  2. config_infer_secondary_carcolor.txt
  3. config_infer_secondary_carmake.txt
  4. config_infer_secondary_vehicletypes.txt (sample configuration files to configure an nvinfer element as secondary classifier)


  • 상세내용은 Manual 참조
(NVIDIA_DeepStream_SDK_on_Jetson_References.tar)


2. deepstream-app 실행 비교 

현재 Deepstream SDK 3.0에서는 deepstream-app이라는 program이 기본으로 지원이 되고 있으며, 이는 상위에서 언급한 Config에 따라 동작방식이 달라진다.
Jetpack 4.2 와 4.1.1에서 각각 설치 한 후 이를 테스트를 진행을 해보며, 에러가 발생한다면, 각각의 상황을 비교해본다.
( 이외에도 다른 Deepstream-test program을 제공)


2.1 deepstream-app 실행  (JetPack 4.2)

TensorRT Engine까지 생성이 되고, 마지막 OpenMAX 진행 후에
buf_convert: Wrong src surface count in Convert Buffer 와 함께 미동작됨

$ deepstream-app -c  samples/configs/deepstream-app/source30_720p_dec_infer-resnet_tiled_display_int8.txt  // 실행과 같이 TRT Model engine을 생성한다.
config_infer_primary.txt             config_infer_secondary_carmake.txt       source30_720p_dec_infer-resnet_tiled_display_int8.txt
config_infer_secondary_carcolor.txt  config_infer_secondary_vehicletypes.txt  source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt


$ rm ~/.cache/gstreamer-1.0/registry.aarch64.bin  // ERROR 발생한 경우 , 이 파일을 지우고 다시 실행


  • JetPack4.2의 에러 
아래의 글을 읽어보면, DeepStream 3.0 Beta는 현재 JetPack 4.1.1에서만 돌아간다고 하며, 현재 아래와 동일한 에러 발생

  https://devtalk.nvidia.com/default/topic/1048737/deepstream-sdk-on-jetson/failed-to-run-samples-jetpack-4-2-on-xavier/


2.2 deepstream-app 실행  (JetPack 4.1.1 )

상위와 동일하게 설정하며, 다만 JetPack Version만 변경하고 실행

  • 처음 실행시 문제사항
  1. 공유메모리 못잡는 문제발생 ( 두번 실행하면, 문제 해결) 
  2. TensorRT Engine 생성하는 문제  (시간이 많이 걸림)
두 세번 실행시 상위 문제가 없어지며, 아래의 Cache 정보를 삭제하면, 공유메모리를 못찾는문제가 다시 발생


  • 확인사항 
  1. Perf 측정 FPS 
  2. configs 파일의 구성 및 다른 옵션 

$ rm ~/.cache/gstreamer-1.0/registry.aarch64.bin  // ERROR 발생한 경우 , 이 파일을 지우고 다시 실행 

  • 30 Channel 720 P deepstream-app ( Config 파일 구성 및 옵션체크) 

$ deepstream-app -c  samples/configs/deepstream-app/source30_720p_dec_infer-resnet_tiled_display_int8.txt                         // 실행과 같이 TRT Model engine을 생성하며, 30 Channel  720P로 보여줌 
..........
*PERF: FPS 0 (Avg) FPS 1 (Avg) FPS 2 (Avg) FPS 3 (Avg) FPS 4 (Avg) FPS 5 (Avg)FPS 6 (Avg) FPS 7 (Avg) FPS 8 (Avg) FPS 9 (Avg) FPS 10 (Avg) FPS 11 (Avg) FPS 12 (Avg) FPS 13 (Avg) FPS 14 (Avg) FPS 15 (Avg) FPS 16 (Avg) FPS 17 (Avg) FPS 18 (Avg) FPS 19 (Avg) FPS 20 (Avg) FPS 21 (Avg) FPS 22 (Avg) FPS 23 (Avg) FPS 24 (Avg) FPS 25 (Avg) FPS 26 (Avg) FPS 27 (Avg) FPS 28 (Avg) FPS 29 (Avg) 
**PERF: 35.19 (35.19) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 35.19 (35.19) 35.19 (35.19) 35.19 (35.19) 33.82 (33.82) 33.82 (33.82) 35.19 (35.19) 35.19 (35.19) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 35.19 (35.19) 35.19 (35.19) 35.19 (35.19) 33.82 (33.82) 33.82 (33.82) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 33.82 (33.82) 35.19 (35.19) 
**PERF: 33.18 (33.29) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 33.18 (33.29) 33.18 (33.29) 33.18 (33.29) 33.18 (33.22) 33.18 (33.22) 33.18 (33.29) 33.18 (33.29) 33.18 (33.29) 33.18 (33.22) 33.38 (33.48) 33.18 (33.29) 33.18 (33.29) 33.18 (33.29) 33.18 (33.22) 33.18 (33.22) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 33.18 (33.22) 33.18 (33.29) 
**PERF: 29.98 (31.68) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 29.98 (31.68) 29.98 (31.68) 29.98 (31.68) 29.98 (31.65) 29.98 (31.65) 29.98 (31.68) 29.98 (31.68) 29.98 (31.68) 29.98 (31.65) 29.98 (31.78) 29.98 (31.68) 29.98 (31.68) 29.98 (31.68) 29.98 (31.65) 29.98 (31.65) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 29.98 (31.65) 29.98 (31.68) 
**PERF: 30.01 (31.13) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 30.01 (31.13) 30.01 (31.13) 30.01 (31.13) 30.01 (31.11) 30.01 (31.11) 30.01 (31.13) 30.01 (31.13) 30.01 (31.13) 30.01 (31.11) 30.01 (31.20) 30.01 (31.13) 30.01 (31.13) 30.01 (31.13) 30.01 (31.11) 30.01 (31.11) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 30.01 (31.11) 30.01 (31.13) 
**PERF: 30.01 (30.86) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 30.01 (30.86) 30.01 (30.86) 30.01 (30.86) 30.01 (30.84) 30.01 (30.84) 30.01 (30.86) 30.01 (30.86) 30.01 (30.86) 30.01 (30.84) 30.01 (30.91) 30.01 (30.86) 30.01 (30.86) 30.01 (30.86) 30.01 (30.84) 30.01 (30.84) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 30.01 (30.84) 30.01 (30.86) 
**PERF: 29.99 (30.69) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 29.99 (30.69) 29.99 (30.69) 29.99 (30.69) 29.99 (30.68) 29.99 (30.68) 29.99 (30.69) 29.99 (30.69) 29.99 (30.69) 29.99 (30.68) 29.99 (30.73) 29.99 (30.69) 29.99 (30.69) 29.99 (30.69) 29.99 (30.68) 29.99 (30.68) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 29.99 (30.68) 29.99 (30.69) 
**PERF: 29.99 (30.57) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 29.99 (30.57) 29.99 (30.57) 29.99 (30.57) 29.99 (30.56) 29.99 (30.56) 29.99 (30.57) 29.99 (30.57) 29.99 (30.57) 29.99 (30.56) 29.99 (30.60) 29.99 (30.57) 29.99 (30.57) 29.99 (30.57) 29.99 (30.56) 29.99 (30.56) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 29.99 (30.56) 29.99 (30.57) 
**PERF: 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.52) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 29.81 (30.46) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 30.01 (30.49) 
**PERF: 29.99 (30.43) 29.99 (30.43) 29.99 (30.42) 29.99 (30.43) 29.99 (30.42) 29.99 (30.43) 29.99 (30.42) 29.99 (30.43) 29.99 (30.42) 29.99 (30.43) 29.99 (30.43) 29.99 (30.43) 29.99 (30.43) 29.99 (30.42) 29.99 (30.42) 29.99 (30.43) 29.99 (30.43) 29.99 (30.43) 29.99 (30.42) 29.99 (30.45) 29.99 (30.43) 29.99 (30.43) 29.99 (30.43) 29.99 (30.42) 29.99 (30.42) 29.99 (30.40) 29.99 (30.42) 29.99 (30.43) 29.99 (30.42) 29.99 (30.43) 
**PERF: 30.07 (30.39) 30.07 (30.39) 30.07 (30.38) 30.07 (30.39) 30.07 (30.38) 30.07 (30.39) 30.07 (30.38) 30.07 (30.39) 30.07 (30.38) 30.07 (30.39) 30.07 (30.39) 30.07 (30.39) 30.07 (30.39) 30.07 (30.38) 30.07 (30.38) 29.87 (30.37) 30.07 (30.39) 30.07 (30.39) 30.07 (30.38) 30.07 (30.41) 30.07 (30.39) 30.07 (30.39) 30.07 (30.39) 30.07 (30.38) 30.07 (30.38) 30.07 (30.37) 30.07 (30.38) 30.07 (30.39) 30.07 (30.38) 30.07 (30.39) 
** INFO: : Received EOS. Exiting ...

30 (5x6 ) Channel 의 720p의 H.264영상을 처리


상위 채널중에 더블 클릭시 확대가능

상위 로그에서 Perf의 각 Frame을 확인해야한다.


  • 4 Channel 720P deepstreem-app ( Config 파일의 구성 및 옵션부분 체크)
$ deepstream-app -c  samples/configs/deepstream-app/source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt        // 실행과 같이 TRT Model engine을 생성하며,  4 Channel  720P로 보여줌 
....
**PERF: FPS 0 (Avg) FPS 1 (Avg) FPS 2 (Avg) FPS 3 (Avg)             // 왜 40 FPS가 나오는지 동영상을 봐야겠다. 
**PERF: 41.91 (41.91) 41.91 (41.91) 41.91 (41.91) 41.91 (41.91) 
**PERF: 30.01 (32.69) 30.01 (32.69) 30.01 (32.69) 30.01 (32.69) 
**PERF: 29.99 (31.52) 29.99 (31.52) 29.99 (31.52) 29.99 (31.52) 
**PERF: 30.01 (31.06) 30.01 (31.06) 30.01 (31.06) 30.01 (31.06) 
**PERF: 30.00 (30.81) 30.00 (30.81) 30.00 (30.81) 30.00 (30.81) 
**PERF: 30.00 (30.66) 30.00 (30.66) 30.00 (30.66) 30.00 (30.66) 
**PERF: 29.98 (30.55) 29.98 (30.55) 29.98 (30.55) 29.98 (30.55) 
**PERF: 30.02 (30.48) 30.02 (30.48) 30.02 (30.48) 30.02 (30.48) 
**PERF: 30.00 (30.42) 30.00 (30.42) 30.00 (30.42) 30.00 (30.42) 
**PERF: 30.00 (30.38) 30.00 (30.38) 30.00 (30.38) 30.00 (30.38) 
** INFO: : Received EOS. Exiting ...

Quitting


상위 채널중 더블 클릭할 경우




  • 사용되는 Model Network
  1. Primary GIE (1st GIE) : resnet10.caffemodel
  2. Secondary GIE(2nd GIE): resnet18.caffemodel ( 3개다 이 Model 사용)

resnet이 유명하기에 이에 관련되는 부분을 추후에 별도로 공부해야함

  • Deepstream 구조 (deepstream-app 의 경우)


  1. VIDEO DECODE:  부분은 FIle or RTSP 부터 Video Decoder 까지 지원하며, uridecodebin가 이를 둘다 지원
  2. STREAM MUX:  Decode 데이타를 Video MUX와 함께 Car-Detect 도 동작 
  3. PRIMARY DETECTOR:  1 Channel만 선택했을 경우 동작이 후는 다음 그대로 이해하면될 것 같다. 



  http://on-demand.gputechconf.com/gtc-cn/2018/pdf/CH8307.pdf


  • deepstream-app의 Callback 함수의 metadata 처리부분 
소스는 좀 복잡하지만 간단하게 deepstream-app의 metadata 처리하는 Callback 함수만 보고, 어떻게 동작하는지를 이해만 하자
  1. gie_processing_done_buf_prob Pad에 Callback Function 등록 
  2. gie_processing_done_buf_prob->process_buff  Call
  3. Buffer 처리마다 for_each_meta 하도록 Callback 등록 
  4. for_each_meta  실제적인 OSD에 표현할 데이타 구성 


$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-app
$ cat deepstream_app.c 
....

static gboolean
for_each_meta (GstBuffer *buffer, GstMeta **meta, gpointer user_data)            // NvDsInstanceData->NvDsFrameMeta 를 이용한 OSD 처리 
{
  //설정에따라, OSD Label  1st GIE Class 및 Track ID 표시 2nd GIE Class 표시 

}
...
static void
process_buffer (GstBuffer *buf, AppCtx *appCtx, guint index)
{
.....
  // call "for_each_meta" to process metadata.
  gst_buffer_foreach_meta (buf, for_each_meta,
                           &appCtx->pipeline.instance_bins[index]);

}

static GstPadProbeReturn
gie_processing_done_buf_prob (GstPad *pad, GstPadProbeInfo *info,
    gpointer u_data)
{
  GstBuffer *buf = (GstBuffer *) info->data;
  NvDsInstanceBin *bin = (NvDsInstanceBin *) u_data;
  guint index = bin->index;
  AppCtx *appCtx = bin->appCtx;

  if (gst_buffer_is_writable (buf))
    process_buffer (buf, appCtx, index);
  return GST_PAD_PROBE_OK;
}

..........
  if (config->osd_config.enable) {
    NVGSTDS_ELEM_ADD_PROBE (instance_bin->all_bbox_buffer_probe_id,
        instance_bin->osd_bin.nvosd, "sink",
        gie_processing_done_buf_prob, GST_PAD_PROBE_TYPE_BUFFER, instance_bin); //gie_processing_done_buf_prob Call Back 등록 
  } else {
    NVGSTDS_ELEM_ADD_PROBE (instance_bin->all_bbox_buffer_probe_id,
        instance_bin->sink_bin.bin, "sink",
        gie_processing_done_buf_prob, GST_PAD_PROBE_TYPE_BUFFER, instance_bin);   //gie_processing_done_buf_prob Call Back 등록 
  }


2.3  deepstream-app 의 config 파일 (RTSP지원으로변경)

주로 봐야할 Config는 아래의 Config인 것 같으며,  쉽게 설정을 통해서 RTSP변환도 가능하며,이를 통해 IP Camera와 연결가능해지며, 동작화인도 쉽다

  • source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt 
아래의 Config 파일에서 Gstreamer의 Plugin들을 설정변경하여, RTSP기반으로 동작가능.

$ vi source4_720p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt   //RTSP 설정 변경 

[source0]
..
##jhlee
#uri=file://../../streams/sample_720p.mp4        //기본설정 
uri=rtsp://10.0.0.211:554/h264

##jhlee 4->1  Input Chan
num-sources=1

[sink0]
...
type=2
##jhlee 1->0
sync=0
....

참고사항
  https://devtalk.nvidia.com/default/topic/1046315/deepstream-sdk-on-jetson/template-config-file-for-camera-and-rtsp/


  • Gst-nvinfer 용 Configs 설정
아래와 같이 실행하며, 에러가 발생하며, README를 보면,  Gstreamer의 Plugin의 nvinfer 세부설정이라고 한다. 
현재 상위 4Channel에만 해당 아래의 설정들을 Gst-nvinfer 에게 어떻게 전달하는지는 각 소스를 분석을 해봐야 할 것 같으며, 대체적으로 Callback Function으로 Metadata 처리 부분일 것 같다.

$ deepstream-app -c  samples/configs/deepstream-app/config_infer_primary.txt                                                      // 에러 발생 , 아래의 의 Cache를 제거해도 동일함 
$ deepstream-app -c  samples/configs/deepstream-app/config_infer_secondary_carmake.txt                                    // 에러 발생 
$ deepstream-app -c  samples/configs/deepstream-app/config_infer_secondary_carcolor.txt                                     // 에러 발생  
$ deepstream-app -c  samples/configs/deepstream-app/config_infer_secondary_vehicletypes.txt                               // 에러 발생 

** ERROR: : Failed to set pipeline to PAUSED
Quitting
ERROR from src_bin_muxer: Output width not set
Debug info: /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvmultistream/gstnvstreammux.c(1633): gst_nvstreammux_change_state (): /GstPipeline:pipeline/GstBin:multi_src_bin/GstNvStreamMux:src_bin_muxer
App run failed
   
$ rm ~/.cache/gstreamer-1.0/registry.aarch64.bin  // ERROR 발생한 경우 , 이 파일을 지우고 다시 실행



3. deepstream-testX-app  samples
Deepstream SDK 3.0에서 제공해주는 test-app은 총 4개이며, binary package에서 test app은 총 4개 중 3개만 제공하고 있다.

IP Camera or RTSP Server와  RTSP 테스트 할 경우는 아래의 Gstreamer로 기본동작을 확인 후 실행하자.

Binaray Package 이외에도 직접 Source에 가서 쉽게 Build가 가능하며, 이를 Build하여 손쉽게 소스수정해보면서 테스트도 가능하기에, 가능하면 Source에서 Build하면서 하자.

세부내용은 Deepstream SDK Manual 참조

3.1 deepstream-test1-app 

소스보면  단순하며 쉽게 Gstremer Command로 생성가능하며, 분석도 쉬운예제이기에 생략하며, 실행은 아래처럼 Binary Package를 이용하거나,
직접 Build해서 실행하자.

$ cd ~/deepstream_sdk_on_jetson
$ deepstream-test1-app 
Usage: deepstream-test1-app 

$ deepstream-test1-app samples/streams/sample_720p.h264    // Error 발생  
g_key_file_load_from_file failed
g_key_file_load_from_file failed
Now playing: samples/streams/sample_720p.h264
g_key_file_load_from_file failed
g_key_file_load_from_file failed
Running...
ERROR from element primary-nvinference-engine: Failed to parse config file:dstest1_pgie_config.txt
Error: Failed to parse config file:dstest1_pgie_config.txt
Returned, stopping playback
Deleting pipeline

$ cd sources/apps/sample_apps/deepstream-test1    // PATH 변경 ,
$ deepstream-test1-app ../../../../samples/streams/sample_720p.h264  // 실행확인 문제 없음 (상위 config 파일을 못찾아서 에러) 


처음실행시 상위와 같이 에러가 발생했으며, 원인은 각 config file을 못찾아 발생

3.2 deepstream-test2-app

이 예제의 기본구조는 File을 open 하여 1개의 Primary Gst-nvinfer 걸쳐 Gst-nvtracker를 걸쳐 Secondary Gst-nvinfer 3개를 사용하고, 이를 Gst-nvosd에 적용하는 예제이다.
중간에 OSD적용하기위해서  Video layout도 converting도 진행을 한다 (NV12->RGBA)

개인적으로 분석하기에 가장 좋은 예제인 것 같으며, CMD Gstreamer로도 복잡하게 실행도 가능하기에, 이를 분석하고 비교 테스트 한다.

  • make로 생성된 deepstream-test2-app를 실행 
전체화면으로 작동이되며, 이를 소스상에서도 RTSP지원으로 변경가능하며, 수정방법은 test3이 RTSP지원이므로, 이를 참고하여
uridecodebin 사용하면 ( rtspsrc/h264parse/omxh264dec) 의 PlugIn(Elelemnt)가 필요없어진다.

$ cd ~/deepstream_sdk_on_jetson
$ deepstream-test2-app 
Usage: deepstream-test2-app 


$ cd sources/apps/sample_apps/deepstream-test2
$ deepstream-test2-app ../../../../samples/streams/sample_720p.h264  //  실행확인 문제 없음 (상위 config 파일을 못찾아서 에러) 


  • Deepstream SDK 3.0의 Metadata 
Gstreamer와 Deepstream의 차이라면, 이 Metadata와 TensorRT일 것이며, C/C++를 이용하여 Gstreamer Program을 작성하여 Callback function에서 처리를 해야한다.
  1. NvDsObjectParams : Detect를 한 후 각 Object관련된 MetaData
  2. NvDsEventMsgMeta : Event를 위한 Msg MetaData로 현재 TEST4에서만 사용 


  • 소스 Callback Function 의 Metadata 분석 
중요 Callback Function osd_sink_pad_buffer_probe 이며, 이곳에서 Metadata를 처리하여 OSD에 적용한다.
  1. GstMeta  > NvDsMeta    //   구조체 Type 변경하여, Gstreamer 내부 MetaData이용 
  2. NvDsMeta->meta_data  > NvDsFrameMeta     
  3. NvDsFrameMetaNvDsObjectParams 의 정보이용 하여 기본정보를 OSD 표현 


Metadata 의 흐름 과  Kafka 관련사항
  https://devblogs.nvidia.com/intelligent-video-analytics-deepstream-sdk-3-0/


구조체 확인 (NvDsFrameMetaNvDsObjectParams ) 나머지는생략

$ cat  include/gstnvdsmeta.h  //상위참조

/** Holds parameters that describe meta data for one object. */
typedef struct _NvDsObjectParams {
  /** Structure containing the positional parameters of the object in the frame.
   *  Can also be used to overlay borders / semi-transparent boxes on top of objects
   *  Refer NvOSD_RectParams from nvosd.h
   */
  NvOSD_RectParams rect_params;       // Rectangle 위치 및 Size
  /** Text describing the object can be overlayed using this structure.
   *  @see NvOSD_TextParams from nvosd.h. */
  NvOSD_TextParams text_params;     // OSD 표현될 글자적용  
  /** Index of the object class infered by the primary detector/classifier */
  gint class_id;            // 1st GIE가 Detection 했을 때 Class ( Car , Person)
  /** Unique ID for tracking the object. This -1 indicates the object has not been
   * tracked. Custom elements adding new NvDsObjectParams should set this to
   * -1. */
  gint tracking_id;
  /** Secondary classifiers / custom elements update this structure with
   *  secondary classification labels. Each element will only update the
   *  attr_info structure at index specified by the element's unique id.
   */
  NvDsAttrInfo attr_info[NVDS_MAX_ATTRIBUTES];    // Object 의 2nd GIE의 Class 정보들  
  /** Boolean indicating whether attr_info contains new information. */
  gboolean has_new_info;
  /** Boolean indicating whether secondary classifiers should run inference on the object again. Used internally by components. */
  gboolean force_reinference;
  /** Used internally by components. */
  gint parent_class_id;
  /** Used internally by components. */
  struct _NvDsObjectParams *parent_roi;
  /** Used internally by components */
  NvOSD_LineParams line_params[4];
  /** Used internally by components */
  gint lines_present;
  /** Used internally by components */
  gint obj_status;
  /** Provision to add custom object metadata info */
  NvDsObjectParamsEx obj_params_ex;
} NvDsObjectParams;

typedef struct _NvDsFrameMeta {
  /** Array of NvDsObjectParams structure describing each object. */
  NvDsObjectParams *obj_params;           // Rectangle 개수만큼의 배열로 각 개체정보 
  /** Number of rectangles/objects i.e. length of @ref NvDsObjectParams */
  guint num_rects;              // Rectangle 갯수 
  /** Number of valid strings in @ref NvDsObjectParams. */
  guint num_strings;
  /** Index of the frame in the batched buffer to which this meta belongs to. */
  guint batch_id;
  /** NvOSD mode to be used. @see NvOSD_Mode in `nvosd.h`. */
  NvOSD_Mode nvosd_mode;
  /** 1 = Primary GIE, 2 = Secondary GIE, 3 = Custom Elements */
  gint gie_type;
  /** Batch size of the primary detector. */
  gint gie_batch_size;
  /** Unique ID of the primary detector that attached this metadata. */
  gint gie_unique_id;
  /** Frame number. */
  gint frame_num;                  // 동영상 Frame Number
  /** Index of the stream this params structure belongs to. */
  guint stream_id;
  /** Boolean indicating if these params are no longer valid. */
  gint is_invalid;
  /** Indicates Surface Type i.e. Spot or Aisle */
  NvDsSurfaceType surface_type;
  /** Indicates Surface Index for SurfaceType Spot or Aisle */
  gint camera_id;
  /** Indicates Surface Index for SurfaceType Spot or Aisle */
  gint surface_index;
} NvDsFrameMeta;


  • CMD Gstreamer 실행 및 Deepstream 비교 
상위 테스트 소스를 기반으로 command gstreamer로 변경하여 테스트 진행하며, OSD의 TEXT가 제대로 동작이 안됨 (metadata 처리부분이 동작이 안됨)

$ gst-launch-1.0 filesrc location=../../../../samples/streams/sample_720p.h264 ! \
        decodebin ! nvinfer config-file-path= dstest2_pgie_config.txt ! \
        nvtracker ! \
        nvinfer config-file-path= dstest2_sgie1_config.txt ! \
        nvinfer config-file-path= dstest2_sgie2_config.txt ! \
        nvinfer config-file-path= dstest2_sgie3_config.txt ! \
        capsfilter caps=video/x-raw(memory:NVMM), format=NV12 !\        
        nvvidconv ! \
        capsfilter caps=video/x-raw(memory:NVMM), format=RGBA !\
        nvosd font-size=15 ! nvoverlaysink

//상위소스를 분석하면, 위와 같이 명령으로 실행이 가능하지만, osd_sink_pad_buffer_probe의 기능을 필요해서 제대로 표현을 못함 
// decodebin (h264parse/omxh264dec 를 호출할 필요 없음)


  • CMD Gstreamer RTSP Version으로 변경 
decodebin 에서 uridecodebin을 이용하여 다양한 uri을 접속가능하도록 변경

$ gst-launch-1.0 uridecodebin uri=rtsp://10.0.0.196:554/h264 ! \
        nvinfer config-file-path= dstest2_pgie_config.txt ! \
        nvtracker ! \
        nvinfer config-file-path= dstest2_sgie1_config.txt ! \
        nvinfer config-file-path= dstest2_sgie2_config.txt ! \
        nvinfer config-file-path= dstest2_sgie3_config.txt ! \
        capsfilter caps=video/x-raw(memory:NVMM), format=NV12 !\        
        nvvidconv ! \
        capsfilter caps=video/x-raw(memory:NVMM), format=RGBA !\
        nvosd font-size=15 ! nvoverlaysink

// RTSP 지원으로 변경하여 테스트 


  • 다른 version으로 테스트 진행 
상위소스를 보면, OSD에 overlay(전체화면)하기 위해서 하지만, OpenGL을 이용하여 X Window 창으로 재생

$ gst-launch-1.0 filesrc location=../../../../samples/streams/sample_720p.mp4 ! \
        decodebin ! nvinfer config-file-path= dstest2_pgie_config.txt ! \
        nvtracker ! \
        nvinfer config-file-path= dstest2_sgie1_config.txt ! \
        nvinfer config-file-path= dstest2_sgie2_config.txt ! \
        nvinfer config-file-path= dstest2_sgie3_config.txt ! \
        nvvidconv ! nvosd ! nvegltransform ! nveglglessink


3.3 Deepstream TEST3 (RTSP 지원)

RTSP 동작은 잘 동작되며, TEST1과 같이 간단한 구조가  구성되어 생략하지만, 소스참고용은 괜찮은 것 같다.

$ cd ~/deepstream_sdk_on_jetson
$ deepstream-test3-app 
Usage: deepstream-test3-app  [uri2] ... [uriN]

$ cd sources/apps/sample_apps/deepstream-test3
$ deepstream-test3-app ../../../../samples/streams/sample_720p.h264  // 에러 발생, uri를 4개로 늘려도 동일하게 에러발생 
$ deepstream-test3-app rtsp://10.0.0.211:554/h264  // RTSP만 성공 확인  (IP Camera 연결)


3.4 Deepstream TEST 4 (Kafka 예제)

Binary Package에 미포함 되어 있으며, 기존과 다르게,  msgconvmsgbroker를 사용하여 Kafka와 통신하는 구조이다.
Deepstream의 Metadata를 Message(Json)로 변경하여 외부Server로 전송하고 분석하는 구조로 구성이 되고 있음

기존에는 전부 GIE(Gst-nvinfer) config 만 존재했다면 이곳에는 msgconv의 config file도 존재하기 때문에 구조를 잘 살펴보자.


$ cd ~/deepstream_sdk_on_jetson
$ cd sources/apps/sample_apps/deepstream-test4
$ make 
$ ls
deepstream-test4-app  deepstream_test4_app.c  deepstream_test4_app.o  dstest4_msgconv_config.txt  dstest4_pgie_config.txt  Makefile  README

$ ./deepstream-test4-app ../../../../samples/streams/sample_720p.h264  // 에러발생, 


제대로 동작하려면, 소스의 CONNECTION_STRING 설정과 NVDS_META_EVENT_MSG 부분을 잘봐야 겠으며, 상위 설정 dstest4_msgconv_config.txt  의 이해도 필요할 것 같음

현재 이것와 같이 연결될 Server가 존재하지 않아 제대로 동작되지 않는 것 같으며, 이부분은  완벽히 동작될 경우 다시 언급하겠음

msgconv 및 msgbroker 관련내용
  https://devblogs.nvidia.com/intelligent-video-analytics-deepstream-sdk-3-0/

Deepstream 2.0
  https://devblogs.nvidia.com/accelerate-video-analytics-deepstream-2/

4. How To build deepstream Apps

상위 Program은  Binary File을 직접 설치하였기때문에 문제없이 동작했지만,  NVIDIA에서 무료로 제공해주는 Deepstream SDK 3.0 내부의 Source를 직접 빌드를 하여 동작하도록 해보자.

손쉽게 NVIDIA Site에서 무료로 SDK와 Manual을 Download했지만, 라이센스같은 것을 추후에 확인을 해야 할 것 같다.


4.1 빌드시 필요 Package 설치 

Build 전에 아래 Package 설치해야만, Build가 되며, 혹시 빠진 것이 있다면,  dkg -l  명령어로 확인하여 관련필요 Package 설치하자.

$ sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \
   libgstrtspserver-1.0-dev libx11-dev


4.2  deepstream-app 빌드 진행 

상위 source/apps/sampe_apps 를 보면 총 5개의 app를 제공하고 있으며, main이 되는 deepstream-app를 먼저 분석
다른 deepstream-testx-app은 구조가 비교적 간단한 편임

  • deepstream-app 
Deepstream의 Main Program이며,  핵심소스
$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-app 
$ make


  • deepstream-app 구조 및 분석 
이 프로그램만 구성이 좀 복잡하지만, config를 이용하여 file 과 rtsp 테스트도 가능하다.
하지만, rtsp의 경우 처음만 동작하고, 제대로 동작되지 않는다.

$ vi ../../apps-common/includes/deepstream_config.h   //
$ tree -t .
.
├── deepstream_app.c               //apps-common 의 file들을 호출구조 (Gstreamer)
├── deepstream_app_main.c      // main X 구성 및 기본 동작 제어 
├── Makefile
├── README
├── deepstream_app.o
├── deepstream_app_main.o
└── deepstream-app

$ tree -t ../../apps-common
../../apps-common/
├── includes
│   ├── deepstream_app.h
│   ├── deepstream_colors.h
│   ├── deepstream_common.h
│   ├── deepstream_config_file_parser.h
│   ├── deepstream_config.h                           // gstream plugin  (app-common *.c 참조 )
│   ├── deepstream_dsexample.h
│   ├── deepstream_gie.h
│   ├── deepstream_metadata_pool.h
│   ├── deepstream_osd.h
│   ├── deepstream_perf.h
│   ├── deepstream_primary_gie.h
│   ├── deepstream_secondary_gie.h
│   ├── deepstream_sinks.h
│   ├── deepstream_sources.h
│   ├── deepstream_streammux.h
│   ├── deepstream_tiled_display.h
│   └── deepstream_tracker.h
└── src
    ├── deepstream_common.c
    ├── deepstream_config_file_parser.c         //deepstream-app 의 config parser 로  각 group 별로 설정 ( deepstream-app -c xxxx.txt )
    ├── deepstream_dsexample.c                   // 현재 미사용 
    ├── deepstream_metadata_pool.c             // Metadat 추후 Kafka를 통해 전송 
    ├── deepstream_osd_bin.c                       // OSD 관련 ( Text 설정)
    ├── deepstream_perf.c                            // FPS 측정 
    ├── deepstream_primary_gie_bin.c           // 1st TensorRT(GIE), Primary GIE와 Secondary GIE의 옵션이 다름  
    ├── deepstream_secondary_gie_bin.c      //  2nd TensorRT 
    ├── deepstream_sink_bin.c                     // Gstreamer 의 output 
    ├── deepstream_source_bin.c                 // Gstreamer 의 Input
    ├── deepstream_streammux.c                 // Video 영상 Mux 기능 
    ├── deepstream_tiled_display_bin.c         // 최종 Display Option 설정 (e.g 2x2 4Ch)
    ├── deepstream_tracker_bin.c                 //  Tracker 관련 기능,  KLT or IOU 알고리즘제공 
    ├── deepstream_primary_gie_bin.o
    ├── deepstream_tracker_bin.o
    ├── deepstream_config_file_parser.o
    ├── deepstream_metadata_pool.o
    ├── deepstream_source_bin.o
    ├── deepstream_common.o
    ├── deepstream_perf.o
    ├── deepstream_sink_bin.o
    ├── deepstream_dsexample.o
    ├── deepstream_osd_bin.o
    ├── deepstream_secondary_gie_bin.o
    ├── deepstream_tiled_display_bin.o
    └── deepstream_streammux.o

$ grep -r   gst_element_factory_make  .                                 // Gstreamer Plugin 설정함수 검색하여 구조파악
$ grep -r   gst_element_factory_make   ../../apps-common     // Gstreamer Plugin 설정함수 검색 하여 구조파악 


apps-common 파일에서 돌아가는 시스템의 전체적인 구조를 파악하자.
deepstream-app은 두 개의 config를 제공 (30Ch, 4Ch)에서 streammux기능을 사용하며, 여기서 Batch Size의 의미와 정확한 설정방법을 알아두고
이를 display하는 tiled_dispaly의 기능을 확인하자.





  • 다른 deepstream-testx-app 프로그램 
구성이 간단하며, 쉽게 빌드가 가능하며, gst-infer 설정도 별도로 존재하며, 이해하기가 쉽다.

$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test1
$ make

$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test2  // nvinfer의 구성이 기본프로그램과 거의 유사
$ make

$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test3  //RTSP지원인데, 구성이 독특함
$ make

$ cd ~/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test4  // Build 에러발생 
$ make


5. Jetson AGX Xavier 기반의 일반 Gstreamer 예제

IP Camera 와 아래와 같이 실행을 해보면 잘동작되는 것을 알수 있다. 세부 메뉴얼은 Gstreamer 관련메뉴얼을 읽자.


$ vi gstreamFake.sh   // Fakesink 
export GST_DEBUG=fpsdisplaysink:5
export RTSP_PATH=rtsp://10.0.0.211:554/h264
gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv ! video/x-raw ! fpsdisplaysink video-sink=fakesink

$ vi gstream1Ch.sh   // 1Channel Gstream , Fixed Size (not Full Screen)
export GST_DEBUG=fpsdisplaysink:5
export RTSP_PATH=rtsp://10.0.0.211:554/h264
gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink window-x=100 window-y=100 window-width=640 window-height=360 

$ vi gstream1Ch.sh   // 1Channel Gstream , Input Size Screen 
export GST_DEBUG=fpsdisplaysink:5
export RTSP_PATH=rtsp://10.0.0.211:554/h264
gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink -e

$ vi gstream1Ch.sh   // 1Channel Gstream  File Save 
export GST_DEBUG=fpsdisplaysink:5
export RTSP_PATH=rtsp://10.0.0.211:554/h264
gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! video/x-h264,stream-format=byte-stream ! filesink location=dump.h264

$ vi gstream4.sh     //4 Channel Gstream 
export GST_DEBUG=fpsdisplaysink:5
export RTSP_PATH=rtsp://10.0.0.211:554/h264
gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink window-x=100 window-y=100 window-width=640 window-height=360 & gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink window-x=800 window-y=100 window-width=640 window-height=360 & gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink window-x=100 window-y=500 window-width=640 window-height=360  & gst-launch-1.0 rtspsrc location="$RTSP_PATH" ! rtph264depay ! h264parse ! omxh264dec ! nveglglessink window-x=800 window-y=500 window-width=640 window-height=360


  https://devtalk.nvidia.com/default/topic/1043622/jetson-agx-xavier/problems-with-gstreamer-video-decoding-pipeline/
  https://developer.download.nvidia.com/embedded/L4T/r32_Release_v1.0/Docs/Accelerated_GStreamer_User_Guide.pdf?dv2A0QketFFyriluW9VlC-MWvKz47EdjjzfAk-IbvlxfI0h-gzfdPigIlLBki-7obko6HNlF2ffVOvIEypa0Nm446gahCIzqSWD29sNvZ82qQuAkdttYwAAjAkTESp9Rgn6maGtlhsKPIbT0UPC-duLydchWKUbyer3cEWv8ZoL1svospLA


6.  Jetson AGX  Xavier 기반의 TensoRT  관련사항 

AGX Xavier 의 Object Detection 과  Lane Segmatation의 예제인데, TensorRTDALI를 사용하여 최적화한다고 한다.

AGX 기반의 TensorRT 부분
  https://devblogs.nvidia.com/drive-agx-accelerators-object-detection/


7. Yolo 관련 테스트 

EVM-Jetson TX2와 Jetson AGX Xavier에서 각각 Yolo를 Porting하여 돌려 테스트한 사이트

  https://jkjung-avt.github.io/yolov3/
  https://goodtogreate.tistory.com/entry/YOLOv3-on-Jetson-AGX-Xavier-%EC%84%B1%EB%8A%A5-%ED%8F%89%EA%B0%80?category=701595