Gst-nvmsgconv#

Gst-nvmsgconv 插件负责根据模式将元数据转换为消息负载。 DeepStream 5.0 支持模式的两种变体,完整和最小。 Gst-nvmsgconv 插件可以配置为使用其中一种模式。 默认情况下,该插件使用完整的 DeepStream 模式以 JSON 格式生成负载。 完整模式支持对象检测、分析模块、事件、位置、传感器和 3D 跟踪的详细语义。 每个负载都包含有关单个对象的信息。 您可以使用模式的最小变体与后端通信最少的信息。 这为从 DeepStream 传输到消息broker的负载提供了较小的 footprint。 每个负载都可以包含帧中多个对象的信息。

Gst-nvmsgconv 插件与底层 nvmsgconv 库接口,该库提供使用以下元数据类型生成负载的 API

  1. NVDS_EVENT_MSG_META (NvDsEventMsgMeta) 类型元数据作为帧元数据的用户元数据附加到缓冲区。 对于批处理缓冲区,帧的所有对象的元数据必须在相应的帧元数据下。 这是默认选项。

  2. 通过解析 Gst 缓冲区中的 NVDS_FRAME_META (NvDsFrameMeta) 类型和 NVDS_OBJECT_META (NvDsObjectMeta) 类型,以及这些元数据类型中的可用字段,用于基于模式类型创建消息负载。 要使用此选项,请设置 gst 属性 msg2p-newapi = true。

此 API 还支持为每个负载附加自定义用户消息 blob(JSON 格式的字符串),如果消息 blob 作为 NvDsFrameMeta 的用户元数据添加。 此外,使用此 API,您还可以使用另一个 gst 属性来设置生成每个负载的帧间隔。 frame-interval = <interval>。 如果未设置,则生成帧的默认帧间隔为每 30 帧

在上述两种情况下,生成的负载 (NvDsPayload) 都作为 NVDS_PAYLOAD_META 类型用户元数据附加回输入缓冲区。

此外,Gst-nvmsgconv 插件提供可选属性:- debug-payload-dir : 用于调试的负载转储目录的绝对路径 - multiple-payloads : 生成多个消息负载

Gst-nvmsgconv

输入和输出#

  • 输入

    • 带有 NvDsEventMsgMeta 或 NvDsFrameMeta/NvDsObjectMeta 的 Gst 缓冲区

  • 控制参数

    • config

    • msg2p-lib

    • payload-type

    • comp-id

    • debug-payload-dir (可选)

    • multiple-payloads (可选)

    • msg2p-newapi (可选)

    • frame-interval (可选)

  • 输出

    • 带有附加 NvDsPayload 元数据的相同 Gst 缓冲区。 此元数据包含有关插件生成的负载的信息。

特性#

下表总结了插件的特性。

Gst-nvmsgconv 插件特性#

特性

描述

发布版本

JSON 格式的负载

消息负载以 JSON 格式生成

DS 3.0

支持 DeepStream 模式规范

消息的 DeepStream 模式规范实现

DS 3.0

自定义模式规范

为消息提供自定义模式

DS 3.0

用于静态属性的键值文件解析

以键值对的形式从文本文件中读取传感器/地点/模块的静态属性

DS 3.0

用于静态属性的 CSV 文件解析

从 CSV 文件中读取传感器/地点/模块的静态属性

DS 3.0

DeepStream 4.0.1 最小化模式

DeepStream 消息模式的最小变体

DS 4.0

新的 msgconv api

支持直接使用 Gst 缓冲区帧和对象元数据生成 deepStream 消息模式负载(完整和最小)

DS 6.0

负载生成间隔

设置生成负载的帧间隔

DS 6.0

Gst 属性#

下表描述了 Gst-nvmsgconv 插件的 Gst 属性。

Gst-nvmsgconv 插件 gst 属性#

属性

含义

类型和范围

示例 / 注释

平台

config

定义各种传感器、地点和模块的静态属性的配置文件的绝对路径名。

字符串

config=msgconv_config.txt 或 config=msgconv_config.csv

dGPU Jetson

msg2p-lib

包含 nvds_msg2p_* 接口的自定义实现的库的绝对路径名,用于自定义负载生成。

字符串

msg2p-lib=libnvds_msgconv_custom.so

dGPU Jetson

payload-type

要生成的模式负载的类型。 可能的值为

PAYLOAD_DEEPSTREAM:使用 DeepStream 模式的负载。

PAYLOAD_DEEPSTREAM_MINIMAL:使用最小 DeepStream 模式的负载。

PAYLOAD_CUSTOM:使用自定义模式的负载。

整数,0 到 4,294,967,295

payload-type=0 或 payload-type=257

dGPU Jetson

comp-id

要从中处理元数据的插件的组件 ID。

整数,0 到 4,294,967,295

comp-id=2 默认为 NvDsEventMsgMeta

dGPU Jetson

debug-payload-dir

转储负载的目录

字符串

debug-payload-dir=<绝对路径> 默认为 NULL

dGPU Jetson

multiple-payloads

生成多个消息负载

布尔值

multiple-payloads=1 默认为 0

dGPU Jetson

msg2p-newapi

使用 Gst 缓冲区帧/对象元数据生成负载

布尔值

msg2p-newapi=1 默认为 0

dGPU Jetson

frame-interval

生成负载的帧间隔

整数,1 到 4,294,967,295

frame-interval=25 默认为 30

dGPU Jetson

dummy-payload

默认情况下,如果 NVDS_EVENT_MSG_META 附加到缓冲区,则会生成负载。 使用此选项,如果没有 NVDS_EVENT_MSG_META 附加到缓冲区,也可以生成虚拟负载

布尔值

dummy-payload=true 默认为 false

dGPU Jetson

NvMsgConv 底层库 API#

Gst-nvmsgconv 插件与底层 nvmsgconv 库接口,该库提供用于负载生成的 API

  • nvds_msg2p_generate 使用 NVDS_EVENT_MSG_META (NvDsEventMsgMeta) 类型生成消息负载

  • nvds_msg2p_generate_new 使用 GST 缓冲区(NVDS_FRAME_META (NvDsFrameMeta) 和 NVDS_OBJECT_META (NvDsObjectMeta) 类型)生成消息负载

Deepstream 示例测试应用程序具有使用任一 API 生成消息负载的选项

deepstream-test4-app

  • 使用命令行选项 –msg2p-meta 选择要创建负载的元数据类型。

  • 0=Event Msg meta(默认), 创建 NVDS_EVENT_MSG_META 类型的元数据并附加到缓冲区

  • 1=nvdsmeta, 使用 NvDsFrameMeta/NvDsObjectMeta 中的字段来填充负载

deepstream-test5-app

  • 配置选项如下所示,默认选项使用 NvdsEventMsgMeta 创建负载

  • #(0): 使用 NvdsEventMsgMeta 创建负载

  • #(1): 使用 NvDsFrameMeta 创建负载的新 API

  • msg-conv-msg2p-new-api=0

对于使用 NVDS_EVENT_MSG_META 类型生成负载,用户需要

  • 创建 NVDS_EVENT_MSG_META 类型的元数据并附加到缓冲区。

  • 对不同类型的对象(例如,车辆、人员等)使用 NVDS_EVENT_MSG_META。

  • 如果元数据通过“extMsg”字段扩展,则提供复制/释放函数。

而使用新的 NvMsgConv 底层库 API 生成负载,用户无需担心在其示例测试应用程序中创建/销毁任何负载对象。 nvmsgconv 底层库直接使用 GST 缓冲区(NVDS_FRAME_META / NVDS_OBJECT_META)来创建负载。

模式自定义#

此插件可以通过两种方式用于实现自定义模式

  • 通过修改负载生成器库:要执行 DeepStream 模式字段的简单自定义,请修改目录 sources/libs/nvmsgconv 内的底层负载生成库文件。 使用 NVDS_EVENT_MSG_META (NvDsEventMsgMeta) 类型生成的负载可以通过修改 sources/libs/nvmsgconv/deepstream_schema/eventmsg_payload.cpp 进行自定义。 如果负载是使用 DS GST 缓冲区(NVDS_FRAME_META (NvDsFrameMeta) 类型和 NVDS_OBJECT_META (NvDsObjectMeta) 类型)中的元数据生成的,则可以通过修改文件 sources/libs/nvmsgconv/deepstream_schema/dsmeta_payload.cpp 来自定义负载生成。

  • 通过实现 nvds_msg2p 接口:如果需要将实现自定义模式的库与 DeepStream SDK 集成,请将库包装在 nvds_msg2p 接口中,并将插件的 msg2p-lib 属性设置为库的名称。 将 payload-type 属性设置为 PAYLOAD_CUSTOM

有关 nvds_msg2p 接口的示例实现,请参见 sources/libs/nvmsgconv/nvmsgconv.cpp

带有自定义对象的负载#

您可以将一组自定义对象添加到 NvDsEventMsgMeta 结构的 extMsg 字段中,并在 extMsgSize 字段中指定其大小。 元数据复制 (copy_func) 和释放 (release_func) 函数必须相应地处理自定义字段。 负载生成器库处理一些标准类型的对象(车辆、人员、面部等),并根据所选模式生成负载。 要处理自定义对象类型,您必须修改负载生成器库 nvmsgconv.cpp。 有关将自定义对象作为 NVDS_EVENT_MSG_META 用户元数据添加到缓冲区以生成自定义负载并发送到后端的详细信息,请参见 deepstream-test4

如果使用 Deepstream GST 缓冲区(NVDS_FRAME_META (NvDsFrameMeta) 类型和 NVDS_OBJECT_META (NvDsObjectMeta) 类型)生成负载而不是 NvDsEventMsgMeta,您可以使用 NVDS_CUSTOM_MSG_BLOB 类型将自定义消息 blob(字符串)附加到负载,方法是创建 NvDsCustomMsgInfo 对象并指定字段 message (自定义消息 blob)和 len (自定义消息的大小)。 底层负载生成库解析每个帧元数据并检查 NVDS_CUSTOM_MSG_BLOB 类型,如果存在,则将其附加到负载。 当 gst 属性 msg2p-newapi = true 时,此选项可用(使用新的 msgconv API)。

与为 NvDsEventMsgMeta 结构生成自定义对象类似,请参阅 deepstream-test4 以获取有关添加自定义对象的详细信息,您可以使用元数据复制 (copy_func) 和释放 (release_func) 函数来处理自定义字段,并修改应用程序以使用 NVDS_CUSTOM_MSG_BLOB (和 NvDsCustomMsgInfo 对象)类型而不是 NvDsEventMsgMeta 类型来附加自定义消息。