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

通過 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? 等第三方服務支持此功能。

WebRTC 會議階段
WebRTC 會議使用控制路徑和數據路徑以啟用會話創建和流式傳輸。
控制路徑支持設置和管理同行之間的會話,其階段包括初始化、信號傳遞、ICE 候選交換和建立連接。VST 使用戶代理能夠通過其 API 遠程執行這些操作。
數據路徑支持實時媒體數據傳輸以及適應和質量控制,并最終關閉連接。
通過 VST API 啟用 WebRTC 流式傳輸
圖 3 顯示了客戶端和 VST 之間的調用流程,該流程捕獲了用于啟用 WebRTC 會話的控制和數據路徑。

呼叫流始于客戶端使用api/v1/sensor/list
API.
控制和數據路徑基于以下調用流實施:
- 客戶調用
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 為客戶端創建答案,并將其作為響應返回。
- 客戶使用
GET
和POST
請求api/v1/live/iceCandidate
或api/v1/replay/iceCandidate
與peerid
作為查詢參數。 - 當對等連接完成時,視頻數據開始流動。
在進行串流時,客戶端可以使用以下串流 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 候選項
- 使用
GET
和POST
請求api/v1/live/iceCandidate
API. - 使用以下命令將接收到的候選 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 展示了通過移動應用創建和渲染線的示例。用戶使用應用中的觸摸界面選擇線錨點,以繪制線(綠線)以及方向性(紅色箭頭)。

使用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 令牌。

生成 CWT 令牌并調用設備 API
要訪問物聯網設備 API,請首先向物聯網云安全請求授權令牌。在收到有效請求后,物聯網云安全會發出臨時簽名的授權 CWT 令牌。然后,使用此令牌通過物聯網云傳輸調用設備 API,從而進行驗證并將請求轉發至設備。
請注意,如果用戶無權根據設備聲明執行操作,則會返回未經授權的 HTTP 錯誤代碼。

總結
借助 NVIDIA Metropolis API 和微服務,在邊緣構建功能強大的市場就緒型視覺 AI 應用。API 提供了一種標準化、安全和分布式的方法,用于實現各種 NVIDIA Metropolis 微服務的功能。此版本中包含的參考移動應用展示了一個成熟的最終用戶應用,該應用使用這些 API 構建,具有用戶友好型界面,可捕獲配置、視頻流、分析、警報、云集成和設備聲明。此應用包括源代碼,以及版本文檔移動應用部分中各種模塊的演練。
下載適用于 Jetson 的 NVIDIA Metropolis 微服務,并注冊參加我們的在線研討會,包括兩部分:借助適用于 Jetson 的 Metropolis API 和微服務加速邊緣 AI 開發(第 1 部分)和如何使用適用于 Jetson 的 Metropolis 微服務進行構建(第 2 部分)。
?