当前位置:   article > 正文

NVIDIA相关资料(一)——Deepstream相关知识

deepstream

来源于官网翻译资料Welcome to the DeepStream Documentation — DeepStream 5.1 Release documentation

1.DeepStream简介

1.1 DeepStream概览

DeepStream 是一个流分析工具包,用于构建 AI 驱动的应用程序。它将流数据作为输入——来自 USB/CSI 摄像头、来自文件的视频或通过 RTSP 的流,并使用人工智能和计算机视觉从像素中生成洞察力,以便更好地了解环境。DeepStream SDK 可以成为许多视频分析解决方案的基础层,例如了解智慧城市中的交通和行人、医院中的健康和安全监控、零售中的自助结账和分析、制造工厂中的组件缺陷检测等。在此处阅读有关 DeepStream 的更多信息。

深流概述

DeepStream 通过 Python 绑定支持使用 C/C++ 和 Python 开发应用程序。为了更容易上手,DeepStream 附带了几个 C/C++ 和 Python 中的参考应用程序。请参阅C/C++ 示例应用程序源详细信息Python 示例应用程序源详细信息部分,以了解有关可用应用程序的更多信息。有关一些示例 DeepStream 参考应用程序,请参阅NVIDIA-AI-IOT Github 页面。

核心 SDK 由多个硬件加速器插件组成,这些插件使用 VIC、GPU、DLA、NVDEC 和 NVENC 等各种加速器。通过在专用加速器中执行所有计算繁重的操作,DeepStream 可以为视频分析应用程序实现最高性能。DeepStream 的关键功能之一是边缘和云之间的安全双向通信。DeepStream 附带了几个开箱即用的安全协议,例如使用用户名/密码的 SASL/Plain 身份验证和 2 路 TLS 身份验证。要了解有关这些安全功能的更多信息,请阅读IoT章节。要了解有关双向功能的更多信息,请参阅本指南的双向消息部分。

DeepStream 构建在 CUDA-X 堆栈中的几个 NVIDIA 库之上,例如 CUDA、TensorRT、Triton 推理服务器和多媒体库。TensorRT 加速了 NVIDIA GPU 上的 AI 推理。DeepStream 在 DeepStream 插件中抽象了这些库,使开发人员无需学习所有单个库即可轻松构建视频分析管道。

DeepStream 针对 NVIDIA GPU 进行了优化;该应用程序可以部署在运行 Jetson 平台的嵌入式边缘设备上,也可以部署在更大的边缘或数据中心 GPU 上,例如 T4。DeepStream 应用程序可以使用 NVIDIA 容器运行时部署在容器中。这些容器可在 NGC、NVIDIA GPU 云注册处获得。要了解有关使用 docker 进行部署的更多信息,请参阅 Docker 容器章节。DeepStream 应用程序可以使用 GPU 上的 Kubernetes 在边缘进行编排。NGC 上提供了用于部署 DeepStream 应用程序的示例 Helm 图表

1.2 DeepStream图架构

DeepStream 是使用开源 GStreamer 框架构建的优化图架构。. 下图显示了一个典型的视频分析应用程序,从输入视频开始到输出见解。所有单独的块都是使用的各种插件。底部是在整个应用程序中使用的不同硬件引擎。最佳内存管理与插件之间的零内存复制和各种加速器的使用确保了最高的性能。

深流概述

 DeepStream 以 GStreamer 插件的形式提供构建块,可用于构建高效的视频分析管道。有超过 15 个插件可以针对各种任务进行硬件加速。

(1)流数据可以通过 RTSP 或来自本地文件系统或直接来自相机的网络传输。流是使用 CPU 捕获的。一旦帧在内存中,它们就会被发送以使用 NVDEC 加速器进行解码。解码插件称为Gst-nvvideo4linux2

(2)解码后,有一个可选的图像预处理步骤,可以在推理之前对输入图像进行预处理。预处理可以是图像去扭曲或色彩空间转换。Gst-nvdewarper插件可以对来自鱼眼或 360 度相机的图像进行去扭曲。Gst-nvvideoconvert插件可以对帧进行颜色格式转换。这些插件使用 GPU 或 VIC(视觉图像合成器)。

(1)下一步是对帧进行批处理以获得最佳推理性能。批处理是使用Gst-nvstreammux插件完成的。

(1)一旦帧被批处理,它就会被发送以进行推理。可以使用 TensorRT(NVIDIA 的推理加速器运行时)完成推理,也可以使用 Triton 推理服务器在 TensorFlow 或PyTorch等原生框架中完成推理。本机 TensorRT 推理是使用Gst-nvinfer插件执行的,而使用 Triton 的推理是使用Gst-nvinferserver插件完成的。推理可以使用 GPU 或 DLA(深度学习加速器)进行 Jetson AGX Xavier 和 Xavier NX。

(1)推断后,下一步可能涉及跟踪对象。SDK 中有几个内置的参考跟踪器,从高性能到高精度。使用Gst-nvtracker插件执行对象跟踪。为了创建可视化工件,例如边界框、分割掩码、标签,有一个名为Gst-nvdsosd的可视化插件。

(1)最后,为了输出结果,DeepStream 提供了各种选项:在屏幕上使用边界框渲染输出、将输出保存到本地磁盘、通过 RTSP 流式传输或仅将元数据发送到云端。为了将元数据发送到云端,DeepStream 使用Gst-nvmsgconvGst-nvmsgbroker插件。Gst-nvmsgconv将元数据转换为模式负载,Gst-nvmsgbroker建立与云的连接并发送遥测数据。有多种内置代理协议,例如 Kafka、MQTT、AMQP 和 Azure IoT。可以创建自定义代理适配器。

1.3 DeepStream参考应用

首先,开发人员可以使用提供的参考应用程序。还包括这些应用程序的源代码。端到端应用程序称为deepstream-app。这个应用程序是完全可配置的——它允许用户配置任何类型和数量的源。用户还可以选择运行推理的网络类型。它预先构建了一个推理插件来进行对象检测,并由推理插件级联来进行图像分类。有一个选项可以配置跟踪器。对于输出,用户可以在屏幕上渲染、保存输出文件或通过 RTSP 流式传输视频之间进行选择。

深流概述

这是一个很好的参考应用程序,可以开始学习 DeepStream 的功能。DeepStream 参考应用程序 - deepstream-app章节中更详细地介绍了此应用程序。此应用程序的源代码可在/opt/nvidia/deepstream/deepstream-5.1/sources/apps/sample_apps/deepstream-app中找到。此应用程序适用于所有 AI 模型,并在各个 README 文件中提供详细说明。性能基准测试也使用此应用程序运行。

1.4 构建应用程序

 对于希望构建自定义应用程序的开发人员来说,deepstream-app可能有点难以开始开发。SDK 附带了几个简单的应用程序,开发人员可以在其中了解 DeepStream 的基本概念,构建一个简单的管道,然后继续构建更复杂的应用程序。

深流概述

开发人员可以从 deepstream-test1 开始,它几乎就像一个 DeepStream hello world。在这个应用程序中,开发人员将学习如何使用各种 DeepStream 插件构建 GStreamer 管道。他们将从文件中获取视频、解码、批处理,然后进行对象检测,最后在屏幕上呈现框。deepstream-test2 从 test1 开始,将二级网络级联到一级网络。deepstream-test3 展示了如何添加多个视频源,最后 test4 将展示如何使用消息代理插件添加物联网服务。这 4 个入门应用程序在本机 C/C++ 和 Python 中均可用。要了解有关 DeepStream 中这些应用程序和其他示例应用程序的更多信息,请参阅C/C++ 示例应用程序源详细信息Python 示例应用程序源详细信息.

1.5 Python中的DeepStream

Python 易于使用,在创建 AI 模型时被数据科学家和深度学习专家广泛采用。NVIDIA 引入了 Python 绑定来帮助您使用 Python 构建高性能 AI 应用程序。DeepStream 管道可以使用Gst-Python(GStreamer 框架的 Python 绑定)构建。

深流概述

DeepStream Python 应用程序使用Gst-Python API 操作来构建管道并使用探测函数访问管道中各个点的数据。数据类型都在本机 C 中,需要通过PyBindings或 NumPy的填充层才能从 Python 应用程序访问它们。张量数据是推理后出来的原始张量输出。如果您尝试检测对象,则需要通过解析和聚类算法对该张量数据进行后处理,以在检测到的对象周围创建边界框。要开始使用 Python,请参阅本指南中的Python 示例应用源详细信息和 DeepStream Python API 指南中的“DeepStream Python”。

​​​​​​2.Docker容器

DeepStream 5.1 为 dGPU 和 Jetson 平台提供了 Docker 容器。这些容器通过在容器内打包所有相关的依赖项,提供了一种方便的、开箱即用的方式来部署 DeepStream 应用程序。相关的 Docker 镜像托管在 NGC 门户网站https://ngc.nvidia.com的 NVIDIA 容器注册表中。他们使用该nvidia-docker包,该包允许从容器访问所需的 GPU 资源。本节介绍了用于 dGPU 和 Jetson 平台的 DeepStream Docker 容器支持的功能。

2.1 dGPU的Docker容器

