Gst-nvdspostprocess (Alpha)#

Gst-nvdspostprocess 插件是一个可自定义的插件,它为推理插件(nvinfer/nvinferserver)的 Tensor 输出提供了一个自定义库接口,用于后处理。目前,该插件支持检测和分类模型的解析。该插件连接到作为插件参数提供的后处理库。解析参数可以通过配置文件指定。有关更多详细信息,请参阅下面的 Gst-nvdspostprocess 文件配置规范 部分。

为了使插件能够执行推理张量输出的解析,有必要通过在推理配置文件中将 output-tensor-meta 设置为 1,并在推理插件中通过将 network-type 设置为 100 即网络类型为其他类型来禁用解析。同样,在 Gst-nvinferserver 中,我们可以在配置文件中启用以下配置。output_control { output_tensor_meta : true },为了禁用原生后处理,请更新:infer_config { postprocess { other {} } }

默认插件实现提供以下功能。

  1. 它解析附加到帧元数据或对象元数据的张量元数据。

  2. 将张量解析的输出附加到帧元数据或对象元数据。

插件提供的默认自定义库 (postprocesslib_impl) 实现了这些功能。它可以配置为解析检测和分类网络。对于管道中的多个推理插件,需要多个与它们对应的后处理插件实例。

Gst-nvdspostprocess

输入和输出#

  • 输入

    • 输入视频 Gst 缓冲区

    • 元数据 (NvDsBatchMeta)

    • 张量元数据 (NvDsInferTensorMeta)

  • 控制参数

    • postprocesslib-config-file

    • postprocesslib-name

    • gpu-id

  • 输出

    • 输出视频 Gst 缓冲区

    • 原始元数据 (NvDsBatchMeta)(添加了对象元数据/分类器元数据)

特性#

下表总结了插件的特性。

Gst-nvdspostprocess 特性#

特性

描述

发布版本

检测输出解析

解析检测器张量数据并将结果作为对象元数据附加

DS 6.1

分类输出解析

解析分类张量数据并将结果作为分类器属性附加到元数据中

DS 6.1

Yolo 检测器 (YoloV3/V3-tiny/V2/V2-tiny) 解析

支持解析 Yolo 检测器输出

DS 6.1

FasterRCNN 输出解析

DS 6.1

单发检测器 (SSD) 输出解析

DS 6.1

Gst-nvdspostprocess 文件配置规范#

Gst-nvdspreprocess 配置文件使用“YAML”格式。请参阅 config_detector.yml, config_classifier_car_color.yml 等示例,这些示例位于 /opt/nvidia/deepstream/deepstream/sources/gst-plugins/gst-nvdspostprocess/property 组配置插件的常规行为。 class-attrs-all 组配置检测器后处理器的所有类的参数。 class-attrs-<id> 组配置检测器后处理器的 <id> 特定类的参数。

以下两个表分别描述了 property 组和 class-attrs-<id> 组支持的键。

Gst-nvdspostprocess property 组支持的键#

属性

含义

类型和范围

示例

gpu-id

用于处理的 GPU

整数

gpu-id: 0

process-mode

操作模式:全帧(主要 1)或对象(次要 2)

整数 1=主要(全帧),2=次要(对象)

process-mode: 1

gie-unique-id

对 gie-unique-id 的输出执行张量元数据解析

整数 >0

gie-unique-id: 1

num-detected-classes

检测器网络检测到的类数

整数 >0

num-detected-classes: 4

cluster-mode

要在检测器输出上使用的聚类模式

整数 1=DBSCAN 2=NMS 3=DBSCAN+NMS 混合 4=无(无聚类)

cluster-mode: 2

output-blob-names

要解析的输出层名称数组

分号分隔的字符串

output-blob-names: conv2d_bbox;conv2d_cov/Sigmoid

network-type

要解析的网络类型

整数 0=检测器 1=分类器

network-type: 1

labelfile-path

包含模型标签的文本文件的路径名

字符串

labelfile-path: /opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/labels.txt

classifier-threshold

最小阈值标签概率。如果概率大于此阈值,则 GIE 输出具有最高概率的标签

浮点数,>0.0

classifier-threshold: 0.4

operate-on-gie-id

GIE 的唯一 ID,此 GIE 将在其元数据(边界框)上运行,适用于 process-mode=2

整数 >0

operate-on-gie-id: 1

parse-classifier-func-name

