DeepStream是一个流分析工具包,用于构建人工智能驱动的应用程序。它将来自USB/CSI摄像头的流式数据、来自文件的视频或通过RTSP的流式数据作为输入,并使用人工智能和计算机视觉从像素生成细节,以便更好地了解环境。DeepStream SDK 可以是许多视频分析解决方案的基础层,如理解智能城市中的交通和行人、医院的健康和安全监控、零售中的自我检测和分析、检测制造设施中的组件缺陷等。请在此处阅读有关DeepStream的更多信息。
DeepStream通过Python绑定支持C/C++和Python中的应用程序开发。为更容易入门学习,DeepStream 发布的时候提供了C/C++和Python的参考应用程序。请参阅C/C++示例应用程序源详细信息和Python示例应用程序源详细信息部分,了解更多可用的应用程序。有关一些DeepStream参考应用程序示例,请参见NVIDIA-AI-IOT Github页面。
核心SDK由几个硬件加速插件组成,这些插件使用各种加速器,如VIC、GPU、DLA、NVDEC和NVNC。通过在专用加速器中执行所有计算繁重操作,DeepStream可以实现视频分析应用程序的最高性能。DeepStream的关键功能之一是边缘与云之间的安全双向通信。DeepStream附带了一些现成的安全协议,例如使用用户名/密码的SASL/Plain身份验证和双向TLS身份验证。要了解更多有关这些安全特性的信息,请阅读物联网章节。要了解更多关于双向功能的信息,请参阅本指南中的双向消息传递部分。
DeepStream构建在CUDA-X堆栈中的几个NVIDIA库之上,如CUDA、TensorRT、Triton推理服务器和多媒体库。TensorRT加速了NVIDIA GPU上的AI推断。DeepStream在DeepStream插件中抽象这些库,这样开发者就可以轻松地构建视频分析管道,而不必学习所有的单独库。
针对NVIDIA GPU,对DeepStream进行了优化;该应用程序可以部署在运行Jetson平台的嵌入式边缘设备上,也可以部署在更大的边缘或数据中心gpu(如T4)。可以使用NVIDIA容器运行时将DeepStream应用程序部署在容器中。这些容器可在NGC、NVIDIA GPU云注册表上使用。要了解有关dockers部署的更多信息,请参阅Docker容器一章。可以在GPU上使用Kubernetes在边缘编排DeepStream应用程序。部署DeepStream应用程序的示例Helm图表可在NGC上获得。
1. DeepStream Graph 架构
DeepStream是一个使用开源GStreamer框架构建的优化图形体系结构。下图显示了从输入视频到输出细节的典型视频分析应用程序。所有单独的块都是使用的各种插件。底部是应用程序中使用的不同硬件引擎。最佳的内存管理和插件之间的零内存拷贝以及各种加速器的使用确保了最高的性能。
DeepStream以GStreamer插件的形式提供构建块,可用于构建高效的视频分析管道。至少有15个插件采用了硬件加速完成任务。
- 流数据可以通过RTSP或本地文件系统通过网络传输,也可以直接从摄像机传输。流是使用CPU捕获的。一旦帧进入内存,它们就被发送到使用NVDEC加速器进行解码。解码的插件称为 Gst-nvvideo4linux2。
- 在解码之后,存在可选的图像预处理步骤,其中可以在推断之前对输入图像进行预处理。预处理可以是图像畸变矫正或颜色空间转换。Gst-nvdewarper 插件可以矫正鱼眼或360度相机中的图像畸变。Gst-nvvideoconvert 插件可以对帧执行颜色格式转换。这些插件使用GPU或VIC(视觉图像合成器)。
- 下一步是批处理帧以获得最佳的推理性能。批处理是使用 Gst-nvstreammux 插件完成的。
- 一旦帧被批处理,它就被发送用于推断。可以使用TensorRT(NVIDIA的推理加速器运行时)进行推理,也可以使用Triton推理服务器在TensorFlow或PyTorch等本机框架中进行推理。本机TensorRT推断使用 Gst-nvinfer 插件执行,Triton推断使用 Gst-nvinferserver 插件执行。推理可以使用GPU或DLA(深度学习加速器)为 Jetson AGX Xavier 和 Xavier NX。
- 推断之后,下一步可能涉及跟踪目标。SDK中有几个内置的参考跟踪器,从高性能到高精度不等。使用 Gst-nvtracker 插件执行对象跟踪。
- 为了创建可视化工件,比如边界框、分段掩码、标签,有一个名为 Gst-nvdsosd 的可视化插件。
- 最后,为了输出结果,DeepStream 提供了各种选项:使用屏幕上的边界框渲染输出、将输出保存到本地磁盘、通过RTSP流式输出或仅将元数据发送到云。为了向云发送元数据,DeepStream 使用 Gst-nvmsgconv 和 Gst-nvmsgbroker 插件。 Gst-nvmsgconv 将元数据转换为模式负载,Gst-nvmsgbroker 建立到云的连接并发送遥测数据。有几种内置的代理协议,如Kafka、MQTT、AMQP和azureiot。可以创建自定义代理适配器。
2. DeepStream 参考应用程序
首先,开发人员可以使用提供的参考应用程序。还包括这些应用程序的源代码。端到端应用程序称为 deepstream 应用程序。这个应用程序是完全可配置的-它允许用户配置任何类型和数量的来源。用户还可以选择运行推理的网络类型。它预先构建了一个推理插件来进行目标检测,推理插件级联来进行图像分类。有一个配置跟踪器的选项。对于输出,用户可以选择在屏幕上渲染、保存输出文件或通过RTSP流式传输视频。
这是开始学习DeepStream功能的一个很好的参考应用程序。此应用程序在DeepStream参考应用程序-DeepStream应用程序一章中有更详细的介绍。此应用程序的源代码可在 /opt/nvidia/deepstream/deepstream-5.1/sources/apps/sample\u apps/deepstream-app
中找到。此应用程序将适用于所有AI模型,并在各个自述中提供详细说明。性能基准也使用此应用程序运行。
3. 构建应用入门
对于希望构建其定制应用程序的开发人员来说,deepstream应用程序在开始开发时可能有点难以承受。SDK附带了几个简单的应用程序,开发人员可以从中了解DeepStream的基本概念,构建一个简单的管道,然后继续构建更复杂的应用程序。
- deepstream-test1:DeepStream Hello world. 把视频文件显示在屏幕上,并在检测目标上加上一个矩形外框。
- deepstream-test2:在 test1 的基础上在检测目标上进行目标分类。
- deepstream-test3:在 test1 的基础上,添加多路视频输入。
- deepstream-test4:在 test1 的基础上,利用 nvmsgbroker 插件连接到 IoT 服务。
4. Python 中的 DeepStream
Python易于使用,在创建人工智能模型时被数据科学家和深度学习专家广泛采用。NVIDIA引入了Python绑定来帮助您使用Python构建高性能AI应用程序。可以使用gstpython(GStreamer框架的Python绑定)构建DeepStream管道。
DeepStream Python应用程序使用Gst Python API操作构造管道,并使用探测函数访问管道中各个点的数据。这些数据类型都是原生C的,需要通过PyBindings或NumPy的填充层从Python应用程序访问它们。张量数据是经过推理后得到的原始张量输出。如果您试图检测一个对象,则需要通过解析和聚类算法对该张量数据进行后处理,以便在检测到的对象周围创建边界框。要开始使用Python,请参阅本指南中的Python示例应用程序源代码详细信息和DeepStream Python API指南中的“DeepStream Python”。
参考文献:
- NVIDIA DeepStream Overview