C/C++ 示例应用源代码详情#

DeepStream SDK 包包含插件、库、应用程序和源代码的存档。对于 Debian 安装(在 Jetson 或 dGPU 上)和 SDK Manager 安装,源目录位于 /opt/nvidia/deepstream/deepstream/sources。对于 tar 包,源文件位于解压后的 deepstream 包中。DeepStream Python 绑定和示例应用程序作为单独的包提供。有关更多信息,请参阅 NVIDIA-AI-IOT/deepstream_python_apps

使用 Graph Composer 创建的 DeepStream 图列在参考图部分下。有关更多信息,请参阅 Graph Composer 简介

示例源代码详情#

参考测试应用程序

sources 目录内的路径

描述

示例测试应用程序 1

apps/sample_apps/deepstream-test1

如何为单个 H.264 流使用 DeepStream 元素的示例:filesrc → decode → nvstreammux → nvinfer 或 nvinferserver(主要检测器)→ nvdsosd → renderer。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

示例测试应用程序 2

apps/sample_apps/deepstream-test2

如何为单个 H.264 流使用 DeepStream 元素的示例:filesrc → decode → nvstreammux → nvinfer 或 nvinferserver(主要检测器)→ nvtracker → nvinfer 或 nvinferserver(二级分类器)→ nvdsosd → renderer。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测和 2 个分类器模型(即,resnet18_vehiclemakenet_pruned.onnx,resnet18_vehicletypenet_pruned.onnx)。

示例测试应用程序 3

apps/sample_apps/deepstream-test3

基于 deepstream-test1(简单测试应用程序 1)构建,以演示如何

  • 在管道中使用多个源。

  • 使用 uridecodebin 接受任何类型的输入(例如 RTSP/文件)、任何 GStreamer 支持的容器格式和任何编解码器。

  • 配置 Gst-nvstreammux 以生成一批帧并在其上进行推理,以获得更好的资源利用率。

  • 提取流元数据,其中包含有关批处理缓冲区中帧的有用信息。

此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

示例测试应用程序 4

apps/sample_apps/deepstream-test4

基于 deepstream-test1 构建,用于单个 H.264 流:filesrc、decode、nvstreammux、nvinfer 或 nvinferserver、nvdsosd、renderer,以演示如何

  • 在管道中使用 Gst-nvmsgconv 和 Gst-nvmsgbroker 插件。

  • 创建 NVDS_META_EVENT_MSG 类型元数据并将其附加到缓冲区。

  • 将 NVDS_META_EVENT_MSG 用于不同类型的对象,例如车辆和人。

  • 如果通过 extMsg 字段扩展元数据,则实现“copy”和“free”函数以供使用。

此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

示例测试应用程序 5

apps/sample_apps/deepstream-test5

基于 deepstream-app 之上构建。演示了

  • 在管道中为多流使用 Gst-nvmsgconv 和 Gst-nvmsgbroker 插件。

  • 如何从配置文件中将 Gst-nvmsgbroker 插件配置为 sink 插件(用于 KAFKA、Azure 等)。

  • 如何处理来自 RTSP 服务器或摄像机的 RTCP 发送者报告,并将 Gst Buffer PTS 转换为 UTC 时间戳。

有关更多详细信息,请参阅 RTCP 发送者报告回调函数 test5_rtcp_sender_report_callback()deepstream_test5_app_main.c 中的注册和使用。GStreamer 回调与 rtpmanager 元素的“handle-sync”信号的注册记录在 apps-common/src/deepstream_source_bin.c 中。

此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

DeepStream 3D 多模激光雷达相机传感器融合应用

apps/sample_apps/deepstream-3d-lidar-sensor-fusion

示例应用程序 deepstream-3d-lidar-sensor-fusion 展示了使用 DS3D 框架的 LiDAR 和相机数据的多模传感器融合管道。此示例中集成了 2 个管道,ds3d 多模 bevfusion 具有 6 个摄像头加上激光雷达数据融合和 3D 检测;v2x 模型处理来自单个摄像头和激光雷达的数据,利用批量大小为 4。

