GTC 大会火热进行中!别错过 NVIDIA CEO 黄仁勋的最新发布,以及 AI 和加速计算的必听会议。
计算机视觉/视频分析

使用 NVIDIA DeepStream 和 NVIDIA TAO 工具包构建端到端零售分析应用程序

如今,零售商可以使用商店中安装的摄像头和传感器提供的大量视频数据。利用计算机视觉 AI 应用程序,零售商和软件合作伙伴可以更快地开发 AI 应用程序同时提供更高的准确性。这些应用程序可以帮助零售商:

  • 了解店内顾客行为和购买偏好
  • 减少收缩
  • 通知员工库存不足或耗尽
  • 改进商品销售
  • 优化操作

大规模构建和部署这种高效的计算机视觉人工智能应用带来了许多挑战。传统技术耗时,需要密集的开发工作和人工智能专业知识来绘制所有复杂的架构和选项。这些可以包括构建定制的人工智能模型、部署高性能视频解码和人工智能推理管道,以及生成有洞察力的分析仪表板。

NVIDIA 的 SDK 套件有助于简化此工作流。您可以使用 NVIDIA DeepStream SDK 创建具有最低配置的高质量视频分析,并使用 NVIDIA TAO Toolkit 创建简单的模型训练过程。

这篇文章提供了一个教程,介绍如何使用 NVIDIA DeepStream SDK 和 NVIDIA TAO Toolkit 构建一个可以在零售领域执行实时智能视频分析( IVA )的示例应用程序。

要创建端到端零售愿景 AI 应用程序,请遵循以下步骤:

  1. 使用 NVIDIA 预训练模型进行人员检测和跟踪。
  2. 使用 NVIDIA TAO 工具包为特定零售使用案例定制计算机视觉模型。
  3. 使用 Apache Kafka 开发 NVIDIA DeepStream 管道,用于视频分析和流式推理输出。 Kafka 是一个用于 stream processing 、实时数据管道和大规模数据集成的开源分布式流系统。
  4. 设置 Kafka Consumer 将推理数据存储到数据库中。
  5. 开发一个 Django web 应用程序,使用各种指标分析商店性能。

您可以使用 NVIDIA-AI-IOT/deepstream-retail-analytics GitHub repo 上的代码来实现这个示例应用程序。

此示例的最终产品是一个自定义仪表板,如图 1 所示。该仪表板提供分析见解,如商店流量趋势、带购物篮的顾客数量、过道占用率等。

A dashboard with a line graph to track the number of visitors in a day, a pie chart with the ratio of customers with basket and without baskets, a bar graph with the number of customers in each aisle, and a number to depict the number of visitors in the last hour.
图 1 。用于可视化推断数据的前端仪表板

应用程序体系结构简介

在深入了解详细的工作流之前,本节概述了用于构建此项目的工具。

NVIDIA DeepStream SDK 公司

NVIDIA DeepStream SDK 是 NVIDIA 的流媒体分析工具包,支持 GPU 加速视频分析,支持跨各种硬件平台的高性能 AI 推理。 DeepStream 包括几个 reference applications 以启动开发。这些参考应用程序可以很容易地进行修改,以适应新的用例,并且可以在 DeepStream Docker 镜像和 GitHub 上的 deepstream_reference_apps 中获得。

该零售视觉 AI 应用程序构建在两个参考应用程序之上,­ deepstream-test4 和 deepstream test5 。图 2 显示了典型 DeepStream 应用程序的体系结构。

Graphic showing a DeepStream reference architecture workflow, including Video Decoding, Stream Mux, Primary Detector, Object Tracker, Secondary Classifiers, Tiler, On-Screen Display, and Renderer.
图 2 : NVIDIA DeepStream 参考应用程序架构

NVIDIA TAO 工具包和预训练模型

NVIDIA TAO (训练、调整和优化)工具包可将各种 AI 预训练模型微调到新领域。 TAO 工具包与 DeepStream 应用程序配合使用,以执行独特用例的分析。

在本项目中,该模型用于检测客户是否携带购物篮。 DeepStream 实现了 TAO 工具包与其现有管道的无缝集成,无需进行大量配置。

使用 TAO 工具包很容易。 TAO 工具包为 100 多种 CV 架构和主干的组合提供了完整的 Jupyter notebooks 模型定制。 TAO 工具包还为常见零售任务(如 people detectionpose estimationaction recognition 等)提供了一个特定于任务的预训练模型库。要开始,请参见 TAO Toolkit Quick Start

零售视觉 AI 应用程序工作流

零售视觉 AI 应用程序架构(图 3 )由以下阶段组成:

具有以下配置的 DeepStream 管道

  • 主检测器:从 NGC 配置 PeopleNet 预训练模型以检测“人员”
  • 二级检测器:使用 TAO 工具包训练的自定义分类模型,用于购物篮检测
  • 对象跟踪器: NvDCF 跟踪器(在精度配置中),用于跟踪视频流中的移动
  • 消息转换器:消息转换器,用于从推断数据生成自定义 Kafka 流负载
  • MessageBroker :将推断数据中继到 Kafka 接收器的消息代理

kSQL 时间序列数据库: 用于存储边缘推理服务器的推理输出流

Django Web Application :应用程序,用于分析存储在 kSQL 数据库中的数据,以生成有关存储性能的见解,并将这些指标用作 RESTful API 和 web 仪表板

The architectural diagram for retail vision AI, including the workflow from taking the input from in-store cameras as the video feed and using the DeepStream pipeline for the video analytics. This is followed by the Inference in a kSQL Time Series Database (TSDB) and then transferred to the Django App where the Dashboard is created.
图 3 。零售视觉 AI 应用架构

此外,此应用程序是为具有 NVIDIA GPU 的 x86 平台构建的。然而,它可以很容易地部署在 NVIDIA Jetson 嵌入式平台上,例如 NVIDIA ZVK4] AGX Orin 。

下一节将引导您完成构建应用程序所涉及的步骤。

步骤 1 :构建自定义 NVIDIA DeepStream 管道

要构建零售数据分析管道,请从 NVIDIA DeepStream reference applications deepstream-test4 和 deepstream-1test5 开始。 deepstream-retail-analytics GitHub repo 中提供了管道代码和流程的详细描述。我们建议使用本文作为对存储库中代码的演练。

deepstream-test4 应用程序是一个引用 DeepStream 管道,它演示了将custom-detected对象添加为NVDS_EVENT_MSG_META用户元数据并将其附加到要发布的缓冲区。 deepstream-test5 是一个端到端应用程序,它演示了如何在多流管道中使用nvmsgconvnvmsgbroker插件,创建NVDS_META_EVENT_MSG类型的元,以及使用 Kafka 和其他汇类型的流推理输出。

除了主对象检测器之外,该管道还集成了一个辅助分类器,一旦在零售视频分析应用程序中检测到某人,该分类器可用于检测购物者属性。 test4 应用程序用于修改nvmsgconv插件以包括零售分析属性。然后,在 Kafka 主题上使用nvmsgbroker从管道中获取二级分类器和流式数据,请参考 test5 应用程序。

由于工作流的第一步是从视频源中识别人和对象,因此首先使用 deepstream-test4 应用程序进行主要对象检测。该对象检测是在 PeopleNet 预训练模型上完成的,默认情况下,该模型接受视频输入并检测人或其物品。

对于此用例,请配置模型以仅捕获有关人员的信息。这可以通过仅存储关于数据集中包含人物的帧子集的信息来轻松实现。

完成主person对象检测后,使用 deepstream-test5 添加辅助对象分类模型。该对象分类显示检测到的人是否携带篮子。

步骤 2 :使用 NVIDIA TAO 工具包构建购物篮检测的自定义模型

本节介绍如何使用 TAO 工具包来微调对象分类模型,并找出 PeopleNet 模型中检测到的人是否携带购物篮(图 4 )。

The sample image classifier files where you can see the customers in the ‘hasBasket’ category are clearly carrying shopping baskets. The second category of ‘noBasket’ shows customers without baskets in their hands.
图 4 。购物者被分类为有篮子(左)和没有篮子(右)

首先,从零售环境收集并注释训练数据,以执行对象分类。使用 Computer Vision Annotation Tool ( CVAT )为观察到的人标注以下标签:

  • hasBasket:有人提着篮子
  • noBasket:人没有提篮子

此注释存储为 KITTI 格式的数据集,其中每行对应一个帧,因此对应一个对象。要使数据与对象分类兼容,请使用 GitHub 上的示例 ‘kitti_to_classification‘ Python file 裁剪数据集。然后可以对其执行对象分类。

接下来,使用 TAO 工具包微调 Resnet34 图像分类模型,以对训练数据执行分类。在 GitHub 上 deepstream-retail-analytics/tree/main/TAO 了解有关微调过程的更多信息。

创建自定义模型后,运行推断以验证模型是否按预期工作。

步骤 3 :集成 Kafka 消息代理以创建自定义前端仪表板

随着主要对象检测和次要对象分类模型准备就绪, DeepStream 应用程序需要将该推断数据转发到分析 web 服务器。使用 deepstream-test5 参考应用程序作为模板,使用 ApacheKafka 流式传输数据。

这里,内置在 DeepStream 中的 Kafka 适配器用于向 Kafka 消息代理发布消息。一旦 web 服务器从商店内的每个摄像头接收到 Kafka 流,这些推断输出数据就会存储在一个 kSQL 时间序列数据库中。

