8/01/2019

DS SDK 4.0 구조 와 TEST4 및 IPlugIN Sample들

1. DeepStream SDK 4.0 전체구조

DeepStream SDK 4.0 전체구조 파악
  • Deepstream Sample 구조
$ cd ~/deepstream-4.0/samples    //  /opt/nvidia/deepstream/deepstream-4.0에서 복사해옴 (이전에)
$ tree
.
├── configs
│   └── deepstream-app    // deepstream-app 만을 위한 설정 
│       ├── config_infer_primary_nano.txt            // Jetson Nano를 위한 version 인것 같음 
│       ├── config_infer_primary.txt
│       ├── config_infer_secondary_carcolor.txt
│       ├── config_infer_secondary_carmake.txt
│       ├── config_infer_secondary_vehicletypes.txt
│       ├── iou_config.txt
│       ├── source12_1080p_dec_infer-resnet_tracker_tiled_display_fp16_tx2.txt       // deepstream-app 의 다양한 설정제공  (CSI,USB 테스트 못함)
│       ├── source1_csi_dec_infer_resnet_int8.txt
│       ├── source1_usb_dec_infer_resnet_int8.txt
│       ├── source2_csi_usb_dec_infer_resnet_int8.txt
│       ├── source30_1080p_dec_infer-resnet_tiled_display_int8.txt
│       ├── source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
│       ├── source6_csi_dec_infer_resnet_int8.txt
│       ├── source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt
│       ├── source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_tx1.txt
│       └── tracker_config.yml
├── models
│   ├── Primary_Detector    // 1nd GIE  Object Detection 
│   │   ├── cal_trt.bin
│   │   ├── labels.txt
│   │   ├── resnet10.caffemodel
│   │   ├── resnet10.caffemodel_b1_int8.engine   // TensorRT Engine 
│   │   ├── resnet10.caffemodel_b4_int8.engine
│   │   └── resnet10.prototxt
│   ├── Primary_Detector_Nano
│   │   ├── labels.txt
│   │   ├── resnet10.caffemodel
│   │   ├── resnet10.caffemodel_b12_fp16.engine
│   │   └── resnet10.prototxt
│   ├── Secondary_CarColor   // 2nd GIE  Classfication 
│   │   ├── cal_trt.bin
│   │   ├── labels.txt
│   │   ├── mean.ppm
│   │   ├── resnet18.caffemodel
│   │   ├── resnet18.caffemodel_b16_int8.engine
│   │   └── resnet18.prototxt
│   ├── Secondary_CarMake       // 2nd GIE  Classfication 
│   │   ├── cal_trt.bin
│   │   ├── labels.txt
│   │   ├── mean.ppm
│   │   ├── resnet18.caffemodel
│   │   ├── resnet18.caffemodel_b16_int8.engine
│   │   └── resnet18.prototxt
│   ├── Secondary_VehicleTypes   // 2nd GIE  Classfication 
│   │   ├── cal_trt.bin
│   │   ├── labels.txt
│   │   ├── mean.ppm
│   │   ├── resnet18.caffemodel
│   │   ├── resnet18.caffemodel_b16_int8.engine
│   │   └── resnet18.prototxt
│   └── Segmentation      // 이전 Segmentation을 위한 UFF Format Model 2개 
│       ├── industrial
│       │   ├── unet_output_graph.uff
│       │   ├── unet_output_graph.uff_b1_fp32.engine
│       │   └── unet_output_graph.uff_b2_fp32.engine
│       └── semantic
│           ├── unetres18_v4_pruned0.65_800_data.uff
│           └── unetres18_v4_pruned0.65_800_data.uff_b2_fp32.engine
├── streams                                      //예제 동영상 
│   ├── sample_1080p_h264.mp4
│   ├── sample_1080p_h265.mp4
│   ├── sample_720p.h264
│   ├── sample_720p.jpg
│   ├── sample_720p.mjpeg
│   ├── sample_720p.mp4
│   ├── sample_cam6.mp4
│   └── sample_industrial.jpg
└── streams2                             // 내가 복사해서 만든 예제
    └── sample_720p.h264


  • Source 구조 
기존과 동일하게 우선 확인해야할 것은 gst-inspect 와 아래의 deepstream_config.h 에서 PlugIn 기능확인