AMQP 协议测试应用程序

libs/amqp_protocol_adaptor

用于测试 AMQP 协议的应用程序。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

Azure MQTT 测试应用程序

libs/azure_protocol_adaptor

测试应用程序,用于展示使用 MQTT 的 Azure IoT 设备到边缘消息传递和设备到云消息传递。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

DeepStream 参考应用程序

apps/sample_apps/deepstream-app

DeepStream 参考应用程序的源代码。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测和 2 个分类器模型(即,resnet18_vehiclemakenet_pruned.onnx,resnet18_vehicletypenet_pruned.onnx)。

Dewarper 示例

apps/sample_apps/deepstream-dewarper-test

演示单个或多个 360 度摄像头流的 dewarper 功能。从 CSV 文件读取摄像头校准参数,并在显示器上渲染通道和点表面。

光流示例

apps/sample_apps/deepstream-nvof-test

演示单个或多个流的光流功能。此示例使用两个 GStreamer 插件(Gst-nvof 和 Gst-nvofvisual)。Gst-nvof 元素生成 MV(运动向量)数据并将其作为用户元数据附加。Gst-nvofvisual 元素使用预定义的色轮矩阵可视化 MV 数据。

自定义元数据示例

apps/sample_apps/deepstream-user-metadata-test

演示如何将自定义或用户特定的元数据添加到 DeepStream 的任何组件。测试代码将填充了用户数据的 16 字节数组附加到所选组件。数据在另一个组件中检索。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

MJPEG 和 JPEG 解码器和推理示例

apps/sample_apps/deepstream-image-decode-test

基于 deepstream-test3 构建,以演示图像解码而不是视频。此示例使用自定义解码 bin,以便可以将 MJPEG 编解码器用作输入。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

在 Gst-nvstreammux 之前处理元数据

apps/sample_apps/deepstream-gst-metadata-test

演示如何在 DeepStream 管道中的 Gst-nvstreammux 插件之前设置元数据,以及如何在 Gst-nvstreammux 之后访问它。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

Gst-nvinfer 张量元流示例

apps/sample_apps/deepstream-infer-tensor-meta-app

演示如何将 nvinfer 张量输出作为元数据流动和访问。注意:由于 OpenCV 已弃用,因此未打包此二进制文件。此应用程序需要用户编译。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测和 2 个分类器模型(即,resnet18_vehiclemakenet_pruned.onnx,resnet18_vehicletypenet_pruned.onnx)。

预处理示例

apps/sample_apps/deepstream-preprocess-test

演示对为流配置的预处理 ROI 进行推理。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

3D 动作识别参考应用

apps/sample_apps/deepstream-3d-action-recognition

演示基于序列批处理的 3D 或 2D 模型推理管道,用于动作识别。它还包括一个基于序列的预处理自定义库,用于 NCSHW 时间批处理。在运行应用程序之前,请参阅 README 中的先决条件。此应用程序使用 resnet18_2d_rgb_hmdb5_32.etlt 进行 2D 动作识别,使用 resnet18_3d_rgb_hmdb5_32.etlt 进行 3D 动作识别。

分析示例

apps/sample_apps/deepstream-nvdsanalytics-test

演示批量分析,如 ROI 过滤、线路交叉、方向检测和人群拥挤。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

OpenCV 示例

apps/sample_apps/deepstream-opencv-test

演示在 dsexample 插件中使用 OpenCV。需要使用标志 WITH_OPENCV=1 编译 dsexample。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

图像作为元数据示例

Apps/sample_apps / deepstream-image-meta-test

演示如何将编码图像作为元数据附加,并将图像保存为 jpeg 格式。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

Appsrc 和 Appsink 示例

apps/sample_apps/deepstream-appsrc-test

演示 AppSrc 和 AppSink 用法,分别用于从非 DeepStream 代码使用和提供数据。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

Cuda Appsrc 和 Appsink 示例

apps/sample_apps/deepstream-appsrc-cuda-test

演示如何将从 DeepStream 外部获取的 cuda 帧馈送到 DeepStream 管道。

