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 時能夠進行身份驗證和授權。
圖 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 等第三方服務提供支援。
圖 2. 用于 WebRTC 流式傳輸的實體
WebRTC 會話階段
WebRTC 會話使用控制路徑和資料路徑來建立會話和進行流式傳輸。
控制路徑可在對等裝置之間建立和管理會話,其階段包括初始化、信令、ICE 候選交換以及連接配接建立。VST 可讓使用者代理通過其 API 遠端執行這些操作。
資料路徑支援實時媒體資料傳輸以及自适應和品質控制,并最終關閉連接配接。
通過 VST API 實作 WebRTC 流式傳輸
圖 3 顯示了用戶端與 VST 之間的調用流,捕捉了實作 WebRTC 會話的控制和資料路徑。
圖 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 顯示了通過移動應用建立和渲染絆線的示例。使用者使用應用中的觸摸界面選擇絆線錨點,繪制絆線(綠色線條)和方向(紅色箭頭)。
圖 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。
圖 5. 使用 IDP 進行授權的調用流
生成 JWT token 并調用裝置 API
如要通路物聯網裝置 API,首先要向物聯網雲安全系統申請授權 token。申請有效後,物聯網雲安全會發出一個短暫簽名的授權 JWT token。然後使用該 token 通過物聯網雲傳輸調用裝置 API,物聯網雲傳輸網會驗證該 token 并将請求轉發給裝置。
請注意,如果使用者無權根據裝置聲明執行操作,則會傳回未經授權的 HTTP 錯誤代碼。
圖 6. 通過物聯網雲授權使用者的調用流
總結
使用 NVIDIA Metropolis API 和微服務,在邊緣建構功能強大且面向市場的視覺 AI 應用。API 以标準化、安全、分布式的方式執行各種 NVIDIA Metropolis 微服務功能。該版本中包含的參考移動應用展示了一個成熟的終端使用者應用,該應用使用這些 API 建構而成,具有對使用者友好的界面,可捕捉配置、視訊流、分析、警報、雲內建和裝置聲明。該應用包含源代碼,并在該版本文檔的移動應用部分提供各種子產品的詳細使用說明。
下載下傳适用于 Jetson 的 NVIDIA Metropolis 微服務:
請報名參加我們的兩場線上研讨會:
使用适用于 Jetson 的 Metropolis API 和微服務加速邊緣 AI 開發
如何使用适用于 Jetson 的 Metropolis 微服務進行建構