$  cd ~/deepstream-4.0/sources
$ tree
.
├── apps
│   ├── apps-common
│   │   ├── includes
│   │   │   ├── deepstream_app_version.h
│   │   │   ├── deepstream_common.h
│   │   │   ├── deepstream_config_file_parser.h
│   │   │   ├── deepstream_config.h             // DeepStream PLUGIN 확인
│   │   │   ├── deepstream_dewarper.h
│   │   │   ├── deepstream_dsexample.h
│   │   │   ├── deepstream_gie.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_dewarper_bin.c
│   │       ├── deepstream_dsexample.c
│   │       ├── deepstream_osd_bin.c
│   │       ├── deepstream_perf.c
│   │       ├── deepstream_primary_gie_bin.c
│   │       ├── deepstream_secondary_gie_bin.c
│   │       ├── deepstream_sink_bin.c
│   │       ├── deepstream_source_bin.c
│   │       ├── deepstream_streammux.c
│   │       ├── deepstream_tiled_display_bin.c
│   │       └── deepstream_tracker_bin.c
│   └── sample_apps
│       ├── deepstream-app
│       │   ├── deepstream_app.c
│       │   ├── deepstream_app_config_parser.c
│       │   ├── deepstream_app.h
│       │   ├── deepstream_app_main.c
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-dewarper-test
│       │   ├── config_dewarper.txt
│       │   ├── csv_files
│       │   │   ├── nvaisle_2M.csv
│       │   │   └── nvspot_2M.csv
│       │   ├── deepstream_dewarper_test.c
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-gst-metadata-test
│       │   ├── deepstream-gst-metadata-app
│       │   ├── deepstream_gst_metadata.c
│       │   ├── deepstream_gst_metadata.o
│       │   ├── dsmeta_pgie_config.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-image-decode-test
│       │   ├── deepstream_image_decode_app.c
│       │   ├── dstest_image_decode_pgie_config.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-infer-tensor-meta-test
│       │   ├── deepstream_infer_tensor_meta_test.cpp
│       │   ├── dstensor_pgie_config.txt
│       │   ├── dstensor_sgie1_config.txt
│       │   ├── dstensor_sgie2_config.txt
│       │   ├── dstensor_sgie3_config.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-nvof-test
│       │   ├── deepstream_nvof_test.c
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-perf-demo
│       │   ├── deepstream-perf-demo
│       │   ├── deepstream_perf_demo.cpp
│       │   ├── deepstream_perf_demo.o
│       │   ├── Makefile
│       │   ├── perf_demo_pgie_config.txt
│       │   ├── perf_demo_sgie1_config.txt
│       │   ├── perf_demo_sgie2_config.txt
│       │   ├── perf_demo_sgie3_config.txt
│       │   └── README
│       ├── deepstream-segmentation-test
│       │   ├── deepstream-segmentation-app
│       │   ├── deepstream_segmentation_app.c
│       │   ├── deepstream_segmentation_app.o
│       │   ├── dstest_segmentation_config_industrial.txt
│       │   ├── dstest_segmentation_config_semantic.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-test1
│       │   ├── deepstream-test1-app
│       │   ├── deepstream_test1_app.c
│       │   ├── deepstream_test1_app.o
│       │   ├── dstest1_pgie_config.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-test2          // 가장 많이 사용할 예제 인것 같으며, TEST3와 같이 결합하면, RTSP지원 
│       │   ├── deepstream-test2-app
│       │   ├── deepstream_test2_app.c
│       │   ├── deepstream_test2_app.o
│       │   ├── dstest2_pgie_config.txt
│       │   ├── dstest2_sgie1_config.txt
│       │   ├── dstest2_sgie2_config.txt
│       │   ├── dstest2_sgie3_config.txt
│       │   ├── dstest2_tracker_config.txt
│       │   ├── Makefile
│       │   ├── README
│       │   └── tracker_config.yml
│       ├── deepstream-test3
│       │   ├── deepstream-test3-app
│       │   ├── deepstream_test3_app.c
│       │   ├── deepstream_test3_app.o
│       │   ├── dstest3_pgie_config.txt
│       │   ├── Makefile
│       │   └── README
│       ├── deepstream-test4
│       │   ├── cfg_amqp.txt
│       │   ├── cfg_azure.txt
│       │   ├── cfg_kafka.txt
│       │   ├── deepstream-test4-app
│       │   ├── deepstream_test4_app.c
│       │   ├── deepstream_test4_app.o
│       │   ├── dstest4_msgconv_config.txt
│       │   ├── dstest4_pgie_config.txt
│       │   ├── Makefile
│       │   └── README
│       └── deepstream-user-metadata-test
│           ├── deepstream-user-metadata-app
│           ├── deepstream_user_metadata_app.c
│           ├── deepstream_user_metadata_app.o
│           ├── dsmeta_pgie_config.txt
│           ├── Makefile
│           └── README
├── gst-plugins
│   ├── gst-dsexample
│   │   ├── dsexample_lib
│   │   │   ├── dsexample_lib.c
│   │   │   ├── dsexample_lib.h
│   │   │   └── Makefile
│   │   ├── gstdsexample.cpp
│   │   ├── gstdsexample.h
│   │   ├── Makefile
│   │   └── README
│   ├── gst-nvinfer
│   │   ├── gstnvinfer_allocator.cpp
│   │   ├── gstnvinfer_allocator.h
│   │   ├── gstnvinfer.cpp
│   │   ├── gstnvinfer.h
│   │   ├── gstnvinfer_meta_utils.cpp
│   │   ├── gstnvinfer_meta_utils.h
│   │   ├── gstnvinfer_property_parser.cpp
│   │   ├── gstnvinfer_property_parser.h
│   │   ├── Makefile
│   │   └── README
│   ├── gst-nvmsgbroker
│   │   ├── gstnvmsgbroker.c
│   │   ├── gstnvmsgbroker.h
│   │   ├── Makefile
│   │   └── README
│   └── gst-nvmsgconv
│       ├── gstnvmsgconv.c
│       ├── gstnvmsgconv.h
│       ├── Makefile
│       └── README
├── includes
│   ├── gstnvdsinfer.h
│   ├── gstnvdsmeta.h
│   ├── gst-nvevent.h
│   ├── gst-nvmessage.h
│   ├── gst-nvquery.h
│   ├── nvbufsurface.h
│   ├── nvbufsurftransform.h
│   ├── nvds_dewarper_meta.h
│   ├── nvdsinfer_context.h
│   ├── nvdsinfer_custom_impl.h
│   ├── nvdsinfer_dbscan.h
│   ├── nvdsinfer.h
│   ├── nvdsinfer_tlt.h
│   ├── nvdsinfer_utils.h
│   ├── nvds_latency_meta.h
│   ├── nvds_logger.h
│   ├── nvdsmeta.h         //NvDsFrameMeta , NvDsObjectMeta 구조를 파악  DeepStream SDK API에서도 확인가능
│   ├── nvdsmeta_schema.h
│   ├── nvds_msgapi.h
│   ├── nvds_opticalflow_meta.h
│   ├── nvdstracker.h
│   ├── nvds_version.h
│   ├── nvll_osd_api.h
│   └── nvll_osd_struct.h
├── libs
│   ├── amqp_protocol_adaptor
│   │   ├── cfg_amqp.txt
│   │   ├── Makefile.test
│   │   ├── README
│   │   ├── test_amqp_proto_async.c
│   │   └── test_amqp_proto_sync.c
│   ├── azure_protocol_adaptor
│   │   ├── device_client
│   │   │   ├── cfg_azure.txt
│   │   │   ├── Makefile.test
│   │   │   ├── README
│   │   │   ├── test_azure_proto_async.c
│   │   │   └── test_azure_proto_sync.c
│   │   └── module_client
│   │       ├── cfg_azure.txt
│   │       ├── Dockerfile
│   │       ├── Makefile.test
│   │       ├── README
│   │       ├── test_azure_iotedge_async.c
│   │       └── test_azure_iotedge_sync.c
│   ├── kafka_protocol_adaptor
│   │   ├── json_helper.cpp
│   │   ├── kafka_client.cpp
│   │   ├── kafka_client.h
│   │   ├── Makefile
│   │   ├── Makefile.test
│   │   ├── nvds_kafka_proto.cpp
│   │   ├── README
│   │   ├── test_kafka_proto_async
│   │   ├── test_kafka_proto_async.cpp
│   │   ├── test_kafka_proto_sync
│   │   └── test_kafka_proto_sync.cpp
│   ├── nvdsinfer
│   │   ├── Makefile
│   │   ├── nvdsinfer_context_impl_capi.cpp
│   │   ├── nvdsinfer_context_impl.cpp
│   │   ├── nvdsinfer_context_impl.h
│   │   ├── nvdsinfer_context_impl_output_parsing.cpp
│   │   ├── nvdsinfer_conversion.cu
│   │   ├── nvdsinfer_conversion.h
│   │   └── README
│   ├── nvdsinfer_customparser
│   │   ├── Makefile
│   │   ├── nvdsinfer_custombboxparser.cpp
│   │   ├── nvdsinfer_customclassifierparser.cpp
│   │   └── README
│   └── nvmsgconv
│       ├── Makefile
│       ├── nvmsgconv.cpp
│       ├── nvmsgconv.h
│       └── README
├── objectDetector_FasterRCNN
│   ├── config_infer_primary_fasterRCNN.txt             // Custom Layer 설정확인 
│   ├── deepstream_app_config_fasterRCNN.txt
│   ├── labels.txt
│   ├── nvdsinfer_custom_impl_fasterRCNN   // IPluginFactory  Custom Layer 
│   │   ├── factoryFasterRCNN.h
│   │   ├── factoryFasterRCNNLegacy.h
│   │   ├── Makefile
│   │   ├── nvdsinitinputlayers_fasterRCNN.cpp
│   │   ├── nvdsiplugin_fasterRCNN.cpp
│   │   ├── nvdsparsebbox_fasterRCNN.cpp  // OutLayer 이름 bbox_pred;cls_prob;rois 3개 사용하여 NvDsInferParseCustomFasterRCNN 생성
│   │   └── nvdssample_fasterRCNN_common.h
│   └── README
├── objectDetector_SSD
│   ├── config_infer_primary_ssd.txt
│   ├── deepstream_app_config_ssd.txt
│   ├── nvdsinfer_custom_impl_ssd
│   │   ├── Makefile
│   │   ├── nvdsiplugin_ssd.cpp   //IPlugIn , 상위와 구조가 좀 다름 
│   │   └── nvdsparsebbox_ssd.cpp  // OutLayer (NMS,NMS_1) 2개를 사용하고 새 CustomLayer NvDsInferParseCustomSSD 생성 
│   └── README
├── objectDetector_Yolo
│   ├── config_infer_primary_yoloV2_tiny.txt
│   ├── config_infer_primary_yoloV2.txt
│   ├── config_infer_primary_yoloV3_tiny.txt
│   ├── config_infer_primary_yoloV3.txt
│   ├── deepstream_app_config_yoloV2_tiny.txt
│   ├── deepstream_app_config_yoloV2.txt
│   ├── deepstream_app_config_yoloV3_tiny.txt
│   ├── deepstream_app_config_yoloV3.txt
│   ├── labels.txt
│   ├── nvdsinfer_custom_impl_Yolo  // 기존과 다르게 완전히 구성 
│   │   ├── kernels.cu
│   │   ├── Makefile
│   │   ├── nvdsinfer_yolo_engine.cpp   // 기존과 다르게 Engine도 구성 
│   │   ├── nvdsparsebbox_Yolo.cpp  // Yolo version 마다 구성  NvDsInferParseCustomYoloV3 생성 
│   │   ├── trt_utils.cpp             // 필요하면, Layer를 직접 사용 
│   │   ├── trt_utils.h
│   │   ├── yolo.cpp       // Yolo Engine 생성과 Layer도 직접 추가 
│   │   ├── yolo.h
│   │   ├── yoloPlugins.cpp
│   │   └── yoloPlugins.h
│   ├── prebuild.sh
│   ├── README
│   └── yolov3-calibration.table.trt5.1
└── tools
    └── nvds_logger
        ├── README
        └── setup_nvds_logger.sh



  • DeepStream 봐야할 기본문서들 


