DeepStream
NVIDIA 的 DeepStream SDK 提供了一套完整的流分析工具包,用于基于 AI 的多傳感器處理、視頻和圖像理解。Deepstream SDK 大量使用開源多媒體處理庫 Gstreamer。DeepStream SDK 可用于構(gòu)建端到端 AI 驅(qū)動的應(yīng)用程序來分析視頻和傳感器數(shù)據(jù)。
它可將來自 USB/CSI 攝像頭的媒體流數(shù)據(jù)、來自文件的視頻或通過網(wǎng)絡(luò)傳輸?shù)拿襟w流作為輸入,并使用人工智能和計算機視覺從中進行分析和推理,以便更好地了解視頻中的內(nèi)容。

DeepStream SDK 可以成為許多視頻分析解決方案的基礎(chǔ)框架,例如了解智慧城市中的交通和行人、醫(yī)院中的健康和安全監(jiān)控、醫(yī)學(xué)影像分析, 零售業(yè)中的自助結(jié)賬和分析、檢測制造工廠中的組件缺陷等.

DeepStream是NVIDIA基于GStreamer的插件系統(tǒng)開發(fā)的, 繼承了GStreamer的特性。DeepSream提供超過15種以上的GStreamer插件模塊, 以此建造一個高效的視頻分析管道(Pipeline)。
NVIDIA將 TensorRT, cuDNN, CUDA, Video SDK 等以插件的形式集成進 GStreamer 當(dāng)中, 以管道的形式進行智能視頻分析應(yīng)用的開發(fā), 將各個功能封裝成組件, 通過將對應(yīng)功能的組件插入管道中, 啟動管道使數(shù)據(jù)按照要求在管道內(nèi)流動, 數(shù)據(jù)經(jīng)過解析、編解碼、預(yù)處理、算法處理后進行圖像渲染或者發(fā)送到云端。
例如
- nvv4l2decoder 用于調(diào)用 GPU 硬件加速解碼 h264 文件 (解碼幀的格式是 NV12(YUV420))
- nvstreammux 用于把輸入按照參數(shù)處理成一系列的視頻幀
- nvinfer 通過推理的配置文件對輸入圖像進行推理
- nvvideoconvert 視頻顏色格式轉(zhuǎn)換
- nvdsosd 處理 RGBA buffer 繪制 ROI 等 識別對象的 Bounding Box, 邊框, 以及識別對象的文字標簽(字體、顏色、標示框)
- nvegltransform 轉(zhuǎn)換成 EGLImage instance 給nveglglessink使用
- nveglglessink 渲染
DeepStream Graph Architecture
DeepStream是使用開源 GStreamer 框架構(gòu)建的優(yōu)化的圖架構(gòu)。 下圖顯示了從輸入視頻到輸出見解的典型視頻分析應(yīng)用程序。 所有單獨的塊都是使用的各種插件。 底部是整個應(yīng)用程序中使用的不同硬件引擎。 插件之間零內(nèi)存復(fù)制的最佳內(nèi)存管理以及各種加速器的使用確保了最高性能。

DeepStream 以 GStreamer 插件的形式提供構(gòu)建塊,可用于構(gòu)建高效的視頻分析管道。 有超過 20 個針對各種任務(wù)進行硬件加速的插件。
視頻流數(shù)據(jù)可以通過網(wǎng)絡(luò)傳輸, 或本地文件系統(tǒng), 或直接從攝像頭捕獲。流使用 CPU 捕獲。一旦幀進入內(nèi)存,它們就會被發(fā)送到 NVDEC 加速器進行解碼。解碼插件稱為“Gst-nvvideo4linux2”。
解碼后,有一個可選的圖像預(yù)處理步驟,其中可以在推理之前對輸入圖像進行預(yù)處理。預(yù)處理可以是圖像去扭曲或顏色空間轉(zhuǎn)換。
Gst-nvdewarper插件可以對魚眼或 360 度相機的圖像進行去扭曲。Gst-nvvideoconvert插件可以對幀執(zhí)行顏色格式轉(zhuǎn)換。這些插件使用 GPU 或 VIC(視覺圖像合成器)。下一步是批量處理幀以獲得最佳推理性能。批處理是使用“Gst-nvstreammux”插件完成的。
一旦幀被批處理,它就會被發(fā)送到下一插件進行推理。可以使用 TensorRT(NVIDIA 的推理加速器運行時)進行推理,也可以使用 Triton 推理服務(wù)器在 TensorFlow 或 PyTorch 等本機框架中完成推理。本機 TensorRT 推理是使用“Gst-nvinfer”插件執(zhí)行的,使用 Triton 的推理是使用“Gst-nvinferserver”插件執(zhí)行的。推理可以使用 Jetson AGX Orin 和 Orin NX 的 GPU 或 DLA(深度學(xué)習(xí)加速器)。
推理之后,下一步可能涉及跟蹤對象。 SDK 中有多個內(nèi)置參考跟蹤器,從高性能到高精度不等。 使用
Gst-nvtracker插件執(zhí)行對象跟蹤。為了創(chuàng)建可視化工件(例如邊界框、分割蒙版、標簽),有一個名為“Gst-nvdsosd”的可視化插件。
最后,為了輸出結(jié)果,DeepStream 提供了各種選項:使用屏幕上的邊界框渲染輸出、將輸出保存到本地磁盤、通過 RTSP 流式傳輸或僅將元數(shù)據(jù)(metadata)發(fā)送到云端。為了將元數(shù)據(jù)發(fā)送到云端,DeepStream 使用“Gst-nvmsgconv”和“Gst-nvmsgbroker”插件。Gst-nvmsgconv 將元數(shù)據(jù)(metadata)轉(zhuǎn)換為模式負載(schema payload),Gst-nvmsgbroker 建立與云端的連接并發(fā)送遙測數(shù)據(jù)。有幾種內(nèi)置代理協(xié)議,例如 Kafka、MQTT、AMQP 和 Azure IoT。可以創(chuàng)建自定義代理適配器。
DeepStream reference app
首先,開發(fā)人員可以使用提供的參考應(yīng)用程序。這些應(yīng)用程序的源代碼也包含在內(nèi)。
端到端應(yīng)用程序稱為 deepstream-app。此應(yīng)用程序完全可配置 - 它允許用戶配置任何類型和數(shù)量的源。
用戶還可以選擇要運行推理的網(wǎng)絡(luò)類型。
它預(yù)裝了一個推理插件,用于進行對象檢測,并通過推理插件進行級聯(lián)以進行圖像分類。有一個選項可以配置跟蹤器。
對于輸出,用戶可以選擇在屏幕上渲染、保存輸出文件或通過 RTSP 流式傳輸視頻。

示例
- dsexample 是一個用 deepstream 寫的插件, 參見 deepstream_custom_plugin,
稍后我們仔細分析下它的代碼細節(jié), 使用它也很簡單, 例如
DISPLAY=:0 gst-launch-1.0 -v filesrc location=talk.mp4 ! qtdemux ! h264parse \
! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 \
! nvvideoconvert ! dsexample full-frame=1 ! nvdsosd ! nv3dsink
DISPLAY=:0 gst-launch-1.0 -v filesrc location=talk.mp4 ! qtdemux ! h264parse \
! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 \
! nvvideoconvert ! dsexample full-frame=1 ! nvdsosd ! autovideosink