自定义分类器输出解析函数的名称。如果未指定,后处理库将使用 softmax 层的解析函数。

字符串

parse-classifier-func-name: NvDsPostProcessClassiferParseCustomSoftmax

parse-bbox-func-name

自定义边界框解析函数的名称。如果未指定,后处理库将使用 SDK 提供的 resnet 模型的函数

字符串

parse-bbox-func-name: NvDsPostProcessParseCustomResnet

Gst-nvdspostprocess class-attr-<id> 组支持的键#

属性

含义

类型和范围

示例

topk

仅保留检测得分最高的 top K 个对象。

整数,>0。 -1 表示禁用

topk: 10

nms-iou-threshold

两个提案之间的最大 IOU 分数,超过此分数后,置信度较低的提案将被拒绝。

浮点数,>0.0

nms-iou-threshold: 0.2

pre-cluster-threshold

在聚类操作之前应用的检测阈值

浮点数,>0.0

pre-cluster-threshold: 0.5

post-cluster-threshold

在聚类操作之后应用的检测阈值

浮点数,>0.0

post-cluster-threshold: 0.5

eps

DBSCAN 算法的 Epsilon 值

浮点数,>0.0

eps: 0.2

dbscan-min-score

集群中所有邻居的置信度总和的最小值,集群要被视为有效集群。

浮点数,>0.0

dbscan-min-score: 0.7

Gst 属性#

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

Gst-nvspostprocess gst 属性#

属性

含义

类型和范围

示例注释

gpu-id

用于后处理的 GPU 的设备 ID(仅限 dGPU)

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

gpu-id=1

postprocesslib-name

用于输出解析的底层后处理库

字符串

postprocesslib-name=./postprocesslib_impl/libpostprocess_impl.so

postprocesslib-config-file

设置要使用的后处理 yaml 配置文件

字符串

postprocesslib-config-file= config_detector.yml

示例管道#

下面是一些示例管道,请设置适当的配置文件和库路径。

用于多流检测器和分类器 (dGPU)

gst-launch-1.0 uridecodebin \
 uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 \
! m.sink_0 nvstreammux name=m width=1920 height=1080 batch-size=2   ! \
 nvinfer config-file-path=config_infer_primary_post_process.txt  \
! nvdspostprocess \
postprocesslib-config-file=config_detector.yml \
postprocesslib-name= ./postprocesslib_impl/libpostprocess_impl.so \
! queue ! nvinfer \
config-file-path= config_infer_secondary_vehiclemake_postprocess.txt \
! nvdspostprocess \
postprocesslib-config-file= config_classifier_vehicle_make.yml \
postprocesslib-name= ./postprocesslib_impl/libpostprocess_impl.so ! queue ! nvinfer \
config-file-path= config_infer_secondary_vehicletypes_postprocess.txt \
! nvdspostprocess  postprocesslib-config-file= \
config_classifier_vehicle_type.yml  postprocesslib-name= \
./postprocesslib_impl/libpostprocess_impl.so    ! queue ! nvmultistreamtiler !  nvvideoconvert \
gpu-id=0 ! nvdsosd ! nveglglessink sync=1 -v  uridecodebin \
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 ! m.sink_1

用于多流检测器和分类器 (Jetson)

gst-launch-1.0 uridecodebin \
 uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 \
! m.sink_0 nvstreammux name=m width=1920 height=1080 batch-size=2   ! \
nvinfer config-file-path=config_infer_primary_post_process.txt  \
! nvdspostprocess \
postprocesslib-config-file=config_detector.yml \
postprocesslib-name= ./postprocesslib_impl/libpostprocess_impl.so \
! queue ! nvinfer \
config-file-path= config_infer_secondary_vehiclemake_postprocess.txt \
! nvdspostprocess \
postprocesslib-config-file=config_classifier_vehicle_make.yml \
postprocesslib-name= ./postprocesslib_impl/libpostprocess_impl.so ! queue ! nvinfer \
config-file-path= config_infer_secondary_vehicletypes_postprocess.txt \
! nvdspostprocess  postprocesslib-config-file= \
config_classifier_vehicle_type.yml  postprocesslib-name= \
./postprocesslib_impl/libpostprocess_impl.so ! queue ! nvmultistreamtiler !  nvvideoconvert \
gpu-id=0 ! nvdsosd ! nv3dsink sync=1 -v  uridecodebin \
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 ! m.sink_1