DeepStream 전체 문서
  https://docs.nvidia.com/metropolis/index.html

DeepStream Quick Guide
  설치부터 기본사용법을 쉽게 이해할수 있다.
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html

DeepStream PlugIn Manual
  DeepStream 의 개별 PlugIn 옵션과 기능의 변화들을 알아야한다.
  https://docs.nvidia.com/metropolis/deepstream/4.0/DeepStream_Plugin_Manual.pdf



  • DeepStream Source를 수정시 봐야할 문서 

DeepStream SDK 4.0 API
  소스 수정시 내부 관련 함수이해를 위해서 봐야함
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/DeepStream_Development_Guide/baggage/index.html

Jetson Multimedia Document
  Multimedia 관련부분의 문서로 Buffer 관련부분
  https://docs.nvidia.com/jetson/l4t-multimedia/index.html

2. Gst-Invfer 구조 변화 와 TensorRT의 IPlugIn 사용예제 

이번의 DeepStream SDK 4.0으로 오면서 MetaData구조가 변경이 되었는데, 그 부분의 이전의 부분에서 확인하자.


변경된 특징을 정리해보면,

  1. Transfer-learning-Toolkit encoded Model 지원  ( Model을 재학습이 가능 , 추후 테스트)
  2. Tensor output as meta    ( Gst Buffer로 meata data를 포함해서 보낸다고 하는데, Sample 예제 있는 것 같다)
  3. Segmentation Model 지원 ( 이부분 이전에 테스트한 Segmetation 부분같다)
  4. Gray input Model  ( Gray input Model 이 별도로 존재이유를 아직 잘 모르겠음)
  5. Yolo 의 지원인데, 이전 DS3.0 도 Github를 통해서 지원이 가능했으므로, 별로 



