NVIDIA Deesptream笔记(三):Deesptream里那些超实用的插件

2019-07-04 15:55:55 浏览数 (1)

对于视频分析从业人员来说,是很有必要了解一下NVIDIA Deepstream开发工具的。

这是第三部分

所以我提到动态流管理是deepstream 3.0中的一项新功能,这是一项重要功能,因为现在您的应用程序可以即时添加或删除流,更改您的FPS、更改所有分辨率,而无需重新启动应用程序图, 所以这真正意味着它为您的应用程序提供了弹性,例如,如果您有一个多流应用程序但是由于网络断开而丢失了一个流 ,这不会使你的应用程序崩溃,如果你的解决方案由于部署部分的网络状况不佳而分辨率降低,应用程序仍然可以正常工作。所有内存分配和解除分配现在都会自动处理,这样就允许这种动态流管理

使用Deepstream 3.0,您还可以使用docker容器进行扩展,在过去几年中,部署容器的使用量大幅增加,原因非常简单,容器封装和应用程序依赖关系使其可重现并可靠地执行应用程序而无需启动整个虚拟机。所以我们已经发布了NVIDIA GPU云,免费提供的docker容器,这将帮助您快速开始测试您的应用程序,这使得构建异构应用程序和独立维护该应用程序变得非常容易。

我们将通过一个例子来讨论你如何用deepstream构建的一些东西,但在我们这样做之前,先阅读一些我们已经构建的示例应用程序,以帮助我们快速了解几个插件,让你了解发生了什么。所以解码器插件是我要讨论的第一个,IP摄像机是许多用例中比较常用的摄像机之一,为了处理来自这些摄像机的这些压缩视频拍摄,我们建立了一个 解码器插件,利用NVDECODE Low level API和硬件加速,可同时支持多个流,适用于两种最流行的编码h.264 和h.265,此插件可以连接到其他插件,接受YUV数据,如推理插件,视频转换插件等。

我们还有一个批处理插件,允许您批量处理来自多个流的数据,因此您可以在GPU上有效地处理它。在上图左侧,您可以看到有多个摄像机需要解码,虽然在图里我们只有三个摄像头,但可能有很多摄像头。合并器对于连接到它的每个数据源,都有一个内部的队列。在本例中,只有3个队列。每个数据来源链接到为它自己(单独)准备的队列上。这发生在 DeepStream中的上游数据的单独线程中。然后batch算法开始运行,在本例中,只是最简单的round-robin算法,实际上意味着,每批量收集到的帧中,来自三个来源的帧的数量是平均的。 然后该批处理算法,还将为批量输出缓冲区中的每帧复制元数据信息, 因为后面需要将每帧的元数据,对应到具体的帧(元数据往往是指一些描述性数据,例如图像的宽度、高度、来源的摄像头之类的)。 当收集到的批量缓冲区装满了帧后,就会将里面的帧交给下一步处理, 或者是没有装满,但用户自己定义的,能在提交一个批处理前所等待的最多的一定的超时阈值到了。既然合并器只能按照一种固定的分辨率输出,那么如果这些所有帧的分辨率是一样的,则一切都挺好。你可以可选的将所有的帧都缩放到一个用户自定义的分辨率。以及,如果来自不同的来源的分辨率是不同的话,作为用户,

你必须指定将这些来源指定成固定的一种输出分辨率。batch算法支持NV12或者RGBA的颜色空间/颜色格式,同时没有任何颜色空间转换功能。 然后一旦batch被创建后,它将传递给下游的处理组件。

批处理插件后的组建很有可能就是推理插件。如果你看一下这个推理插件的内幕,那么有许多用于预处理数据事物的函数,比如格式转换,缩放,平均减法等。如果你看一下这个推理插件的内幕,那么有许多用于预处理数据的函数,比如格式转换,缩放,平均减法等,它们可以让你在应用中能有效地利用不同的加速预处理函数。现在,这个低级库使用TensorRT引擎,这是一个神经网络推理优化框架,以确保您的神经网络尽可能优化,以尽可能高效地运行它, 在TensorRT里,允许你通过IPluginCreator接口来实现自定义的运算层。 一旦运行了特定的网络模型,如果你是在做目标识别,也就是检测一个图像帧里面都有什么东西的话,则相应的BBox会被创建。一共有两种信息可以往下游继续传递:本组件的输入将不经修改的往下传递,这是实际的摄像头数据,也就是图像帧;以及,之前batch处理时候的元数据和本推理Plugin所创建的新BBox元数据信息。

DeepStream 3.0中也含有一个新(功能)库,能让你处理360度摄像头(图像)。 这是个参数化的库,允许你将类似鱼眼视图的的图像,通过这个新的叫NVWarp360的SDK,转成其他不同的视图/视角,以满足你的不同处理需求。 你可以从鱼眼视角变换成球面、圆柱、帕尼尼投影或者其他种类的视角/视图。这些变换用户均可以通过不同的参数进行变换。

最后我要重点说的Plugin,实际上是一对Plugin。它是两个Plugins的集合。 这对Plugin首先允许用户完成应用程序的图像数据感知阶段--也就是你程序的理解,和从视频的图像帧和像素中,创建和提取元数据的阶段。然后再允许用户将理解到的信息,通过某种消息总线,发送到一个分析服务器上,或者云后端服务器上。这两个插件,也叫nvmsgtransform和nvmsgbroker, 允许你的DeepStream应用程序,直接(支持将你的基本信息格式,根据某种常用的消息框架格式,和用户自定义的模式和规范进行转换,并且转换完成后,能够发生到类似CoAP或者MQTT之类的消息总线上。

我们只是浏览了部分插件,实际上Deepstream有很多NVIDIA加速的插件你可以使用,当然你也可以使用非加速的插件,这些插件是建立在Gstreamer,您可以使用gstreamer插件来混合和匹配构建应用程序以解决您的特定问题。

0 人点赞