NGC 网络门户中的容器页面提供了拉取和运行容器的说明,以及对其内容的描述。dGPU 容器被调用deepstream,Jetson 容器被调用deepstream-l4t。与 DeepStream 3.0 中的容器不同,dGPU DeepStream 5.1 容器支持容器内的 DeepStream 应用程序开发。它包含与 DeepStream 5.1 SDK 相同的构建工具和开发库。在典型场景中,您在 DeepStream 容器内构建、执行和调试 DeepStream 应用程序。一旦您的应用程序准备就绪,您就可以使用 DeepStream 5.1 容器作为基础镜像来创建您自己的 Docker 容器来保存您的应用程序文件(二进制文件、库、模型、配置文件等)。这是一个示例片段用于创建您自己的 Docker 容器的Dockerfile:

# Replace with required container type e.g. base, devel etc in the following line
FROM nvcr.io/nvidia/ deepstream:5.1-21.02-<container type>
COPY myapp  /root/apps/myapp
# To get video driver libraries at runtime (libnvidia-encode.so/libnvcuvid.so)
ENV NVIDIA_DRIVER_CAPABILITIES $NVIDIA_DRIVER_CAPABILITIES,video

此Dockerfile将您的应用程序(从目录mydsapp)复制到容器 ( ) 中。请注意,您必须确保来自 NGC 的 DeepStream 5.1 图像位置准确。pathname /root/apps

下表列出了与 DeepStream 5.1 一起发布的用于 dGPU 的 docker 容器:

容器

容器拉取命令

基础 docker(仅包含运行时库和 GStreamer 插件。可用作为 DeepStream 应用程序构建自定义 docker 的基础)

docker pull nvcr.io/nvidia/deepstream:5.1-21.02-base

devel docker(包含整个 SDK 以及用于构建 DeepStream 应用程序的开发环境)

docker pull nvcr.io/nvidia/deepstream:5.1-21.02-devel

带有 Triton 推理服务器和依赖项的 Triton 推理服务器 docker 以及用于构建 DeepStream 应用程序的开发环境

docker pull nvcr.io/nvidia/deepstream:5.1-21.02-triton

安装了 deepstream-test5-app 并删除了所有其他参考应用程序的 DeepStream IoT docker

docker pull nvcr.io/nvidia/deepstream:5.1-21.02-iot

DeepStream 示例 docker(包含运行时库、GStreamer 插件、参考应用程序和示例流、模型和配置)

docker pull nvcr.io/nvidia/deepstream:5.1-21.02-samples

2.2 Jetson的Docker容器

从 JetPack 4.2.1 版开始,已添加NVIDIA Container Runtime for Jetson ,使您能够在 Jetson 设备上运行支持 GPU 的容器。使用此功能,DeepStream 5.1 可以使用 NGC 上的 Docker 映像在 Jetson 设备上的容器内运行。拉取容器并按照NGC Containers上的说明执行页。DeepStream 容器期望 CUDA、TensorRT 和 VisionWorks 安装在 Jetson 设备上,因为它是从主机安装在容器内的。在启动 DeepStream 容器之前,请确保在您的 Jetson 上使用 JetPack 安装这些实用程序。Jetson Docker 容器仅用于部署。它们不支持容器内的 DeepStream 软件开发。您可以在 Jetson 目标上本地构建应用程序,并通过将二进制文件添加到您的 docker 镜像来为它们创建容器。或者,您可以使用在x86 工作站上构建 Jetson 容器中的说明从您的工作站生成 Jetson 容器NVIDIA Container Runtime for Jetson 文档中的部分。下表列出了与 DeepStream 5.1 一起发布的 Jetson 的 docker 容器:

容器

容器拉取命令

基础 docker(仅包含运行时库和 GStreamer 插件。可用作为 DeepStream 应用程序构建自定义 docker 的基础)

docker pull nvcr.io/nvidia/deepstream-l4t:5.1-21.02-base

安装了 deepstream-test5-app 并删除了所有其他参考应用程序的 DeepStream IoT docker。

docker pull nvcr.io/nvidia/deepstream-l4t:5.1-21.02-iot

DeepStream 示例 docker(包含运行时库、GStreamer 插件、参考应用程序和示例流、模型和配置)

docker pull nvcr.io/nvidia/deepstream-l4t:5.1-21.02-samples

3.C/C++示例应用程序源详细信息 

3.1 示例源详细信息

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

参考测试应用

源目录中的路径

描述

示例测试应用程序 1

应用程序/sample_apps/deepstream-test1

如何将 DeepStream 元素用于单个 H.264 流的示例:filesrc → 解码 → nvstreammux → nvinfer(主检测器)→ nvdsosd → 渲染器。

示例测试应用程序 2

应用程序/sample_apps/deepstream-test2

如何将 DeepStream 元素用于单个 H.264 流的示例:filesrc → 解码 → nvstreammux → nvinfer(主检测器)→ nvtracker → nvinfer(二级分类器)→ nvdsosd → 渲染器。

示例测试应用程序 3

应用程序/sample_apps/deepstream-test3

以 deepstream-test1(简单测试应用程序 1)为基础,演示如何:

  • 在管道中使用多个源

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

  • 配置 Gst-nvstreammux 以生成一批帧并对其进行推断以更好地利用资源

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

示例测试应用程序 4

应用程序/sample_apps/deepstream-test4

为单个 H.264 流构建 deepstream-test1:filesrc、decode、nvstreammux、nvinfer、nvdsosd、renderer 以演示如何:

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

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

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

  • 如果通过 extMsg 字段扩展元数据,则实现“复制”和“免费”功能以供使用

示例测试应用程序 5

应用程序/sample_apps/deepstream-test5

建立在 deepstream-app 之上。证明:

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

  • 如何从配置文件中将 Gst-nvmsgbroker 插件配置为接收器插件(适用于 KAFKA、Azure 等)

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

更多细节请参考 中的 RTCP Sender Report 回调函数test5_rtcp_sender_report_callback()注册和使用deepstream_test5_app_main.c。GStreamer 回调注册与 rtpmanager 元素的“handle-sync”信号记录在apps-common/src/deepstream_source_bin.c.

AMQP协议测试应用

库/amqp_protocol_adaptor

用于测试 AMQP 协议的应用程序。

Azure MQTT 测试应用程序

库/azure_protocol_adaptor

测试应用程序以使用 MQTT 显示 Azure IoT device2edge 消息传递和 device2cloud 消息传递。

DeepStream 参考应用

应用程序/sample_apps/deepstream-app

DeepStream 参考应用程序的源代码。

UFF SSD 探测器

来源/objectDetector_SSD

SSD 检测器模型的配置文件和自定义库实现。

更快的 RCNN 检测器

来源/objectDetector_FasterRCNN

FasterRCNN 模型的配置文件和自定义库实现。

Yolo探测器

来源/objectDetector_Yolo

Yolo 模型的配置文件和自定义库实现,目前是 Yolo v2、v2 tiny、v3 和 v3 tiny。

解瓦器示例

应用程序/sample_apps/deepstream-dewarper-test

演示单个或多个 360 度摄像机流的去扭曲功能。从 CSV 文件中读取相机校准参数并在显示器上渲染过道和光斑表面。

光流示例

应用程序/sample_apps/deepstream-nvof-test

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

自定义元数据示例

应用程序/sample_apps/deepstream-user-metadata-test

演示如何将自定义或用户特定的元数据添加到 DeepStream 的任何组件。测试代码将填充有用户数据的 16 字节数组附加到所选组件。在另一个组件中检索数据。

MJPEG 和 JPEG 解码器和推理示例

应用程序/sample_apps/deepstream-image-decode-test

建立在 deepstream-test3 上以演示图像解码而不是视频。此示例使用自定义解码箱,因此 MJPEG 编解码器可用作输入。

图像/视频分割示例

应用程序/sample_apps/deepstream-segmentation-test

演示使用语义或工业神经网络对多流视频或图像进行分割并将输出渲染到显示器。

在 Gst-nvstreammux 之前处理元数据

应用程序/sample_apps/deepstream-gst-metadata-test

演示如何在 DeepStream 管道中的 Gst-nvstreammux 插件之前设置元数据,以及如何在 Gst-nvstreammux 之后访问它。

Gst-nvinfer 张量元流示例

应用程序/sample_apps/deepstream-infer-tensor-meta-app

演示如何将 nvinfer 张量输出作为元数据流动和访问。

性能演示

应用程序/sample_apps/deepstream-perf-demo

对目录中的所有流按顺序执行单通道级联推理和对象跟踪。

分析示例

应用程序/sample_apps/deepstream-nvdsanalytics-test

演示批量分析,如 ROI 过滤、线路交叉、方向检测和过度拥挤

OpenCV 示例

应用程序/sample_apps/deepstream-opencv-test

在dsexample插件中演示OpenCV的使用

图像作为元数据示例

应用程序/sample_apps / deepstream-image-meta-test

演示如何将编码图像附加为元数据并将图像保存为 jpeg 格式。

Appsrc 和 Appsink 示例

应用程序/sample_apps/deepstream-appsrc-test

演示 AppSrc 和 AppSink 分别用于消费和提供来自非 DeepStream 代码的数据。

迁移学习示例

应用程序/sample_apps/deepstream-transfer-learning-app

演示了一种机制,可以为置信度较低的对象保存图像,并且可以将其用于进一步训练

Mask-RCNN 示例

应用程序/sample_apps/deepstream-mrcnn-test

使用 Mask-RCNN 模型演示实例分割

DeepStream 音频参考应用

应用程序/sample_apps/deepstream-audio

演示音频分析管道的 DeepStream 参考应用程序的源代码。

智能记录示例

