deepstream实践Gst-nvinfer插件

学习deepstream插件,首先要了解推理插件,它运行AI模型实现推理,是核心插件。在了解完推理插件后,可以在此基础上了解其他插件的功能。

Gst-nvinfer 插件是deepstream推理插件之一,它使用 NVIDIA® TensorRT™ 对输入图像数据进行推理。

Gst-nvinfer框架

下图Gst-nvinfer 插件框架图,该插件接受来自上游的NV12/RGBA 批量缓冲数据,NvDsBatchMeta 结构必须已经添加到 Gst Buffer。底层库 (libnvds_infer) 对具有高、宽维度的INT8 RGB、BGR 或 GRAY 数据进行处理。Gst-nvinfer 插件根据网络要求对输入帧进行转换(格式转换和缩放),并将转换后的数据传递给底层库。底层库对转换后的帧进行预处理(执行归一化和均值减法)并生成最终的浮点 RGB/BGR/GRAY 平面数据,数据传递给 TensorRT 引擎进行推理。

nvinfer 框架

Gst-nvinfer 目前适用于以下类型的网络:
多类型目标检测;多标签分类;语义分割;实例分割

Gst-nvinfer 插件可以在三种模式下工作:

在预处理张量输入模式下运行时,会完全跳过 Gst-nvinfer 内部预处理。Gst-nvinfer查找添加到输入buffer的 GstNvDsPreProcessBatchMeta 并将张量原封不动传递给 TensorRT 推理函数。此模式目前支持处理全帧和 ROI。 GstNvDsPreProcessBatchMeta 由 Gst-nvdspreprocess 插件添加。

当Gst-nvinfer与跟踪器插件一起作为二级分类器运行时,它把分类输出缓存在以对象的唯一 ID 作为键的map中,避免重复推断每一帧中的相同对象来提高性能。即当对象首次出现在框架中(基于对象 ID)或对象的大小(边界框区域)增加 20% 或更多时,才会推断对象。注意此优化仅当将跟踪器添加为上游元素时,才可能进行。

Gst-nvinfer下游组件接收一个 Gst buffer,其中包含未修改的NV12/RGBA数据以及经 Gst-nvinfer 插件推理后创建的元数据。该插件可用于级联推理, 即可以直接对输入数据进行一级推理,然后对一级推理的结果进行二级推理,以此类推。

Gst-infer输入输出

输入:

控制参数:

Gst-nvinfer从配置文件中获取控制参数。通过GObject属性也可以设置Gst-nvinfer控制参数,它可以设置下面这些参数:

输出:

学习Gst-nvinfer配置文件

参见https://www.toutiao.com/article/7096632112018686497/,我们分析安装deepstream后得到的deepstream-app配置文件样例来学习如何设置Gst-nvinfer属性。

下面是配置了caffe模型的Gst-nvinfer 配置文件config_infer_primary_nano.txt,对主要的属性做了注释。

[property]
gpu-id=0
## 把输入从0-255转换到0-1的比例值
net-scale-factor=0.0039215697906911373
## caffe 模型文件,存储了权重、偏置信息,并存储了网络结构信息
model-file=../../models/Primary_Detector_Nano/resnet10.caffemodel
## caffe 模型网络结构信息
proto-file=../../models/Primary_Detector_Nano/resnet10.prototxt
## 模型识别处的物体类别标签
labelfile-path=../../models/Primary_Detector_Nano/labels.txt
## 最多一次预测8帧
batch-size=8
## 1=处理整帧图像;2=只处理预测出来的对象区域
process-mode=1
## 输入模型网络图像格式,0=RGB;1=BGR;2=GRAY
model-color-format=0
## 0=FP32, 1=INT8, 2=FP16 mode,预测网络使用的数据精度
network-mode=2
## 预测出来的对象种类数量
num-detected-classes=4
## 每隔一帧图像预测一次
interval=1
## nvinfer 标志id,用来标记,无其他作用
gie-unique-id=1
## 预测模型网络输出层名称
output-blob-names=conv2d_bbox;conv2d_cov/Sigmoid
## 1:隐式batch 维度,0:显式batch维度,使用onnx时 需要设置为显式batch维度;
## 模型网络使用动态tensor维度时,也需要设置为显式batch维度
force-implicit-batch-dim=1

[class-attrs-all]
pre-cluster-threshold=0.2
group-threshold=1
eps=0.2
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0
detected-max-h=0

在配置文件中,若没有指定模型的engine文件,需要根据情况指定以下属性:

对于目标检测,必须设置属性: num-detected-classes。下面属性是可选的:

对于分类,必须设置的属性有:
classifier-threshold, is-classifier
可选属性classifier-async-mode,只有在次模式下起作用,默认值是false

在次模式下,可选的属性有:

batch-size: 每次都推荐设置一个合适值,默认值是1

操作Gst-nvinfer配置文件

上一节介绍了Gst-nvinfer配置文件各属性作用。这节通过简单例子介绍如何修改Gst-nvinfer配置文件。

上一节Gst-nvinfer配置文件使用了caffe 模型文件,bbox 处理函数是默认的方法。使用caffe模型转换后的tensorrt engine文件,bbox 处理函数使用用户自定义函数如何配置呢?可以看下面的配置,与上一节的配置文件相比model-file和proto-file换成了model-engine-file,添加了parse-bbox-func-name和custom-lib-path属性。

