7/31/2019

Deepstream SDK 4.0 설치 및 기본예제

1. DeepStream SDK 4.0 설치 

DeepStream SDK 4.0은 이제 기본적으로 NVIDIA 기본 Componemt에 들어가 있어 쉽게 SDKManger를 이용하여 기본설치가능

  • JetPack 4.2.1 설치 
DeepStream SDK 4.0을 사용하기위해서 JetPack 4.2.1 설치
  https://ahyuo79.blogspot.com/2019/07/jetpack-421.html
NVIDIA JetPack 관련부분
  https://ahyuo79.blogspot.com/search/label/NVIDIA-JetPack

  • DeepStream  문서 온라인 지원 
기존에는 별도로 Download하여 지원을 해줬는데, Online으로 전부 다 지원
  https://docs.nvidia.com/metropolis/index.html

DeepStream SDK 4.0
  https://ahyuo79.blogspot.com/search/label/NVIDIA-DeepStream%20SDK%204.0

DeepStream SDK 3.0
  https://ahyuo79.blogspot.com/search/label/NVIDIA-DeepStream%20SDK%203.0

DeepStream
  https://ahyuo79.blogspot.com/search/label/NVIDIA-DeepStream


  • Jetson 성능 최대화 설정 
기존에는 jetson_clock.sh 이였지만, 아래와 같이 변경

$ sudo nvpmodel -m 0 
$ sudo jetson_clocks   //변경됨 

$ sudo nvpmodel -q
NV Fan Mode:quiet
NV Power Mode: MAXN        
0


  • DeepStream SDK 위치 파악 및 Library 관련사항 확인 

설치한 후 무작정 Deepstream 관련정보를 찾고 위치를 파악하고 Library 관계도 대충파악

$ find / -name *.caffemodel 2> /dev/null      // 설치 위치 파악 
/usr/src/tensorrt/data/googlenet/googlenet.caffemodel
/usr/src/tensorrt/data/resnet50/ResNet50_fp32.caffemodel
/usr/src/tensorrt/data/mnist/mnist.caffemodel
/usr/src/tensorrt/data/mnist/mnist_lenet.caffemodel
/usr/src/tegra_multimedia_api/data/Model/resnet10/resnet10.caffemodel
/usr/src/tegra_multimedia_api/data/Model/GoogleNet_one_class/GoogleNet_modified_oneClass_halfHD.caffemodel
/usr/src/tegra_multimedia_api/data/Model/GoogleNet_three_class/GoogleNet_modified_threeClass_VGA.caffemodel
/opt/nvidia/deepstream/deepstream-4.0/samples/models/Secondary_CarMake/resnet18.caffemodel
/opt/nvidia/deepstream/deepstream-4.0/samples/models/Secondary_CarColor/resnet18.caffemodel
/opt/nvidia/deepstream/deepstream-4.0/samples/models/Primary_Detector/resnet10.caffemodel
/opt/nvidia/deepstream/deepstream-4.0/samples/models/Primary_Detector_Nano/resnet10.caffemodel
/opt/nvidia/deepstream/deepstream-4.0/samples/models/Secondary_VehicleTypes/resnet18.caffemodel

$ which deepstream-app   // 실행파일만 /usr/bin에 위치 
/usr/bin/deepstream-app

$ ls /usr/bin/deepstream-*
/usr/bin/deepstream-app               /usr/bin/deepstream-nvof-app          /usr/bin/deepstream-test2-app
/usr/bin/deepstream-dewarper-app      /usr/bin/deepstream-perf-demo         /usr/bin/deepstream-test3-app
/usr/bin/deepstream-gst-metadata-app  /usr/bin/deepstream-segmentation-app  /usr/bin/deepstream-test4-app
/usr/bin/deepstream-image-decode-app  /usr/bin/deepstream-test1-app         /usr/bin/deepstream-user-metadata-app


//DeepStream 4.0 PlugIn
$ ls /opt/nvidia/deepstream/deepstream-4.0/lib/gst-plugins   
libnvdsgst_dewarper.so   libnvdsgst_infer.so      libnvdsgst_msgconv.so      libnvdsgst_multistreamtiler.so  libnvdsgst_ofvisual.so  libnvdsgst_segvisual.so
libnvdsgst_dsexample.so  libnvdsgst_msgbroker.so  libnvdsgst_multistream.so  libnvdsgst_of.so                libnvdsgst_osd.so       libnvdsgst_tracker.so

//DeepStream 4.0 Library 
$ ls /opt/nvidia/deepstream/deepstream-4.0/lib
gst-plugins            libnvbufsurftransform.so     libnvds_csvparser.so  libnvds_inferutils.so   libnvds_mot_iou.so        libnvds_nvdcf.so               libnvds_utils.so
libiothub_client.so    libnvds_amqp_proto.so        libnvdsgst_helper.so  libnvds_kafka_proto.so  libnvds_mot_klt.so        libnvds_nvtxhelper.so          libvpi.so.0
libiothub_client.so.1  libnvds_azure_edge_proto.so  libnvdsgst_meta.so    libnvds_logger.so       libnvds_msgconv.so        libnvds_opticalflow_jetson.so  libvpi.so.0.0.2
libnvbufsurface.so     libnvds_azure_proto.so       libnvds_infer.so      libnvds_meta.so         libnvds_msgconv.so.1.0.0  libnvds_osd.so

// Gst-nvinfer shared Library 의존성확인 
$ ldd /opt/nvidia/deepstream/deepstream-4.0/lib/gst-plugins/libnvdsgst_infer.so
 linux-vdso.so.1 (0x0000007f8bab2000)
 libnvds_infer.so => /opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_infer.so (0x0000007f8b64b000)
 libglib-2.0.so.0 => /usr/lib/aarch64-linux-gnu/libglib-2.0.so.0 (0x0000007f8b53d000)
 libgobject-2.0.so.0 => /usr/lib/aarch64-linux-gnu/libgobject-2.0.so.0 (0x0000007f8b4df000)
 libgstreamer-1.0.so.0 => /usr/lib/aarch64-linux-gnu/libgstreamer-1.0.so.0 (0x0000007f8b3b0000)
 libgstbase-1.0.so.0 => /usr/lib/aarch64-linux-gnu/libgstbase-1.0.so.0 (0x0000007f8b33a000)
 libnvbufsurface.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbufsurface.so.1.0.0 (0x0000007f8b2bc000)
 libnvbufsurftransform.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbufsurftransform.so.1.0.0 (0x0000007f8ac2b000)
 libnvds_meta.so => /opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_meta.so (0x0000007f8ac15000)
 libnvdsgst_helper.so => /opt/nvidia/deepstream/deepstream-4.0/lib/libnvdsgst_helper.so (0x0000007f8ac01000)
 libnvdsgst_meta.so => /opt/nvidia/deepstream/deepstream-4.0/lib/libnvdsgst_meta.so (0x0000007f8abed000)
 libcuda.so.1 => /usr/lib/aarch64-linux-gnu/tegra/libcuda.so.1 (0x0000007f89cc8000)
 libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007f89cb3000)
 libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007f89b20000)
 libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007f89af4000)
 librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000007f89add000)
 libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f89984000)
 libnvparsers.so.5 => /usr/lib/aarch64-linux-gnu/libnvparsers.so.5 (0x0000007f89645000)
 libnvonnxparser.so.0 => /usr/lib/aarch64-linux-gnu/libnvonnxparser.so.0 (0x0000007f89221000)
 libnvinfer.so.5 => /usr/lib/aarch64-linux-gnu/libnvinfer.so.5 (0x0000007f8029d000)
 libnvinfer_plugin.so.5 => /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.5 (0x0000007f7ffc7000)
 libnvds_inferutils.so => /opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_inferutils.so (0x0000007f7ffb1000)
 libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007f7fef7000)
 libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007f7fed3000)
 libpcre.so.3 => /lib/aarch64-linux-gnu/libpcre.so.3 (0x0000007f7fe61000)
 /lib/ld-linux-aarch64.so.1 (0x0000007f8ba87000)
 libffi.so.6 => /usr/lib/aarch64-linux-gnu/libffi.so.6 (0x0000007f7fe49000)
 libgmodule-2.0.so.0 => /usr/lib/aarch64-linux-gnu/libgmodule-2.0.so.0 (0x0000007f7fe35000)
 libnvrm.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm.so (0x0000007f7fdf3000)
 libEGL.so.1 => /usr/lib/aarch64-linux-gnu/libEGL.so.1 (0x0000007f7fdd2000)
 libnvos.so => /usr/lib/aarch64-linux-gnu/tegra/libnvos.so (0x0000007f7fdb4000)
 libnvbuf_fdmap.so.1.0.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvbuf_fdmap.so.1.0.0 (0x0000007f7fda1000)
 libnvrm_graphics.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_graphics.so (0x0000007f7fd82000)
 libnvddk_vic.so => /usr/lib/aarch64-linux-gnu/tegra/libnvddk_vic.so (0x0000007f7fd64000)
 libnvrm_gpu.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_gpu.so (0x0000007f7fd21000)
 libnvidia-fatbinaryloader.so.32.2.0 => /usr/lib/aarch64-linux-gnu/tegra/libnvidia-fatbinaryloader.so.32.2.0 (0x0000007f7fcc3000)
 libcudnn.so.7 => /usr/lib/aarch64-linux-gnu/libcudnn.so.7 (0x0000007f68e5d000)
 libcublas.so.10.0 => /usr/local/cuda-10.0/lib64/libcublas.so.10.0 (0x0000007f634f4000)
 libcudart.so.10.0 => /usr/local/cuda-10.0/lib64/libcudart.so.10.0 (0x0000007f63483000)
 libnvdla_compiler.so => /usr/lib/aarch64-linux-gnu/tegra/libnvdla_compiler.so (0x0000007f63080000)
 libnvmedia.so => /usr/lib/aarch64-linux-gnu/tegra/libnvmedia.so (0x0000007f6301d000)
 libcrypto.so.1.1 => /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 (0x0000007f62dd8000)
 libGLdispatch.so.0 => /usr/lib/aarch64-linux-gnu/libGLdispatch.so.0 (0x0000007f62caa000)
 libnvdc.so => /usr/lib/aarch64-linux-gnu/tegra/libnvdc.so (0x0000007f62c8b000)
 libnvtvmr.so => /usr/lib/aarch64-linux-gnu/tegra/libnvtvmr.so (0x0000007f62bfc000)
 libnvparser.so => /usr/lib/aarch64-linux-gnu/tegra/libnvparser.so (0x0000007f62bc0000)
 libnvimp.so => /usr/lib/aarch64-linux-gnu/tegra/libnvimp.so (0x0000007f62bab000)