자세한 properties는 아래의 PlugIn Manual에서 참조하자
관련문서
  https://docs.nvidia.com/metropolis/deepstream/4.0/DeepStream_Plugin_Manual.pdf


2.1 IPlugIn FastRCNN 기능확인 (Caffe기반 ) 

이전과 거의 동일하하기에 자세한 부분은 생략

$ cd ~/deepstream-4.0/sources/objectDetector_FasterRCNN 

$ wget --no-check-certificate \
        https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz?dl=0 \
        -O faster-rcnn.tgz

$ tar zxvf faster-rcnn.tgz -C . --strip-components=1 --exclude=ZF_*
faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel

$ cp /usr/src/tensorrt/data/faster-rcnn/faster_rcnn_test_iplugin.prototxt  .
$ ls 
config_infer_primary_fasterRCNN.txt   faster-rcnn.tgz                   README
deepstream_app_config_fasterRCNN.txt  labels.txt                        VGG16_faster_rcnn_final.caffemodel
faster_rcnn_test_iplugin.prototxt     nvdsinfer_custom_impl_fasterRCNN

$ make -C nvdsinfer_custom_impl_fasterRCNN
$ ls nvdsinfer_custom_impl_fasterRCNN/libnvdsinfer_custom_impl_fasterRCNN.so
libnvdsinfer_custom_impl_fasterRCNN.so    // 생성확인 

DS 3.0과 다르게 Gstreamer로 실행해도 Label이 실행됨

$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_fasterRCNN.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

$ deepstream-app -c deepstream_app_config_fasterRCNN.txt


기존보다 약간 좋게  8FPS 정도를 유지하는 것 같다.


2.2 IPlugIn SSD 기능확인 (UFF, Tensorlfow 기반)

