英伟达DeepStream学习笔记2——deepstream_sdk文件夹解析
我们在用jetpack刷了系统后,正常来说,deepstream是已经安装了,在/opt/nvidia/deepstream/deepstream-5.0/目录下就是deepstream的源码。
先了解下DeepStream的应用架构
DeepStream参考应用程序是基于GStreamer的解决方案,由一组GStreamer插件组成,这些插件封装了低级API,以形成完整的图形(关于GStreamer的入门介绍,可参考《Gstreamer系列教程》)。该参考应用程序具有接受来自各种来源(如Camera,RTSP输入,编码文件输入)的输入的能力,并且还支持多流/源功能。由NVIDIA实现并作为DeepStream SDK的一部分提供的GStreamer插件列表包括:
- 流媒体插件Gst-nvstreammux:可从多个输入源组成一批缓冲区。
- 基于TensorRT的推理插件GST-nvinfer:分别用于初级和次级(主要对象的属性分类)检测和分类。
- 基于OpenCV的跟踪器插件Gst-nvtracker,用于具有唯一ID的对象跟踪。
- Multi Stream Tiler插件Gst-nvmultistreamtiler:用于形成2D帧数组。
- 屏幕显示插件Gst-nvdsosd:可使用生成的元数据在合成框架上- 绘制阴影框,矩形和文本。
- 消息转换器Gst-nvmsgconv和消息代理Gst-nvmsgbroker插件结合使用,可以将分析数据发送到云中的服务器。
1 、整体结构
如果使用deb包安装的SDK,则安装目录位于/opt/nvidia/deepstream/deepstream-x.x。如果使用压缩包安装的,则位于我们压缩包解压的位置,利用tree -d指令进行目录分析,输出如下
.
├── samples
│ ├── configs
│ │ └── deepstream-app
│ ├── models
│ │ ├── Primary_Detector
│ │ ├── Primary_Detector_Nano
│ │ ├── Secondary_CarColor
│ │ ├── Secondary_CarMake
│ │ ├── Secondary_VehicleTypes
│ │ └── Segmentation
│ │ ├── industrial
│ │ └── semantic
│ └── streams
└── sources
├── apps
│ ├── apps-common
│ │ ├── includes
│ │ └── src
│ └── sample_apps
│ ├── deepstream-app
│ ├── deepstream-dewarper-test
│ │ └── csv_files
│ ├── deepstream-gst-metadata-test
│ ├── deepstream-image-decode-test
│ ├── deepstream-infer-tensor-meta-test
│ ├── deepstream-nvof-test
│ ├── deepstream-perf-demo
│ ├── deepstream-segmentation-test
│ ├── deepstream-test1
│ ├── deepstream-test2
│ ├── deepstream-test3
│ ├── deepstream-test4
│ ├── deepstream-test5
│ │ └── configs
│ └── deepstream-user-metadata-test
├── gst-plugins
│ ├── gst-dsexample
│ │ └── dsexample_lib
│ ├── gst-nvinfer
│ ├── gst-nvmsgbroker
│ └── gst-nvmsgconv
├── includes
├── libs
│ ├── amqp_protocol_adaptor
│ ├── azure_protocol_adaptor
│ │ ├── device_client
│ │ └── module_client
│ ├── kafka_protocol_adaptor
│ ├── nvdsinfer
│ ├── nvdsinfer_customparser
│ └── nvmsgconv
├── objectDetector_FasterRCNN
│ └── nvdsinfer_custom_impl_fasterRCNN
├── objectDetector_SSD
│ └── nvdsinfer_custom_impl_ssd
├── objectDetector_Yolo
│ └── nvdsinfer_custom_impl_Yolo
└── tools
└── nvds_logger
接下来对每个文件夹中的内容进行介绍
2、 samples文件夹
samples文件夹中含有三个子文件夹,分别是configs、models、streams文件夹,分别表示示例配置文件、运行示例应用程序的模型及流媒体文件目录
2.1 configs子文件夹
configs文件夹下是deepstream-app的各种配置文件,
.
├── configs
│ └── deepstream-app
│ ├── config_infer_primary_nano.txt(在nano上将 nvinfer 元素配置为主要检测器)
│ ├── config_infer_primary.txt(将 nvinfer 元素配置为主要检测器)
│ ├── config_infer_secondary_carcolor.txt(将 nvinfer元素配置为辅助分类器)
│ ├── config_infer_secondary_carmake.txt(将 nvinfer元素配置为辅助分类器)
│ ├── config_infer_secondary_vehicletypes.txt(将 nvinfer元素配置为辅助分类器)
│ ├── iou_config.txt(配置一个低级的IOU(联合上的交集)跟踪器)
│ ├── source1_usb_dec_infer_resnet_int8.txt(演示一个USB摄像机作为输入)
│ ├── source30_1080p_dec_infer-resnet_tiled_display_int8.txt
│ │ (演示30路1080P视频输入解码、推理、显示)
│ ├── source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8_gpu1.txt
│ │ (演示在gpu1上4路1080P视频输入解码、推理、跟踪、显示)
│ ├── source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
│ │ (演示4路1080P视频输入解码、推理、跟踪、显示)
│ └── tracker_config.yml
2.2 models子文件夹
├── models
│ ├── Primary_Detector(一级检测器)
│ │ ├── cal_trt.bin
│ │ ├── labels.txt
│ │ ├── resnet10.caffemodel
│ │ └── resnet10.prototxt
│ ├── Primary_Detector_Nano(一级检测器,适用于nano)
│ │ ├── labels.txt
│ │ ├── resnet10.caffemodel
│ │ └── resnet10.prototxt
│ ├── Secondary_CarColor(二级检测器,车辆颜色分类)
│ │ ├── cal_trt.bin
│ │ ├── labels.txt
│ │ ├── mean.ppm
│ │ ├── resnet18.caffemodel
│ │ └── resnet18.prototxt
│ ├── Secondary_CarMake(二级检测器,车辆颜色分类)
│ │ ├── cal_trt.bin
│ │ ├── labels.txt
│ │ ├── mean.ppm
│ │ ├── resnet18.caffemodel
│ │ └── resnet18.prototxt
│ ├── Secondary_VehicleTypes(二级检测器,车辆种类分类)
│ │ ├── cal_trt.bin
│ │ ├── labels.txt
│ │ ├── mean.ppm
│ │ ├── resnet18.caffemodel
│ │ └── resnet18.prototxt
│ └── Segmentation(分割模型)
│ ├── industrial
│ │ └── unet_output_graph.uff
│ └── semantic
│ └── unetres18_v4_pruned0.65_800_data.uff
模型的具体参数如下
2.3 streams子文件夹
该文件夹主要包含一些测试文件,文件对应的类型如图所示
3 、sources文件夹
该文件夹中包含各种示例程序和插件的源代码,主要有以下几个文件夹
.
├── apps(deepstream-app的测试代码)
├── gst-plugins(gstreamer插件)
├── includes(各种头文件)
├── libs(各种库)
├── objectDetector_FasterRCNN(faster rcnn目标检测器)
├── objectDetector_SSD(SSD目标检测器)
├── objectDetector_Yolo(yolo目标检测器)
└── tools(日志工具)
我们能用到的主要是apps中的sample_app示例代码、gst-plugins和三种目标检测器
3.1 apps子文件夹
sample_apps
├── deepstream-app
├ 端到端示例演示了4级联神经网络(1个一级检测器和3个二级分类器)的多相机流,并显示平铺输出。
├── deepstream-dewarper-test
├ 演示单个或多个360度摄像机流的扭曲功能。从CSV文件读取相机校准参数,
├ 并在显示屏上渲染过道和斑点表面。
├── deepstream-gst-metadata-test
├ 演示如何在DeepStream管道中的Gst-nvstreammux插件之前设置元数据,
├ 以及如何在Gst-nvstreammux之后访问元数据。
├── deepstream-image-decode-test
├ 建立在deepstream-test3上,以演示图像解码而不是视频。本示例使用自定义解码箱,
├ 因此可以将MJPEG编解码器用作输入。
├── deepstream-infer-tensor-meta-test
├ 演示如何将nvinfer张量输出作为元数据传递和访问。
├── deepstream-nvof-test
├ 演示单个或多个流的光流功能。本示例使用两个GStreamer插件(Gst-nvof和Gst-nvofvisual)。
├ Gst-nvof元素生成MV(运动矢量)数据并将其作为用户元数据附加。Gst-nvofvisual元素使用
├ 预定义的色轮矩阵可视化MV数据。
├── deepstream-perf-demo
├ 对目录中的所有流顺序执行单通道级联推理和对象跟踪。
├── deepstream-segmentation-test
├ 演示使用语义或工业神经网络对多流视频或图像进行分割,并将输出呈现到显示器。
├── deepstream-test1
├ 有关如何对单个H.264流使用DeepStream元素的简单示例:filesrc→decode解码→nvstreammux→nvinfer
├ (主检测器)→nvosd→renderer渲染器。
├── deepstream-test2
├ 简单的应用程序,建立在test1之上,显示额外的属性,如跟踪和二级分类属性。
├── deepstream-test3
├ 基于deepstream-test1(简单测试应用程序1)构建,以演示如何:
├ •在管道中使用多个来源
├ •使用uridecodebin接受任何类型的输入(例如RTSP /文件),任何GStreamer支持的容器格式以及任何编解码器
├ •配置Gst-nvstreammux生成一批帧并推断出这些帧以提高资源利用率
├ •提取流元数据,其中包含有关批处理缓冲区中的帧的有用信息
├── deepstream-test4
├ 基于deepstream-test1 构建单个H.264流:filesrc,decode,nvstreammux,nvinfer,nvosd, renderer演示如何:
├ •在管道中使用Gst-nvmsgconv和Gst-nvmsgbroker插件
├ •创建NVDS_META_EVENT_MSG类型的元数据并将其附加到缓冲区
├ •将 NVDS_META_EVENT_MSG用于不同类型的对象,例如车辆和人
├ •实现元数据通过extMsg字段扩展的“复制”和“免费”功能
├── deepstream-test5
├ 建立在deepstream-app之上。展示:
├ •在管道中将Gst-nvmsgconv和Gst-nvmsgbroker插件用于多流
├ •如何从配置文件中将Gst-nvmsgbroker插件配置为接收器插件(适用于KAFKA,Azure等)
├ •如何处理来自RTSP服务器或摄像机的RTCP发送者报告,以及如何将Gst Buffer PTS转换为UTC时间戳。
├ 欲了解更多详情,请参阅该RTCP发送者报告回调函数test5_rtcp_sender_report_callback注册和使用的 deepstream_test5_app_main.c。
├ 使用rtpmanager元素的“ handle-sync”信号进行GStreamer回调注册的过程记录在apps-common /src / deepstream_source_bin.c中。
├──deepstream-user-metadata-test
├ 演示如何向DeepStream的任何组件中添加自定义或用户特定的元数据。测试代码将一个填充有用户
├ 数据的16字节数组附加到所选组件。数据在另一个组件中检索。
3.2 gst-plugins子文件夹
gst-plugins
├── gst-dsexample(模板插件,用于将自定义算法集成到DeepStream SDK图形中)
│ └── dsexample_lib
├── gst-nvinfer(用于推理的GStreamer Gst-nvinfer插件的源代码)
├── gst-nvmsgbroker(GStreamer Gst-nvmsgbroker插件的源代码,用于将数据发送到服务器)
└── gst-nvmsgconv(GStreamer Gst-nvmsgconv插件的源代码,用于将元数据转换为架构格式。)
3.3 libs子文件夹
libs
├── amqp_protocol_adaptor(测试AMQP的应用程序。)
├── azure_protocol_adaptor(测试Azure MQTT的应用程序。)
│ ├── device_client
│ └── module_client
├── kafka_protocol_adaptor(测试Kafka的应用程序)
├── nvdsinfer(NvDsInfer 库的源代码,由Gst-nvinfer GStreamer插件使用。)
├── nvdsinfer_customparser(用于检测器和分类器的定制模型输出解析示例)
└── nvmsgconv(Gst-nvmsgconv GStreamer插件所需的NvMsgConv库的源代码)