DeepStream 有一个默认的 Kafka 消息共享库对象,使用户能够执行主要对象检测并无缝传输数据。这个项目进一步修改了这个库,以包括关于二级分类器的信息。这有助于流式传输商店内购物篮使用的数据。

当前 DeepStream 库包括NvDsPersonObject、 ,用于定义在主检测器中检测到的persons。为了确保篮子检测唯一地映射到每个人,请修改该类,使其除了先前存在的属性之外,还包含hasBasket属性。有关详细信息,请访问 GitHub 上的 deepstream-retail-analytics/tree/main/nvmsgconv

在修改NvDsPersonObject 以包括篮检测后,使用图 5 所示的管道以确保篮检测功能正常工作。

The Application pipeline, which walks through all the steps in the workflow starting from video source and h264-parser, followed by nvh264-decoder, nvstreammux, the nvinfer primary detector, the nvtracker, nvinfer for secondary detection, nvvidconv, nvsod and then the tee which branches to msgconv, nveglglessink, msgconv, and msgbroker.
图 5 。零售视觉 AI 应用管道

如图 5 中的应用程序管道所示,对象检测和跟踪是在pgiesgie . 的帮助下执行的。这些 是nvinfer 插件[VZX6]的一部分,作为主要和次要推理引擎。使用nvtracker,将数据传输到nvosd 插件。这个nvosd 插件负责在前面章节中检测到的对象周围绘制方框。

接下来,需要根据特定的模式将该推断数据转换为消息负载, Kafka 消息代理稍后可以使用该模式来存储和分析结果。使用NvDsPersonsObject (先前生成) 作为 eventmsg_payload file. 中更新的有效载荷

最后,您现在有了带有自定义模式的消息负载。使用此命令将其传递给 Kafka 协议适配器,并发布 DeepStream 应用程序在指定的代理地址和主题向 Kafka 消息代理发送的消息。此时,最终的消息负载已准备就绪。

现在 DeepStream 管道已经准备好,构建一个 web 应用程序,将流式推理数据存储到一个 kSQL 数据库中。这个使用 Django 框架构建的 web 应用程序分析推理数据,以生成与前面讨论的商店性能相关的指标。这些指标可通过 GitHub 上 deepstream-retail-analytics/tree/main/ds-retail-iva-frontend 中记录的 RESTful API 获得。

为了演示 API 功能,我们构建了一个前端 web 仪表板,以可视化分析服务器的结果。此仪表板充当整个门店分析系统的模板。

Results

前面的步骤演示了如何使用 NVIDIA DeepStream 和 NVIDIA TAO 工具包轻松开发端到端零售视频分析管道。这条管道帮助零售企业利用已有的视频源,并找到他们可以用来提高利润的有洞察力的信息。

该工作流以易于使用的 web 仪表板为高潮,可实时分析宝贵的全店数据。如图 1 所示,仪表板显示以下信息:

  • 全天门店访客数量
  • 关于带篮子和不带篮子购物的客户比例的信息
  • 每个商店过道的访客数
  • 门店入住热图
  • 客户旅程可视化

这些属性可以很容易地修改,以包括与每个单独商店更相关的特定用例的信息。商店可以使用这些信息来安排人员配置并改进商店布局,以最大限度地提高效率。

例如,图 6 显示了全天商店中顾客的总体分布,以及带篮子和不带篮子的顾客的比例。虽然此示例应用程序仅支持单个摄像机流,但可以轻松修改以支持多个摄像机。将此应用程序扩展到多个商店同样容易。

A figure displaying the number of customers in the store over time as a bar graph with many rows and different distribution throughout the x-axis (left). On the right side, the  pie chart depicts the ratio of customers who have ‘noBasket’ with respect to the customers who fall into the ‘hasBasket’ category. There are 82.6% customers who have ‘noBasket’ vs 17.4% who are in the ‘hasBasket’ category.
图 6 。一段时间内商店中顾客数量的推断数据(左),以及有篮子的顾客与没有篮子的顾客的比率(右)

应用程序通过设置hasBasket属性来唯一检测person 11携带购物篮,而未携带购物篮的其他客户则标记为noBasket。此外,带有纸板箱的person 1未被识别为有篮子。因此,该模型对误报是鲁棒的,确保它被成功训练为只获取该用例的相关信息。

总结

这篇文章展示了一个端到端的过程,即使用 NVIDIA TAO 工具包和 NVIDIA DeepStream SDK 开发视觉 AI 应用程序,以执行零售分析。零售企业可以利用现有的视频数据流,并构建最先进的视频分析应用程序。这些应用程序可以实时部署,启动时只需最少的配置。此外,该应用程序的高度可定制性确保了它可以应用于商店可能受益的任何用例。

开始使用 GitHub 上的示例 deepstream-retail-analytics 应用程序。

 

Tags