nvdsosd

Draw with nvdsosd.

Overview

Nvidia的nvdsosdarrow-up-right插件可以绘制边界框、文本和感兴趣区域(RoI)多边形(多边形以一组线的形式呈现)。该插件接受一个带有来自上游组件的元数据的RGBA缓冲区。它绘制边界框,根据给定边界框的配置(例如宽度、颜色和不透明度)着色。它还可以在框架的指定位置绘制文本和RoI多边形。文本和多边形参数可以通过元数据进行配置。

  • 从上图中可以看出nvdsosd插件的输入是RGBA格式的图像,鉴于通常nvv4l2decoder解码出的图像格式为NV12,所以为了确保pipeline的插件能够正确连接协商,添加一个nvvideoconvert插件在两者之间。

  • 绘制内容的配置来自于上游件的metadata,在DeepStream中设计实现了一个NvDsBatchMetaarrow-up-right结构体用于封装一系列metadata。

  • 在nvdsosd插件的底层有一系列nvds_osd相关的API,这些API可以参考Nvidia DeepStream SDK API Referencearrow-up-right,但文档目前更新版本为DeepStream 4.0 Release,5.0之后的新特性并未添加进来,新版的数据结构可以参考NvOsd module APIarrow-up-right

NvDsBatchMeta

GstBuffer是GStreamer Pipeline中流动的最基本的数据单元,每个GstBuffer都有与之关联的metadata,DeepStreamer实现了一套拓展的标准metadata数据结构,NvDsBatchMeta是其中最基础的一个。

顾名思义,NvDsBatchMeta是从batch这个概念衍生出来的结构体,它支持批处理metadata,这是基于nvstreammux插件arrow-up-right实现的——NvDsBatchMeta由nvstreammux插件生成,携带有多路数据源的metadata。

NvDsBatchMeta内含了一系例metadata数据,包括帧,物体,分类和标签结果,DeepStream通过访问NvDsBatchMeta来访问这些metadata。gst_buffer_get_nvds_batch_meta()可以从GstBuffer中提取出NvDsBatchMeta。

DeepStream整个metadata的结构如下图:

NvDsDisplayMeta

在DeepStream 5.0之后增加了绘制arrow和circle两种形状的支持,因此相对于4.0增加了对应的两个数据结构。从上述声明中可以看出,一帧图像支持绘制的object的个数是有上限的,查看头文件可以知道MAX_ELEMENTS_IN_DISPLAY_META=16

每种绘制的object都会内含一个NvOSD_ColorParams成员,用于设置绘制的颜色信息,需要注意的是NvOSD_Params是RGBA格式,并且所有成员都是double类型,设置范围限制在0.0-1.0之间,和通常的0-255的8bits表示法不一样。

Develop Guide

以这样一条pipeline为例,nvinfer将完成推理任务,在nvvideoconvert阶段将获得所有需要OSD的objectmetadata信息,这时候将你所想要额外fontparams添加到NvDisplayMeta中即可。

FAQ

上述示例Pipeline在显示上使用了nveglglessink插件,这取决于开发平台是否支持显示,例如在Tesla这类计算卡平台上使用docker container环境开发时默认无法显示,具体可以参考https://forums.developer.nvidia.com/t/cugraphicsglregisterbuffer-failed-with-error-219-gst-eglglessink-cuda-init-texture-1/121833arrow-up-right这个issue,据CE的回复需要安装Nvidia的Display Driver之后配置Virtual Display,由于我所用的T4服务器是公司资产,无法确定这么做的风险,所以没有尝试,而Jetson平台几乎都支持GPU Display,因此没有这种问题。

Last updated