应用程序/sample_apps/deepstream-testsr

演示基于事件的智能记录功能

3.2 插件和库源详细信息

插件或库

源目录中的路径

描述

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-nvinfer 插件

gst-plugins/gst-nvinfer

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

GStreamer Gst-nvdsosd 插件

gst-plugins/gst-nvdsosd

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

NvDsInfer 库

库/nvdsinfer

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

NvMsgConv 库

库/nvmsgsconv

Gst-nvmsgconv GStreamer 插件所需的 NvMsgConv 库的源代码。

卡夫卡协议适配器

库/kafka_protocol_adapter

Kafka 协议适配器。

nvdsinfer_customparser

库/nvdsinfer_customparser

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

Gst-v4l2

请参阅下面的注释 1

v4l2 编解码器的源代码。

Gstreamer gst-nvdsvideotemplate 插件

gst-plugins/gst-nvdsvideotemplate

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

Gstreamer gst-nvdsaudiotemplate 插件

gst-plugins/gst-nvdsaudiotemplate

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

脚注

DeepStream 包中不存在 Gst-v4l2 源。要下载,请按照下列步骤操作:

  1. 转到:https : //developer.nvidia.com/embedded/downloads

  2. 在字段中,输入Search filterL4T sources

  3. 为 L4T Release 选择适当的项目32.5.1

  4. 下载文件并解压,以获取.tbz2文件。

  5. 展开.tbz2文件。Gst-v4l2源文件在gst-nvvideo4linux2_src.tbz2

4.Python示例应用程序源详细信息

4.1 Python绑定

本节提供有关使用 Python 开发 DeepStream 应用程序的详细信息。Python 绑定包含在 DeepStream 5.1 SDK 中,示例应用程序可在此处获得:https : //github.com/NVIDIA-AI-IOT/deepstream_python_apps。在此处阅读有关 Pyds API 的更多信息:https ://docs.nvidia.com/metropolis/deepstream/python-api/

4.1.1 先决条件

  • Ubuntu 18.04

  • DeepStream SDK 5.1 或更高版本

  • 蟒蛇 3.6

  • Gst Python v1.14.5 如果Jetson 上缺少Gst python 安装,请使用以下命令安装:

    $ sudo apt-get install python-gi-dev
    $ export GST_LIBS="-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0"
    $ export GST_CFLAGS="-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include"
    $ git clone https://github.com/GStreamer/gst-python.git
    $ cd gst-python
    $ git checkout 1a8f48a
    $ ./autogen.sh PYTHON=python3
    $ ./configure PYTHON=python3
    $ make
    $ sudo make install
    

4.1.2 运行示例应用程序

  1. deepstream_python_appsrepo克隆到:<DeepStream 5.1 ROOT>/sources

    git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps
    
  2. 这将创建以下目录:

    <DeepStream 5.1 ROOT>/sources/deepstream_python_apps
    
  3. Python 应用程序位于该apps目录下。进入每个应用程序目录并按照自述文件中的说明进行操作。

管道建​​设:DeepStream 管道可以使用 Gst Python(GStreamer 框架的 Python 绑定)构建。有关管道构建示例,请参阅示例应用程序主要功能。(应用程序配置文件包含模型的相对路径)

4.2 元数据访问

DeepStream MetaData 包含推理结果和其他用于分析的信息。MetaData 附加到每个管道组件接收到的数据上。元数据格式在 SDK MetaData 文档和 API 指南中有详细描述。SDK 元数据库是用 C/C++ 开发的。Python 绑定提供从 Python 应用程序对元数据的访问。绑定在编译模块中提供,可用于 x86_64 和 Jetson 平台。该模块可作为 DeepStream SDK 安装目录下的一部分使用。示例应用程序通过 common/utils.py 获取此模块的导入路径。还包含一个 setup.py,用于将模块安装到标准路径中:Gst Bufferpyds.so/lib

cd /opt/nvidia/deepstream/deepstream/lib
python3 setup.py install

这目前不是通过 SDK 安装程序自动完成的,因为 python 的使用是可选的。绑定通常遵循与底层 C/C++ 库相同的 API,下面的部分详细介绍了一些例外情况。

4.2.1 内存管理

元数据的内存由 Python 和 C/C++ 代码路径共享。例如,一个MetaData项可能是由Python编写的probe函数添加的,需要由C/C++编写的下游插件访问。deepstream-test4 应用程序包含此类用法。Python 垃圾收集器无法查看 C/C++ 中的内存引用,因此无法安全地管理此类共享内存的生命周期。由于这种复杂性,Python 对 MetaData 内存的访问通常是通过引用实现的,而无需声明所有权。

4.2.2 分配

当在 Python 中分配 MetaData 对象时,绑定提供了一个分配函数来确保对象的正确内存所有权。如果使用构造函数,则对象将在其 Python 引用终止时被垃圾收集器声明。但是,该对象仍需要由下游的 C/C++ 代码访问,因此必须在这些 Python 引用之外持续存在。示例:要分配NvDsEventMsgMeta实例,请使用以下命令:

msg_meta = pyds.alloc_nvds_event_msg_meta() *# get reference to allocated instance without claiming memory ownership*

不是这个:

msg_meta = NvDsEventMsgMeta() *# memory will be freed by the garbage collector when msg_meta goes out of scope in Python*

分配器可用于以下结构:

  • NvDsVehicleObject: alloc_nvds_vehicle_object()

  • NvDsPersonObject: alloc_nvds_person_object()

  • NvDsFaceObject: alloc_nvds_face_object()

  • NvDsEventMsgMeta: alloc_nvds_event_msg_meta()

  • NvDsEvent: alloc_nvds_event()

  • NvDsPayload: alloc_nvds_payload()

  • Generic buffer: alloc_buffer(size)

4.2.3 字符串访问

一些元数据结构包含字符串字段。以下部分提供了有关访问它们的详细信息。

设置字符串字段

设置字符串字段会导致在底层 C++ 代码中分配字符串缓冲区。

obj.type = "Type"

这将导致分配内存缓冲区,并将字符串“TYPE”复制到其中。该内存归 C 代码所有,稍后将被释放。要在 Python 代码中释放缓冲区,请使用:

pyds.free_buffer(obj.type)

   读取字符串字段

直接读取一个字符串字段,以int的形式返回该字段的C地址,例如:

obj = pyds.NvDsVehicleObject.cast(data);
print(obj.type)

这将打印一个代表obj.typein C地址的 int (这是一个 char*)。要检索此字段的字符串值,请使用pyds.get_string(),例如:

print(pyds.get_string(obj.type))

4.2.4 铸件

一些 MetaData 实例以 GList 形式存储。要访问 GList 节点中的数据,需要将数据字段转换为适当的结构。此转换是通过目标类型的 cast() 成员函数完成的:

NvDsBatchMeta.cast
NvDsFrameMeta.cast
NvDsObjectMeta.cast
NvDsUserMeta.cast
NvDsClassifierMeta.cast
NvDsDisplayMeta.cast
NvDsLabelInfo.cast
NvDsEventMsgMeta.cast
NvDsVehicleObject.cast
NvDsPersonObject.cast

在 v0.5 版本中,提供了独立的强制转换功能。这些现在已被弃用并被上面的 cast() 函数取代:

glist_get_nvds_batch_meta
glist_get_nvds_frame_meta
glist_get_nvds_object_meta
glist_get_nvds_user_meta
glist_get_nvds_classifier_meta
glist_get_nvds_display_meta
glist_get_nvds_label_info
glist_get_nvds_event_msg_meta
glist_get_nvds_vehicle_object
glist_get_nvds_person_object

例子:

l_frame = batch_meta.frame_meta_list
frame_meta = pyds.NvDsFrameMeta.cast(l_frame.data)

4.2.5 回调函数注册

添加到 NvDsUserMeta 的自定义元数据需要自定义复制和发布功能。MetaData 库依赖于这些自定义函数来执行自定义结构的深度复制,并释放分配的资源。这些函数在 NvDsUserMeta 结构中注册为回调函数指针。使用以下函数注册回调函数:pyds.set_user_copyfunc(NvDsUserMeta_instance, copy_function) pyds.set_user_releasefunc(NvDsUserMeta_instance, free_func)

另:在应用程序退出之前,回调需要在绑定库中取消注册。绑定库当前保留对已注册函数的全局引用,并且这些引用不能持续到应用程序退出时发生的绑定库卸载之后。使用以下函数取消注册所有回调:pyds.unset_callback_funcs()

有关回调注册和注销的示例,请参阅 deepstream-test4 示例应用程序。

限制:绑定库目前仅支持每个应用程序的一组回调函数。将使用最后注册的函数。

4.2.6 优化和实用程序

Python 解释通常比运行编译的 C/C++ 代码慢。为了提供更好的性能,一些操作是用 C 实现的,并通过绑定接口公开。目前这是实验性的,将随着时间的推移而扩展。提供以下优化功能:

  • pyds.NvOSD_ColorParams.set(double red, double green, double blue, double alpha)

    这是一个简单的函数,执行与以下相同的操作:

    txt_params.text_bg_clr.red = red
    txt_params.text_bg_clr.green = green
    txt_params.text_bg_clr.blue = blue
    txt_params.text_bg_clr.alpha = alpha
    

    这些在 deepstream_test_4.py 中的每个对象上执行,导致聚合处理时间减慢管道。将此函数推入 C 层有助于提高性能。

  • generate_ts_rfc3339 (buffer, buffer_size)

    此函数使用根据 RFC3339 生成的时间戳填充输入缓冲区: %Y-%m-%dT%H:%M:%S.nnnZ\0