迁移学习示例

apps/sample_apps/ deepstream-transfer-learning-app

演示一种保存置信度较低的对象的图像的机制,并且该机制可以用于进一步训练。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

智能录制示例

apps/sample_apps/deepstream-testsr

演示基于事件的智能录制功能。此应用程序使用 resnet18_trafficcamnet_pruned.onnx 进行检测。

音频+视频+文本同步(Alpha)

apps/sample_apps/deepstream-avsync-app

演示 DeepStream 管道中来自 nvdsasr 的音频、视频和文本输出的同步。注意:此应用程序需要 Riva ASR 服务可用。在运行应用程序之前,请参阅 README 中的先决条件。此应用程序使用 Jasper 模型进行语音识别。

DeepStream NMOS 应用程序

apps/sample_apps/deepstream-nmos

此应用程序演示如何将 DeepStream 应用程序创建为 NMOS 节点。它使用一个库 (NvDsNmos),该库提供用于创建、销毁和内部管理 NMOS 节点的 API。NMOS 节点可以使用 AMWA IS-04 注册 API 自动发现网络上的 NMOS 注册表并向其注册。

它还展示了如何创建各种视频和音频管道、同时运行它们以及根据 NMOS 事件(例如来自 NMOS 控制器的 AMWA IS-05 连接 API 请求)重新配置它们。

DeepStream UCX 测试

apps/sample_apps/deepstream-ucx-test

演示如何将通信插件 gst-nvdsucx 与 DeepStream SDK 一起使用。该应用程序已在 kernel-5.15 上验证。

DeepStream 3D 深度相机参考应用

apps/sample_apps/deepstream-3d-depth-camera

演示如何通过 ds3d::dataloaderds3d::datafilterds3d::datarender 的 DS3D 接口和自定义库设置深度捕获、深度渲染、3D 点云处理和 3D 点渲染管道。有关更多详细信息,请参阅 DeepStream 3D 深度相机应用

DeepStream 3D 激光雷达数据推理参考应用

apps/sample_apps/deepstream-lidar-inference-app

演示如何读取点云数据,使用 pointpillar 3D 对象检测模型和 Triton 推理点云数据,使用 GLES 渲染点云数据和 3D 对象。整个应用程序基于 ds3d::dataloaderds3d::datafilterds3d::datarender 的 DS3D 接口和自定义库。有关更多详细信息,请参阅 DeepStream 3D 激光雷达推理应用

Deepstream 服务器应用程序

apps/sample_apps/deepstream-server

演示 REST API 支持,以动态控制 DeepStream 管道。

DeepStream 罐头方向示例应用

apps/sample_apps/deepstream-can-orientation-app

演示使用基于 CV 的 VPI 模板匹配算法进行罐头方向检测。VPI 模板匹配通过 DeepStream 视频模板插件实现。有关更多详细信息,请参阅 apps/sample_apps/deepstream-can-orientation-app/README

Triton Ensemble 模型示例

sources/TritonBackendEnsemble

Triton ensemble 模型示例的配置文件、Triton 自定义 C++ 后端实现和自定义库实现。演示如何将 Triton ensemble 模型与 gst-nvinferserver 插件结合使用,以及如何实现自定义 Triton C++ 后端以使用多输入张量访问 DeespStream 元数据(如流 ID)。

deepstream-multigpu-nvlink-test

apps/sample_apps/deepstream-multigpu-nvlink-test

使用 gst-nvdsxfer 插件模拟启用 NVLINK 的多 GPU 设置的管道,以实现更好的性能。用户可以使用 dsmultigpu_config.yml 文件中 nvxfer 配置部分的“position”参数来模拟 gst-nvxfer 插件支持的各种多 GPU 用例管道。

deepstream-ipc-test-app

apps/sample_apps/deepstream-ipc-test-app

演示 Jetson 平台上用于实时流的解码器缓冲区共享 IPC 用例,以优化 NVDEC HW 利用率。此示例使用 IPC sink 和 IPC source 元素来互连在不同进程中运行的 GStreamer 管道。

