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文件夹解析的主要内容,如果未能解决你的问题,请参考以下文章