이전에는 DS3.0에서는 x86에서 이를 변환(convert-uff)하여 만들어서 가져와서 테스트를 했으나, 이번에는 버전은 Jetson에 이미 존재하므로,쉽게 설치하고 실행가능하다

  • Tensorflow 설치진행 (시간이 많이 걸림)
README에서 Tensorflow로 설치를 권장하여, Tensorflow로 설치진행 

# install prerequisites
$ sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev

# install and upgrade pip3
$ sudo apt-get install python3-pip
$ sudo pip3 install -U pip

# install the following python packages
$ sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta setuptools testresources

# install the latest version of TensorFlow
$ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu


Tensorflow 설치관련문서 (NVIDIA 문서를 참조를 해야 에러가 없음)
   https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html#prereqs
   https://elinux.org/Jetson_Zoo#TensorFlow


  • convert_to_uff.py 를 이용하여 PB->UFF 포맷으로 변경 

처음 Tensorflow를 미설치하고 아래 같이 진행하며, 에러가 발생하는 것 같아 Tensorflow를 별도를 설치를 했는데,  아래의 에러발생

$ cd ~/deepstream-4.0/sources/objectDetector_SSD 

$ cp /usr/src/tensorrt/data/ssd/ssd_coco_labels.txt .

$ wget  http://download.tensorflow.org/models/object_detection/ssd_inception_v2_coco_2017_11_17.tar.gz 
$ tar zxvf ssd_inception_v2_coco_2017_11_17.tar.gz
ssd_inception_v2_coco_2017_11_17/
ssd_inception_v2_coco_2017_11_17/model.ckpt.index
ssd_inception_v2_coco_2017_11_17/model.ckpt.meta
ssd_inception_v2_coco_2017_11_17/frozen_inference_graph.pb
ssd_inception_v2_coco_2017_11_17/model.ckpt.data-00000-of-00001
ssd_inception_v2_coco_2017_11_17/saved_model/
ssd_inception_v2_coco_2017_11_17/saved_model/saved_model.pb
ssd_inception_v2_coco_2017_11_17/saved_model/variables/
ssd_inception_v2_coco_2017_11_17/checkpoint

$ cd ssd_inception_v2_coco_2017_11_17
$ python /usr/lib/python2.7/dist-packages/uff/bin/convert_to_uff.py   frozen_inference_graph.pb -O NMS   -p /usr/src/tensorrt/samples/sampleUffSSD/config.py     -o sample_ssd_relu6.uff
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/uff/bin/convert_to_uff.py", line 15, in 
    import uff
  File "/usr/lib/python2.7/dist-packages/uff/__init__.py", line 1, in 
    from uff import converters, model  # noqa
  File "/usr/lib/python2.7/dist-packages/uff/model/__init__.py", line 1, in 
    from . import uff_pb2 as uff_pb  # noqa
  File "/usr/lib/python2.7/dist-packages/uff/model/uff_pb2.py", line 6, in 
    from google.protobuf.internal import enum_type_wrapper
ImportError: No module named google.protobuf.internal


$ pip list | grep protobuf    // Tensorflow-GPU 설치를 해도 동일해서 Package 검색 
protobuf                      3.9.1


  • Python 3로 해결 ( Anaconda , 이문제인줄 알았는데, 아님)
$ python3 /usr/lib/python3.6/dist-packages/uff/bin/convert_to_uff.py ./frozen_inference_graph.pb -O NMS          -p /usr/src/tensorrt/samples/sampleUffSSD/config.py          -o sample_ssd_relu6.uff
No. nodes: 563
UFF Output written to sample_ssd_relu6.uff

$ cp sample_ssd_relu6.uff ..
$ cd .. 
$ pwd
/home/nvidia/deepstream-4.0/sources/objectDetector_SSD

$ export CUDA_VER=10.0
$ make -C nvdsinfer_custom_impl_ssd 
$ ls nvdsinfer_custom_impl_ssd/libnvdsinfer_custom_impl_ssd.so
nvdsinfer_custom_impl_ssd/libnvdsinfer_custom_impl_ssd.so


관련자료
  https://www.cnblogs.com/sdu20112013/p/10702173.html


$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_ssd.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

//Gst-Tracker 도  동작됨 
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_ssd.txt ! \
        nvtracker tracker-width=640 tracker-height=368  gpu-id=0  \
        ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_nvdcf.so \
        ll-config-file=tracker_config.yml enable-batch-process=1 ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

// dstest2_sgie1_config.txt 를 test2에서 가져와야하며 내부 PATH를 제대로 설정해주면, 동작은 되지만, Batch Size 문제로 Engine을 새로생성하느라고 시간이 걸림 
//상위와 동일하게 동작  (2nd nvinfer는 미동작, Gst-Tracker 까지는 동작됨) 
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_ssd.txt ! \
        nvtracker tracker-width=640 tracker-height=368  gpu-id=0  \
        ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_nvdcf.so \
        ll-config-file=tracker_config.yml enable-batch-process=1 ! \
        nvinfer config-file-path= dstest2_sgie1_config.txt ! \
        nvinfer config-file-path= dstest2_sgie2_config.txt ! \
        nvinfer config-file-path= dstest2_sgie3_config.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink


$ deepstream-app -c deepstream_app_config_ssd.txt

기존과 동일하게 실시간 동작하며, Gstreamer로 해도 Label 표시 (30FPS로 동작)



  • Config 설정부분 

$ vi  ./config_infer_primary_ssd.txt     
....
[property]
gpu-id=0
net-scale-factor=0.0078431372
offsets=127.5;127.5;127.5
model-color-format=0
model-engine-file=sample_ssd_relu6.uff_b1_fp32.engine       // TensorRT Engine 
labelfile-path=ssd_coco_labels.txt
uff-file=sample_ssd_relu6.uff                          // Caffe Model 이 아니므로 UFF-File , Caffe는 model-file 
uff-input-dims=3;300;300;0
uff-input-blob-name=Input
batch-size=1
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=0
num-detected-classes=91
interval=0
gie-unique-id=1
is-classifier=0
output-blob-names=MarkOutput_0
parse-bbox-func-name=NvDsInferParseCustomSSD                                        // BBox 함수 
custom-lib-path=nvdsinfer_custom_impl_ssd/libnvdsinfer_custom_impl_ssd.so   // Custom Layer (IPlugIn 

[class-attrs-all]
threshold=0.5
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0
detected-max-h=0

.......


  • DeepStream SDK 3.0 IPlugIn 사용
자세한 부분은 아래의 링크로 확인하자
  https://ahyuo79.blogspot.com/2019/07/deepstream-gst-nvinfer-tensorrt-iplugin.html


2.3 IPlugIn Yolov3  (TensorRT Directly)

이전에 DeepStream SDK 3.0에서 Github를 통해 Download하여 Build하고 테스트한 부분이 이번 버전에 반영이 되었다.

DeepStream SDK 3.0 Yolo 사용
  https://ahyuo79.blogspot.com/2019/07/deepstream-30-sdk-deepstream-referece.html

소스의 전체구성은 이전의 Github와 거의 유사한 것 같으며, 다만 이번에는  deepstream-app에서 실행이 가능하다.

TensorRT Example(이전 DS3.0의 Yolo가 아니고, TensorRT 예제)에서는 Yolov3를 ONNX로 변경해서 사용했던것으로 기억하는데,
이번 것은 어떻게 동작이 되는지 사실 이해가 안된다, 이전의 DS 3.0에서도 구조가 비슷한 것 같은데, 지금 구조를 보면 Caffe Model로 설정사용을 하는데, 이부분은 좀 의아했다.


$ cd ~/deepstream-4.0/sources/objectDetector_Yolo   // 원래 opt 지만, 본인은 소스보호를 위해 이쪽으로 복사했음

$  ./prebuild.sh     // 이전과 유사하게 yolo에 관련된  weight 와 cfg download 

$ ls /usr/local/cuda-10.0   // CUDA Version 확인 

$ export CUDA_VER=10.0
$ make -C nvdsinfer_custom_impl_Yolo


  • Yolov3 와 Yolov2 실행 (Gstreamer 과 deepstream)
이전의 Yolo와 성능이 많이 달라졌으며, 이부분 각각 아래와 같이 기록한다.

//Yolov3 TEST
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_yoloV3.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

//YoloV2 TEST
$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_yoloV2.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

만약 아래처럼 Tracker 와 2차 Classification TensorRT를 삽입을 해도 되지만, 사람도 적용이 되어 문제발생 , 속도가 느리다면, model-engine을 반드시 정의 및 복사 

$ gst-launch-1.0 filesrc location=../../samples/streams/sample_1080p_h264.mp4 ! \
        decodebin ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 \
        height=720 ! nvinfer config-file-path= config_infer_primary_yoloV3.txt ! \
        nvtracker tracker-width=640 tracker-height=368  gpu-id=0  \
        ll-lib-file=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_nvdcf.so \
        ll-config-file=../objectDetector_SSD/tracker_config.yml enable-batch-process=1 ! \
        nvinfer config-file-path= ../objectDetector_SSD/dstest2_sgie1_config.txt ! \
        nvinfer config-file-path= ../objectDetector_SSD/dstest2_sgie2_config.txt ! \
        nvinfer config-file-path= ../objectDetector_SSD/dstest2_sgie3_config.txt ! \
        nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink

//실제 Yolo TEST 진행 

$ deepstream-app -c deepstream_app_config_yoloV3.txt                 //26~27 FPS
$ deepstream-app -c deepstream_app_config_yoloV3_tiny.txt           //60~61 FPS
$ deepstream-app -c deepstream_app_config_yoloV2.txt                  //18 FPS
$ deepstream-app -c deepstream_app_config_yoloV2_tiny.txt            //60~61 FPS

yolov3
yolov3_tiny


  • Yolo Config 
기본으로 TensorRT Engine을 실행마다 만들어주므로 아래와 같이 수정

