DeepStream6.0系列之SDK文件夹解析

Posted ZONG_XP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DeepStream6.0系列之SDK文件夹解析相关的知识,希望对你有一定的参考价值。

点击查看系列文章目录

0 背景

在《DeepStream4.0系列之SDK文件夹解析》一文中,对 SDK 的目录结构进行了一个介绍。随着内容的更新,在 5.0、5.1、6.0 版本中又新增了很多实用功能,提供了很多有价值的示例代码,本文以 jetson 端的 SDK 为例,对新增的内容进行一个介绍(与 4.0 版本相比

1 目录结构

首先使用 tree -d 指令查看 sdk 的目录结构,输出如下,其中,红色加粗的内容表示是新增内容

nvidia@nvidia:/opt/nvidia/deepstream/deepstream-6.0$ tree -d
.
├── bin
├── doc
│   └── nvidia-tegra
├── lib
│   ├── cvcore_libs
│   └── gst-plugins
├── samples
│   ├── configs
│   │   ├── deepstream-app
│   │   ├── deepstream-app-triton
│   │   ├── deepstream-app-triton-grpc
│   │   └── tao_pretrained_models

│   ├── models
│   │   ├── Primary_Detector
│   │   ├── Primary_Detector_Nano
│   │   ├── Secondary_CarColor
│   │   ├── Secondary_CarMake
│   │   ├── Secondary_VehicleTypes
│   │   ├── Segmentation
│   │   │   ├── industrial
│   │   │   └── semantic
│   │   └── SONYC_Audio_Classifier
│   ├── streams
│   ├── triton_model_repo
│   │   ├── densenet_onnx
│   │   ├── inception_graphdef
│   │   ├── mobilenet_v1
│   │   ├── Primary_Detector
│   │   ├── Secondary_CarColor
│   │   ├── Secondary_CarMake
│   │   ├── Secondary_VehicleTypes
│   │   ├── Segmentation_Industrial
│   │   ├── Segmentation_Semantic
│   │   ├── ssd_inception_v2_coco_2018_01_28
│   │   └── ssd_mobilenet_v1_coco_2018_01_28
│   └── trtis_model_repo -> triton_model_repo

└── sources
    ├── apps
    │   ├── apps-common
    │   │   ├── includes
    │   │   └── src
    │   └── sample_apps
    │       ├── deepstream-3d-action-recognition
    │       │   └── custom_sequence_preprocess

    │       ├── deepstream-app
    │       ├── deepstream-appsrc-test
    │       ├── deepstream-audio
    │       │   └── configs

    │       ├── deepstream-dewarper-test
    │       │   └── csv_files
    │       ├── deepstream-gst-metadata-test
    │       ├── deepstream-image-decode-test
    │       ├── deepstream-image-meta-test
    │       ├── deepstream-infer-tensor-meta-test
    │       │   └── inferserver
    │       ├── deepstream-mrcnn-test
    │       ├── deepstream-nvdsanalytics-test

    │       ├── deepstream-nvof-test
    │       ├── deepstream-opencv-test
    │       ├── deepstream-perf-demo
    │       ├── deepstream-preprocess-test
    │       │   └── test

    │       ├── deepstream-segmentation-test
    │       │   └── inferserver
    │       ├── deepstream-test1
    │       ├── deepstream-test2
    │       ├── deepstream-test3
    │       ├── deepstream-test4
    │       ├── deepstream-test5
    │       │   └── configs
    │       ├── deepstream-testsr
    │       ├── deepstream-transfer-learning-app
    │       │   └── configs

    │       └── deepstream-user-metadata-test
    ├── gst-plugins
    │   ├── gst-dsexample
    │   │   └── dsexample_lib
    │   ├── gst-nvdsaudiotemplate
    │   │   ├── common
    │   │   └── customlib_impl
    │   ├── gst-nvdsosd
    │   ├── gst-nvdspreprocess
    │   │   ├── include
    │   │   └── nvdspreprocess_lib
    │   ├── gst-nvdsvideotemplate
    │   │   ├── customlib_impl
    │   │   └── includes

    │   ├── gst-nvinfer
    │   ├── gst-nvmsgbroker
    │   └── gst-nvmsgconv
    ├── includes
    │   ├── cvcore_headers
    │   │   └── cv
    │   │       ├── bodypose2d
    │   │       ├── core
    │   │       ├── emotions
    │   │       ├── faciallandmarks
    │   │       ├── gazenet
    │   │       ├── gestures
    │   │       └── heartrate
    │   └── nvdsinferserver
    ├── libs
    │   ├── amqp_protocol_adaptor
    │   ├── azure_protocol_adaptor
    │   │   ├── device_client
    │   │   └── module_client
    │   ├── kafka_protocol_adaptor
    │   ├── nvdsinfer
    │   ├── nvdsinfer_customparser
    │   ├── nvmsgbroker
    │   ├── nvmsgconv
    │   │   └── deepstream_schema
    │   ├── nvmsgconv_audio
    │   └── redis_protocol_adaptor

    ├── objectDetector_FasterRCNN
    │   ├── nvdsinfer_custom_impl_fasterRCNN
    │   └── triton_model_repo
    │       └── fasterRCNN
    │           └── 1

    ├── objectDetector_SSD
    │   └── nvdsinfer_custom_impl_ssd
    ├── objectDetector_Yolo
    │   └── nvdsinfer_custom_impl_Yolo
    ├── SONYCAudioClassifier
    │   └── gstnvinferaudio_custom_parser

    ├── tools
    │   └── nvds_logger
    └── tracker_DeepSORT

2 samples 文件夹

可以看到,samples 文件夹中主要增加了对 triton 和 tao 工具链的支持,提供了各种配置文件和媒体文件,这里不再赘述

3 source 文件夹

3.1 apps 文件夹

apps-common 文件夹提供的是各种头文件和底层驱动文件,变化不多。主要讲解 sample-apps 文件夹下的示例文件

3.1.1 deepstream-3d-action-recognition

提供了基于 2D/3D 模型的行为识别 pipeline,基本流程如下

src_bin -> nvstreammux -> nvdspreprocess -> nvinfer -> nvtiler -> nvosd -> display.

其中,在推理之前采用 nvdspreprocess 插件,源代码在 custom_sequence_preprocess 子文件夹中,实现了时序上的 batching 和 ROI 空间上的 batching,然后传输到下游插件做推理,输出结果做动作的分类识别,包括五类:push;fall_floor;walk;run;ride_bike

3D/2D 的模型是通过 TAO 工具提供的,3D 模型的输入大小为 NCDHW(NCSHW),2D 模型的输入大小为 NSHW,各个字母含义如下

    N: batch-size

    C: channels

    D/S: depth(sequence)

    H: height

    W: width

    S: channels x depth, reshaped from [C, D]

 目录中有多个配置文件,每个配置文件含义如下

.
├── config_infer_primary_2d_action.txt(nvinfer 的配置文件,2D 行为识别)
├── config_infer_primary_3d_action.txt(nvinfer 的配置文件,3D 行为识别)
├── config_preprocess_2d_custom.txt(preprocess 前处理配置文件,2D 行为识别)
├── config_preprocess_3d_custom.txt(preprocess 前处理配置文件,2D 行为识别)
├── deepstream_action_recognition_config.txt(pipeline 配置文件)
├── labels.txt(动作类别)

对于前处理插件的相关配置,有几个重要配置需注意:

  • subsample:下采样配置,帧数间隔,默认为 0,当设置为 1 时,处理的帧数为 1,3,5,7,9
  • stride:滑窗步数,基于下采样的帧数进行滑窗,默认值为 1。假设处理 5 帧图片,当设置 stride=0, subsample=0 时,连续的 2 个 batch 处理的帧数为 [1,2,3,4,5], [2,3,4,5,6]

在 jetson 上运行时,会报错如下

nvbufsurface: memory type (3) not supported
Running...
ERROR from element preprocess-plugin: Failed to set buffer pool to active
Error details: gstnvdspreprocess.cpp(578): gst_nvdspreprocess_start (): /GstPipeline:preprocess-test-pipeline/GstNvDsPreProcess:preprocess-plugin
Returned, stopping playback
Deleting pipeline

 这是由于 surface 的类别没设置对,需要修改一下 preprocess 的源码,进入 /opt/nvidia/deepstream/deepstream-6.0/sources/gst-plugins/gst-nvdspreprocess 路径,修改 gstnvdspreprocess.cpp 中的 memory_type,找到大概 554 行,将memory_type 修改为 NVBUF_MEM_DEFAULT,然后运行 sudo make install,替换掉系统路径中的插件动态库即可

#ifdef DUMP_ROIS
  // allocator_info.memory_type = NVBUF_MEM_CUDA_UNIFIED;
  allocator_info.memory_type = NVBUF_MEM_DEFAULT;
#else
  allocator_info.memory_type = nvdspreprocess->scaling_pool_memory_type;
#endif

 然后即可成功运行,显示如下

3.1.2 deepstream-appsrc-test

这个 pipeline 介绍了如何使用 appsrc 插件实现将外部数据喂入 pipeline 中,以及使用 appsink 插件从 pipeline 中获取数据。具体的,通过 fread() 函数读入裸视频数据(只支持 RGBA,NV12,I420 格式),输入到 appsrc 插件中,然后下游进行推理应用,直到 appsink 插件,appsink 提取 buffer 数据,来解析 metadata 中的有用信息。

这个功能与《Gstreamer应用开发手册13:管道中添加删除数据》介绍的基本一致,感兴趣的可以深入研究。

3.1.3 deepstream-audio

deepstream-audio 的主程序,具体功能参考 DeepStream Reference Application - deepstream-audio app — DeepStream 6.0 Release documentation 中的介绍,主要实现的是语音识别,输入一段语音,经过 audiodecode、streammux、nvinferaudio等插件后,得到语音的类别,pipeline 如下所示

3.1.4 deepstream-image-meta-test

这个 pipeline 主要介绍了如何编码保存 nvinfer 检测到的目标,保存为 jpeg 格式。搭建 pipeline 的时候,在 pgie_src_pad 上注册一个 pgie_src_pad_buffer_probe 回调函数,自定义编码 userData 数据。在 osd_sink_pad 上注册一个 osd_sink_pad_buffer_probe() 回调函数,在该回调函数中使用 fopen(), fwrite(), fclose() 等接口进行图片保存操作。

3.1.5 deepstream-mrcnn-test

在 deepstream-test1 的基础上,增加了几个功能

  • 使用 nvmsgconv 和 nvmsgbroker 插件
  • 创建 NVDS_EVENT_MSG_META 类型的数据,并且附着到 buffer 上
  • 使用 NVDS_EVENT_MSG_META 来区分不同类别的目标,如车辆、行人等
  • 如果元数据通过“extMsg”字段扩展,则提供复制/释放功能

nvmsgconv 插件使用 NVDS_ENENT_MSG_META 类型的数据,然后产生 json 格式的 deepstream schema,从配置文件中的 key-value 对来获取静态属性,产生这些数据后会以 NVDS_META_PAYLOAD 的格式附着到 buffer 中。

nvmsgbroker 插件解析 buffer 中的 NVDS_META_PAYLOAD 格式的数据,然后使用 C 语言的 API 接口发送到服务端。支持 Azure(mqtt) IOThub, kafka 和 AMQP broker(rabbitmq) 多种消息服务。

3.1.6 deepstream-nvdsanalytics-test

在 deepstream-test3 的基础上验证了:

  • 如何使用 nvdsanalytics 插件
  • 提取 nvdsanalytics 中的 metadata,包含 buffer 中的有用信息
  • 配置 nvdsanalytics 的相关属性

nvdsanalytics 插件分析 tracker 的输出,判断 Line crossing/Direction Detection/ROI Filtering/Overcrowding detection 几种情况,即穿线检测、方向检测、ROI 过滤,关于插件的功能介绍可直接查看Gst-nvdsanalytics — DeepStream 6.0 Release documentation

3.1.7 deepstream-opencv-test

介绍使用 dsexample 插件,使用 opencv 的相关功能,该插件已经开源,可以直接在插件源码中查看处理逻辑,功能容易理解,但对于性能要求较高的应用来说,不建议使用这个插件,因为从 数据在 gpu 和 cpu 之间的来回拷贝,效率不高,会降低整体 pipeline 的性能。

3.1.8 deepstream-preprocess-test

在 deepstream-test3 的基础上,新增了几项功能

  • 使用 multiple source
  • 使用 uridecodebin 插件,可以自动识别输入类型并匹配对应的解码器
  • 使用 streammux 来产生 batch 数据,提高 gpu 利用率
  • 每个 group 配置不同的 preprocess 操作

nvdspreprocess 插件也是开源的,可以对输入的流进行裁剪,然后打包成一个 batch 进行推理,推理完之后再把结果返回到原图像上进行显示,这个插件有利于对高分辨率图像进行识别,crop 其中的一部分进行推理,可以提高小目标的识别率。

3.1.9 deepstream-testsr

该示例介绍了如何使用 smart record 功能来自动保存视频和音频文件

3.1.10 deepstream-transfer-learning-app

该示例介绍了如何保存图片和识别结果(标注文件),用来进一步的进行训练,运行之后,在输出文件夹中自动生成下边格式的文件

.
├── images
│   ├── camera-0_2021-11-22T17:42:37+0800_0000000040.jpg
│   ├── camera-1_2021-11-22T17:42:37+0800_0000000042.jpg
│   ├── camera-2_2021-11-22T17:42:37+0800_0000000036.jpg
│   └── camera-3_2021-11-22T17:42:37+0800_0000000038.jpg
├── images_cropped
├── labels
│   ├── camera-0_2021-11-22T17:42:37+0800_0000000040.txt
│   ├── camera-1_2021-11-22T17:42:37+0800_0000000042.txt
│   ├── camera-2_2021-11-22T17:42:37+0800_0000000036.txt
│   └── camera-3_2021-11-22T17:42:37+0800_0000000038.txt
├── metadata.csv
└── metadata.json

3.2 gst-plugins 文件夹

sdk 新开源了几个插件,包括 osd、preprocess、audiotemplate、videotemplate,这里主要介绍一下 nvdsvideotemplate 这个插件

插件介绍地址:Gst-nvdsvideotemplate — DeepStream 6.0 Release documentation

该插件提供了对视频帧处理的一个模板过程,可以调用自定义库,实现不同算法的处理功能,支持 NV12 和 RGBA 格式的输入

测试方法如下:

On dGPU
   $ gst-launch-1.0 filesrc location=/home/nvidia/sample_720p.mp4 ! decodebin ! \\
      nvvideoconvert ! nvdsvideotemplate customlib-name="./libcustom_videoimpl.so" \\
      customlib-props="key1:value1" customlib-props="key2:value2" ! identity silent=1 ! nveglglessink

On Jetson
   $ gst-launch-1.0 filesrc location=/home/nvidia/sample_720p.mp4 ! decodebin ! \\
      nvvideoconvert ! nvdsvideotemplate customlib-name="./libcustom_videoimpl.so" \\
      customlib-props="key1:value1" customlib-props="key2:value2" ! identity silent=1 ! nvegltransform ! nveglglessink

以上是关于DeepStream6.0系列之SDK文件夹解析的主要内容,如果未能解决你的问题,请参考以下文章

DeepStream6.0系列之filesink保存文件

DeepStream6.0系列之filesink保存文件

DeepStream6.0系列之版本说明

DeepStream6.0系列之版本说明

模型推理deepstream6.0 部署 yolov3 和 yolov4 教程

目录