注意

写入输出文件的应用程序(示例:deepstream-image-meta-testdeepstream-testsrdeepstream-transfer-learning-app)应使用 sudo 权限运行。

插件和库源代码详情#

下表描述了 sources 目录的内容,参考测试应用程序除外

插件和库源代码详情#

插件或库

sources 目录内的路径

描述

DsExample GStreamer 插件

gst-plugins/gst-dsexample

用于将自定义算法集成到 DeepStream SDK 图中的模板插件。

GStreamer Gst-nvmsgconv 插件

gst-plugins/gst-nvmsgconv

用于将元数据转换为模式格式的 GStreamer Gst-nvmsgconv 插件的源代码。

GStreamer Gst-nvmsgbroker 插件

gst-plugins/gst-nvmsgbroker

用于将数据发送到服务器的 GStreamer Gst-nvmsgbroker 插件的源代码。

GStreamer Gst-nvdspreprocess 插件

gst-plugins/gst-nvdspreprocess

用于对预定义 ROI 进行预处理的 GStreamer Gst-nvdspreprocess 插件的源代码。

GStreamer Gst-nvinfer 插件

gst-plugins/gst-nvinfer

用于推理的 GStreamer Gst-nvinfer 插件的源代码。

GStreamer Gst-nvinferserver 插件

gst-plugins/gst-nvinferserver

用于使用 Triton Inference Server 进行推理的 GStreamer Gst-nvinferserver 插件的源代码。

GStreamer Gst-nvdsosd 插件

gst-plugins/gst-nvdsosd

用于绘制边界框、文本和其他对象的 GStreamer Gst-nvdsosd 插件的源代码。

Gstreamer Gst-nvdewarper 插件

gst-plugins/gst-nvdewarper

用于解扭曲帧的 GStreamer Gst-nvdewarper 插件的源代码

NvDsInfer 库

libs/nvdsinfer

NvDsInfer 库的源代码,由 Gst-nvinfer GStreamer 插件使用。

NvDsInferServer 库

libs/nvdsinferserver

NvDsInferServer 库的源代码,由 Gst-nvinferserver GStreamer 插件使用。

NvDsNmos 库

libs/nvdsnmos

NvDsNmos 库的源代码,由 DeepStream NMOS 应用程序演示。

NvMsgConv 库

libs/nvmsgsconv

NvMsgConv 库的源代码,Gst-nvmsgconv GStreamer 插件需要它。

Kafka 协议适配器

libs/kafka_protocol_adapter

Kafka 的协议适配器。

nvds_rest_server 库

libs/nvds_rest_server

rest 服务器的源代码。

nvds_customhelper

libs/gstnvdscustomhelper

“nvdsmultiurisrcbin helper”和 rest 服务器所需的自定义“gst-events、gst-messages 和 common configs”的源代码。

nvdsinfer_customparser

libs/nvdsinfer_customparser

检测器和分类器的自定义模型输出解析示例。

Gst-v4l2

请参阅下面的注释 [1]

v4l2 编解码器的源代码。

Gstreamer gst-nvdsvideotemplate 插件

gst-plugins/gst-nvdsvideotemplate

用于实现视频自定义算法(非 Gstreamer 基于)的模板插件的源代码

NvDsVideoTemplate 自定义库

gst-plugins/gst-nvdsvideotemplate/customlib_impl

用于实现视频自定义算法的自定义库的源代码

Gstreamer gst-nvdsaudiotemplate 插件

gst-plugins/gst-nvdsaudiotemplate

用于实现音频自定义算法(非 Gstreamer 基于)的模板插件的源代码

NvDsVideoTemplate 自定义库

gst-plugins/gst-nvdsaudiotemplate/customlib_impl

用于实现音频自定义算法的自定义库的源代码

Gstreamer gst-nvdsmetautils

gst-plugins/gst-nvdsmetautils

用于处理元数据的 Gstreamer Gst-nvdsmetainsert 和 Gst-nvdsmetaextract 插件的源代码