$ vi  ./config_infer_primary_yoloV3.txt     //model-engine-file 을 선언해주면, 매번 TensorRT Engine을 생성할 필요없다. 
....
[property]
gpu-id=0
net-scale-factor=1
#0=RGB, 1=BGR
model-color-format=0
custom-network-config=yolov3.cfg
model-file=yolov3.weights                        // modle-file 이 yolov3.weight  인데,  Caffe Model이 아니여서 혼동
model-engine-file=model_b1_int8.engine   // 처음 정의 되어 있지 않다면 반드시 정의 
labelfile-path=labels.txt
int8-calib-file=yolov3-calibration.table.trt5.1   // INT8로 사용시 별도로 필요한 Table  (Jetson Xavier)
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=1
num-detected-classes=80
gie-unique-id=1
is-classifier=0
maintain-aspect-ratio=1
parse-bbox-func-name=NvDsInferParseCustomYoloV3
custom-lib-path=nvdsinfer_custom_impl_Yolo/libnvdsinfer_custom_impl_Yolo.so      // Custom Layer로 연결 , 아래 설명 
.......


  • 설정부분 재확인 (model-file 은 Caffe Model만 지원)
  https://docs.nvidia.com/metropolis/deepstream/4.0/dev-guide/index.html#page/DeepStream_Development_Guide%2Fdeepstream_custom_model.html%23

  • Custom Layer 부분 
이전의 IPlugIn의 구성은 비슷하지만, 소스의 구성과 구조가 다름 (추후 시간될때 분석)

$ tree nvdsinfer_custom_impl_Yolo/
nvdsinfer_custom_impl_Yolo/
├── kernels.cu                      //Implementation of cuda kernels for
├── kernels.o
├── libnvdsinfer_custom_impl_Yolo.so  // 상위 config 설정 
├── Makefile
├── nvdsinfer_yolo_engine.cpp    //Implementation of 'NvDsInferCudaEngineGet' for nvdsinfer to create cuda engine
├── nvdsinfer_yolo_engine.o
├── nvdsparsebbox_Yolo.cpp  //Output layer , BBox Function 상위 NvDsInferParseCustomYoloV3 정의 이전 IPlugIn 구조와 유사 
├── nvdsparsebbox_Yolo.o
├── trt_utils.cpp     //Implementation of Utilities to setup tensorRT networks
├── trt_utils.h        //Utilities to setup tensorRT networks
├── trt_utils.o
├── yolo.cpp          //Implementation to create Yolo Cuda-Engine ( IPluginV2)
├── yolo.h             //Interface to create Yolo Cuda-Engine 
├── yolo.o
├── yoloPlugins.cpp  //Implementation of YoloLayerV3 and YoloLayerV3PluginCreator  (IPluginV2)
├── yoloPlugins.h   //Declaration of YoloLayerV3 and YoloLayerV3PluginCreator
└── yoloPlugins.o


  • NVIDIA에  Yolo 모델 관련질문
상위 Yolo 모델의 네트워크 구성이 궁금해서 NVIDIA에 직접 질문하여 답을 구했으며, 상위 Yolo는 TensorRT의 어느 Framework의 모델 (UFF/ONNX/Caffe)에 속하지 않는다고 한다.
TensorRT의 예제와 구성이 다르니 이 부분을 알아두어야 겠다.

직접 TensorRT에 Network를 구성하여 구현을 했다고 한다.
  https://devtalk.nvidia.com/default/topic/1061574/deepstream-sdk/objectdetector_yolo-in-ds-4-0-on-xavier-/post/5375710/#5375710


3. DeepStream-test4


3.1 Kafka 환경구성 

  • libnvds_kafka_proto.so 빌드 및 테스트 프로그램 빌드 (생략가능)
lib로 제공해주므로 생략을 해도 상관없음

$ sudo apt-get update
$ sudo apt-get install libglib2.0 libglib2.0-dev
$ sudo apt-get install libjansson4  libjansson-dev

$ sudo apt-get install librdkafka1=0.11.3-1build1   // rdkafka.h 파일이 없음 
or  // 직접설치로 변경 
$ cd ~
$ git clone https://github.com/edenhill/librdkafka.git
$ cd librdkafka
$ git reset --hard 7101c2310341ab3f4675fc565f64f0967e135a6a
$ ./configure
$ make
$ sudo make install
$ sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream-4.0/lib/

$ cd ~/deepstream-4.0/sources/libs/kafka_protocol_adaptor
$ make     // libnvds_kafka_proto.so (apt install 하면 , rdkafka.h: 문제발생)
$ make -f Makefile.test    //  test_sample_proto_sync   ,  test_sample_proto_async 생성 

$ find / -name  libnvds_kafka_proto.so 2> /dev/null 
/home/nvidia/deepstream-4.0/sources/libs/kafka_protocol_adaptor/libnvds_kafka_proto.so  // 지금 설치한 것
/home/nvidia/deepstream-4.0/lib/libnvds_kafka_proto.so // lib 제공 
/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_kafka_proto.so // lib 제공 


  • Zookeeper 및 Kafka 설치 
이전에도 설치를 해봤기때문에, 쉽게 설치가 가능