4.2.7 图像数据访问

解码后的图像可以NumPy通过该get_nvds_buf_surface函数以数组的形式访问。该函数记录在 API 指南中。有关deepstream-imagedata-multistream图像数据使用的示例,请参阅示例应用程序。

4.3 示例应用程序源详细信息

下表显示了 Python 示例应用程序在https://github.com/NVIDIA-AI-IOT/deepstream_python_apps下的位置

Python 示例应用程序源详细信息

参考测试应用

GitHub 存储库中的路径

描述

简单测试应用1

应用程序/深流测试1

如何将 DeepStream 元素用于单个 H.264 流的简单示例:filesrc → 解码 → nvstreammux → nvinfer(主检测器)→ nvdsosd → 渲染器。

简单测试应用2

应用程序/深流测试2

如何将 DeepStream 元素用于单个 H.264 流的简单示例:filesrc → 解码 → nvstreammux → nvinfer(主检测器)→ nvtracker → nvinfer(二级分类器)→ nvdsosd → 渲染器。

简单测试应用3

应用程序/deepstream-test3

以 deepstream-test1(简单测试应用程序 1)为基础,演示如何:

  • 在管道中使用多个源

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

  • 配置 Gst-nvstreammux 以生成一批帧并对其进行推断以更好地利用资源

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

简单的测试应用 4

应用程序 / deepstream-test4

为单个 H.264 流构建 deepstream-test1:filesrc、decode、nvstreammux、nvinfer、nvdsosd、renderer 以演示如何:

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

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

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

  • 如果通过 extMsg 字段扩展元数据,则实现“复制”和“免费”功能以供使用

USB摄像头源应用

应用程序/deepstream-test1-usbcam

简单的测试应用程序 1 修改为处理来自 USB 相机的单个流。

RTSP 输出应用

应用程序/deepstream-test1-rtsp-out

简单的测试应用程序 1 修改为通过 RTSP 输出可视化流。

影像数据存取应用

应用程序/deepstream-imagedata-multistream

基于简单的测试应用程序 3 来演示如何:

  • 在管道中以 NumPy 数组的形式访问解码帧

  • 检查检测对象的检测置信度(需要 DBSCAN 或 NMS 聚类)

  • 修改帧并查看管道下游反映的更改

  • 使用 OpenCV 对帧进行注释并将它们保存到文件

SSD检测器输出解析器应用

应用程序/deepstream-ssd-parser

演示如何对来自 Triton 推理服务器的推理输出执行自定义后处理:

  • 在 Triton Inference Server 上使用 SSD 模型进行对象检测

  • 通过配置文件设置为 Triton Inference Server 启用自定义后处理和原始张量导出

  • 访问管道中的推理输出张量以在 Python 中进行后处理

  • 将检测到的对象添加到元数据

  • 将 OSD 可视化输出到 MP4 文件

光流应用

应用程序/深流光流

演示了如何获取光流元数据并演示了如何:

  • 以 numpy 数组的形式访问光流向量

  • 使用获得的流向量和 OpenCV 可视化光流

分段应用

应用程序/深度分段

演示如何获取分段元数据并演示如何:

  • 访问分割掩码作为 numpy 数组

  • 使用获得的掩码和 OpenCV 可视化分割

分析应用

应用程序/deepstream-nvdsanalytics

演示如何使用 nvdsanalytics 插件并获取分析元数据

5.Deepstream参考应用程序 -deepstream-app

5.1 应用架构

下图显示了 NVIDIA ® DeepStream 参考应用程序的架构。

DeepStream 参考应用架构

DeepStream 参考应用程序是一个基于 GStreamer 的解决方案,由一组封装低级 API 的 GStreamer 插件组成,以形成一个完整的图形。参考应用程序能够接受来自各种来源的输入,如相机、RTSP 输入、编码文件输入,另外还支持多流/源功能。由 NVIDIA 实现并作为 DeepStream SDK 的一部分提供的 GStreamer 插件列表包括:

  • Stream Muxer 插件 (Gst-nvstreammux) 从多个输入源形成一批缓冲区。

  • 基于 NVIDIA TensorRT™ 的插件 (Gst-nvinfer) 分别用于主要和次要(主要对象的属性分类)检测和分类。

  • 基于 OpenCV 的跟踪器插件 (Gst-nvtracker),用于具有唯一 ID 的对象跟踪。

  • Multi Stream Tiler 插件 (Gst-nvmultistreamtiler) 用于形成 2D 帧数组。

  • 屏幕显示 (OSD) 插件 (Gst-nvdsosd) 使用生成的元数据在合成帧上绘制阴影框、矩形和文本。

  • 消息转换器 (Gst-nvmsgconv) 和消息代理 (Gst-nvmsgbroker) 插件结合使用,可将分析数据发送到云中的服务器。

5.2 参考应用配置

NVIDIA DeepStream SDK 参考应用程序使用samples/configs/deepstream-appDeepStream 包目录中的示例配置文件之一:

  • 启用或禁用组件

  • 更改组件的属性或行为

  • 自定义与管道及其组件无关的其他应用程序配置设置

配置文件使用密钥文件格式,基于 freedesktop 规范:https : //specifications.freedesktop.org/desktop-entry-spec/latest

5.2.1 DeepStream 参考应用程序 (deepstream-app) 的预期输出

下图显示了预期的输出:

DeepStream 参考应用架构

5.3 配置组

应用程序配置分为每个组件和应用程序特定组件的配置组。配置组是:

配置组 - deepstream 应用

团体

配置组

应用组

与特定组件无关的应用程序配置。

平铺展示组

应用程序中的平铺显示。

源组

源属性。可以有多个来源。这些组必须命名为:[source0], [source1] ...

流复用组

指定流复用组件的属性和修改行为。

初级 GIE 和次级 GIE 组

指定主 GIE 的属性并修改其行为。指定辅助 GIE 的属性并修改其行为。这些组必须命名为:[secondary-gie0], [secondary-gie1] ...

追踪组

指定属性并修改对象跟踪器的行为。

消息转换器组

指定消息转换器组件的属性和修改行为。

消息消费者组

指定属性并修改消息使用者组件的行为。管道可以包含多个消息使用者组件。组必须命名为 [message-consumer0], [message-consumer1] ...

OSD组

指定属性并修改在框架上覆盖文本和矩形的屏幕显示 (OSD) 组件。

水槽组

指定表示输出(例如用于渲染、编码和文件保存的显示和文件)的接收器组件的属性并修改其行为。管道可以包含多个接收器。组必须命名为:[sink0], [sink1] ...

测试组

诊断和调试。这组是实验性的。

NvDs-analytics Group

指定 nvdsanalytics 插件配置文件,并在应用程序中添加插件

5.3.1 应用组

应用程序组属性是:

应用组

钥匙

意义

类型和值

例子

平台

启用性能测量

指示是否启用应用程序性能测量。

布尔值

启用性能测量=1

dGPU,杰森

性能测量间隔秒

采样和打印性能指标的时间间隔(以秒为单位)。

整数,>0

性能测量间隔秒=10

dGPU,杰森

gie-kitti-输出目录

应用程序以修改后的 KITTI 元数据格式存储主要检测器输出的现有目录的路径名。

细绳

gie-kitti-output-dir=/home/ubuntu/kitti_data/

dGPU,杰森

kitti-track-output-dir

应用程序以修改后的 KITTI 元数据格式存储跟踪器输出的现有目录的路径名。

细绳

kitti-track-output-dir=/home/ubuntu/kitti_data_tracker/

dGPU,杰森

5.3.2 平铺展示组

平铺显示组属性是:

平铺显示组

钥匙

意义

类型和值

例子

平台

使能够

指示是否启用平铺显示。当用户设置 enable=2 时,第一个带有 key:link-to-demux=1 的 [sink] 组应链接到 demuxer 的 src_[source_id] pad,其中 source_id 是相应 [sink] 组中设置的键。

整数,0 = 禁用,1 = tiler-enabled 2 = tiler-and-parallel-demux-to-sink-enabled

启用=1

dGPU,杰森

平铺二维数组中的行数。

整数,>0

行数=5

dGPU,杰森

平铺二维数组中的列数。

整数,>0

列=6

dGPU,杰森

宽度

平铺二维数组的宽度,以像素为单位。

整数,>0

宽度=1280

dGPU,杰森

高度

平铺二维阵列的高度,以像素为单位。

整数,>0

高度=720

dGPU,杰森

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=0

图形处理器

nvbuf 内存类型

元素为输出缓冲区分配的内存类型。0 (nvbuf-mem-default):特定于平台的默认类型 1 (nvbuf-mem-cuda-pinned):固定/主机 ​​CUDA 内存 2 (nvbuf-mem-cuda-device):设备 CUDA 内存 3 (nvbuf-mem -cuda-unified):统一 CUDA 内存 对于 dGPU:所有值均有效。对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

dGPU,杰森

5.3.3 源组

源组指定源属性。DeepStream 应用程序支持多个同步源。对于每个源,source%d必须将带有组名称的单独组添加到配置文件中。例如:

[source0]
key1=value1
key2=value2
...

[source1]
key1=value1
key2=value2
...

源组属性是:

源组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用源。

布尔值

启用=1

dGPU,杰森

类型

