计算机视觉/视频分析

借助 NVIDIA Metropolis 微服务和 API 构建边缘视觉 AI 应用

 

通过 NVIDIA Metropolis 微服务,开发者可以利用功能强大的云原生 API 和微服务来构建和定制视觉 AI 应用和解决方案。该框架现已与 NVIDIA Jetson 相结合,使得开发者能够在边缘快速开发高性能、成熟的视觉 AI 应用,并实现产品化。

API 通过实现不同应用和服务之间的无缝通信和集成,提高了软件开发的灵活性、互操作性和效率。用于构建视频分析应用的两个常见功能是视频流和基于 AI 的见解和分析生成。

本文介绍了用于构建视觉 AI 应用并将其集成到任何客户端应用中的 API 工作流程。我们将介绍构建应用的三个关键步骤:

  • 使用 API 通过 WebRTC 将视频从边缘流式传输到任何设备。
  • 使用线功能(可通过 API 访问)生成有关人员/物体移动的见解和警报。
  • 使用参考云进行安全的远程设备 API 访问。

模块化架构

适用于 Jetson 的 NVIDIA Metropolis 微服务提供了一个模块化架构,该架构包含大量可自定义、可重复使用的微服务,这些微服务用于构建视觉 AI 应用。该套件还为基础设施功能和参考云提供了平台服务。各种微服务包括 Video Storage Toolkit (VST),这是一种基于 NVIDIA DeepStream 的分析服务。每个服务都提供了用于配置和访问微服务功能的 API。

这些 API 使用 Ingress 平台服务从外部提供给系统,该服务基于云原生架构中使用的标准模式,以使用单个网关在系统中公开 API.客户端应用通过 Ingress 服务调用相应的 API 来执行微服务功能。此外, NVIDIA Metropolis 微服务提供了一个 IoT 云模块,使客户端能够在远程访问这些 API 时进行身份验证和授权。

Diagram showing the cloud-native workflow for a complete application using NVIDIA Metropolis microservice for NVIDIA Jetson.
图 1.适用于 Jetson 的云原生 NVIDIA Metropolis 微服务

通过 WebRTC 进行视频流式传输

通过使用客户端应用程序(例如移动应用程序或浏览器)连接到系统的摄像头查看视频流是视频分析系统的常见要求。此功能通过基于 VST API 的标准化调用流提供支持。VST 微服务支持使用 WebRTC (Web Real-Time Communication,Web 实时通信)协议进行远程流式传输,该协议专为通过互联网可靠地对等传输视频和其他数据而设计。

本节概述 WebRTC 协议背后的突出概念,并使用 VST API 实现基于 WebRTC 的流式传输。WebRTC 是一个功能强大的开源项目,可在两个对等端(例如 Web 浏览器和运行 VST 的 Jetson 设备)之间直接进行实时通信。

用于 WebRTC 流式传输的实体

典型的 WebRTC 会话涉及几个不同的实体,如下所示:

用户代理:表示使用 VST API 发起通信的移动、浏览器或 Web 应用程序。

信号服务器:在 VST 中实现的 Web 服务器参与建立 WebRTC 会话的通信通道。

ICE (交互式连接建立)服务器:VST-WebRTC 堆栈中实现的逻辑模块,用于确定对等方之间的最佳连接路径。这是绕过防火墙和 NAT (网络地址转换器)所必需的。

STUN (会话遍历实用程序)服务器:一种有助于发现公共 IP 地址和端口的 ICE 服务器。当对等方使用私有(基于 NAT 的)IP 地址时,这是必要的。这是托管在公有云网络上的第三方实体。

TURN (使用 NAT 周围的继电器进行遍历)服务器:在直接点对点通信失败时充当中继器,并且仅在节点位于不同网络时才需要。Twilio™ 等第三方服务支持此功能。

Graphic showing the different entities involved with peer-to-peer WebRTC streaming, including signaling server, WebRTC, STUN, TURN.
图 2.用于 WebRTC 流式传输的实体

WebRTC 会议阶段

WebRTC 会议使用控制路径数据路径以启用会话创建和流式传输。

控制路径支持设置和管理同行之间的会话,其阶段包括初始化、信号传递、ICE 候选交换和建立连接。VST 使用户代理能够通过其 API 远程执行这些操作。

数据路径支持实时媒体数据传输以及适应和质量控制,并最终关闭连接。

通过 VST API 启用 WebRTC 流式传输

图 3 显示了客户端和 VST 之间的调用流程,该流程捕获了用于启用 WebRTC 会话的控制和数据路径。

Diagram showing the call flow between clients and VST, capturing the control and data paths for enabling WebRTC sessions.
图 3.使用 VST 的 WebRTC 调用流程

呼叫流始于客户端使用api/v1/sensor/listAPI.

控制和数据路径基于以下调用流实施:

  • 客户调用GET api/v1/live/iceServers or api/v1/replay/iceServers从 VST 获取 ICE 服务器列表。
  • 客户端创建本地报价,并使用POST api/v1/live/stream/start or api/v1/replay/stream/start.
  • VST 为客户端创建答案,并将其作为响应返回。
  • 客户使用GETPOST请求api/v1/live/iceCandidateapi/v1/replay/iceCandidatepeerid作为查询参数。
  • 当对等连接完成时,视频数据开始流动。

在进行串流时,客户端可以使用以下串流 API 控制串流:

  • 暂停视频管线:api/v1/replay/stream/pause
  • 继续视频制作流程:api/v1/replay/stream/resume
  • 在视频中查找特定时间:api/v1/replay/stream/seek

构建客户端应用

通过在 JavaScript 中通过 HTTP 调用 VST API,同时利用大多数浏览器支持的 JavaScript 中的 WebRTC 支持,这些概念可应用于向基于浏览器的 Web 应用程序添加视频流功能。类似概念也可应用于构建原生 WebRTC 客户端应用程序。

要使用 JavaScript 设置 WebRTC 流式传输,请执行以下步骤:

初始化对等连接

创建新的RTCPeerConnection具有适当配置设置的对象。

处理音轨添加

  • 为 NVIDIA Omniverse 开发者套件ontrack活动。
  • 添加新音轨后,请更新远程视频元素以显示传入的视频流。

生成报价

  • 使用createOffer为对等连接生成 offer 的方法。
  • 将对等连接的本地描述设置为生成的 offer.

将优惠发送至 VST

  • 使用peerConnection.localDescription.
  • 使用适当的启动 API 向 VST 发送报价;例如api/v1/live/stream/start.

接收来自 VST 的回复

当从 VST 接收到答案 SDP 作为启动 API 响应时,请使用peerConnection.setRemoteDescription.

处理 ICE 候选项

  • 使用GETPOST请求api/v1/live/iceCandidateAPI.
  • 使用以下命令将接收到的候选 ICE 添加到对等连接中:peerConnection.addIceCandidate.

为物体移动生成空间见解和警报

分析微服务支持三个人员或对象分析模块:

  • 视野 (FOV):统计摄像头视野中的人员或物体。
  • 线检测:检测穿越用户定义的线线段的人员或物体。
  • 关注区域 (ROI) 分析:对定义的感兴趣区域中的人员或物体进行计数。

结合使用,这些模块提供了一套功能强大的工具,用于了解人员或物体在物理空间中的移动,用例涵盖零售仓库、安全和安保。客户端应用使用 API 来识别传感器列表、创建线,以及检索每个功能的计数和警报。

本节介绍线这些操作的端到端示例。类似的方法可用于启用 FOV 和 ROI.对于每种情况,请调用您选择的编程语言或 HTTP 客户端中的 HTTP API.

检索传感器列表

第一步,检索要为其配置线的传感器名称。

调用 VST API 以列出所有传感器。从返回的列表中识别感兴趣的传感器。name在后续步骤中,传感器对象的属性将用作传感器 ID,以配置和检索线数量和警报。将 <device-ip>替换为设备的 IP 地址。

http://<device-ip>:30080/vst/api/v1/sensor/list

创建线配置

在此步骤中,配置一条线,以指定您希望对穿越的人员进行计数的线。

配置线时,请指定以下属性:

  • 传感器识别:识别需要配置的传感器。
  • 线 ID:识别线。传感器可以有多个定义。每条线都需要有一个唯一的标识符。
  • 线缆:表示构成线的线段的点序列。
  • 方向:描述交叉点(进入/退出)方向性的向量(两个点)。

请注意,点的坐标位于相机坐标(图像平面)中。左上角为 (00).

客户应用(例如随 NVIDIA Metropolis 微服务提供的参考移动应用)提供了视觉辅助来选择点,而无需手动确定 (x,y) 位置。图 4 展示了通过移动应用创建和渲染线的示例。用户使用应用中的触摸界面选择线锚点,以绘制线(绿线)以及方向性(红色箭头)。

Visual rendering in the reference mobile app, provided with Metropolis microservices. Users can draw tripwires, specify directions, and view the real-time analytics.
图 4.随 NVIDIA Metropolis 微服务一起提供的参考移动应用中的 Tripwire 视觉渲染

使用Id = main_door传感器Id = Amcrest_3然后,使用您选择的编程语言调用以下 HTTP API 调用:

http://<device-ip>:30080/emdx/api/config/tripwire?sensorId=Amcrest_3

{
  "deleteIfPresent": false,
  "tripwires": [
    {
        "direction": {
          "entry": {
            "name": "Inside the room"
          },
          "exit": {
            "name": "Outside of the room"
          },
          "p1": { "x": 753, "y": 744},
          "p2": { "x": 448, "y": 856}
        },
        "id": "main_door",
        "name": "Main door",
        "wire": [
          { "x": 321, "y": 664 },
          { "x": 544, "y": 648 },
          { "x": 656, "y": 953 },
          { "x": 323, "y": 1067}
        ]
      }
  ],
  "sensorId": "Amcrest_3"
}

配置线警报规则(可选)

可以选择为给定的线配置警报规则。警报规则是特定条件,满足这些条件后将生成警报事件。

要配置一条警报规则,以便在有人朝入口方向穿过线(大门)时发出警报,请调用以下 API 请求:

http://<device-ip>:30080/emdx/api/config/rule/alerts/tripwire

{
  "sensorId": "Amcrest_3",
  "rules": [
    {
      "rule_id": "cd2218f6-e4d2-4ad4-9b15-3396e4336064",
      "id": "main_door",
      "type": "tripwire",
      "rule_type": "increment",
      "time_interval": 1,
      "count_threshold": 1,
      "direction": "entry"
    }
  ]
}

检索线数量和警报

此步骤说明了如何检索穿越先前定义的线的人数。或者,您还可以检索根据该线的配置警报规则生成的警报。

可以查询特定线的计数(sensorId, tripwireId),时间范围(fromTimestamp, toTimestamp)并聚合到指定的时间窗口(fixedInterval或者,您可以通过将“DLSS 3”设置为“DLSS 3”来检索警报和统计信息。alerts query 参数true:

http://<device-ip>:30080/emdx/api/metrics/tripwire/histogram?sensorId=Amcrest_3&tripwireId=main_door&fromTimestamp=2020-10-30T20:00:00.000Z&toTimestamp=2020-10-30T20:01:00.000Z&fixedInterval=1000&alerts=true

{
    "alerts": [
     {
            "count": 1,
            "description": "1 people entered tripwire",
            "duration": 1.000,
            "startTimestamp": "2020-10-30T20:00:59.000Z",
            "endTimestamp": "2020-10-30T20:01:00.000Z",
            "id": "unique-alert-id",
            "rule_type": "increment",
            "rule_id": "cd2218f6-e4d2-4ad4-9b15-3396e4336064",
            "sensorId": "Amcrest_3",
            "type": "tripwire",
            "direction": "entry",
            "directionName": "Inside the room", 
            "attributes": [..],
        }
     ],
    "counts": [
      {
        "agg_window": "1 sec",
        "histogram": [
          {
            "end": "2020-10-30T20:00:01.000Z",
            "start": "2020-10-30T20:00:00.000Z",
            "sum_count": 1
          }
        ],
        "attributes": [...],
        "sensorId": "Amcrest_3",
        "type": "exit"
      },
      {
        "agg_window": "1 sec",
        "histogram": [
          {
            "end": "2020-10-30T20:00:01.000Z",
            "start": "2020-10-30T20:00:00.000Z",
            "sum_count": 0
          },
          …..
        ],
        "attributes": [.. ],
        "sensorId": "Amcrest_3",
        "type": "entry"
      }
    ]
  }

系统会分别返回每个方向的直方图。整个时间范围被划分为fixedInterval.每个时间窗口的交叉start,end报告为sum_count.

检索线警报

要检索给定传感器的所有警报,请调用以下 API:

http://<device-ip>:30080/emdx/api/alerts?sensorId=Amcrest_3&fromTimestamp=2020-10-30T20:00:00.000Z&toTimestamp=2020-10-31T01:00:00.000Z

安全、远程、基于云的 API 访问

API 使客户端能够使用 HTTP 协议远程访问设备配置和功能。在开发阶段,建议通过将 HTTP 请求定向到设备 IP 地址来调用 API.但是,在生产场景中,客户端通常不知道设备的 IP 地址。

此外,Jetson 设备可能位于防火墙后面,使其无法访问,或者它们可能使用基于 NAT 的 IP 地址,而这些地址在外部可能无效。IoT 云通过提供一种机制,以安全的方式将请求从网络分离的客户端转发到设备,从而促进产品级远程 API 调用。

本节介绍客户端获取安全令牌的机制,并使用这些令牌通过云创建 HTTP,以转发到适当的设备。

虽然本节的重点是展示客户端如何通过云调用设备 API,但请注意,云架构提供了一种安全的“设备声明”机制,用于通过云授权访问特定设备。通过云访问的所有用户设备都经过身份验证和授权,用户只能访问之前声明过的设备。

此功能的设计具有高度可定制性,可与原始设计制造商 (ODM) 和原始设备制造商 (OEM) 运营商现有的安全框架和云后端基础设施无缝集成。

通过 IoT Cloud 调用设备 API 的工作流程

物联网 (IoT) 云实现参考使用 Amazon Cognito 作为身份提供商 (IdP),但用户可以自由选择任何第三方身份提供商。要通过云端点访问设备 API,请遵循以下概述的身份验证和授权调用流。

使用 Amazon Cognito 进行身份验证

使用 Web 控制台登录 URI 页面,以便使用 Amazon Cognito 进行身份验证。身份验证成功后,Amazon Cognito 会返回唯一的授权代码。使用授权代码向 Amazon Cognito 发出受时间限制的 ID 令牌。在调用 IoT 云安全 API 时展示此 ID 令牌。

The call flow diagram initiated by a user to an IDP service such as Amazon Cognito to authenticate the user.
图 5.使用 IDP 进行授权的调用流

生成 CWT 令牌并调用设备 API

要访问物联网设备 API,请首先向物联网云安全请求授权令牌。在收到有效请求后,物联网云安全会发出临时签名的授权 CWT 令牌。然后,使用此令牌通过物联网云传输调用设备 API,从而进行验证并将请求转发至设备。

请注意,如果用户无权根据设备声明执行操作,则会返回未经授权的 HTTP 错误代码。

Call flow diagram showing the user initiating the authorization by requesting an authorization token from IoT cloud and using it to invoke the device APIs.
图 6.使用 IoT 云授权用户的调用流程

总结

借助 NVIDIA Metropolis API 和微服务,在边缘构建功能强大的市场就绪型视觉 AI 应用。API 提供了一种标准化、安全和分布式的方法,用于实现各种 NVIDIA Metropolis 微服务的功能。此版本中包含的参考移动应用展示了一个成熟的最终用户应用,该应用使用这些 API 构建,具有用户友好型界面,可捕获配置、视频流、分析、警报、云集成和设备声明。此应用包括源代码,以及版本文档移动应用部分中各种模块的演练。

下载适用于 Jetson 的 NVIDIA Metropolis 微服务,并注册参加我们的在线研讨会,包括两部分:借助适用于 Jetson 的 Metropolis API 和微服务加速边缘 AI 开发(第 1 部分)和如何使用适用于 Jetson 的 Metropolis 微服务进行构建(第 2 部分)。

 

Tags