NvDsMetaUtils SEI 序列化库

gst-plugins/gst-nvdsmetautils/sei_serialization

用于自定义元数据反/序列化以嵌入到编码比特流中作为 SEI 数据(Gst-nvdsmetautils 插件需要)的源代码

NvDsMetaUtils 音频序列化库

gst-plugins/gst-nvdsmetautils/audio_metadata_serialization

音频 NvDsFrameMeta 反/序列化(Gst-nvdsmetautils 插件需要)的源代码

NvDsMetaUtils 视频序列化库

gst-plugins/gst-nvdsmetautils/video_metadata_serialization

视频 NvDsFrameMeta 和 NvDsObjectMeta 反/序列化(Gst-nvdsmetautils 插件需要)的源代码

Gstreamer gst-nvvideotestsrc 插件

gst-plugins/gst-nvvideotestsrc

用于生成以各种格式和模式编写的视频测试数据的源代码,这些数据直接写入 GPU 输出缓冲区

Gstreamer gst-nvdsspeech 插件

gst-plugins/gst-nvdsspeech

自定义低级别自动语音识别 (ASR) 库的接口,该库可以由 Gst-nvdsasr 插件加载

Gstreamer gst-nvdstexttospeech 插件

gst-plugins/gst-nvdstexttospeech

自定义低级别文本到语音 (TTS) 库的接口,该库可以由 Gst-nvds_text_to_speech 插件加载

Gstreamer gst-nvdspostprocess 插件

gst-plugins/gst-nvdspostprocess

插件和低级别库的源代码,用于为推理插件(nvinfer/nvinferserver)的张量输出提供自定义库接口

Gstreamer gst-nvtracker 插件

gst-plugins/gst-nvtracker

用于跟踪检测到的对象在一段时间内具有持久性(可能是唯一) ID 的插件的源代码

Gstreamer gst-nvdsanalytics 插件

gst-plugins/gst-nvdsanalytics

用于对 nvinfer(主要检测器)和 nvtracker 附加的元数据执行分析的接口

Gstreamer gst-nvstreammux New 插件

gst-plugins/gst-nvmultistream2

用于从多个输入源形成一批帧的插件的源代码

DS3D 激光雷达文件读取器自定义库

libs/ds3d/dataloader/lidarsource

DS3D 激光雷达文件读取器的源代码,其中包含 ds3d::dataloader 接口的实现,开发人员可以按照它来实现自定义激光雷达设备捕获,有关库详细信息,请参阅 自定义数据加载器 libnvds_lidarfileread 配置规范

DS3D 激光雷达数据读取器自定义处理库

libs/ds3d/datafilter/lidar_preprocess

DS3D 激光雷达数据处理的源代码,其中包含 ds3d::datafilter 接口的实现

DS3D 激光雷达检测后处理自定义库

libs/ds3d/inference_custom_lib/ds3d_lidar_detection_postprocess

DS3D 激光雷达和传感器融合 (bevfusion) 后处理自定义库的源代码

DS3D 激光雷达 v2xfusion 后处理自定义库

libs/ds3d/inference_custom_lib/ds3d_v2x_infer_custom_postprocess

DS3D 激光雷达和传感器融合 (v2xfusion) 后处理自定义库的源代码

DS3D 激光雷达 v2xfusion 预处理自定义库

ds3d/inference_custom_lib/ds3d_v2x_infer_custom_preprocess

DS3D 传感器融合 (v2xfusion) 预处理自定义库的源代码

Gstreamer Gst-nvurisrcbin 插件

gst-plugins/gst-nvurisrcbin

Gstreamer Gst-nvurisrcbin 插件的源代码,它是 uridecodebin 的包装器,具有文件循环、rtsp 重新连接和智能录制的附加功能

Gstreamer Gst-nvmultiurisrcbin 插件

gst-plugins/gst-nvmultiurisrcbin

Gstreamer Gst-nvmultiurisrcbin 插件的源代码,它集成了 gstnvurisrcbin、nvstreammux 插件,并默认启用了 REST 服务器支持。

脚注