//Gst-nvinfer Symbol Table 확인 , 이미 제거했음 
$ nm /opt/nvidia/deepstream/deepstream-4.0/lib/gst-plugins/libnvdsgst_infer.so
nm: /opt/nvidia/deepstream/deepstream-4.0/lib/gst-plugins/libnvdsgst_infer.so: no symbols

//Gst-nvinfer  Symbol Table Function 확인 
$ readelf -s /opt/nvidia/deepstream/deepstream-4.0/lib/gst-plugins/libnvdsgst_infer.so
Symbol table '.dynsym' contains 329 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000000000e280     0 SECTION LOCAL  DEFAULT    9 
     2: 00000000000919e8     0 SECTION LOCAL  DEFAULT   19 
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _Znam@GLIBCXX_3.4 (2)
     4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __fxstat@GLIBC_2.17 (3)
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND g_object_new
     6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND socket@GLIBC_2.17 (3)
     7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND nvds_add_label_info_meta_
     8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sem_destroy@GLIBC_2.17 (4)
     9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.17 (3)
    10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND gst_plugin_register_stati
    11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND g_cond_clear
    12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND fchmod@GLIBC_2.17 (3)
    13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND g_queue_new
    14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND fread@GLIBC_2.17 (3)
............

//Linking Loader 설정확인  
$ cat /etc/ld.so.conf    
include /etc/ld.so.conf.d/*.conf

$ ls /etc/ld.so.conf.d/
aarch64-linux-gnu.conf  aarch64-linux-gnu_EGL.conf  aarch64-linux-gnu_GL.conf  cuda-10-0.conf  deepstream.conf  fakeroot-aarch64-linux-gnu.conf  libc.conf  nvidia-tegra.conf

$ cat /etc/ld.so.conf.d/deepstream.conf   
/opt/nvidia/deepstream/deepstream-4.0/lib

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

$ ls 
bin  doc  lib  LicenseAgreement.pdf  LICENSE.txt  README  samples  sources

$ cd ..

$ cp -a deepstream-4.0 ~/deepstream-4.0   // Source 도 수정할 것 이기때문에 복사하자.


DeepStream SDK 4.0 설정관련문서
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html

1.1 DeepStream SDK 4.0 관련정보 

  • DeepStream SDK 4.0 관련정보 
  https://developer.nvidia.com/deepstream-sdk




  • DeepStream NGC(NVIDIA GPU CLOUD) Docker 이용설치가능 
NGC가 드디어 Jetson에서도 지원가능하여 쉽게 설치 및 가능하나 이부분은 추후에 별도로 테스트를 진행하자.
  https://ngc.nvidia.com/catalog/containers/nvidia:deepstream-l4t

  • DeepStream SDK Source 및 Package Download (JetPack 이미설치)
기존처럼 동일하게  Source를 Download가능하지만, 현재는 이미 Jetpack에서 이미 설치했기때문에 필요없다.

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


  • DeepStream SDK 4.0 호환성 
DeepStream 과 각 Jetson의 호환성을 알아보자

  https://docs.nvidia.com/metropolis/deepstream/4.0/faq/index.html#page/DeepStream_FAQ/DeepStream_FAQ.html#wwpID0EIHA


  • DeepStream 관련 설치 및 기본사용법 
아래의 문서를 보면, DeepStream SDK 4.0에 설치관련된 내용이 상세히 잘 설명됨
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html


  • DeepStream SDK Development Guide 

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


2. DeepStream SDK 4.0 Sample 기본예제

  • DeepStream SDK 4.0  Sample ( Contents 설명)
설명을 쉽게해줘서  감사할 뿐이며, 점점 더 편하게 웹으로 설명이 잘 나오고 있다.

  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html#page/DeepStream_Development_Guide/deepstream_quick_start.html#wwpID0E6HA



2.1 deepstream-app  

이전 보다 다양한 Config를 제공해주고 있으며, 관련소스는 Source에서 살펴보면 된다.

현재 CSI 와 USB Interface를 사용하지 않기때문에 이것을 제외한 것들을 테스트 진행 


$ cd ~/deepstream-4.0
$ deepstream-app -c samples/configs/deepstream-app/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

2.2 deepstream-dewarper-app 

NVIDIA의 Smart Garage System에서 지원을 하는 어안렌즈를 사용한 카메라를 4개의 화면으로 펴서 보여주는 deepstream 예제를 지원해준다.
하지만 생각보다 느리며, 관련세부설정은 config_dewarper.txt 와 함께 을 살펴보자.

$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-dewarper-test/
$ make
$ ./deepstream-dewarper-app file:///home/nvidia/deepstream-4.0/samples/streams/sample_cam6.mp4 6     //config_dewarper.txt 필요 

$ deepstream-dewarper-app file:///home/nvidia/deepstream-4.0/samples/streams/sample_cam6.mp4 6   file:///home/nvidia/deepstream-4.0/samples/streams/sample_cam6.mp4 6     // Multiversion 


아래의 경우는 2 Channel 로 사용하여 총 8개의 화면으로 구성




2.3 deepstream-gst-metadata-app 

이전과 큰 차이가 없으며, metadata를 처리하는 Callback Function하지만 기존과 좀 다르게 User Metadata와 Gst-nvinfer의 Config 존재한다.

내부소스를 보면 기준이 H.264 Parse 기준으로 되어있어 Sample File을 잘 사용하며 구조가 간단하다.


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-gst-metadata-test
$ make

$./deepstream-gst-metadata-app ../../../../samples/streams/sample_720p.h264    // 실행가능 
$./deepstream-gst-metadata-app ../../../../samples/streams/sample_1080p_h264.mp4  // Error 발생 
$./deepstream-gst-metadata-app ../../../../samples/streams/sample_1080p_h265.mp4   // Error 발생 , 이유는 내부소스를 보면 파악가능 (H.264) 


2.4  deepstream-image-decode-test

MJPEG or JPEG 의 Sample을 테스트 가능하며, 상위과 비슷하므로, 소스를 보면 간단하다.

$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-image-decode-test
$ make

$./deepstream-image-decode-app ../../../../samples/streams/sample_720p.mjpeg  ../../../../samples/streams/sample_720p.mjpeg    // 실행가능 




2.5 deepstream-infer-tensor-meta-test

이전에 이와 비슷하게 프로그램을 작성을 했는데, 이렇게 쉽게 예제로 나오니, 삽질을 했다는 생각이 든다.
소스는 상단 좌측위의 자동차와 사람 정보 표시하고, 이를 표시해주면,  가장 기본이 되는 소스 같다.


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-infer-tensor-meta-test
$ export CUDA_VER=10.0
$ make

$./deepstream-infer-tensor-meta-app ../../../../samples/streams/sample_720p.h264     // 실행가능 




2.6 deepstream-nvof-test

드디어 Optical Flow 지원을 해주는 Source가 Porting되었으며, 이전에 이것을 Porting하려고 무지 애써는데, 참 헛된 짓 많이 한 것 같아 좀 그렇다.
소스를 보면 출력은 720P이며,  streammux로 처음 받기 때문에 MultiURT이 지원되므로, RTSP도 가능하다

Optical flow로 인하여, 차량의 움직임을 알수 있는데, 이전의 제공해주던 예제처럼 일반영상과 같이 제공해주는 방식이 아니므로 ,  그것은 직접 구현을 해보는 수 밖에 없겠다.


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-nvof-test
$ make
$./deepstream-nvof-app file:///home/nvidia/deepstream-4.0/samples/streams/sample_720p.h264    // 실행가능 
$./deepstream-nvof-app file:///home/nvidia/deepstream-4.0/samples/streams/sample_720p.h264 file:///home/nvidia/deepstream-4.0/samples/streams/sample_720p.h264    //2 Ch  실행가능 
$./deepstream-nvof-app file:///home/nvidia/deepstream-4.0/samples/streams/sample_720p.h264 rtsp://10.0.0.199:554/h264     //2 Ch  실행가능 
$./deepstream-nvof-app rtsp://10.0.0.199:554/h264    // 실행가능 


1 Channel / 2 Channel / RTSP와 같이 사용





2.7 deepstream-perf-demo

MUX를 소스를 보면, 720P이며,Rows 와 Column과 Tile을 사용하여 Channel 수를 설정하고이를 Play해주는 Program이다.
이름을 보면 성능을 측정해주는 부분이 어딜까 봤는데, ENABLE_PROFILING 보면 되지만, 이 부분이 define되어있지 않다.
소스를 수정하여 사용을 해보고, accumulated_base 부분을 자세히 보자
특히한 부분은  source_switch_thread 부분인데,  실시간으로 각 File들을 Switch해주는 기능으로 이부분이 주요기능같다.

filesrc (switch)-> h264parser -> nvv4l2decoder -> nvstreammux -> pgie -> sgie1
-> sgie2-> sgie3 -> nvvideoconvert -> nvdsosd -> (nvtransform) ->nveglglessink


GTC 2018의 Kubernetes
  https://www.youtube.com/watch?v=8bbtAvMAI2c


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-perf-demo 

$ vi Makefile 
ifeq ($(TARGET_DEVICE),aarch64)
  CFLAGS:= -DPLATFORM_TEGRA -DENABLE_PROFILING
endif

$ vi  ./deepstream-perf-demo.cpp   //본인이 성능측정하고 싶은 곳에 profile 함수사용 , accumulated_base 를 자세히 분석하자 
static GstPadProbeReturn eos_probe_cb(GstPad* pad, GstPadProbeInfo* info, gpointer u_data) {
.....
    if ((info->type & GST_PAD_PROBE_TYPE_BUFFER)) {
        GST_BUFFER_PTS(GST_BUFFER(info->data)) += prev_accumulated_base;

#if defined(ENABLE_PROFILING) //jhlee   정확하지 않아 추후 수정해보자. 
  if((frame_number%30) == 29){
   profile_end();
   profile_result();
  }else if((frame_number%30) == 0)
   profile_start();
        frame_number++;
#endif
    }


$ make

$ mkdir ../../../../samples/streams2 

$ cp ../../../../samples/streams/sample_720p.h264 ../../../../samples/streams2/sample_720p.h264  // 한개만 복사해도됨 

$ vi perf_demo_pgie_config.txt 
model-engine-file=../../../../samples/models/Primary_Detector/resnet10.caffemodel_b1_int8.engine
$ vi perf_demo_sgie1_config.txt
model-engine-file=../../../../samples/models/Secondary_CarColor/resnet18.caffemodel_b16_int8.engine
$ vi perf_demo_sgie2_config.txt
model-engine-file=../../../../samples/models/Secondary_CarMake/resnet18.caffemodel_b16_int8.engine
$ vi perf_demo_sgie3_config.txt
model-engine-file=../../../../samples/models/Secondary_VehicleTypes/resnet18.caffemodel_b16_int8.engine

$ export GST_DEBUG=2  //eos_probe_cb 함수의 accumulated_base 보기위함 

$ ./deepstream-perf-demo 1  1 ../../../../samples/streams2                   // Rows  Columns Stream Dir 1 Ch 반복재생 
$ ./deepstream-perf-demo 2  2 ../../../../samples/streams2                   // 4 Ch 순차 반복 재생 혼동하지말자  



  • Gstreamer DEBUG 방법
아래와 같이 Shell 변수를 이용하여 GST_DEBUG를 설정하여 기본적인 Debugging 가능하다.
     GST_DEBUG=3  or GST_DEBUG=2,nvstreammux:4

숫자의 의미
 1 | ERROR
 2 | WARNING
 3 | FIXME
 4 | INFO
 5 | DEBUG
 6 | LOG
 7 | TRACE
 8 | MEMDUMP

  https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c

Gstreamer 의 gst_pad_add_probe
  https://gstreamer.freedesktop.org/documentation/gstreamer/gstpad.html?gi-language=c#gst_pad_add_probe
  https://gstreamer.freedesktop.org/documentation/application-development/advanced/pipeline-manipulation.html?gi-language=c#page-description

GST_EVENT_X
  https://gstreamer.freedesktop.org/documentation/gstreamer/gstevent.html?gi-language=c#GstEventType


4 Channel로 만들어도, 1 Channel 씩 Swtich 되면서 재생, 결국은 1Channel 만 재생


2.8  deepstream-segmentation-test

영상을 Segmentation 해주는 DeepStream으로 MJPEG 과 JPEG에서만 동작되는 TEST이다.
특히한 것은 설정들을 보면 UFF Format 기준이다.


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-segmentation-test 
$ make

$ ./deepstream-segmentation-app dstest_segmentation_config_semantic.txt ../../../../samples/streams/sample_720p.mjpeg ../../../../samples/streams/sample_720p.mjpeg

$ ./deepstream-segmentation-app dstest_segmentation_config_industrial.txt ../../../../samples/streams/sample_720p.mjpeg ../../../../samples/streams/sample_720p.mjpeg

$ ./deepstream-segmentation-app dstest_segmentation_config_industrial.txt ../../../../samples/streams/sample_industrial.jpg   // 원본사진이 좀 독특한데, 



  • dstest_segmentation_config_semantic 설정 , mjpeg 테스트
자동차 이미지만 분리해줘서 보여준다.



  • dstest_segmentation_config_industrial 설정 , mjpeg 테스트
자동차를 분리는 못하고 보여주는데, 자세한 부분은 설정과 UFF Model 둘다 달라서 구조를 알아야겠다.



  • dstest_segmentation_config_industrial 설정 , jpeg TEST 
우측이 원본인데 보면 좌측에  얼룩이 있는데, 그 부분을 찾아낸다.



2.9 deepstream-test-1/2/3

기존과 유사하지만, 다른 점이 있다면, TEST 4번 Kafka 지원이외에 AZURE/AMQP 지원을 해준다.
이전에 이미 Kafka를 테스트를 해봤기때문에, AMQP만 테스트 해보면 될 것 같다. (AZURE는 포기)

$ cd ~/deepstream-4.0/sources/apps/sample_apps/deepstream-test1
$ make
$./deepstream-test1-app  ../../../../samples/streams/sample_720p.h264  //

$ cd ~/deepstream-4.0/sources/apps/sample_apps/deepstream-test2
$ make
$./deepstream-test2-app  ../../../../samples/streams/sample_720p.h264 

$ vi dstest2_pgie_config.txt 
model-engine-file=../../../../samples/models/Primary_Detector/resnet10.caffemodel_b1_int8.engine
$ vi dstest2_sgie1_config.txt
model-engine-file=../../../../samples/models/Secondary_CarColor/resnet18.caffemodel_b16_int8.engine
$ vi dstest2_sgie2_config.txt
model-engine-file=../../../../samples/models/Secondary_CarMake/resnet18.caffemodel_b16_int8.engine
$ vi dstest2_sgie3_config.txt
model-engine-file=../../../../samples/models/Secondary_VehicleTypes/resnet18.caffemodel_b16_int8.engine

$ cd ~/deepstream-4.0/sources/apps/sample_apps/deepstream-test3
$ make
$./deepstream-test3-app  file:///home/nvidia/deepstream-4.0/samples/streams/sample_1080p_h264.mp4   
$./deepstream-test3-app  rtsp://10.0.0.199:554/h264  


  • TEST 1/2/3 부분 거의 동일
  1. TEST1  기존과 동일하지만, 상단 좌측에 자동차와 사람의 인식수가 상위버전과 동일 (개선됨)
  2. TEST2 기존과 동일하며, TEST1의 기능에 기존 1GIE/2GIE 사용하여 Classfication 가능
  3. TEST3 기존과 동일하며, FILE 과 RTSP 지원하며 1GIE만지원 

  • TEST4의 변화 (nvmsgconv/nvmsgbroker)
이전에, Kafka만 지원가능했다면, 이제 AMQP 와 AZURE도 지원가능한데, 테스트는 Kafka와 AMQP만 하겠다.
이 부분은 lib와 같이 해야 하므로 다음에 테스트 진행





NvDsFrameMeta
  - NvDsObjectMetaList  ->  NvDsObjectMeta
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/DeepStream_Development_Guide/baggage/struct__NvDsFrameMeta.html

NvDsObjectMeta
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/DeepStream_Development_Guide/baggage/struct__NvDsObjectMeta.html

Meta 관련 구조
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/DeepStream_Development_Guide/baggage/nvdsmeta_8h_source.html

2.10 deepstream-user-metadata-test

Deepstream의 Metadata 처리 부분이 Pad probe Callback 함수가 Gst-nvosd 이외 Gst-nvinfer 가 존재하며 각각 NvDsUserMeta 처리 부분이 핵심인 소스이다.
기본적인 구조는 Objection Detection 밖에 못하지만, User Metadata를 처리를 위한 좋은 예제인 것 같다.


$ cd ~/deepstream-4.0
$ cd sources/apps/sample_apps/deepstream-user-metadata-test 
$ make

$ ./deepstream-user-metadata-app ../../../../samples/streams/sample_720p.h264 


3. DeepStream 의 Gst-plugins Build 확인 

이미 설치된 것이기 때문에, 빌드만 하고 소스만 분석을 하고 넘어가고, 만약 PlugIN을 작성해야 한다면, 이전 처럼 gst-dsexample을 참조하자.

$ cd ~/deepstream-4.0/sources/gst-plugins/gst-dsexample
$ make CUDA_VER=10.0
$ ls libnvdsgst_dsexample.so
libnvdsgst_dsexample.so

$ cd ~/deepstream-4.0/sources/gst-plugins/gst-nvinfer
$ make CUDA_VER=10.0
$ ls libnvdsgst_infer.so
libnvdsgst_infer.so

$ cd ~/deepstream-4.0/sources/gst-plugins/gst-nvmsgbroker
$ make
$ ls libnvdsgst_msgbroker.so
libnvdsgst_msgbroker.so

$ cd ~/deepstream-4.0/sources/gst-plugins/gst-nvmsgconv
$ make
$ ls libnvdsgst_msgconv.so
libnvdsgst_msgconv.so



  • DeepStream SDK 3.0 의 설치 및 실행부분과 비교 
우측메뉴에서 선택
  https://ahyuo79.blogspot.com/search/label/NVIDIA-DeepStream%20SDK%203.0


7/30/2019

JetPack 4.2.1 설치

1. NVIDIA JetPack 4.2.1 설치

JetPack 4.1.1 설치
  https://ahyuo79.blogspot.com/2019/06/jetpack-411.html

JetPack 4.2 설치 및 Jetson AGX Xavier
  https://ahyuo79.blogspot.com/2019/06/jetpack-42-jetson-agx-xavier.html
  https://ahyuo79.blogspot.com/2019/05/jetpack-42.html

  • 이전 JetPack 설치 장소 및 관리 
SDKManager가 나오면서 쉽게 설치가 가능하며, JetPack 관리도 쉬워져서 좋다.
앞으로도 4.2와 같이 한 곳에서 관리하면 될 것 같다.

//4.2 설치장소  (SDK Manager 사용)
$ cd ~/nvidia
$ tree  -L 2
.
└── nvidia_sdk
    ├── JetPack_4.2_Linux
    ├── JetPack_4.2_Linux_P2888
    └── JetPack_4.2_Linux_P3310

//4.1.1 설치장소 (./JetPack-L4T-4.1.1-linux-x64_b57.run 실행)
$ cd ~/Jetpack/jetpack4.1.1/Xavier/Linux_for_Tegra

//3.3 Jetson TX2 용 
$ ~/project/jetsonTX2


1.1 JetPack 4.2.1 설치 (SDKManger 관리)

이전 4.2 부터 SDKManger를 이용하여 설치를 진행했기때문에, 이를 이용하여 업데이트만 해줘서 쉽게 업그레이드가 가능하고, 쉽게 설치가 가능하다.

만약 JetPack이 없다면, 아래의 사이트에서 Download하고 설치하고 설치방식의 그 전하고 동일하기때문에 그전의 문서를 참조하자.

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


  • SDKManger 실행
이전에 설치된 장소에서 일단 확인하고 sdkmanger를 호출하여 update를 진행하자.

 cd ~/nvidia
~/nvidia$ sdkmanager


Update 후 쉽게 4.2.1 Version을 설치가능


Target Device도 설정만 해주면됨



1.2  Jetson AGX Xavier (Deepstream SDK 4.0)


아래와 같이 DeepStream SDK가 기본으로 포함되어 나오고 있으며,  이제 4.0 볼수가 있다.
그리고, 아래와 같이 Download & Install Option을 선택해서 상위 설치된 장소와 같은지 확인을 하자.



STEP 3으로 가기전에,  SDKmanager가 Jetson OS를 Flash를 한 후 초기화가 진행이 된다.
이때 다시 Jetson의 Ubuntu Setup을 다시 해주고, SDK Manager에서 id/pw를 넣고 진행하면, Jetson SDK Components를 설치가능하다.


상위와 같이 진행하면, 구지 Recovery Mode로 들어가지 않아도 모든 설치가 진행된다.


  • NVIDIA SDK 설치위치 재확인 

$ cd ~/nvidia/nvidia_sdk
~/nvidia/nvidia_sdk$ tree  -L 2
.
├── JetPack_4.2.1_Linux_GA
│   └── documentations
├── JetPack_4.2.1_Linux_GA_P2888    // Jetson AGX Xavier 
│   └── Linux_for_Tegra
├── JetPack_4.2_Linux
│   └── documentations
├── JetPack_4.2_Linux_P2888
│   └── Linux_for_Tegra
└── JetPack_4.2_Linux_P3310
    └── Linux_for_Tegra


  • NVIDIA NGC 지원확인 
이번 Version 부터 NGC Cloud가 지원이 되고 (이전 Version들은 x86만 지원가능)

  https://github.com/NVIDIA/nvidia-docker/wiki/NVIDIA-Container-Runtime-on-Jetson


$ sudo dpkg --get-selections | grep nvidia
[sudo] password for nvidia: 
libnvidia-container-tools   install
libnvidia-container0:arm64   install
nvidia-container-runtime   install
nvidia-container-runtime-hook   install
nvidia-docker2     install

$ sudo docker info | grep nvidia
Runtimes: nvidia runc
Name: nvidia-desktop



  • NVIDIA Jetson USB Network 주소변경 
USB CDC Module을 찾고 관련부분 설정

$ find /etc/systemd/system -name 'nv-l4t-usb-device-mode*'
/etc/systemd/system/nv-l4t-usb-device-mode.service
/etc/systemd/system/multi-user.target.wants/nv-l4t-usb-device-mode.service

$ cat /etc/systemd/system/nv-l4t-usb-device-mode.service
[Unit]
Description=Configure USB flashing port for device mode

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode.sh
ExecStop=/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-stop.sh

[Install]
WantedBy=multi-user.target

$ sudo vi /opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode.sh

# The IP address shared by all USB network interfaces created by this script.
#net_ip=192.168.55.1
net_ip=192.168.55.3
# The associated netmask.
net_mask=255.255.255.0
# The associated network address.
net_net=192.168.55.0

  https://devtalk.nvidia.com/default/topic/1039410/jetson-tx2/how-to-delete-l4tbr0-bridge/




7/24/2019

Gstreamer 의 RTSP Server 구축

1. Gstreamer 기반의 RTSP Server 구축 

  • 우선 Gstreamer 관련 Package 및 관련 Package 설치 진행 
$ sudo apt-get install \ 
     libgstreamer0.10-dev  \ 
     libgstreamer-plugins-base0.10-dev 

$ sudo apt-get install \ 
     libfontconfig1-dev \ 
     libfreetype6-dev \ 
     libpng-dev 

$ sudo apt-get install \
       libcairo2-dev \
       libjpeg-dev \
       libgif-dev 

$ sudo apt-get install libgstreamer-plugins-base1.0-dev

  • Gstreamer 와 RTSP Server library 설치 진행 (Python용도 설치)
$ 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 python-gst-1.0 python3-gst-1.0

$ sudo apt-get install gir1.2-gst-rtsp-server-1.0

1.1 Gstreamer 기반으로 RTSP Server 동작 

  • 간단하게 아래와 같이 Gstreamer 기반으로 RTSP Server를 구축 
$ gst-launch-1.0 filesrc location=./test.mp4 ! qtdemux name=demux demux.video_0 ! queue ! rtph264pay pt=96 name=pay0 demux.audio_0 ! queue ! rtpmp4apay pt=97 name=pay1 demux.subtitle_0 ! queue ! rtpgstpay pt=98 name=pay2

  • Gstreamer Plugin 관련부분 확인 
  https://gstreamer.freedesktop.org/documentation/plugins_doc.html?gi-language=c






1.2 Python 기반의 RTSP Server 구축 

7/22/2019

DeepStream SDK 3.0 와 OpenALPR

1. DeepStream SDK에 OpenALPR 기본설치 

OpenALPR (Automatic License Plate Recognition)으로 자동차 번호판 인식하는 소스이며, 내부에는 tesseract OCR을 이용하여 이를 작동한다고 한다.

  • NVIDIA Deepstream SDK 4.0 API
SDK 4.0 API Manual이 존재하며, 아직 Jetson AGX Xavier에는 해당사항은 없지만, 참고사항으로 알아두자.

  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/DeepStream_Development_Guide/baggage/modules.html

  • NVIDIA L4T Multimedia API
소스를 수정하다보면,  Mulimedia 부분의 관련된 API와 구조체를 많이 보게되어 이 부분을 참고하자.

  https://docs.nvidia.com/jetson/l4t-multimedia/group__l4t__mm__nvbuffer__group.html

  • Tesseract OCR 설치
OpenALPR은 Tesseract 기반으로 하기때문에, 기본적인 Tesseract 설치와 사용법을 알아두자

  https://ahyuo79.blogspot.com/2019/05/tesseract-ocr.html

  • OpenALPR을 이용하여 만든 시스템 
Rekorsystems 회사에서 만든 시스템인 것 같은데, 인터넷에서 있기에 관련부분

  https://www.rekorsystems.com/
  https://youtu.be/ofpxX49vdXY

-다른 동영상
  https://www.youtube.com/watch?v=w6gs10P2e1k


1.1   OpenALPR 관련소스 와 사용법  

OpenALPR (Automatic License Plate Recognition)
  https://www.openalpr.com/

OpenALPR Source
  https://github.com/openalpr/openalpr

OpenALPR 관련 Project 전부
  https://github.com/openalpr


1.2  Jetson 에 OpenALPR 설치 

Jetson AGX Xavier 에서 OpenALPR 설치하고 이를 간단하게 테스트를 진행해보자. 

$ sudo apt-get update && sudo apt-get install -y openalpr openalpr-daemon openalpr-utils libopenalpr-dev

$ sudo apt list | grep tesseract  //   현재 4.0 지원 설치확인 
libtesseract-dev/bionic 4.00~git2288-10f4998a-2 arm64
libtesseract4/bionic,now 4.00~git2288-10f4998a-2 arm64 [installed,automatic]
tesseract-ocr/bionic 4.00~git2288-10f4998a-2 arm64
tesseract-ocr-afr/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-all/bionic 4.00~git2288-10f4998a-2 all
tesseract-ocr-amh/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-ara/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-asm/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-aze/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-aze-cyrl/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-bel/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-ben/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-bod/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-bos/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-bre/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-bul/bionic 4.00~git24-0e00fe6-1.2 all
tesseract-ocr-cat/bionic 4.00~git24-0e00fe6-1.2 all
....

$ sudo apt install tesseract-ocr
$ sudo apt install libtesseract-dev
$ sudo apt install tesseract-ocr-eng   // 영어 모델
$ sudo apt install tesseract-ocr-kor   // 한글 모델

$ alpr ./test.JPG 
Error opening data file /usr/share/openalpr/runtime_data/ocr/lus.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
Failed loading language 'lus'
Tesseract couldn't load any languages!
Image file not found: test.JPG

$ sudo ln -s /usr/share/openalpr/runtime_data/ocr/tessdata/lus.traineddata /usr/share/openalpr/runtime_data/ocr/lus.traineddata

$ alpr ./test.JPG 
plate0: 10 results
    - GS00  confidence: 79.1004
    - GSH00  confidence: 78.1927
    - NGS00  confidence: 77.5058
    - NGSH00  confidence: 76.5981
    - GSD0  confidence: 76.2403
    - GSHD0  confidence: 75.3326
    - HGS00  confidence: 75.3263
    - GSO0  confidence: 75.1033
    - NGSD0  confidence: 74.6456
    - HGSH00  confidence: 74.4186

# Test US plates
$ wget http://plates.openalpr.com/ea7the.jpg
$ alpr -c us ea7the.jpg

# Test European plates
$ wget http://plates.openalpr.com/h786poj.jpg
$ alpr -c eu h786poj.jpg

$ ls /etc/openalpr/
alprd.conf  openalpr.conf

$ ls  /usr/share/openalpr/config/
alprd.defaults.conf  openalpr.defaults.conf

$ vi  /usr/share/openalpr/config/openalpr.defaults.conf         // debug 옵션 및 기타 설정가능
.....
debug_general         = 0
debug_timing          = 0
debug_detector        = 1
debug_prewarp         = 0
debug_state_id        = 0
debug_plate_lines     = 1
debug_plate_corners   = 0
debug_char_segment    = 0
debug_char_analysis   = 0
debug_color_filter    = 0
debug_ocr             = 1
debug_postprocess     = 0
debug_show_images     = 0
debug_pause_on_frame  = 0



OpenALPR 설치 및 기본사용법
  http://doc.openalpr.com/compiling.html
  http://doc.openalpr.com/on_premises.html


2. Deepstream SDK 3.0 과 OpenALPR  테스트 

OpenALPR을 가지고, Deepstream의 Gst-Plugin을 추가하여 사용되는 소스가 존재하며, 이를 간단하게 진행해보면, 빌드가 되지 않는데, 이 소스가 DeepStream SDK 1.0 기준으로
작성되어 동작되지 않는 것 같다.

Deepstream SDK의  Gstreamer OpenALPR PlugIn
  https://github.com/openalpr/deepstream_jetson


$ cd ~ 
$ git clone https://github.com/openalpr/deepstream_jetson
$ cd deepstream_jetson

$ make   //
gstdsexample.h:21:10: fatal error: nvbuf_utils.h: No such file or directory

$ vi Makefile   // Deepstream SDK의 Version이 다르며, 1.0과 호환되는 것 같다. 

#CFLAGS+= \
#  -I../nvgstiva-app_sources/nvgstiva-app/includes 
CFLAGS+= \
  -I../deepstream_sdk_on_jetson/sources/includes

$ make   //  Deepstream SDK Version이 맞지 않아 빌드가 되지 않는다.
gstdsexample.h:22:10: fatal error: gstnvivameta_api.h: No such file or directory


DeepSream SDK 1.0 관련내용
  https://tech-blog.abeja.asia/entry/deepstream-sdk-jetson


2.1 Commerical OpenALPR Porting (유료버전) 

DeepStream SDK 3.0에서도 동일하게 gst-dsexample을 제공하고 있으며, 이 소스를 변경하여 테스트를 진행해보자.
간단히 소스를 분석하면, Commercial OpenALPR의 소스를 사용하고 있어, 이에 관련된 SDK도 필요하며, 사용하고 싶다면 상용버전을 사야할 것 같지만, 일단 무료로 다운받아보고 설치해보자.

  • Commercial OpenALPR SDK 설치 
$ sudo apt install curl
$ bash <(curl -s https://deb.openalpr.com/install)


아래와 같이 선택해서 설치하자.


  1. install _webserver :  현재설치시 에러 발생 
  2. install_agent : 설치완료 
  3. install_sdk : 설치완료
  4. install_nvidia: 설치완료
Commercial Vesion
  http://doc.openalpr.com/sdk.html#linux

  • gst-dsopenaplr 기본구성 
dsopenalpr_lib만  복사하여 gst-dsexample에 넣고 유사하게 Makefile과 다른 소스도 수정하여 빌드를 진행을 하자
소스을 두 소스를 비교를 해서 수정을 많이 해야한다.

$ cp -a ../deepstream_sdk_on_jetson/sources/gst-plugins/gst-dsexample ../deepstream_sdk_on_jetson/sources/gst-plugins/gst-openaplr
$ cp -a dsopenalpr_lib ../deepstream_sdk_on_jetson/sources/gst-plugins/gst-openaplr/
$ cd ~/deepstream_sdk_on_jetson/sources/gst-plugins/gst-openaplr
$ rm -rf dsexample_lib 

소스를 수정하여 구성해도, 내부함수가 라이센스 키가 없으면, 아무런 동작하지 않기때문에 다른방법을 찾아봐야겠다. 유료버전을 사용한다면 이렇게 구성해서 사용하도록하자.


OpenALPR 의 Commercial Version의 장점
  http://doc.openalpr.com/opensource.html#commercial-enhancements

2.2  OpenALPR을 gst-dsexample 연결 ( 무료 )

상위와 같이 DeepStream SDK 3.0의 gst-dsexample을 이용하여 비슷하게 구성하고, 소스를 전부 분석하여 본인이 직접 만들어나가는 수 밖에 없을 것 같다.

상위 OpenALPR의 소스분석하면 실행파일관련 파일들을  찾을 수 있지만, 이것들을 전부 빌드하여 넣어 동작시키기가 쉽지않다.
그래서 이 방법보다는 이를 분석해서 내가 만든것이 왠지 더 나을 것 같다.

  https://github.com/openalpr/openalpr/tree/master/src/openalpr
  https://github.com/openalpr/openalpr/blob/master/src/openalpr/alpr.cpp

아래의 구성으로 이 함수를 참조하여 오픈소스로 다시 해보자.
  http://doc.openalpr.com/opensource.html#developers-guide



2.3  OpenALPR Cloud API 연결방법 (무료/유료)

OpenALPR의 Cloud가 제공하고 있으며, 간단하게 Cloud API로 연결하여 그림파일을 전송하면되는 방식이다.

  • OpenALPR Cloud API 테스트 진행 
아래의 사이트에서 자동차 사진을 가지고 있다면, OpenALPR을 Cloud API을 이용하여 테스트 가능하며, 월 1000개까지 무료인 것 같다.
  http://www.openalpr.com/cloud-api.html


  • OpenALPR Cloud API 사용방법 
각 Shell / Python / C#을 이용하여 Cloud API 예제를 제공하고 있으므로, 이부분을 참조하자.
  http://doc.openalpr.com/cloud_api.html

7/19/2019

DeepStream SDK 3.0 Kafka 연결

1. DeepStream SDK 3.0 Msg 관련부분 설정 및 테스트


  • 기본설치방법

아래링크의-DeepStream SDK 3.0 설치 참조
  https://ahyuo79.blogspot.com/2019/06/deepstream-sdk-30-jetpack-42-411.html


NVIDIA msgbroker 관련부분
  https://devtalk.nvidia.com/default/topic/1048534/deepstream-for-tesla/deepstream-test4-app-stalled-after-the-first-few-frames/
 https://devtalk.nvidia.com/default/topic/1044365/deepstream-for-tesla/using-kafka-protocol-for-retrieving-data-from-a-deepstream-pipeline-/

NVIDIA Analytic Server ( Smart PArking Sytstem)
  https://github.com/NVIDIA-AI-IOT/deepstream_360_d_smart_parking_application/

Kafka Site
  https://kafka.apache.org/intro.html

Apach Kafka 구조 파악
  https://epicdevs.com/17
  https://www.joinc.co.kr/w/man/12/Kafka/chatting

1.1 DeepStream SDK 3.0 TEST 4 부분 

아래 링크의 3.4 Deepstream TEST 4 (Kafka) 부분 다시 참조
  https://ahyuo79.blogspot.com/2019/06/deepstream-sdk-30-jetpack-42-411.html



$ vi deepstream_test4.app.c 
#define PROTOCOL_ADAPTOR_LIB  "/usr/lib/aarch64-linux-gnu/tegra/libnvds_kafka_proto.so"
#define CONNECTION_STRING "127.0.0.1;9092;dsapp2"

  1. 우선 아래의 Kafka를 설치
  2. 설치완료 후 dsapp2의 topic 생성
  3. 상위 수정된 소스 make 후 deepstream-test4-app 실행 
  4. 상위 topic으로 받은 메시지를 bin/kafka-console-consumer.sh 이용하여 확인 


이 소스는 Gst-msgconv 와 Gst-msgbroker 를 같이 사용하는 예제이다.
Gst-msgconv는 현재 config file을 별도로 지정하여 dstest4_msgconv_config.txt 설정하고 이 설정에 해당하는 소스부분이 상위 소스에 있다.
Gst-msgbroker 는 받은 metadata를 Kafka에게 전송하는 역할이며, 현재 모두 JSON Format이다.

$ cd /usr/local/kafka
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic dsapp2 --from-beginning            //deepstream-test4-app 이 보낸 metadata 를 json으로 보냄 
{
  "messageid" : "220a8cea-9dc5-448c-8da6-cc9998a5fefe",
  "mdsversion" : "1.0",
  "@timestamp" : "2019-07-22T02:01:54.067Z",
  "place" : {
    "id" : "1",
    "name" : "XYZ",
    "type" : "garage",
    "location" : {
      "lat" : 30.32,
      "lon" : -40.549999999999997,
      "alt" : 100.0
    },
    "aisle" : {
      "id" : "walsh",
      "name" : "lane1",
      "level" : "P2",
      "coordinate" : {
        "x" : 1.0,
        "y" : 2.0,
        "z" : 3.0
      }
    }
  },
  "sensor" : {
    "id" : "CAMERA_ID",
    "type" : "Camera",
    "description" : "\"Entrance of Garage Right Lane\"",
    "location" : {
      "lat" : 45.293701446999997,
      "lon" : -75.830391449900006,
      "alt" : 48.155747933800001
    },
    "coordinate" : {
      "x" : 5.2000000000000002,
      "y" : 10.1,
      "z" : 11.199999999999999
    }
  },
  "analyticsModule" : {
    "id" : "XYZ",
    "description" : "\"Vehicle Detection and License Plate Recognition\"",
    "source" : "OpenALR",
    "version" : "1.0",
    "confidence" : 0.0
  },
  "object" : {
    "id" : "db521849-00f8-44f6-b20c-daf3111b6ccd",
    "speed" : 0.0,
    "direction" : 0.0,
    "orientation" : 0.0,
    "vehicle" : {
      "type" : "sedan",
      "make" : "Bugatti",
      "model" : "M",
      "color" : "blue",
      "licenseState" : "CA",
      "license" : "XX1234",
      "confidence" : 0.0
    },
    "bbox" : {
      "topleftx" : 0,
      "toplefty" : 0,
      "bottomrightx" : 0,
      "bottomrighty" : 0
    },
    "location" : {
      "lat" : 0.0,
      "lon" : 0.0,
      "alt" : 0.0
    },
    "coordinate" : {
      "x" : 0.0,
      "y" : 0.0,
      "z" : 0.0
    }
  },
  "event" : {
    "id" : "b63d0d65-eaf8-44c5-be51-979a009f8a33",
    "type" : "moving"
  },
  "videoPath" : ""
}
....   // Ctrl+C 로 정지 



2.  Apache Kafka 설치 작업 및 테스트 

Apache Kafka를 설치를 위해서 Apache Zookeeper가 필요하기에 아래와 같이 설치하다.

  • apt update 와 Java JDK or default-jre 설치 
Kafka 설치를 위해 JDK or JRE설치

$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk


2.1 Apache zookeeper  기본설치


zookeeper site
  https://zookeeper.apache.org/releases.html

package download
  https://www-eu.apache.org/dist/zookeeper/
  http://www-us.apache.org/dist/zookeeper
  http://apache.mirror.globo.tech/zookeeper


  • zookeeper 설치 (apt 이용)
$ sudo apt-get install zookeeperd

$ find / -name zkServer.sh 2> /dev/null 
/usr/share/zookeeper/bin/zkServer.sh


  • package download 설치 
package로 설치하면 /usr/share 에 존재하는 것 같아  /usr/local/변경

$ wget https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
$ tar zxvf zookeeper-3.4.14.tar.gz
$ sudo mv zookeeper-3.4.14/ /usr/local/zookeeper
$ sudo chown -R root:root /usr/local/zookeeper

$ find / -name zkServer.sh 2> /dev/null      // 좀더 최신 version이라 좀 다르다.
/usr/local/zookeeper/zookeeper-contrib/zookeeper-contrib-rest/src/test/zkServer.sh
/usr/local/zookeeper/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zkServer.sh
/usr/local/zookeeper/zookeeper-client/zookeeper-client-c/tests/zkServer.sh
/usr/local/zookeeper/bin/zkServer.sh
/usr/local/zookeeper/zookeeper-recipes/zookeeper-recipes-lock/src/main/c/tests/zkServer.sh
/usr/local/zookeeper/zookeeper-recipes/zookeeper-recipes-queue/src/main/c/tests/zkServer.sh


2.2 Apache Zookeeper  Service 등록 

사용하기 편하기 위해서 아래와 같이 systemd에 Service로 등록을 한다.

  • systemd 에 zookeeper.service 등록 

$ sudo vi /etc/systemd/system/zookeeper.service
[Unit]
Description=zookeeper-server
After=network.target

[Service]
Type=forking
User=root
Group=root
SyslogIdentifier=zookeeper-server
WorkingDirectory=/usr/share/zookeeper
Restart=on-failure
RestartSec=0s
ExecStart=/usr/share/zookeeper/bin/zkServer.sh start
ExecStop=/usr/share/zookeeper/bin/zkServer.sh stop


  • system service 등록 및 확인 

$ sudo systemctl daemon-reload
$ sudo systemctl enable zookeeper.service
$ sudo systemctl start zookeeper.service
$ sudo systemctl status zookeeper.service


  • zookeeper 상태체크

$ netstat -nlp|grep 2181
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::2181                 :::*                    LISTEN      -  

$ sudo /usr/share/zookeeper/bin/zkServer.sh status     
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Error contacting service. It is probably not running.

or 

$ echo status | nc 127.0.0.1 2181
Zookeeper version: 3.4.10-3--1, built on Sat, 03 Feb 2018 14:58:02 -0800
Clients:
 /127.0.0.1:45894[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 3
Sent: 2
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4


2.3  Apache Kafka 관련 설치 및 서비스 등록 


Apache Kafka
  https://kafka.apache.org/

Package download (지원되는 Version확인)
  https://www-eu.apache.org/dist/kafka
  http://www-us.apache.org/dist/kafka
  http://apache.mirror.globo.tech/kafka


Download하면서 Version이 혼동이 되었는데, 아래 사이트에서 정확하게 알게되었다.
Kafka가 Scala 언어로 개발되었는데,  호환성문제로 Java로 이식되었다고 한다.
Version 은  File에서 두개로 표시를 한다

e.g kafka/2.2.1/kafka_2.12-2.2.1.tgz  (Scala:2.12 , Kafka:2.2.1)

현재 Download 하는 사이트들을 보니 현재는 Kafka 2.x.x 만 지원을 하고 있어서 이 기준으로 변경


  • Kafka Download 및 기본 테스트 진행 

$ wget http://www-us.apache.org/dist/kafka/2.2.1/kafka_2.12-2.2.1.tgz  //download 가능 

$ tar zxvf kafka_2.12-2.2.1.tgz
$ sudo mv kafka_2.12-2.2.1 /usr/local/kafka

$ cd /usr/local/kafka

$ vi config/server.properties     // Log Data 설정된 장소확인 및 변경 
log.dirs=/tmp/kafka-logs/

상위 log.dirs 은 만약 topic를 생성하면 이곳에서 관련 data를 확인이 가능하다.


  • Kafka Service 등록 

$ sudo vi  /etc/systemd/system/kafka.service          // 새로운 File 생성 
[Unit]
Description=kafka-server
After=network.target

[Service]
Type=simple
User=root
Group=root
SyslogIdentifier=kafka-server
WorkingDirectory=/usr/local/kafka
Restart=no
RestartSec=0s
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh

$ systemctl daemon-reload
$ systemctl enable kafka.service
$ systemctl start kafka.service
$ systemctl status kafka.service



  • Kafka 동작확인

$ sudo apt install lsof 
$ sudo lsof -i :2181                       //Zookeeper 만 동작될 때 
COMMAND   PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    18819 zookeeper   43u  IPv6 759187      0t0  TCP *:2181 (LISTEN)

$  sudo lsof -i :2181      //Zookeeper 와 Kafka 동작될 때 
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    22350 nvidia  109u  IPv6 767085      0t0  TCP *:2181 (LISTEN)
java    22350 nvidia  110u  IPv6 761679      0t0  TCP localhost:2181->localhost:46018 (ESTABLISHED)
java    22675 nvidia  109u  IPv6 766151      0t0  TCP localhost:46018->localhost:2181 (ESTABLISHED)



2.4  Kafka TEST 방법 

Kafka는 File기반으로 Topic을 만들고,  이를 통신하는 구조라고 한다.
아래과 같이 새로운 testTopic을 만들고 이를 MSG를 전송해보고 받아보자.

  • Kafka에서 testTopic 생성 및 확인

$ cd /usr/local/kafka
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testTopic
Created topic "testTopic".

$ bin/kafka-topics.sh --list --zookeeper localhost:2181     // 생성된 list
testTopic

$ ls //tmp/kafka-logs/     // testTopic 확인 
..
testTopic-0/               


  • Kafka로 MSG 전송 (testTopic)

$ cd /usr/local/kafka
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic    
>Welcome to kafka
>This is my first topic      // Ctrol+c 


  • Kafka에서 받은 메시지 확인  (testTopic)

$ cd /usr/local/kafka
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testTopic --from-beginning
Welcome to kafka
This is my first topic


Kafka 설치방법들
  https://zzsza.github.io/data/2018/07/24/apache-kafka-install/
  https://tecadmin.net/install-apache-kafka-ubuntu/
  https://linuxhint.com/install-apache-kafka-ubuntu/
  https://jwon.org/install-kafka-on-ubuntu/
  https://www.digitalocean.com/community/tutorials/how-to-install-apache-kafka-on-ubuntu-18-04


2.5  systemctl 사용법 

  • systemd default target 확인

$ systemctl get-default
multi-user.target

$ sudo systemctl set-default graphical.target  // X-Windows Log In 변경 

$ systemctl get-default
graphical.target


  • systemd target list 확인

$ systemctl list-units --type target
UNIT                  LOAD   ACTIVE SUB    DESCRIPTION              
basic.target          loaded active active Basic System             
bluetooth.target      loaded active active Bluetooth                
cryptsetup.target     loaded active active Encrypted Volumes        
getty.target          loaded active active Login Prompts            
graphical.target      loaded active active Graphical Interface      
local-fs-pre.target   loaded active active Local File Systems (Pre) 
local-fs.target       loaded active active Local File Systems       
multi-user.target     loaded active active Multi-User System        
network-online.target loaded active active Network is Online        
network.target        loaded active active Network                  
nfs-client.target     loaded active active NFS client services      
paths.target          loaded active active Paths                    
remote-fs-pre.target  loaded active active Remote File Systems (Pre)
remote-fs.target      loaded active active Remote File Systems      
slices.target         loaded active active Slices                   
sockets.target        loaded active active Sockets                  
sound.target          loaded active active Sound Card               
swap.target           loaded active active Swap                     
sysinit.target        loaded active active System Initialization    
time-sync.target      loaded active active System Time Synchronized 
timers.target         loaded active active Timers                   

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.


  • systemd default target 확인

$ systemctl get-default
multi-user.target

$ systemctl get-default
graphical.target

systemctl 사용법
  https://www.lesstif.com/pages/viewpage.action?pageId=24445064


System Service 등록방법
  https://fmd1225.tistory.com/93
  https://pinedance.github.io/blog/2017/09/12/Ubuntu-16.04-system-service-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0



7/16/2019

Fine Tuning 과 Transfer Learning 관련자료

NVIDIA에서 제공하는 Model 혹은 다양하게 제공되어지는 AI Model들은 특정목적으로 이미 Train 된 상태이다. 
이것을 각각의 사용자, 유저가 원하는 AI Model로 변경하는 것을 Transfer Learning이라고 한다.
한마디로, 기존의 AI Model에서 retrain 을 해서 각 사용자가 원하는 결과를 얻고자 하는 것이다.
그래서 Fine Turning 과 Transfer learning 항상 같이 다니는 용어와 같다. 

  • Transfer learning: Retrain을 하여 Model을 약간 다른목적으로도 사용가능 
  • Fine Tuning : 좀 더 세밀하게 traning 하도록 설정하여 변경 

Transfer Learning의 예 (DNN Model)

Tensorflow 기반의 Transfer Learning 

Pythoch 기반의 Transfer Learning 
  http://incredible.ai/artificial-intelligence/2017/05/13/Transfer-Learning/

NVIDIA에서 제공하는 Transfer Learning Toolkit 
  https://devblogs.nvidia.com/accelerating-video-analytics-tlt/

7/12/2019

Video Annotation Tool(VATIC)

Video Annotation Tool

VATIC(Video Annotation Tool from Irvine, California) 이라고 부르며, 무료로 제공해주는 Video Annotation Tool 이다.
VATIC은 Ubuntu기반에서 Apache 2.2 HTTP Server 와 MySQL를 설치된 상태에서 테스트가 가능하다고 한다.

$ git clone https://github.com/cvondrick/vatic
$ cd vatic 
$ ./vatic-install.sh  // 필요한 Package 설치 (python, mysql), 

$ cat ./vatic-install.sh  // Shell Script 확인 
sudo apt-get install -y git python-setuptools python-dev libavcodec-dev libavformat-dev libswscale-dev libjpeg62 libjpeg62-dev libfreetype6 libfreetype6-dev apache2 libapache2-mod-wsgi mysql-server-5.1 mysql-client-5.1 libmysqlclient-dev gfortran 

sudo easy_install -U SQLAlchemy wsgilog pil cython mysql-python munkres parsedatetime argparse
sudo easy_install -U numpy

git clone https://github.com/cvondrick/turkic.git
git clone https://github.com/cvondrick/pyvision.git
git clone https://github.com/cvondrick/vatic.git

cd turkic
sudo python setup.py install
cd ..

cd pyvision
sudo python setup.py install
cd ..

echo "*****************************************************"
echo "*** Please consult README to finish installation. ***"
echo "*****************************************************"


$ dpkg -l python-setuptools python-dev libavcodec-dev libavformat-dev libswscale-dev libjpeg62 libjpeg62-dev libfreetype6 libfreetype6-dev apache2 libapache2-mod-wsgi mysql-server-5.1 mysql-client-5.1 libmysqlclient-dev gfortran  

+++-===========================-==================-==================-============================================================
un  apache2                                               (설명 없음)
un  gfortran                                              (설명 없음)
ii  libfreetype6:amd64          2.6.1-0.1ubuntu2.3 amd64              FreeType 2 font engine, shared library files
ii  python-dev                  2.7.12-1~16.04     amd64              header files and a static library for Python (default)
ii  python-setuptools           20.7.0-1           all                Python Distutils Enhancements
dpkg-query: no packages found matching libavcodec-dev
dpkg-query: no packages found matching libavformat-dev
dpkg-query: no packages found matching libswscale-dev
dpkg-query: no packages found matching libjpeg62
dpkg-query: no packages found matching libjpeg62-dev
dpkg-query: no packages found matching libfreetype6-dev
dpkg-query: no packages found matching libapache2-mod-wsgi
dpkg-query: no packages found matching mysql-server-5.1
dpkg-query: no packages found matching mysql-client-5.1
dpkg-query: no packages found matching libmysqlclient-dev


How to install Vatic tool
  https://glentimemaker.github.io/Install-and-Use-Vatic-Annotation-Tool/

VATIC(Video Annotation Tool from Irvine, California) 활용
  http://www.cs.columbia.edu/~vondrick/vatic/

VATIC Source
  https://github.com/cvondrick/vatic

7/11/2019

Deepstream SDK 3.0 자료정리 와 Gstreamer 관련부분정리

1. Deepstream SDK 3.0 자료정리 


DeepStream 과 Could or Server  연결되어 구성이 되며, Server/Cloud는 Deepstream 정보를 분석하는 기능으로 이를 반영하여 통계를 낸다.




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

Accelerate Video Analytics Development with DeepStream 2.0
  https://devblogs.nvidia.com/accelerate-video-analytics-deepstream-2/?ncid=so-int-dmsk20ntllh-43648

Multi-Camera Large-Scale Intelligent Video Analytics with DeepStream SDK
  https://devblogs.nvidia.com/multi-camera-large-scale-iva-deepstream-sdk/
  https://devblogs.nvidia.com/intelligent-video-analytics-deepstream-sdk-3-0/

NVIDIA Smart Parking System 관련소스
  https://github.com/NVIDIA-AI-IOT/deepstream_360_d_smart_parking_application/tree/master/analytics_server_docker
  https://github.com/NVIDIA-AI-IOT/deepstream_360_d_smart_parking_application/tree/master/ui


NVIDIA DeepStream FAQ
  최근에 만들어졌으며, 궁금한것들이 잘 정리되어있다.
  https://developer.nvidia.com/deepstream-faq


2. Jetson Xavier 의 Gstreamer 정리  

NVIDIA 에서제공하는 Gstreamer 관련기능 확인

NVIDIA Gstreamer 관련 Manual
  https://developer.download.nvidia.com/embedded/L4T/r24_Release_v2.1/Docs/Accelerated_GStreamer_User_Guide_Release_24.2.1.pdf?Dsg5YTViV_i5SxRbavlm3R7FqNVkipeBaAerYDWgbrzpG_PGcUsOBUFf-tRmfM8oTzP1cVkFoKWd377iX2XFDoch9j9QcTG5-81dXNzyHAmEsyNn9mSbUsHK3tztpzwhFhQ7NLkzLPyHeb8k6vKxNg1pNLdk_XXK5x-BxvKNf2oh3M8C7LuMBT1-ZA5mwJPcdOvuJLA


2.1 get-inspect 사용방법 

NVIDIA에서 제공하는 Gstreamer의 PlugIn들을 확인을 해보자

  • Gstreamer PlugIn 모든기능확인 
Gstreamer에서 제공하는 모든 PlugIn 와 그의 기능을 확인가능하다.

$ gst-inspect-1.0 -a   // 모든 PlugIn 확인가능    
.......
$ gst-inspect-1.0 -a |  grep dsexample
......


  • Gstreamer 특정 PlugIn 분석 

Gstreamer의 특정 PlugIn 정보를 넣고 아래와 같이 확인하자.

$ gst-inspect-1.0 dsexample    // PlugIn 기능확인 
nvbuf_utils: Could not get EGL display connection
Factory Details:
  Rank                     primary (256)
  Long-name                DsExample plugin
  Klass                    DsExample Plugin
  Description              Process a 3rdparty example algorithm on objects / full frame
  Author                   Shaunak Gupte 

Plugin Details:
  Name                     nvdsexample
  Description              NVIDIA example plugin for integration with DeepStream on Jetson
  Filename                 /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvdsexample.so
  Version                  1.0
  License                  Proprietary
  Source module            dsexample
  Binary package           NVIDIA DeepStream 3rdparty IP integration example plugin
  Origin URL               http://nvidia.com/

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstBaseTransform
                         +----GstDsExample

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-raw(memory:NVMM)
                 format: { (string)NV12, (string)RGBA }
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]
  
  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw(memory:NVMM)
                 format: { (string)NV12, (string)RGBA }
                  width: [ 1, 2147483647 ]
                 height: [ 1, 2147483647 ]
              framerate: [ 0/1, 2147483647/1 ]

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
  SINK: 'sink'
    Pad Template: 'sink'
  SRC: 'src'
    Pad Template: 'src'

Element Properties:
  name                : The name of the object
                        flags: readable, writable
                        String. Default: "dsexample0"
  parent              : The parent of the object
                        flags: readable, writable
                        Object of type "GstObject"
  qos                 : Handle Quality-of-Service events
                        flags: readable, writable
                        Boolean. Default: false
  unique-id           : Unique ID for the element. Can be used to identify output of the element
                        flags: readable, writable
                        Unsigned Integer. Range: 0 - 4294967295 Default: 15 
  processing-width    : Width of the input buffer to algorithm
                        flags: readable, writable
                        Integer. Range: 1 - 2147483647 Default: 640 
  processing-height   : Height of the input buffer to algorithm
                        flags: readable, writable
                        Integer. Range: 1 - 2147483647 Default: 480 
  full-frame          : Enable to process full frame or disable to process objects detected by primary detector
                        flags: readable, writable
                        Boolean. Default: true

상위기능을 간단히 분석해보면 다음과 같다.

  1. FilenameGstreamer의 이 PlugIn 위치확인
  2. Pad Templates :  PAD의 특성을 확인가능
  3. Availability :  PAD의 사용가능여부 (Always)
  4. Capabilities : PAD의 속성으로 보통 영상에서는 filter라고 생각하면됨 ( 설정이 다양함)
  5. Pads:  일반적으로는 두개의 PAD (src/sink)를 가지지만, 그 이상을 가질수도 있다. 
  6. Element Properties : 외부에서 줄수 있는 옵션으로 Command에서  이 옵션을 설정가능(name, parent,qos는 거의 동일하므로, 이를 제외하고 설정)  

GST-Inspect  Manual
  https://gstreamer.freedesktop.org/documentation/tools/gst-inspect.html?gi-language=c

2.2 Gstreamer  기본 영상재생  

Gstreamer의 command tool 인 gst-launch를 이용하여 NVIDIA에서 제공하는 PlugIn들을 테스트 진행을 해보자.

gst-launch 사용법
  https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gi-language=c


  • 각  PlugIn 간략설명 
  1. decodebin :  h264/mpeg4 를 decode 해주는 plugin  (omxh264dec 및 다른것으로 대체가능)
  2. uridecodebin:  decodebin기능을 포함하며, multiuri를 지원 ( RTSP:// , FILE://
  3. nvoverlaysink : 화면전체로 출력하며, Window창 기준이 아님 
  4. nveglglessink: X Window 창 기준으로 출력하지만, nvegltransform 이 필요함
  5. nvosd : RGBA기준으로 동작이 되며, 기본이 NV12이므로 이전에 nvvidconv 로 변환필요 


  • MP4/ H.264  decoding 후 기본영상재생  
// X Window 창으로 Play (OPENGL사용)
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin ! nvegltransform  ! nveglglessink

//전체화면 Play 
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin ! nvoverlaysink

  • MP4/ H.264  decoding 후 OSD를 걸쳐 기본영상재생  
OSD를 사용하는 이유는 NV12->RGBA로 변환하여 이를 적용할 것들을 적용하기위함이다.

//  OSD를 걸쳐 X Window 창으로 Play (OPENGL사용)
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin !  nvvidconv ! nvosd ! nvegltransform  ! nveglglessink

//  OSD를 걸쳐 전체화면 Play 
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin !  nvvidconv ! nvosd ! nvoverlaysink


2.3 Gstreamer  Deconding 후 Encoding 방법 

말이 좀 어려운데, 한마디로 Transcoding or  본인이 본 영상을 Recording 하는 방법이 될 것이다
Encoding된 영상의 품질은 아래의 omxh264enc에서 설정으로 다양하게 변경가능하다.

  • H.264로 Transcoding 
 화면재생은 안되며, H.264로 Transcoding 함

$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin ! omxh264enc !  h264parse ! qtmux ! filesink location=test.mp4  


  • 화면재생 과 H.264 Encoding 동시작업
이 작업을 하기위해서는 tee라는 stream을 분기하는 plugin을 사용하여 아래와 같이 두개로 나눠 재생과 H.264 Encoding 작업을 하자

decodebin 이후 tee로 2개로 분기하여 화면재생 과 H.264 Encoding 동시 진행

$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin !  tee name=t ! queue ! nvegltransform ! nveglglessink t. !  omxh264enc !  h264parse ! qtmux  ! filesink location=test.mp4

qtmux 관련사항( audio/video를 merge하여 QuickTime Format *.mov)
  https://gstreamer.freedesktop.org/documentation/isomp4/qtmux.html?gi-language=c

tee 를 이용한 2 Channel 사용
  https://gstreamer.freedesktop.org/documentation/coreelements/tee.html?gi-language=c

  • nvinfer 와 nvosd를 적용 후 화면재생과 H.264 Encoding 동시작업 
상위와 동일한 기능이라 동일할거라고 생각하지만 다소 복잡하다.

nvosd 이후로 tee로 2개로 분기하며  화면재생과 H.264 Encoding 진행해서 Encoding을 한다
또 다른점은 nvosd를 걸쳐서, nvvidconv를 다시 한번 사용해줘야 framerate 조절이 되며, 이부분을 삭제하며 동영상이 빨리 재생되는 문제가 발생한다.

// nvosd 이후로 tee로 2개로 분기하여 화면재생 과 H.264 Encoding 동시진행   
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 !  decodebin ! nvinfer config-file-path= config_infer_primary_ssd.txt ! nvvidconv ! nvosd ! tee name=t ! queue ! nvegltransform ! nveglglessink t. ! queue ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420'  ! omxh264enc !  h264parse ! qtmux  ! filesink location=test.mp4

// nvosd 이후로 tee로 2개로 분기하여 화면재생 과 H.264 Encoding 동시진행  ( 상위와 동일하지만, capsfileter 부분제거) 
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! decodebin ! nvinfer config-file-path= config_infer_primary_ssd.txt ! nvvidconv ! nvosd ! tee name=t ! queue ! nvegltransform ! nveglglessink t. ! queue ! nvvidconv ! omxh264enc !  h264parse ! qtmux  ! filesink location=test.mp4

상위와 비슷하게 구성을 했지만, 오작동되는 부분을 간략정리

//nvosd에서 직접 tee로 나누어 이를 저장했더니 gstreamer 재생시는 문제가 없으나, 다른 Player에서 재생속도가 너무빠르다.
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 !  decodebin ! nvinfer config-file-path= config_infer_primary_ssd.txt ! nvvidconv ! nvosd ! tee name=t ! queue ! nvegltransform ! nveglglessink t. ! queue ! omxh264enc control-rate=1 ! 'video/x-h264,stream-format=(string)byte-stream' ! filesink location=test.mp4

//nvosd 를 걸치지 않아, bbox 표시가 되지 않는다.
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 !  decodebin ! nvinfer config-file-path= config_infer_primary_ssd.txt ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! omxh264enc ! h264parse ! qtmux ! filesink location=test.mp4


  • PlugIn 의 capsfilter 의 역할
PAD에 상위에 보면 Capabilities 보면 두개의 Format을 지원하고 있으며, 이때 강제적으로 Format 혹은 video의 종류를 변경해줘야 할 경우 사용하는 것이 이 PlugIn의 역할될 것이다.
정의를 하여 오작동을 방지하는 것이 맞고, 강제로 변경도 가능하므로, 이 부분을 알아두자.

사용방법
  1. capsfilter caps=video/x-raw,format=GRAY8     :  다 정의하고 사용 
  2. video/x-raw,format=GRAY8                                      :  필요부분만 정의
  3. 'video/x-raw(memory:NVMM), format=NV12'  :  필요부분만 정의 ''는 ()때문에 필요 
  4. 'video/x-raw(memory:NVMM), format=RGBA'
이 기능은 연결된 PlugIn을 상위에서 처럼 gst-inspec로 반드시 확인하고 사용하며, 만약 지원되지 않는 것이라면, 무시되니 걱정말자.

  https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/gstreamer-plugins-capsfilter.html
  https://gstreamer.freedesktop.org/documentation/videoconvert/index.html?gi-language=c


2.4  Gstreamer의 nvinfer를 적용 (Deepstream) 
X-Window 화면 창으로 구성하기위해서 아래와 같이 nveglglessink만 사용하겠으며, 본인이 좀 더 세부적인 설정을 원하면, 위치와 크기도 조절가능하다.

nvinfer를 적용하기위해서는 config-file-path가 필요하므로, 위치와 본인이 실행하고자하는 gstreamer를 실행해보자.

Command로만 실행을 하면 Deepstream이 제대로 동작이 되지 않으며, 이유는 이전에도 설명했듯이 Callback Function 의 Metadata 처리 부분이 동작이 안되기 때문이다
더불어 다른 것도 마찬가지이다.

  • SSD 와 FasterRCNN 실행 
SSD 와 FasterRCNN 설정을 가지고 테스트 해보자
config는 custom-lib-path, parse-bbox-func-name 설정하고, 구현된 C++과 연결하여 사용하므로 이부분 설정은 까먹지 말자.

$ pwd
/home/nvidia/deepstream_sdk_on_jetson/sources/objectDetector_FasterRCNN

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

$ pwd
/home/nvidia/deepstream_sdk_on_jetson/sources/objectDetector_SSD

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

  • SSD 와 FasterRCNN 실행 ( dsexample 적용)
상위와 다른점은 dsexample이  opencv를 이용하여 사각형을 만들어 제공해주고 있으며, 관련소스는 Deepstream SDK의 소스를 참고
dsexample을 nvosd 이후로 넣으면 작동이 안됨 

$ pwd
/home/nvidia/deepstream_sdk_on_jetson/sources/objectDetector_SSD

$ gst-launch-1.0 filesrc location=../../samples/streams/sample_720p.mp4 ! \
        decodebin ! nvinfer config-file-path= config_infer_primary_ssd.txt ! \
        dsexample ! nvvidconv ! nvosd ! nvegltransform ! nveglglessink

  • nvinfer (1stGIE, 2ndGIE로 구분하여 사용)
상위 nvinfer는 Object Detection만 사용했다면, 이제 Classfication 기능도 같이 사용해서 테스트를 진행하자

$ pwd
/home/nvidia/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test2

//Sample 영상로 1stGIE,2ndGIE ,nvtracker 사용하여 화면전체 재생 ( X-Window 재생은 상위 참조)

$ 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

// RTSP를 이용하여  1stGIE,2ndGIE ,nvtracker 사용하여 화면전체 재생 ( X-Window 재생은 아래 참조)

$ 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

//Sample 영상로 1stGIE,2ndGIE ,nvtracker 사용하여 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


  • nvmsgconv 와 nvmsgbroker 기능 (Kafka와 작동안됨)
test4가 이전에도 설명했듯이 아래의 구조를 가지고 있지만, Command로 실행시 동작자체가 되지 않는다. 역시 Callback Function 의 처리가 필요하다.
이전의 test4를 참조하자

$ pwd
/home/nvidia/deepstream_sdk_on_jetson/sources/apps/sample_apps/deepstream-test4

$  gst-launch-1.0 filesrc location=../../../../samples/streams/sample_720p.h264 ! \
        h264parse ! omxh264dec ! \
        nvinfer config-file-path= dstest4_pgie_config.txt ! \
        nvvidconv ! \
        nvosd font-size=15 ! tee name=t ! \
        queue ! nvegltransform ! nveglglessink t. ! \
        queue ! nvmsgconv config=dstest4_msgconv_config.txt ! \
        nvmsgbroker proto-lib=/usr/lib/aarch64-linux-gnu/tegra/libnvds_kafka_proto.so conn-str=127.0.0.1;1280;dsapp2


2.5 기타 Debug와 다른 기본 Gstreamer Command 

참조용으로 다시 기록

$ 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


Gstreamer DEBUG
  https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html?gi-language=c



NVIDIA  Gstreamer 관련자료

  https://devtalk.nvidia.com/default/topic/1032597/how-to-capture-video-using-gst-launch-1-0-/
  https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Jetson_TX2#v4l2src
  https://devtalk.nvidia.com/default/topic/1048481/jetson-agx-xavier/h264-streaming-issues/
  https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/gst-plugins-good-plugins-v4l2src.html