来源类型;源的其他属性取决于此类型。

1:相机(V4L2)

2:URI

3:多URI

4:RTSP

5:相机(CSI)(仅限Jetson)

整数、1、2、3、4 或 5

类型=1

dGPU,杰森

编码流的 URI。URI 可以是文件、HTTP URI 或 RTSP 实时源。当 type=2 或 3 时有效。对于 MultiURI,%d 格式说明符也可用于指定多个源。应用程序从 0 迭代到 num-sources 1 以生成实际的 URI。

细绳

uri=file:///home/ubuntu/source.mp4 uri=http://127.0.0.1/source.mp4 uri=rtsp://127.0.0.1/source1 uri=file:///home/ubuntu/source_ %d.mp4

dGPU,杰森

数字来源

来源数量。仅当 type=3 时有效。

整数,≥0

数量来源=2

dGPU,杰森

内解码启用

启用或禁用仅内解码。

布尔值

内解码启用=1

dGPU,杰森

数量额外的表面

除了解码器给出的最小解码表面之外的表面数量。可用于管理流水线中解码器输出缓冲区的数量。

整数,≥0 且≤24

num-extra-surfaces=5

dGPU,杰森

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=1

图形处理器

相机编号

要添加到元数据的输入源的唯一 ID。(可选的)

整数,≥0

相机 ID=2

dGPU,杰森

相机宽度

要从相机请求的帧的宽度,以像素为单位。当 type=1 或 5 时有效。

整数,>0

相机宽度=1920

dGPU,杰森

相机高度

要从相机请求的帧的高度,以像素为单位。当 type=1 或 5 时有效。

整数,>0

相机高度=1080

dGPU,杰森

相机-fps-n

指定相机请求的帧速率的分数的分子部分,以帧/秒为单位。当 type=1 或 5 时有效。

整数,>0

相机-fps-n=30

dGPU,杰森

相机-fps-d

指定从相机请求的帧速率的分数的分母部分,以帧/秒为单位。当 type = 1 或 5 时有效。

整数,>0

相机-fps-d=1

dGPU,杰森

相机-v4l2-dev-node

V4L2设备节点编号。例如,/dev/video<num> 用于开源 V4L2 相机捕获路径。当类型设置(源类型)为 1 时有效。

整数,>0

相机-v4l2-dev-node=1

dGPU,杰森

潜伏

以毫秒为单位的抖动缓冲区大小;仅适用于 RTSP 流。

整数,≥0

延迟=200

dGPU,杰森

相机-CSI-传感器-ID

摄像头模块的传感器 ID。当类型(源类型)为 5 时有效。

整数,≥0

相机-CSI-传感器-id=1

杰森

丢帧间隔

丢帧间隔。例如,5 表示解码器每五帧输出一次;0 表示不丢帧。

整数,

丢帧间隔=5

dGPU,杰森

cudadec-memtype

用于为类型 2,3 或 4 的源分配输出缓冲区的 CUDA 内存元素类型。不适用于 CSI 或 USB 相机源

0 (memtype_device):使用 cudaMalloc() 分配的设备内存。

1 (memtype_pinned):使用 cudaMallocHost() 分配的主机/固定内存。

2 (memtype_unified):使用 cudaMallocManaged() 分配的统一内存。

整数、0、1 或 2

cudadec-memtype=1

图形处理器

nvbuf 内存类型

元素为 nvvideoconvert 的输出缓冲区分配的 CUDA 内存类型,对于类型 1 的源很有用。