//Zookeeper 설치 
$  sudo apt-get install zookeeperd
/etc/zookeeper/conf 
/etc/zookeeper/conf_example

$ cat /etc/zookeeper/conf/zoo.cfg 
....

//설치후  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
Mode: standalone

//Kafka 설치 
$ cd ~
$ wget http://www-us.apache.org/dist/kafka/2.2.1/kafka_2.12-2.2.1.tgz  //download 가능 (다른version가능)

$ 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/

$ 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
 8월 01 11:21:32 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:32,939] INFO [GroupMetadataManager brokerId=0] Removed 0 expired offsets in 8 milliseconds. (kafka.coordinator.group.GroupMe
 8월 01 11:21:32 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:32,968] INFO [ProducerId Manager 0]: Acquired new producerId block (brokerId:0,blockStartProducerId:0,blockEndProducerId:999
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,016] INFO [TransactionCoordinator id=0] Starting up. (kafka.coordinator.transaction.TransactionCoordinator)
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,022] INFO [Transaction Marker Channel Manager 0]: Starting (kafka.coordinator.transaction.TransactionMarkerChannelManager
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,022] INFO [TransactionCoordinator id=0] Startup complete. (kafka.coordinator.transaction.TransactionCoordinator)
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,141] INFO [/config/changes-event-process-thread]: Starting (kafka.common.ZkNodeChangeNotificationListener$ChangeEventProc
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,185] INFO [SocketServer brokerId=0] Started data-plane processors for 1 acceptors (kafka.network.SocketServer)
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,208] INFO Kafka version: 2.2.1 (org.apache.kafka.common.utils.AppInfoParser)
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,208] INFO Kafka commitId: 55783d3133a5a49a (org.apache.kafka.common.utils.AppInfoParser)
 8월 01 11:21:33 nvidia-desktop kafka-server[6521]: [2019-08-01 11:21:33,212] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)


$ 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)



  • Kafka Topic 생성 및 확인
$ /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic dsapp
Created topic dsapp.

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

$ /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper localhost:2181  // Topic list 확인
__consumer_offsets
dsapp
testTopic

$  ls /tmp/kafka-logs/ 
cleaner-offset-checkpoint  __consumer_offsets-17  __consumer_offsets-26  __consumer_offsets-35  __consumer_offsets-44  __consumer_offsets-9
__consumer_offsets-0       __consumer_offsets-18  __consumer_offsets-27  __consumer_offsets-36  __consumer_offsets-45  dsapp-0
__consumer_offsets-1       __consumer_offsets-19  __consumer_offsets-28  __consumer_offsets-37  __consumer_offsets-46  log-start-offset-checkpoint
__consumer_offsets-10      __consumer_offsets-2   __consumer_offsets-29  __consumer_offsets-38  __consumer_offsets-47  meta.properties
__consumer_offsets-11      __consumer_offsets-20  __consumer_offsets-3   __consumer_offsets-39  __consumer_offsets-48  recovery-point-offset-checkpoint
__consumer_offsets-12      __consumer_offsets-21  __consumer_offsets-30  __consumer_offsets-4   __consumer_offsets-49  replication-offset-checkpoint
__consumer_offsets-13      __consumer_offsets-22  __consumer_offsets-31  __consumer_offsets-40  __consumer_offsets-5   testTopic-0
__consumer_offsets-14      __consumer_offsets-23  __consumer_offsets-32  __consumer_offsets-41  __consumer_offsets-6
__consumer_offsets-15      __consumer_offsets-24  __consumer_offsets-33  __consumer_offsets-42  __consumer_offsets-7
__consumer_offsets-16      __consumer_offsets-25  __consumer_offsets-34  __consumer_offsets-43  __consumer_offsets-8

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


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

  • deepstream-test4-app
$ cd ~/deepstream-4.0/sources/apps/sample_apps/deepstream-test4
$ make

$./deepstream-test4-app  -i ../../../../samples/streams/sample_720p.h264 -p /home/nvidia/deepstream-4.0/lib/libnvds_kafka_proto.so  --conn-str="127.0.0.1;9092;dsapp"  -c cfg_kafka.txt  -s 1  //

$ 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

$ sudo ldconfig  // 상위 ld.so.conf 변화가 있거나, lib path를 추가 했을 경우 실행 

$./deepstream-test4-app  -i ../../../../samples/streams/sample_720p.h264 -p /opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_kafka_proto.so  --conn-str="127.0.0.1;9092;dsapp"  -c cfg_kafka.txt  -s 1  //



  • How to receive Messages from Topic
$ /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic dsapp --from-beginning
{
  "messageid" : "53724824-163f-43e5-bbf7-41c4cca4fc05",
  "mdsversion" : "1.0",
  "@timestamp" : "2019-08-05T05:42:27.060Z",
  "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
      }
    }
  },
..........


  • Deepstream SDK 3.0 Kafka 구성
이전 DeepStream SDK 3.0에서 구성한 Kafka 구성과 설정을 비교해보자.
  https://ahyuo79.blogspot.com/2019/07/deepstream-sdk-30-kafka.html?zx=944829aea867a266