天天看點

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

作者:NVIDIA英偉達中國

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 時能夠進行身份驗證和授權。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 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 等第三方服務提供支援。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 2. 用于 WebRTC 流式傳輸的實體

WebRTC 會話階段

WebRTC 會話使用控制路徑和資料路徑來建立會話和進行流式傳輸。

控制路徑可在對等裝置之間建立和管理會話,其階段包括初始化、信令、ICE 候選交換以及連接配接建立。VST 可讓使用者代理通過其 API 遠端執行這些操作。

資料路徑支援實時媒體資料傳輸以及自适應和品質控制,并最終關閉連接配接。

通過 VST API 實作 WebRTC 流式傳輸

圖 3 顯示了用戶端與 VST 之間的調用流,捕捉了實作 WebRTC 會話的控制和資料路徑。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 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/sensor/list

建立一個絆線配置

在此步驟中配置一個絆線,指定要對越線人數進行計數的線。

配置絆線時,請指定以下屬性:

  • 傳感器 ID:待配置絆線的傳感器的辨別。
  • 絆線 ID:絆線的辨別。一個傳感器可能有多個定義,但每個絆線都需要有唯一的辨別符。
  • 導線:組成絆線的線段的點序列。
  • 方向:描述穿越(進入/退出)方向的矢量(兩個點)。

請注意,點的坐标是錄影機坐标(圖像平面)。左上角為(0,0)。

用戶端應用(如 NVIDIA Metropolis 微服務提供的參考移動應用)為點的選擇提供了視覺輔助,無需手動确定 (x, y) 位置。圖 4 顯示了通過移動應用建立和渲染絆線的示例。使用者使用應用中的觸摸界面選擇絆線錨點,繪制絆線(綠色線條)和方向(紅色箭頭)。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 4. NVIDIA Metropolis 微服務提供的參考移動應用中的絆線可視化渲染

要為 Id = Amcrest_3 的傳感器配置 Id = main_door 的絆線,請使用您選擇的程式設計語言調用以下 HTTP API:

http://: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://: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)來查詢計數。您還可以選擇将警報查詢參數設定為 true 來檢索警報和計數:

http://: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://: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 位址,而這些位址可能對外無效。物聯網雲通過提供一種機制,以安全的方式将請求從網絡分離的用戶端轉發到裝置,進而促進産品層面的遠端 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。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 5. 使用 IDP 進行授權的調用流

生成 JWT token 并調用裝置 API

如要通路物聯網裝置 API,首先要向物聯網雲安全系統申請授權 token。申請有效後,物聯網雲安全會發出一個短暫簽名的授權 JWT token。然後使用該 token 通過物聯網雲傳輸調用裝置 API,物聯網雲傳輸網會驗證該 token 并将請求轉發給裝置。

請注意,如果使用者無權根據裝置聲明執行操作,則會傳回未經授權的 HTTP 錯誤代碼。

利用 NVIDIA Metropolis 微服務和 API 在邊緣建構視覺 AI 應用

圖 6. 通過物聯網雲授權使用者的調用流

總結

使用 NVIDIA Metropolis API 和微服務,在邊緣建構功能強大且面向市場的視覺 AI 應用。API 以标準化、安全、分布式的方式執行各種 NVIDIA Metropolis 微服務功能。該版本中包含的參考移動應用展示了一個成熟的終端使用者應用,該應用使用這些 API 建構而成,具有對使用者友好的界面,可捕捉配置、視訊流、分析、警報、雲內建和裝置聲明。該應用包含源代碼,并在該版本文檔的移動應用部分提供各種子產品的詳細使用說明。

下載下傳适用于 Jetson 的 NVIDIA Metropolis 微服務:

請報名參加我們的兩場線上研讨會:

使用适用于 Jetson 的 Metropolis API 和微服務加速邊緣 AI 開發

如何使用适用于 Jetson 的 Metropolis 微服務進行建構

繼續閱讀