0(nvbuf-mem-default,特定于平台的默认值

1 (nvbuf-mem-cuda-pinned):固定/主机 ​​CUDA 内存。

2 (nvbuf-mem-cuda-device):设备 CUDA 内存。

3 (nvbuf-mem-cuda-unified):统一CUDA内存。

对于 dGPU:所有值均有效。

对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

dGPU,Jetson

选择-rtp-协议

用于 RTP 的传输协议。当 type(源类型)为 4 时有效。

0:UDP + UDP 组播 + TCP
4:仅 TCP

整数,0 或 4

选择-rtp-协议=4

dGPU,杰森

rtsp-重新连接-间隔-秒

在强制重新连接之前从 RTSP 源接收到最后一个数据后等待的超时时间(以秒为单位)。将其设置为 0 将禁用重新连接。当 type(源类型)为 4 时有效。

整数,≥0

rtsp-重新连接-间隔-秒=60

dGPU,杰森

智能记录

触发智能记录的方法。

0:禁用

1:只能通过云消息

2:云消息+本地事件

整数,0、1 或 2

智能记录=1

dGPU,杰森

智能记录目录路径

保存录制文件的目录路径。默认情况下,使用当前目录。

细绳

smart-rec-dir-path = / home / nvidia /

dGPU,杰森

智能记录文件前缀

录制视频的文件名前缀。默认情况下,Smart_Record 是前缀。对于唯一的文件名,必须为每个源提供一个唯一的前缀。

细绳

smart-rec-file-prefix=Cam1

dGPU,杰森

智能录制视频缓存

以秒为单位的视频缓存大小。

整数,≥0

smart-rec-video-cache=20

dGPU,杰森

智能记录容器

录制视频的容器格式。支持 MP4 和 MKV 容器。

整数,0 或 1

智能记录容器=0

dGPU,杰森

智能记录开始时间

从现在开始记录的提前秒数。例如,如果 t0 是当前时间,N 是开始时间(以秒为单位),这意味着录制将从 t0 – N 开始。显然,要使其工作,视频缓存大小必须大于 N。

整数,≥0

智能记录开始时间=5

dGPU,杰森

智能记录默认持续时间

如果未生成停止事件。此参数将确保录制在预定义的默认持续时间后停止。

整数,≥0

smart-rec-default-duration=20

dGPU,杰森

智能记录持续时间

以秒为单位的记录持续时间。

整数,≥0

智能记录持续时间=15

dGPU,杰森

智能记录间隔

这是 SR 启动/停止事件生成的时间间隔(以秒为单位)。

整数,≥0

智能记录间隔=10

dGPU,杰森

5.3.4 流复用组

[streammux] 组指定和修改 Gst-nvstreammux 插件的属性。

流复用组

钥匙

意义

类型和值

例子

平台

gpu-id

GPU 元素用于多个 GPU 的情况。

整数,≥0

gpu-id=1

图形处理器

直播源

通知多路复用器源是实时的。

布尔值

直播源=0

dGPU,杰森

批量大小

多路复用器批量大小。

整数,>0

批量大小=4

dGPU,杰森

批量推送超时

在第一个缓冲区可用后推送批次后的超时时间(以微秒为单位),即使没有形成完整的批次。

整数,≥−1

批量推送超时=40000

dGPU,杰森

宽度

多路复用器输出宽度(以像素为单位)。

整数,>0

宽度=1280

dGPU,杰森

高度

多路复用器输出高度(以像素为单位)。

整数,>0

高度=720

dGPU,杰森

启用填充

指示在通过添加黑带进行缩放时是否保持源纵横比。

布尔值

启用填充=0

dGPU,杰森

nvbuf 内存类型

元素为输出缓冲区分配的 CUDA 内存类型。

0(nvbuf-mem-default,特定于平台的默认值

1 (nvbuf-mem-cuda-pinned):固定/主机 ​​CUDA 内存。

2 (nvbuf-mem-cuda-device):设备 CUDA 内存。

3 (nvbuf-mem-cuda-unified):统一CUDA内存。

对于 dGPU:所有值均有效。

对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

图形处理器

附加-sys-ts-as-ntp

对于实时源,当流式传输 RTSP 时,混合缓冲区应将关联的 NvDsFrameMeta->ntp_timestamp 设置为系统时间或服务器的 NTP 时间。

如果设置为 1,系统时间戳将作为 ntp 时间戳附加。

如果设置为 0,则将附加来自 rtspsrc 的 ntp 时间戳(如果可用)。

布尔值

附加-sys-ts-as-ntp=0

dGPU,杰森

配置文件路径

此密钥仅对新的流复用器有效。有关更多信息,请参阅插件手册部分“New Gst-nvstreammux”。mux 配置文件的绝对或相对(到 DS 配置文件位置)路径。

细绳

配置文件路径=config_mux_source30.txt

dGPU,杰森

5.3.5 初级 GIE 和次级 GIE 组

DeepStream 应用程序支持多个辅助 GIE。对于每个辅助 GIE,secondary-gie%d必须将具有名称的单独组添加到配置文件中。例如:

[primary-gie]
key1=value1
key2=value2
...

[secondary-gie1]
key1=value1
key2=value2
...

主要和次要 GIE 配置如下。对于每个配置,Valid for 列指示配置属性是对主要还是次要 TensorRT 模型有效,还是对两个模型都有效。

小学和中学 GIE* 组

钥匙

意义

类型和值

例子

平台/ GIE*

使能够

指示是否必须启用主 GIE。

布尔值

启用=1

dGPU,Jetson 两个 GIE

唯一标识

要分配给 nvinfer 实例的唯一组件 ID。用于标识实例生成的元数据。

整数,>0

gie-unique-id = 2

两个都

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=1

dGPU,两个 GIE

模型引擎文件

模式的预生成序列化引擎文件的绝对路径名。

细绳

模型引擎文件=../../models/Primary_Detector/resnet10. caffemodel_b4_int8.engine

两个 GIE

nvbuf 内存类型

CUDA 内存元素的类型是分配给输出缓冲区。

0 (nvbuf-mem-default):特定于平台的默认值

1 (nvbuf-mem-cuda-pinned): pinned/host CUDA 内存

2(nvbuf-mem-cuda-device):设备CUDA内存

3(nvbuf-mem-cuda-unified):统一CUDA内存

对于 dGPU:所有值均有效。

对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

dGPU,Jetson 初级 GIE

配置文件

指定 Gst-nvinfer 插件属性的配置文件的路径名。它可能包含此表中描述的任何属性,但配置文件本身除外。属性必须在名为 [property] 的组中定义。有关参数的更多详细信息,请参阅 DeepStream 4.0 插件手册中的“Gst-nvinfer 文件配置规范”。

细绳

config-file=¬/home/-ubuntu/-config_infer_resnet.txt 有关完整示例,请参阅示例文件 samples/¬configs/-deepstream-app/-config_infer_resnet.txt 或 deepstream-test2 示例应用程序。

dGPU,Jetson 两个 GIE

批量大小

批量推断的帧数(P.GIE)/对象(S.GIE)。

整数,>0 整数,>0

批量大小=2

dGPU,Jetson 两个 GIE

间隔

要跳过以进行推理的连续批次数。

整数,>0 整数,>0

间隔=2

dGPU,Jetson 初级 GIE

bbox边框颜色

特定类 ID 的对象的边框颜色,以 RGBA 格式指定。密钥的格式必须为 bbox-border-color<class-id>。可以为多个类 ID 多次标识此属性。如果未为类 ID 标识此属性,则不会为该类 ID 的对象绘制边框。

R:G:B:A 浮点数,0≤R,G,B,A≤1

bbox-border-color2= 1;0;0;1(红色表示类 ID 2)

dGPU,Jetson 两个 GIE

bbox-bg-颜色

在特定类 ID 的对象上绘制的框的颜色,采用 RGBA 格式。密钥的格式必须为 bbox-bg-color<class-id>。此属性可以多次用于多个类 ID。如果它不用于类 ID,则不会为该类 ID 的对象绘制框。

R:G:B:A 浮点数,0≤R,G,B,A≤1

bbox-bg-color3=-0;1;0;0.3(class-id 3 的半透明绿色)

dGPU,Jetson 两个 GIE

操作 gie-id

GIE 的唯一 ID,此 GIE 将在其元数据 (NvDsFrameMeta) 上运行。

整数,>0

操作 gie-id=1

dGPU,Jetson 二级 GIE

操作类 ID

此 GIE 必须在其上运行的父 GIE 的类 ID。使用 operation-on-gie-id 指定父 GIE。

分号分隔的整数数组

operation-on-class-ids=1;2(对父 GIE 生成的类 ID 为 1、2 的对象进行操作)

dGPU,Jetson 二级 GIE

推断原始输出目录

将原始推理缓冲区内容转储到文件中的现有目录的路径名。

细绳

infer-raw-output-dir=/home/ubuntu/infer_raw_out

dGPU,Jetson 两个 GIE

标签文件路径

标签文件的路径名。

细绳

labelfile-path=../../models/Primary_Detector/labels.txt

dGPU,Jetson 两个 GIE

插件类型

用于推理的插件。0:nvinfer(TensorRT) 1:nvinferserver(Triton 推理服务器)

整数,0 或 1

插件类型=1

dGPU,Jetson 两个 GIE

5.3.6 追踪组

跟踪器组属性是:

跟踪器组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用跟踪器。

布尔值

启用=1

dGPU,杰森

跟踪宽度

跟踪器将运行的帧宽度,以像素为单位。

整数,≥0

跟踪器宽度= 960

dGPU,杰森

追踪高度

跟踪器将运行的帧高度,以像素为单位。

整数,≥0

追踪高度=540

dGPU,杰森

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=1

图形处理器

配置文件

低级跟踪器配置文件的路径名。

细绳

ll-config-file=iou_config.txt

dGPU,杰森

ll-lib-文件

低级跟踪器实现库的路径名。

细绳

ll-lib-file=/usr/-local/deepstream/libnvds_mot_iou.so

dGPU,杰森

启用批处理

启用跨多个流的批处理。

布尔值

启用批处理=1

dGPU,杰森

启用过去帧

启用报告过去帧数据

布尔值

启用过去帧=1

dGPU,杰森

跟踪表面类型

设置用于跟踪的表面流类型。(默认值为 0)

整数,≥0

跟踪表面类型=0

dGPU,杰森

显示跟踪 ID

启用跟踪 ID 显示。

布尔值

显示跟踪 ID=1

dGPU,杰森

5.3.7 消息转换器组

消息转换器组属性是:

消息转换器组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用消息转换器。

布尔值

启用=1

dGPU,杰森

msg-conv-config

Gst-nvmsgconv 元素的配置文件的路径名。

细绳

msg-conv-config=dstest5_msgconv_sample_config.txt

dGPU,杰森

msg-conv-payload-type

有效载荷的类型。

0、PAYLOAD_DEEPSTREAM:Deepstream 模式负载。

1、PAYLOAD_DEEPSTREAM_MINIMAL:Deepstream schema的payload最小。

256、PAYLOAD_RESERVED:保留类型。

257、PAYLOAD_CUSTOM:自定义模式负载。

整数 0、1、256 或 257

msg-conv-payload-type=0

dGPU,杰森

msg-conv-msg2p-lib

可选的自定义负载生成库的绝对路径名。该库实现了由 sources/libs/nvmsgconv/nvmsgconv.h 定义的 API。

细绳

msg-conv-msg2p-lib=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_msgconv.so

dGPU,杰森

msg-conv-comp-id

gst-nvmsgconv 元素的 comp-id Gst 属性。这是附加必须由 gst-nvmsgconv 元素处理的 NvDsEventMsgMeta 的组件的 ID。

整数,>=0

msg-conv-comp-id=1

dGPU,杰森

5.3.8 消息消费者组

消息消费者组属性是:

消息消费者组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用消息使用者。

布尔值

启用=1

dGPU,杰森

原型库

具有协议适配器实现的库的路径。

细绳

proto-lib=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_kafka_proto.so

dGPU,杰森

连接字符串

服务器的连接字符串。

细绳

conn-str=foo.bar.com;80

dGPU,杰森

配置文件

具有协议适配器附加配置的文件的路径,

细绳

配置文件=../cfg_kafka.txt

dGPU,杰森

订阅主题列表

要订阅的主题列表。

细绳

订阅主题列表=toipc1;topic2;topic3

dGPU,杰森

传感器列表文件

具有从传感器索引到传感器名称的映射的文件。

细绳

传感器列表文件=dstest5_msgconv_sample_config.txt

dGPU,杰森

5.3.9 OSD组

OSD 组指定属性并修改 OSD 组件的行为,该组件在视频帧上覆盖文本和矩形。

OSD组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用屏幕显示 (OSD)。

布尔值

启用=1

dGPU,杰森

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=1

图形处理器

边框宽度

为对象绘制的边界框的边框宽度,以像素为单位。

整数,≥0

边框宽度=10

dGPU,杰森

边框颜色

为对象绘制的边界框的边框颜色。

R;G;B;A 浮点数, 0≤R,G,B,A≤1

边框颜色=0;0;0.7;1 #深蓝色

dGPU,杰森

字体大小

描述对象的文本大小,以磅为单位。

整数,≥0

文字大小=16

dGPU,杰森

文字颜色

描述对象的文本颜色,采用 RGBA 格式。

R;G;B;A 浮点数, 0≤R,G,B,A≤1

文本颜色=0;0;0.7;1 #深蓝色

dGPU,杰森

文字背景颜色

描述对象的文本的背景颜色,采用 RGBA 格式。

R;G;B;A 浮点数, 0≤R,G,B,A≤1

text-bg-color=0;0;0;0.5 #半透明黑色

dGPU,杰森

时钟文本大小

时钟时间文本的大小,以磅为单位。

整数,>0

时钟文本大小=16

dGPU,杰森

时钟x偏移

时钟时间文本的水平偏移量,以像素为单位。

整数,>0

时钟-x-偏移=100

dGPU,杰森

时钟偏移

时钟时间文本的垂直偏移量,以像素为单位。

整数,>0

时钟-y-偏移=100

dGPU,杰森

制作

描述对象的文本的字体名称。

细绳

字体=Purisa

dGPU,杰森

输入 shell 命令 fc-list 以显示可用字体的名称。

时钟颜色

时钟时间文本的颜色,RGBA 格式。

R;G;B;A 浮点数, 0≤R,G,B,A≤1

时钟颜色=1;0;0;1 #红色

dGPU,杰森

nvbuf 内存类型

元素为输出缓冲区分配的 CUDA 内存类型。

0 (nvbuf-mem-default):特定于平台的默认值

1 (nvbuf-mem-cuda-pinned): pinned/host CUDA 内存

2(nvbuf-mem-cuda-device):设备CUDA内存

3(nvbuf-mem-cuda-unified):统一CUDA内存

对于 dGPU:所有值均有效。

对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

图形处理器

过程模式

NvOSD 处理模式。

0:CPU
1:GPU(仅dGPU)
2:硬件(仅限Jetson)

整数、0、1 或 2

进程模式=1

dGPU,杰森

显示文本

指示是否显示文本

布尔值

显示文本=1

dGPU,杰森

显示框

指示是否为边界框

布尔值

显示框=1

dGPU,杰森

显示掩码

指示是否显示实例掩码

布尔值

显示掩码=1

dGPU,杰森

hw-blend-color-attr

混合所有类的颜色属性。用于 process-mode=2(基于 VIC 的混合)。如果设置了此属性,则将使用混合绘制阴影 bbox。属性以以下形式设置:“Class_ID,R,G,B,A”,每个类用“:”分隔,仅适用于 Jetson。

请注意,对于 VIC 模式,必须设置此属性,否则对象将无法与所需颜色混合。如果在主 gie 中指定了 bbox-bg-color 值,则对象将与 nvdsosd 插件中定义的 DEFAULT_CLR 参数混合。

细绳

hw-blend-color-attr=0,0.0,1.0,0.0,0.3:1,1.0,0.0,0.3.0.3

杰森

5.3.10 水槽组

接收器组指定属性并修改接收器组件用于渲染、编码和文件保存的行为。

水槽组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用接收器。

布尔值

启用=1

dGPU,杰森

类型

使用的水槽类型。

1:假货
2:基于 EGL 的窗口接收器 (nveglglessink)
3:编码+文件保存(编码器+复用器+文件接收器)
4:编码+RTSP流
5:叠加(仅限Jetson)
6:消息转换器+消息代理

整数、1、2、3、4、5 或 6

类型=2

dGPU,杰森

同步

指示流的渲染速度。

0:尽可能快
1:同步

整数,0 或 1

同步=1

dGPU,杰森

服务质量

指示接收器是否要生成服务质量事件,当管道 FPS 跟不上流帧速率时,这可能导致管道丢帧。

布尔值

服务质量=0

dGPU,杰森

源标识

此接收器必须使用其缓冲区的源的 ID。源 ID 包含在源组名称中。例如,对于组 [source1] source-id=1。

整数,≥0

源 ID=1

dGPU,杰森

gpu-id

在多个 GPU 的情况下,元素将使用 GPU。

整数,≥0

gpu-id=1

图形处理器

容器

用于文件保存的容器。仅对 type=3 有效。| 1:MP4 | 2:MKV

整数,1 或 2

容器=1

dGPU,杰森

编解码器

用于保存文件的编码器。

1:H.264(硬件)
2:H.265(硬件)

整数,1 或 2

编解码器=1

dGPU,杰森

比特率

用于编码的比特率,以每秒比特数为单位。对 type=3 和 4 有效。

整数,>0

比特率=4000000

dGPU,杰森

iframe 间隔

编码帧内出现频率。

整数,0≤iv≤MAX_INT

iframeinterval = 30

dGPU,杰森

输出文件

输出编码文件的路径名。仅对 type=3 有效。

细绳

输出文件=/home/ubuntu/output.mp4

dGPU,杰森

nvbuf 内存类型

插件为输出缓冲区分配的 CUDA 内存类型。

0 (nvbuf-mem-default):特定于平台的默认值

1 (nvbuf-mem-cuda-pinned): pinned/host CUDA 内存

2(nvbuf-mem-cuda-device):设备CUDA内存

3(nvbuf-mem-cuda-unified):统一CUDA内存

对于 dGPU:所有值均有效。

对于 Jetson:只有 0(零)有效。

整数、0、1、2 或 3

nvbuf-内存类型=3

dGPU,杰森

rtsp端口

RTSP 流媒体服务器的端口;一个有效的未使用的端口号。对类型=4 有效。

整数

rtsp-端口=8554

dGPU,杰森

UDP端口

流实现内部使用的端口 - 有效的未使用端口号。对类型=4 有效。

整数

udp 端口​​=5400

dGPU,杰森

覆盖ID

用于 HEAD 0 的叠加索引。对叠加接收器有效(类型 = 5)。

整数,>=1

overlay-id=1 必须小于 HEAD 0 支持的覆盖数量。

图形处理器

宽度

渲染器的宽度(以像素为单位)。

整数,>=1

宽度=1920

dGPU,杰森

高度

渲染器的高度(以像素为单位)。

整数,>=1

高度=1920

dGPU,杰森

偏移-x

渲染器窗口的水平偏移量,以像素为单位。

整数,>=1

偏移-x=100

dGPU,杰森

偏移-y

渲染器窗口的垂直偏移,以像素为单位。

整数,>=1

偏移-y = 100

dGPU,杰森

显示 ID

显示器 HEAD 的 ID。适用于覆盖接收器(类型 = 5)。

整数,≥0

显示 ID=0

杰森

msg-conv-config

Gst-nvmsgconv 元素的配置文件的路径名(type=6)。

细绳

msg-conv-config=dstest5_msgconv_sample_config.txt

dGPU,杰森

msg-broker-proto-lib

协议适配器实现的路径使用 Gst-nvmsgbroker (type=6)。

细绳

msg-broker-proto-lib=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_amqp_proto.so

dGPU,杰森

msg-broker-conn-str

后端服务器的连接字符串(type=6)。

细绳

msg-broker-conn-str=foo.bar.com;80;dsapp

dGPU,杰森

话题

消息主题的名称(类型=6)。

细绳

主题=测试-ds4

dGPU,杰森

msg-conv-payload-type

有效载荷的类型。

0、PAYLOAD_DEEPSTREAM:DeepStream 模式负载。

1、PAYLOAD_DEEPSTREAM_-MINIMAL:DeepStream schema的payload最小。

256、PAYLOAD_RESERVED:保留类型。

257、PAYLOAD_CUSTOM:自定义模式负载(类型=6)。

整数 0、1、256 或 257

msg-conv-payload-type=0

dGPU,杰森

消息代理配置

Gst-nvmsgbroker 元素的可选配置文件的路径名(type=6)。

细绳

msg-conv-config=/home/ubuntu/cfg_amqp.txt

dGPU,杰森

新的api

直接使用协议适配器库 api 或使用新的 msgbroker 库包装器 api

整数

0 : 直接使用适配器 api

1 : msgbroker lib 包装器 api

新 API = 0

dGPU,杰森

msg-conv-msg2p-lib

可选的自定义负载生成库的绝对路径名。该库实现了由 sources/libs/nvmsgconv/nvmsgconv.h 定义的 API。仅当 msg-conv-payload-type=257, PAYLOAD_CUSTOM 时适用。

细绳

msg-conv-msg2p-lib=/opt/nvidia/deepstream/deepstream-4.0/lib/libnvds_msgconv.so

dGPU,杰森

msg-conv-comp-id

nvmsgconv 元素的 comp-id Gst 属性;要从中处理元数据的主要/次要 gie 组件的 ID(gie-unique-id)。

整数,>=0

msg-conv-comp-id=1

dGPU,杰森

msg-broker-comp-id

nvmsgbroker 元素的 comp-id Gst 属性;要从中处理元数据的主要/次要 gie 组件的 ID (gie-unique-id)。

整数,>=0

msg-broker-comp-id=1

dGPU,杰森

禁用-msgconv

只添加消息代理组件而不是消息转换器+消息代理。

整数,

禁用-msgconv = 1

dGPU,杰森

enc 类型

用于编码器的引擎

0:NVENC硬件引擎
1:CPU软件编码器

整数,0 或 1

编码类型=0

dGPU,杰森

个人资料(硬件)

编解码器 V4L2 H264 编码器 (HW) 的编码器配置文件:

0:基线
2:主要
4:高

V4L2 H265编码器(硬件):

0:主要
1:主要10

来自旁边列的整数,有效值

个人资料=2

dGPU,杰森

udp 缓冲区大小

内部 RTSP 输出管道的 UDP 内核缓冲区大小(以字节为单位)。

整数,>=0

udp 缓冲区大小=100000

dGPU,杰森

链接到解复用器

一个布尔值,用于启用或禁用将特定“源 ID”单独流式传输到此接收器。

请检查平铺显示组启用键以获取更多信息。

布尔值

链接到解复用器=0

dGPU,杰森

5.3.11 测试组

测试组用于诊断和调试。

测试组

钥匙

意义

类型和值

例子

平台

文件循环

指示是否应无限循环输入文件。

布尔值

文件循环=1

dGPU,杰森

5.3.12 NvDs-analytics Group

[nvds-analytics]组用于在管道中添加 nvds-analytics 插件。

NvDs-分析组

钥匙

意义

类型和值

例子

平台

使能够

启用或禁用插件。

布尔值

启用=1

dGPU,杰森

配置文件

nvdsanalytics 插件的配置文件路径

细绳

配置文件=config_nvdsanalytics.txt

dGPU,杰森

5.4 DeepStream SDK 的应用调优

本节使用配置文件中的以下参数为 DeepStream SDK 提供应用程序调优技巧。

5.4.1 性能优化

本节介绍了您可以尝试以获得最佳性能的各种性能优化步骤。

DeepStream 最佳实践

以下是优化 DeepStream 应用程序以消除应用程序瓶颈的一些最佳实践:

  1. 将 streamux 和主检测器的批量大小设置为等于输入源的数量。这些设置是在[streammux][primary-gie]配置文件的组。这使管道保持满负荷运行。高于或低于输入源数量的批次大小有时会增加管道中的延迟。

  2. 将 streammux 的高度和宽度设置为输入分辨率。这是[streammux]在配置文件的组下设置的。这可确保流不会经过任何不需要的图像缩放。

  3. 如果您从实时源(如 RTSP 或 USB 摄像头)流式传输,请live-source=1[streammux]配置文件组中进行设置。这可以为实时源提供适当的时间戳,从而创建更流畅的播放

  4. 平铺和视觉输出会占用 GPU 资源。当您不需要在屏幕上呈现输出时,您可以禁用 3 项功能以最大化吞吐量。例如,当您想在边缘运行推理并仅将元数据传输到云以进行进一步处理时,不需要渲染。

  1. 禁用 OSD 或屏幕显示。OSD 插件用于绘制边界框和其他工件并在输出帧中添加标签。要禁用 OSD [osd],在配置文件组中设置 enable=0 。

  2. tiler 创建一个NxM用于显示输出流的网格。要禁用平铺输出,请[tiled-display]在配置文件组中设置 enable=0 。

  3. 禁用输出接收器进行渲染:选择fakesink,即在配置文件type=1[sink]组中。性能部分中的所有性能基准测试都在禁用平铺、OSD 和输出接收器的情况下运行。

  1. 如果 CPU/GPU 利用率低,则其中一种可能性是管道中的元素因缓冲区而变得饥饿。然后尝试通过设置增加由解码器分配的缓冲区的数量num-extra-surfaces的的属性[source#]组中的应用程序或num-extra-surfaces财产Gst-nvv4l2decoder元件。

  2. 如果您在 docker 控制台中运行应用程序并且它提供低 FPS,请qos=0在配置文件的 [sink0] 组中设置。该问题是由初始加载引起的。当 qos 设置为 1 时,作为组中属性的默认值[sink0],decodebin 开始丢帧。

  3. 如果您想优化处理管道的端到端延迟,您可以使用 DeepStream 中的延迟测量方法。

  • 要启用帧延迟测量,请在控制台上运行以下命令:

    $ export NVDS_ENABLE_LATENCY_MEASUREMENT=1
    
  • 要为所有插件启用延迟,请在控制台上运行以下命令:

    $ export NVDS_ENABLE_COMPONENT_LATENCY_MEASUREMENT=1
    

Jetson 优化

  1. 确保 Jetson 时钟设置为高。运行这些命令以将 Jetson 时钟设置为高。

    $ sudo nvpmodel -m <mode> --for MAX perf and power mode is 0
    $ sudo jetson_clocks
    另:对于 NX:使用模式为 2。
  2. 在 Jetson 上,使用Gst-nvoverlaysink代替Gst-nveglglessinknveglglessink 需要 GPU 利用率

海卫一

  1. 如果您将 Triton 与 DeepStream 结合使用,请调整tf_gpu_memory_fraction每个进程的 TensorFlow GPU 内存使用值 - 建议范围 [0.2, 0.6]。太大的值会导致内存不足,太小可能会导致性能低下。

  2. 将 TensorFlow 或 ONNX 与 Triton 结合使用时启用 TensorRT 优化。更新 Triton 配置文件以启用 TensorFlow/ONNX TensorRT 在线优化。这将在每次初始化期间花费几分钟。或者,您可以离线生成 TF-TRT graphdef/savedmodel模型。

推理吞吐量

以下几个步骤可帮助您提高应用的通道密度:

  1. 如果您使用的是 Jetson Xavier 或 Xavier NX,则可以使用 DLA(深度学习加速器)进行推理。这为其他模型或更多流释放了 GPU。

  2. 使用 DeepStream,用户可以推断每隔一帧或每隔三帧,并使用跟踪器来预测对象中的位置。这可以通过简单的配置文件更改来完成。用户可以使用 3 个可用跟踪器之一来跟踪框架中的对象。在推理配置文件中,更改[property]. 这是一个跳跃间隔,推理之间要跳过的帧数。间隔 0 表示每帧推断一次,间隔 1 表示跳过 1 帧并每隔一帧进行推断。通过从 0 到 1 的间隔,这可以有效地将您的整体通道吞吐量加倍。

  3. 选择较低的精度,例如 FP16 或 INT8 进行推理。如果要使用 FP16,则不需要新型号。这是 DS 中的一个简单更改。要更改,请更新推理配置文件中的网络模式选项。如果要运行 INT8,则需要一个 INT8 校准缓存,其中包含 FP32 到 INT8 量化表。

  4. DeepStream 应用程序也可以配置为具有级联神经网络。第一个网络进行检测,然后第二个网络对检测进行一些分类。要启用辅助推理,请从配置文件启用辅助 gie。设置适当的批次大小。批量大小将取决于通常从初级推理发送到次级推理的对象数量。用户将不得不进行试验,看看适合他们用例的批量大小是多少。为了减少二级分类器的推理次数,可以通过适当设置input-object-min-widthinput-object-min-heightinput-object-max-widthinput-object-max-heightoperate-on-gie-id、来过滤要推理的对象operate-on-class-ids

5.4.2 减少虚假检测

减少虚假检测

配置参数

描述

用例

临界点

初级检测器的每类阈值。增加阈值会将输出限制为具有更高检测置信度的对象。

roi-top-offset roi-bottom-offset

每类顶部/底部感兴趣区域 (roi) 偏移。将输出限制为帧的指定区域中的对象。

减少在行车记录仪仪表板上看到的虚假检测

检测到最小-w 检测到-最小-h 检测到-最大-w 检测到-最大-h

初级检测器的每类最小/最大对象宽度/高度将输出限制为指定大小的对象。

为了减少错误检测,例如,将一棵树检测为一个人

6. DeepStream 参考应用程序 - deepstream-test5 应用程序

Test5 应用程序除了常规推理管道外,还支持以下功能:

  • 将消息发送到后端服务器。

  • 作为消费者从后端服务器接收消息。

  • 根据从服务器收到的消息触发基于事件的录制。

  • OTA 模型更新。

6.1 支持的物联网协议和云配置

nvmsgbrokerDeepStream 插件指南中列出了插件支持的物联网协议(如 KAFKA、Azure、AMQP 等)的详细信息。可以参考 DeepStream 公共文档来设置特定于所使用协议的 IoT 中心/服务器/代理。[sink] 与type=6fornvmsgconvnvmsgbrokerconfiguration相关的组键在 :ref: config-groups-label 中讨论。

6.2 消息消费者

deepstream-test5-app可以配置为云消息的消息消费者。解析收到的消息后,可以根据消息的内容触发特定的动作。例如,NvDsSrcParentBin*保存智能记录上下文的 ,作为参数传递,start_cloud_to_device_messaging()用于触发智能记录的启动/停止。默认情况下,已经实现了基于事件的记录来演示消息消费者的使用。用户需要实现自定义逻辑来处理其他类型的接收消息。有关deepstream_c2d_msg*实现的更多详细信息,请参阅文件。要订阅云消息,请相应地配置[message-consumer]组。

6.3 智能记录 - 基于事件的记录

Test5 应用程序可以配置为根据从服务器接收到的事件记录原始视频源。这样,该功能无需一直保存数据,而是只记录感兴趣的事件。请参阅 DeepStream 插件手册和组下。目前 test5 应用仅支持源类型 = 4 (RTSP)。类似的方法也可用于其他类型的源。有两种方式可以触发智能记录事件:gst-nvdssr.h ``header file for more details about smart record. Event based recording can be enabled by setting ``smart-record[sourceX]

1.通过云消息。要通过云消息触发智能记录,Test5 应用程序应配置为消息消费者。这可以通过相应地配置 [message-consumerX] 组来完成。配置消息使用者后,应在需要基于事件的记录的源上启用智能记录。这可以按如下方式完成: smart-record=1 预期以下最小 json 消息将触发智能记录的启动/停止。

 {
command: string   // <start-recording / stop-recording>
start: string     // "2020-05-18T20:02:00.051Z"
end: string       // "2020-05-18T20:02:02.851Z",
sensor: {
id: string
 }
 }

2. 通过本地事件。set smart-record=2,这将通过云消息和本地事件启用智能记录。为了通过本地事件演示基于事件的记录,应用程序默认每十秒触发一次启动/停止事件。此间隔和其他参数是可配置的。

6.4 OTA模型更新

Test5 应用程序可以即时更新正在运行的管道中的模型。为此,该应用程序提供了命令行选项-o。如果使用-o(ota_override_file) 选项启动 test5 应用程序,则会监视对该文件的任何更改,并根据该文件中的更改,使用新模型即时更新正在运行的管道。

使用 OTA 功能

执行以下操作以使用 OTA 功能:

  1. deepstream-test5-app使用选项运行-o <ota_override_file>

  2. 在 DS 应用程序运行时,<ota_override_file>使用新的模型详细信息更新并保存

  3. 文件内容更改被检测到deepstream-test5-app,然后它开始模型更新过程。目前仅支持模型更新功能作为 OTA 功能的一部分。

On-The-Fly 模型更新的假设

  1. 新模型必须具有与先前模型相同的网络参数配置(例如网络分辨率、网络架构、类数)

  2. 开发者提供的新模型的引擎文件或缓存文件

  3. 其他配置参数(如、、、等)的更新值(如果在覆盖文件中提供)在模型切换后不会产生任何影响。primary giegroup-thresholdbbox colorgpu-idnvbuf-memory-type

  4. Secondary gie 未验证模型更新,仅验证主要模型更新。

  5. 在动态模型更新过程中不应观察到无帧丢失/无推理的帧

  6. 如果模型更新失败,将在控制台上打印错误消息,管道应继续使用较旧的模型配置运行

  7. 需要 config-file参数来抑制配置文件解析错误打印,模型切换过程中不使用此配置文件中的值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/861195
推荐阅读
  

闽ICP备14008679号