安装deepstream后,开源的部分代码中给出了用户自定义处理函数样例,此部分代码路径:
/{path-of-deepstream}/sources/libs/nvdsinfer_customparser/,{path-of-deepstream}是deepstream的安装路径。

[property]
gpu-id=0
## 把输入从0-255转换到0-1的比例值
net-scale-factor=0.0039215697906911373
## 模型gpu加速后的tensorrt模型文件
model-engine-file=../../models/Primary_Detector_Nano/resnet10.caffemodel_b8_gpu0_fp16.engine
## 模型识别出的物体类别标签
labelfile-path=../../models/Primary_Detector_Nano/labels.txt
## 最多一次预测8帧
batch-size=8
## 1=处理整帧图像;2=只处理预测出来的对象区域
process-mode=1
## 输入模型网络图像格式,0=RGB;1=BGR;2=GRAY
model-color-format=0
## 0=FP32, 1=INT8, 2=FP16 mode,预测网络使用的数据精度
network-mode=2
## 预测出来的对象种类数量
num-detected-classes=4
## 每隔一帧图像预测一次
interval=1
## nvinfer 标志id,用来标记,无其他作用
gie-unique-id=1
## 预测模型网络输出层名称
output-blob-names=conv2d_bbox;conv2d_cov/Sigmoid
## 1:隐式batch 维度,0:显式batch维度,使用onnx时 需要设置为显式batch维度;
## 模型网络使用动态tensor维度时,也需要设置为显式batch维度
force-implicit-batch-dim=1
## 用户自定义解析bbox函数名
parse-bbox-func-name=NvDsInferParseCustomResnet
## 用户自定义bbox解析动态库路径
custom-lib-path=/home/nvidia/deepstream/sources/libs/nvdsinfer_customparser/libnvds_infercustomparser.so

[class-attrs-all]
pre-cluster-threshold=0.2
group-threshold=1
eps=0.2
roi-top-offset=0
roi-bottom-offset=0
detected-min-w=0
detected-min-h=0
detected-max-w=0

下面介绍deepstream-app配置文件如何调用Gst-nvinfer插件

# 对于主模式Gst-nvinfer,config-file 是必须要配置的。
# 若配置属性与Gst-nvinfer属性一致,会覆盖Gst-nvinfer对应属性
[primary-gie]
## 确定调用Gst-nvinfer主模式
enable=1
## 使用0号GPU, 会覆盖Gst-nvinfer配置文件中对应属性
gpu-id=0
## 模型gpu加速后的tensorrt模型文件,会覆盖Gst-nvinfer配置文件中对应属性
model-engine-file=../../models/Primary_Detector_Nano/resnet10.caffemodel_b8_gpu0_fp16.engine
## 最多一次预测1帧,会覆盖Gst-nvinfer配置文件中对应属性
batch-size=1
## 用于OSD, 不是Gst-nvinfer属性
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
## 每隔4帧图像预测一次,会覆盖Gst-nvinfer配置文件中对应属性
interval=4
## 给Gst-nvinfer实例设置的唯一id,用于区分不同实例产生的metadata,会覆盖Gst-nvinfer配置文件中对应属性
gie-unique-id=1
## 设置推理输出配置的cuda内存类型
nvbuf-memory-type=0
## Gst-nvinfer 配置文件路径
config-file=config_infer_primary_nano.txt
## 保存推理原始结果的文件路径
# infer-raw-output-dir=/home/nvidia/workspace/study

# 对于次模式Gst-nvinfer,config-file 是必须要配置的。
# 若配置属性与Gst-nvinfer属性一致,会覆盖Gst-nvinfer对应属性
[secondary-gie0]
## 确定调用Gst-nvinfer次模式
enable=1
## 模型gpu加速后的tensorrt模型文件,会覆盖Gst-nvinfer配置文件中对应属性
model-engine-file=../../models/Secondary_VehicleTypes/resnet18.caffemodel_b16_gpu0_int8.engine
## 使用0号GPU, 会覆盖Gst-nvinfer配置文件中对应属性
gpu-id=0
## 最多一次预测16帧,会覆盖Gst-nvinfer配置文件中对应属性
batch-size=16
## 给Gst-nvinfer实例设置的唯一id,用于区分不同实例产生的metadata,会覆盖Gst-nvinfer配置文件中对应属性
gie-unique-id=4
## 此Gst-nvinfer实例要处理的metadata 中必须包含的Gst-nvinfer实例id,会覆盖Gst-nvinfer配置文件中对应属性
operate-on-gie-id=1
## 此Gst-nvinfer实例要处理对象的分类id。
## 譬如主Gst-nvinfer 是目标检测实例,能检测4种类型物体,汽车、自行车、人、路标,汽车的分类id是0,此Gst-nvinfer实例对汽车分类
## 此属性会覆盖Gst-nvinfer配置文件中对应属性
operate-on-class-ids=0;
## Gst-nvinfer 配置文件路径
config-file=config_infer_secondary_vehicletypes.txt



本文介绍了如何配置deepstream Gst-nvinfer插件,相信了解这些后,可以轻松配置deepstream-app,调用Gst-nvinfer进行模型推理。

参考:https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_plugin_gst-nvinfer.html

展开阅读全文

页面更新:2024-04-13

标签:插件   张量   维度   实例   属性   模型   对象   文件   数据   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top