Technical Walkthrough

使用 NVIDIA DeepStream 在 Fyma 解锁一条简单、可扩展、高性能的视频管道

 

在云中提供大规模的计算机视觉是一项复杂的任务。 Fyma ,一家计算机视觉公司,正借助于 NVIDIA DeepStream .

作为一家相对较新的公司, Fyma 将视频转换为数据——更具体地说,是物理空间中的运动数据。 Fyma 平台每天全天使用客户的实时视频流,并生成移动事件(例如,有人穿过门口或商店过道)。

他们早期学到的一个教训是,他们的视频处理管道必须简单、可扩展,同时具备良好的性能。由于发展资源有限,一开始它们只能拥有这三种资源中的一种。 NVIDIA DeepStream 最近通过缩短开发时间、提高性能和提供优秀的软件组件(如 GStreamer ),解锁了同时拥有这三种功能的能力。

直播视频流的挑战

Fyma 专注于消费实时视频流,以简化其客户的实施。客户可能会犹豫是否在其场所安装传感器或任何其他硬件,因为他们已经投资了安全摄像头。由于这些摄像机可以在任何地方, Fyma 可以提供不同的对象检测模型,以在不同的环境中最大限度地提高精度。

消费实时视频流在多个方面具有挑战性:

  • 摄像机有时会产生损坏的视频(呈现/解码时间戳跳跃,报告的帧率错误)
  • 网络问题导致视频流冻结、结巴、跳转或脱机
  • CPU /内存负载分配和规划并不简单
  • 实时视频流是无限的

实时视频流的无限性意味着 Fyma 的平台必须至少以帧到达的速度执行计算机视觉。基本上,整个管道必须实时工作。否则,帧将无休止地累积。

幸运的是,在过去几年中,目标检测在速度和准确性方面稳步提高。这意味着每秒可以从 1000 多张图像中检测到物体,而地图的比例超过 90% 。这些进步使 Fyma 能够以合理的价格向客户提供大规模的计算机视觉。

使用计算机视觉(特别是实时)提供物理空间分析涉及的不仅仅是对象检测。据 Fyma 软件开发主管 Kaarel Kivistik 称,“要真正从这些对象中提取一些东西,我们需要在帧之间跟踪它们,并使用某种组件来分析其行为。考虑到每个客户都可以选择自己的模型,建立自己的分析,并根据收集的数据生成报告,一个简单的视频处理管道就成了一个巨大的平台。”

版本 1 :你好,世界

Fyma 从将 OpenCV 和 ffmpeg 耦合到一个非常简单的 Python 应用程序开始。除了他们的神经网络,没有任何硬件加速。当时他们正在使用 Yolo v3 和 Darknet 。尽管使用了 AWS g4dn ,但性能很差,约为每秒 50-60 帧。具有 NVIDIA Tesla T4 GPU (他们继续使用)的 xlarge 实例。应用程序的功能如下:

  • 用于捕获视频的 OpenCV
  • 具有 Python 绑定以检测对象的暗网
  • 自制基于 IoU 的多目标跟踪器

虽然实现相当简单,但不足以扩展。表现不佳的原因有三个:

  • 软件视频解码
  • 在进程之间和 CPU / GPU 内存之间复制解码视频帧
  • 软件对输出进行编码,同时在其上绘制检测结果

他们通过硬件视频解码和编码来改进第一个版本。当时,这并没有使整体速度提高多少,因为他们仍然将解码帧从 GPU 复制到 CPU 内存,然后再复制回[Z1K]内存。

版本 2 :自定义 ffmpeg 编码器

在速度方面真正的突破来自自定义 ffmpeg 编码器,它基本上是一个围绕暗网的包装器,将视频帧转换为检测对象。帧速率增加了十倍,因为它们现在在硬件上解码,而不需要在主机和设备内存之间复制视频帧。

但是帧速率的增加意味着他们的部分应用程序现在是用 C 语言编写的,并且由于 ffmpeg 的高度复杂的构建系统而增加了复杂性。尽管如此,他们的新组件不需要太多的改动,并且被证明是相当可靠的。

这个系统的一个缺点是他们现在只能使用暗网。

版本 2.1 : DeepSORT

为了提高目标跟踪精度, Fyma 用 DeepSORT 取代了自制的基于 IoU 的跟踪器。结果很好,但他们需要更改自定义编码器,以输出对象的视觉特征,以及跟踪所需的边界框。

引入 DeepSORT 提高了准确性,但也带来了另一个问题:根据视频内容,它有时会使用大量 CPU 内存。为了缓解这个问题,该团队采用了“异步跟踪”。基本上是一种基于工作人员的方法,它涉及每个工作人员使用由边界框组成的元数据,并生成有关对象移动的事件。虽然这解决了 CPU 使用不均衡的问题,但它再次使整个体系结构更加复杂。

版本 3 : Triton 推理服务器

虽然之前的版本表现良好,但 Fyma 发现他们仍然无法在每个 GPU 上运行足够的摄像头。他们平台上的每个视频流都有其使用的任何模型的单独副本。如果他们能够减少单个摄像头的内存占用,就有可能从 GPU 实例中挤出更多内存。

Fyma 决定重写其应用程序中与 ffmpeg 相关的部分。更具体地说,该应用程序现在通过自定义 Python 绑定直接与 ffmpeg 库( libav )接口。

这使 Fyma 能够将其应用程序连接到 NVIDIA Triton 推理服务器,从而实现摄像机流之间的神经网络共享。为了保持目标检测代码的核心不变,他们将自定义 ffmpeg 编码器代码移到了自定义 Triton 后端。

虽然这解决了内存问题,但它将 Fyma 应用程序的复杂性提高了至少三倍。

版本 4 : DeepStream

Fyma 应用程序的最新版本是基于 GStreamer 和 NVIDIA DeepStream 的完全重写。

Kivistik 说:“基于管道的加速 DeepStream 组件方法是真正推动我们前进的原因。”。“此外,在不影响性能的情况下,将所有以前基于 C 的东西扔进回收站的乐趣真的令人难以置信。我们接受了 DeepStream 提供的一切:解码、编码、推理、跟踪和分析。得益于 nvtracker ,我们恢复了同步跟踪, CPU / GPU 使用率稳定。”

这意味着事件现在几乎是实时到达他们的数据库。以前,这些数据会延迟几个小时,这取决于有多少工作人员在场以及一般的“视觉”负载(整个平台看到了多少对象)。

Fyma 的当前实现为每个 GPU 实例运行一个主进程。该主进程依次为添加到平台的每个视频流运行 GStreamer 管道。每个摄像头的内存开销很低,因为所有内容都在一个进程中运行。

关于端到端性能(解码、推断、跟踪、分析), Fyma 实现了高达 10 倍的帧速率(单个视频流约 500 fps ),与第一次实现相比,精度提高了 2-3 倍。 Fyma 能够在不到两个月的时间内实施 DeepStream 。

Kivistik 说:“我想我们终于可以说,我们现在有了一个不那么大的代码库,并且具有可扩展性,因为我们可以轻松地切换模型,改变视频管道和性能。”。

“对于每个想要创建生产级计算机视觉应用程序的软件开发人员或数据科学家来说,使用 DeepStream 真的是一件轻而易举的事。”

总结

通过使用 NVIDIA DeepStream , Fyma 能够释放其 AI 模型的威力,提高其 vision AI 应用程序的性能,同时加快开发时间。如果您想做同样的事情并加快您的发展,请访问 DeepStream SDK 产品页面DeepStream 入门 .