本次笔记整理自NVIDIA 8月20日在线研讨会,原讲座标题:DEEPSTREAM SDK – ACCELERATING REAL-TIME AI BASED VIDEO AND IMAGE ANALYTICS
在本节中,我们将介绍几个参考示例以开始使用DeepStream。这些是作为SDK的一部分打包的一些参考应用程序。
如果你刚刚开始使用Deepstream,这是你的出发点。所有源代码都包含在包中。
Deepstream Test 1是一个基本的Hello World,这将引导您完成单个视频源从文件到解码批处理推断的基本构建块,然后在结果中输出屏幕上的边界框。
Deepstream Test2构建在Test 1上,并在对象检测后添加辅助网络。辅助网络是分类器。这显示了在单个管道中运行的多个网络。
Test 3在Test 1上增加了多个视频输入,处理多个流。
Test 4 是通过消息代理插件来提供loT服务。它提供了使用消息代理连接到Azure loT 中心的步骤,或者使用消息代理向服务器发送消息。
除此之外,我们在示例apps目录中还有几个参考应用程序。我们还在包中提供了端到端的Deepstream应用程序。此应用程序比四个测试应用程序稍微复杂一些,但通过配置文件提供完整的配置功能。对于输入,您可以指定任意数量的输入源,任何类型的输入源,所以这可能是一个文件、RTSP、相机。你也可以指定输入分辨率。对于推断,您可以控制批量大小、连接器类型、分辨率,或者检测的GPU ID等。此外,您还可以指定辅助网络和跟踪器的选项。为了您的观看,您可以将他们的输出绑定在2D数组中。当您有多个输入时,这很有用。您还可以控制屏幕的颜色和功能。显示诸如边界框和文本。最后输出可用于在屏幕上查看带有元数据的流或存储在文件中的选项。这是一个应用程序,可以快速原型化或演示您的pipline,并了解它在Deepstream中的工作原理。源目录中提供了所有源代码。
Deepstream 4.0带来了本机运行自己模型的能力。
他们可以使用yolo模型进行推断插件。这个插件使用tensorRT,即NVIDIA推理加速器。
NVIDIA推断插件将NV12或RGBA缓冲区加上批处理元数据作为输入。该插件包括预处理,推理和边界框解析。在预处理步骤中,图像被缩放或裁剪以满足网络的分辨率。因为在tensorRT中不支持Yolo模型中的所有层,所以我们必须添加一些额外的步骤。首先,您需要在Deepstream中使用CUDA引擎API创建CUDA引擎。然后创建自己的网络。接着使用TensorRT中的Iplugin接口为不受支持的层创建自定义实现。最后是最后一部分。解析检测到的对象的边界框。为了使用Yolo模型的输出层,我们提供了自定义边界框解析功能。源目录中提供了创建自己的网络和自定义边界框的所有源代码。我们在深度支持Yolo V3,Tiny V3,Yolo V2和Tiny Yolo V2网络。此外,NVIDIA在文档页面上添加了教程,以便在Deppstream Yolo应用程序中集成自定义Yolo模型。
DeepStream现在可以部署在Docker容器中,用于我们的数据中心GPU,如T4和Tesla V100。这些容器可在NVIDIA NGC上使用。NVIDIA容器运行时为在Docker容器中运行的应用程序启用GPU加速。CUDA工具包,视频编解码器SDK,TensorRT等安装在容器内。在此容器的顶部运行的是Deepstream SDK和Deepstream 应用程序。 容器具有所有更多级别依赖项,以在容器内构建应用程序。
Deepstream 4.0通过Jetson的NVIDIA容器运行时在Jetson平台上带来了容器的优点和可移植性。Deepstream 4.0可以使用NGC上提供的docker镜像在Jetson设备上的容器内运行。DeepStream容器可以在Jetson设备上安装CUDA 10,TensorRT和visionworks。针对边缘设备,这个容器很小巧。与 GPU容器的另一个区别是Jetson容器仅用于部署。这主要是为了减小容器的大小。部署容器不支持容器内的Deepstream软件开发。
您需要在Jetson Target上本地构建应用程序,并通过添加docker镜像的二进制文件来创建容器。或者,您可以使用NVIDIA容器运行时中为Jetson文档提供的说明从工作站生成Jetson容器。请使用NGC链接访问Jetson容器。
在Deesptream4.0中metadata架构跟先前的版本有一些不同。
首先我们从batch级别的元数据开始看,也就是幻灯片中标记为(1)处的NvDsBatchMeta结构。该数据结构是在nvstreammux插件中产生的。然后在NvDsBatchMeta里面,是帧的元数据,即NvDsFrameMeta, 在图中我们标记为(2). 而具体batch元数据中,所包含的frame元数据个数,等同于streammux的batch size. Frame元数据算是高层中的第二层次的元数据。
然后从Frame元数据中,又能指向到Object和Display元数据。这两个是第3层次。3有两种元数据,包含在2中,分别是Object和Display的。Frame元数据中包含的Object元数据多少,等同于在该帧图像中,所能检测到的对象的多少。
Object元数据是通过nvinfer插件创建的。Display元数据则用作在图像帧中,显示/绘制文字和方框的。从Object元数据中,可以进一步指向相对应的Classfifier元数据。Classifier元数据仅存在多个网络的时候,才会被创建。例如,你检测车的时候,下一步可能想具体检测车的颜色,和车的类型。则这种信息就会被存储在Classfier元数据中。这是元数据的第4层次。你可以通过DeepStream 4.0版本迁移/升级指南,和插件手册中,获取关于元数据层次的更详细的信息
关于Deepstream的资源: