NVIDIA英伟达嵌入式系统 · 1月30日 · 北京市

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

头图.gif
NVIDIA Metropolis 微服务提供功能强大且可自定义的云原生 API 和微服务,用于开发视觉 AI 应用和解决方案。该框架现在涵盖 NVIDIA Jetson,使开发者能够在边缘快速构建性能强大的成熟视觉 AI 应用,并将其产品化。

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

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

  • 通过使用 API 的 WebRTC 将视频从边缘传输到任何设备。
  • 通过 API 访问,使用绊线生成有关人员/对象运动的洞察和警报。
  • 使用参考云实现安全的远程设备 API 访问。

模块化架构

适用于 Jetson 的 NVIDIA Metropolis 微服务提供了一个具有大量软件的模块化架构,其中包含了用于构建视觉 AI 应用的可自定义且可重复使用的微服务。该套件还提供适用于基础设施功能和参考云的平台服务。各种微服务包括视频存储工具套件(VST)、基于 NVIDIA DeepStream 的 AI 感知服务以及分析服务。每项服务均提供用于配置和访问微服务功能的 API。

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

图一.png

图 1. 适用于 Jetson 的云原生 NVIDIA Metropolis 微服务通过 WebRTC 传输视频

视频分析系统常常要求使用客户端应用(如移动应用或浏览器)查看连接到系统的摄像机中的视频流。该功能通过基于 VST API 的标准化调用流获得支持。VST 微服务支持使用 WebRTC(网络实时通信)协议来进行远程流式传输,该协议旨在通过互联网来可靠地点对点传输视频和其他数据。

本部分将概述 WebRTC 协议的基本概念和使用 VST API 实现 WebRTC 流式传输的情况。WebRTC 是一个功能强大的开源项目,可在两个对等设备(如网络浏览器和运行 VST 的 Jetson 设备)之间直接进行实时通信。

用于 WebRTC 流式传输的实体

一个典型的 WebRTC 会话涉及以下几个不同的实体:

用户代理:使用 VST API 发起通信的手机、浏览器或网络应用。

信令服务器:在 VST 内实现的网络服务器,用于为 WebRTC 建立会话通信通道。

ICE(建立交互式连接)服务器:VST-WebRTC 堆栈中的一个逻辑模块,用于确定对等设备之间的最佳连接路径,对于穿越防火墙和 NAT(网络地址转换器)来讲是必要的。

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

TURN(围绕 NAT 使用中继进行遍历)服务器:在点对点直接通信失败时充当中继,只有当对等设备位于不同网络时才需要使用。可通过 Twilio 等第三方服务提供支持。

图二.png

图 2. 用于 WebRTC 流式传输的实体

WebRTC 会话阶段

WebRTC 会话使用控制路径和数据路径来创建会话和进行流式传输。

控制路径可在对等设备之间建立和管理会话,其阶段包括初始化、信令、ICE 候选交换以及连接建立。VST 可让用户代理通过其 API 远程执行这些操作。

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

通过 VST API 实现 WebRTC 流式传输

图 3 显示了客户端与 VST 之间的调用流,捕捉了实现 WebRTC 会话的控制和数据路径。

图三.png
图 3. 使用 VST 的 WebRTC 调用流

该调用流先从客户端使用 api/v1/sensor/list API 发现各种视频流。

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

  • 客户端调用 GET api/v1/live/iceServers 或 api/v1/replay/iceServers,以便从 VST 获取 ICE 服务器列表。
  • 客户端创建本地要约,并使用 POST api/v1/live/stream/start 或 api/v1/replay/stream/start 将要约发送给 VST。
  • VST 为客户端创建一个应答,并将其作为响应返回。
  • 客户端使用 GET 和 POST 请求完成 api/v1/live/iceCandidate 或 api/v1/replay/iceCandidate 的 ICE 交换,并将 peerid 作为查询参数。
  • 对等连接完成后,视频数据就开始流动。

流式传输开始后,客户端可使用以下流 API 控制流式传输:

  • 暂停视频管线:api/v1/replay/stream/pause
  • 恢复视频管线:api/v1/replay/stream/resume
  • 查找视频中的特定时间:api /v1/replay/stream/seek

构建客户端应用

通过在 JavaScript 中使用 HTTP 调用 VST API,并利用大多数浏览器支持的 JavaScript 中的 WebRTC 支持,就可使用这些概念为基于浏览器的网络应用添加视频流式传输功能。类似的概念也可用于构建本地 WebRTC 客户端应用。

若使用 JavaScript 设置 WebRTC 流式传输,请按照以下步骤操作:

初始化对等连接

创建一个设置得当的新 RTCPeerConnection 对象。

处理通道添加

  • 为 ontrack 事件设置一个事件监听器。
  • 添加新通道时,更新远程视频元素以显示传入的视频流。

生成要约

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

将要约发送至 VST

  • 使用 peerConnection.localDescription 获取本地描述(要约)。
  • 使用适当的启动 API(例如 api/v1/live/stream/start)向 VST 发送要约。

接收来自 VST 的应答

从 VST 收到作为启动 API 响应的应答 SDP 后,使用 peerConnection.setRemoteDescription 将其设置为远程描述。

处理候选 ICE

  • 使用 api/v1/live/iceCandidate API 的 GET 和 POST 请求交换候选 ICE。
  • 使用 peerConnection.addIceCandidate 将收到的候选 ICE 添加到对等连接中。

生成对象移动的空间洞察和警报

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

  • 视野(FOV):对摄像机视野内的人员或物体进行计数。
  • 绊线:检测跨越用户定义的绊线线段的人员或物体。
  • 感兴趣区域(ROI):对定义的感兴趣区域内的人员或物体进行计数。

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

本节将通过一个端到端示例介绍绊线的这些操作。类似的方法也可用于实现 FOV 和 ROI。对于每种情况,请使用您选择的编程语言或 HTTP 客户端调用 HTTP API。

检索传感器列表

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

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

http://:30080/vst/api/v1/sens...

创建一个绊线配置

在此步骤中配置一个绊线,指定要对越线人数进行计数的线。

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

  • 传感器 ID:待配置绊线的传感器的标识。
  • 绊线 ID:绊线的标识。一个传感器可能有多个定义,但每个绊线都需要有唯一的标识符。
  • 导线:组成绊线的线段的点序列。
  • 方向:描述穿越(进入/退出)方向的矢量(两个点)。

请注意,点的坐标是摄像机坐标(图像平面)。左上角为(0,0)。

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

图四.png
图 4. NVIDIA Metropolis 微服务提供的参考移动应用中的绊线可视化渲染

要为 Id = Amcrest_3 的传感器配置 Id = main_door 的绊线,请使用您选择的编程语言调用以下 HTTP API:

http://:30080/emdx/api/config...


{
  "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://:30080/emdx/api/config...


{
  "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)来查询计数。您还可以选择将警报查询参数设置为 true 来检索警报和计数:

http://:30080/emdx/api/metric...


{
    "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://:30080/emdx/api/alerts...

安全的远程云端 API 访问

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

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

本部分将介绍客户端获取安全 token 的机制,并使用这些 token 通过云生成 HTTP,然后转发到相应的设备。

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

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

通过物联网云调用设备 API 的工作流

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

使用 Amazon Cognito 进行身份验证

使用网络控制台登录 URI 登录页面,然后通过 Amazon Cognito 进行身份验证。验证成功后,Amazon Cognito 会返回一个唯一的授权代码。使用授权代码向 Amazon Cognito 提出申请,以签发一个有时限的 ID token。调用物联网云安全 API 时出示此 ID token。

图五.png
图 5. 使用 IDP 进行授权的调用流

生成 JWT token 并调用设备 API

如要访问物联网设备 API,首先要向物联网云安全系统申请授权 token。申请有效后,物联网云安全会发出一个短暂签名的授权 JWT token。然后使用该 token 通过物联网云传输调用设备 API,物联网云传输网会验证该 token 并将请求转发给设备。

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

图六.png

图 6. 通过物联网云授权用户的调用流

总结

使用 NVIDIA Metropolis API 和微服务,在边缘构建功能强大且面向市场的视觉 AI 应用。API 以标准化、安全、分布式的方式执行各种 NVIDIA Metropolis 微服务功能。该版本中包含的参考移动应用展示了一个成熟的终端用户应用,该应用使用这些 API 构建而成,具有对用户友好的界面,可捕捉配置、视频流、分析、警报、云集成和设备声明。该应用包含源代码,并在该版本文档的移动应用部分提供各种模块的详细使用说明。

下载适用于 Jetson 的 NVIDIA Metropolis 微服务:

https://developer.nvidia.com/...

请报名参加我们的两场在线研讨会:

使用适用于 Jetson 的 Metropolis API 和微服务加速边缘 AI 开发

https://info.nvidia.com/metro...

如何使用适用于 Jetson 的 Metropolis 微服务进行构建

https://info.nvidia.com/build...

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息