運用NVIDIA DeepStream讀取多個影像進行推理

2022-01-17 GPUS開發者

本文作者:洪銘恩

轉載自:makerpro

DeepStream最大優勢是能讓使用者方便處理多個來源,並將處理的結果同步顯示在畫面上,也能將主模型推理後的結果放入一個或多個副模型執行進一步的推理。

在一般使用者執行影像辨識的過程中,往往都是使用OpenCV讀取影像,再經由模型特性轉換適合的格式後,放入已訓練好的模型得到推理結果。以筆者的使用方式為例,若是要針對不同的攝影機畫面進行推理,往往得自行設定不同的輸入源,像是多個視訊串流或是安裝了一個以上的攝影機,以OpenCV讀取不同USB攝影機為例:

cap1 = cv2.VideoCapture(0)

乍看之下好像沒什麼問題,執行邏輯也不會太難,只要將推論過程設定好,輪流迭代各攝影機讀取的影像即可。

實際執行後就如設定的一樣,畢竟執行了兩次推論(處理兩個攝影機的來源),效能就會隨著推論的次數下降,原先處理單個來源的FPS可以來到30左右,隨著增加讀取的攝影機數量,速度就會直接砍半給你看,原先接近實時的效果就變成類似當機的慘狀。

雖說可以輪流跳著推理,而不是每次推理都要將每個攝影機的影像全部用上,來改善這個情況,但問題還是存在呀!只是從降低速度改為有時候辨識到有時候沒有而已。

DeepStream針對多影像輸入這方面的問題進行了改善與加速,本篇文章將著重在如何設定DeepStream讀取多個影像進行推理的部份,也提供在不同來源下如何設定的問題進行說明。

首先要決定好推理用的模型,筆者這邊使用NVIDIA線上課程提到的jetson-inference,來訓練一個Object Detection模型,預訓練模型採用的是SSD-MobileNet,針對手上的幾個物件進行資料搜集並訓練。在DeepStream運行模型時,會轉換成TensorRT的engine檔案進行加速,所以在這邊也將模型轉換為ONNX以便能將模型輸入給TensorRT。

執行平臺採用Jetson Nano 4GB,影像輸入的部份將針對影片、USB Camera與RTSP進行說明。

首先要讓DeepStream能正常讀取ONNX檔案進行推理 :

1. 多USB Camera來源:

將USB Camera接上Jetson Nano後,透過指令查看是否有讀取到裝置,請輸入:

以上圖為例,筆者這邊連接兩支USB Camera,所以能讀取到兩個裝置,編號0為第一支USB Camera,編號1為第二支USB Camera,待會設定DeepStream配置檔案時會需要填入對應的編號,以便連接正確的裝置。

接下來開啟配置檔案設定輸入來源,[source編號]可以讓使用者設定來源數量,首先設定第一個來源[source0],因為使用的是USB Camera所以於來源類型的部份選擇CameraV4L2,接著設定影像大小camera-width=640/camera-height=480。還能設定最大與最小FPS,camera-fps-n是設定最大FPS,camera-fps-d則是設定最小FPS,最後就是USB Camera的編號了,camera-v4l2-dev-node=0表示連接編號0的USB Camera。

方才只是設定第一支USB Camera,因為我們有兩個來源,所以請再新增一個[source1],用來設定第二個來源。設定上與[source0]相同,您可以直接複製[source0]並更改為[source1],主要不同在於camera-v4l2-dev-node=1的部份,設定來源將連接第二支USB Camera。

設定完兩個輸入源後,DeepStream將會依照您的設定,從這兩支USB Camera取得影像並進行推論。接下來是設定顯示畫面的部份,經由設定[tiled-display],能讓兩個推論結果同步顯示在螢幕上,您可以透過參數設定畫面大小與分割樣式。

首先enable=1啟用我們的顯示器,您可透過rows與columns設定畫面輸出欄位數量,筆者希望從兩個USB Camera取得的兩個影像能左右顯示在畫面上,所以設定上rows=1/columns=2,若您想分成上下顯示,則可將參數調整為rows=2/columns=1。width=1280/height=480是設定畫面輸出的大小,請依照自己的需求設定。

完成上述設定後即可儲存並執行,設定無誤的話應該能順利看到畫面,就如配置檔案設定的一樣左右顯示,細節的部份請用滑鼠左鍵點擊想要查看的畫面,畫面將會放大並顯示細節,想退回總顯示畫面的話只要點選滑鼠右鍵即可。

2. 多影片來源

有了設定多個USB Camera的經驗後,設定其他來源就難不倒你了,與設定USB Camera差不多,只要設定相對應的來源即可,請先準備要用來作為輸入源的影片,筆者這邊同樣準備兩個不同的影片,作為模型推論的資料輸入來源。

一樣先來設定[source0],影片輸入的部份選擇類型是URI,使DeepStream經由這個路徑找到我們要進行推論的影片,uri=file://01.mp4的意思是讀取名稱為01的mp4影片檔案,請根據您影片存放的位置填入,num-sources=1則是作為一個來源輸入,若是想將一個影片當作多個來源可參考範例程式,這邊就不贅述了。

接著設定第二個來源[source1],與[source0]一樣,差別在影片路徑而已,同樣請根據您影片存放的位置填入,其餘參數設定一樣。

顯示畫面設定的部份,因為與上一個USB Camera一樣是兩個來源,所以筆者對於[tiled-display]的設定保持不變。

完成上述設定後即可儲存並執行,筆者作為輸入源的兩個影片分別是總物件拍攝與單物件逐一拍攝,顯示畫面參考如下。

3. RTSP來源

若您沒有RTSP來源可以測試,筆者這邊提供一個方法讓您取得RTSP來源,那就是使用您的Android手機充當網路攝影機,Google Play上有一些App可以讓您的手機作為RTSP網路攝影機,可以透過RTSP Server關鍵字找到,筆者使用的是下圖所示的App。

只要將Jetson Nano與手機連上同一個網路來源,啟動App後按下執行,就能在畫面上看到連結路徑,如下圖所示:

筆者這邊透過該方式使用兩臺Android手機充當RTSP來源,若您是使用iphone的同學請自行搜尋是否有類似的App。來源[source0]的設定與影片路徑相同,同為URI,路徑填上在App畫面上看到的路徑。請務必確認是否所有裝置都在相同的網路中。

來源[source1]的設定同樣與[source0]相同,路徑填上在另一支手機畫面上看到的路徑,其餘參數設定皆與讀取影片的設定相同。

顯示畫面設定的部份一樣與讀取影片的設定相同,您可參考設定多影片的[tiled-display]設定,完成上述設定後即可儲存並執行,即可從畫面當中查看到兩臺手機傳送過來的影像。 上述示範了三種不同來源經由DeepStream執行模型推論的方法,筆者都只各示範了兩個來源,若是想要增加更多輸入來源只要自行增加[source編號]的部份即可,例如:

當然也可以混用不同的來源,例如[source0]使用USB Camera、[source1]使用影片來源、[source2]採用RTSP…等,記得當來源增加時要調整[tiled-display]。除了能讓使用者更方便執行多輸入源作推理之外,DeepStream還能讓使用者執行不同模型對一個畫面作推論,有興趣的話可以參考官方說明文件。

相關焦點

  • 當ROS2遇到NVIDIA Jetson平臺,這些開原始碼你必須要知道的.
    雖然您可以在準確性和深度學習模型的大小之間進行權衡,但是在大多數機器人應用中,犧牲準確性以滿足實時需求通常會適得其反。 開發者可以利用現有的NVIDIA框架進行深度學習模型部署,例如TensorRT,以提高模型推理性能。NVIDIA還將 DeepStream SDK與ROS 2集成在一起,因此開發者可以執行流聚合和批處理,並使用各種AI模型進行分類和對象檢測,包括ResNet18,MobileNetV1 / V2,SSD,YOLO和FasterRCNN。
  • 在NVIDIA Drive PX上利用TensorRT 3 進行快速INT8推理
    TensorRT優化訓練過的神經網絡模型,以生成可部署的運行時推理引擎。TensorRT是一種高性能的深度學習推理優化器和用於深度學習應用程式生產部署的運行時引擎。開發人員可以優化TensorFlow或Caffe培訓過的模型,以生成內存效率高的運行時引擎,從而最大限度地提高推理吞吐量,從而使深度學習對於像自動駕駛這樣的延遲關鍵產品和服務變得切實可行。
  • 如何在NVIDIA GPU上進行混合精度訓練(中文字幕)
    DNNs的混合精度訓練實現了兩個主要目標:-減少所需的內存量,使訓練更大的型號或更大的小批量-通過低精度算法降低所需資源,縮短訓練/推理時間。本視頻演示了如何在TensorFlow中以混合精度訓練ResNet-50。 這段視頻的五個關鍵點:1.
  • 如何使用TensorRT對訓練好的PyTorch模型進行加速?
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • 字節跳動開源序列推理引擎LightSeq
    筆者分析發現,核心技術包括這幾項:融合了多個運算操作來減少 IO 開銷、復用顯存來避免動態申請、解碼算法進行層級式改寫來提升推理速度。下面詳細介紹下各部分的優化挑戰和 LightSeq 的解決方法。近年來,由於其高效的特徵提取能力,Transformer encoder/decoder 結構被廣泛應用於各種 NLP 任務中,例如海量無標註文本的預訓練。
  • 嵌入式視覺需求增長 影像傳感器設計考慮更複雜
    每個像素儲存由光子產生的電荷,且多數的應用是由2D數組排列成行,每行由多個像素組成。讀取CCD時,需透過行與行之間的傳輸,將每行平行傳遞到讀取緩存器, 再透過讀取緩存器將每行串行讀取。這個緩存器的讀取過程中,會將電荷轉換為電壓。CMOS影像傳感器能讓ADC、偏壓和驅動電路在同一個晶片上做更緊密的整合,可大幅降低系統對整合的需求,並同時提高CIS設計的複雜度。
  • 嵌入式視覺需求增 影像傳感器設計考慮更複雜
    每個像素儲存由光子產生的電荷,且多數的應用是由2D數組排列成行,每行由多個像素組成。讀取CCD時,需透過行與行之間的傳輸,將每行平行傳遞到讀取緩存器, 再透過讀取緩存器將每行串行讀取。這個緩存器的讀取過程中,會將電荷轉換為電壓。.CMOS影像傳感器能讓ADC、偏壓和驅動電路在同一個晶片上做更緊密的整合,可大幅降低系統對整合的需求,並同時提高CIS設計的複雜度。
  • GTC 2020 | NVIDIA提供全球最先進AI系統NVIDIA DGX A100幫助對抗COVID-19
    該實驗室將運用該集群的AI和計算力來更好地研究和應對COVID-19。NVIDIA創始人兼執行長黃仁勳表示:「NVIDIA DGX A100是專為先進AI打造的高性能系統。NVIDIA DGX是首個為端到端機器學習工作流——從數據分析到訓練再到推理構建的AI系統。藉助於全新DGX的巨大性能飛躍,面對呈指數級速度增長的AI模型和數據,機器學習工程師們能夠保持領先。」
  • 為什麼說AI推理晶片大有可為
    人工智慧的運用分成兩個階段,一是學習訓練階段,二是推理階段,此與應用程式相類似,程序開發階段即為學習訓練階段,程序正式上線執行運作則為推理階段。開發即是船艦在船塢內打造或維修,執行則為船艦出海航行作業執勤(圖2)。
  • 為什麼有些模型FLOPs很低,推理速度卻很慢?
    不難看出,其實這個輸出的tensor大小,就可以看作模型進行推理時,需要從顯存中讀取的feature blob的大小,近似可以認為是訪存數據量的大小。那麼我們不妨從activation這個角度看看EfficientNet,看看depthwise卷積與普通卷積的區別。二者在同等FLOPs下,activation有什麼不同?這種不同為什麼又會導致推理速度的不同?
  • 我為什麼說AI推理晶片大有可為
    人工智慧的運用分成兩個階段,一是學習訓練階段,二是推理階段,此與應用程式相類似,程序開發階段即為學習訓練階段,程序正式上線執行運作則為推理階段。開發即是船艦在船塢內打造或維修,執行則為船艦出海航行作業執勤(圖2)。
  • SpringCloud Stream實戰快速入門(一)
    在一個接口中可以同時定義多個Binding,只需要定義多個@Input或@Output標註的方法。可以通過spring.cloud.stream.bindings..的形式定義Binding的一些屬性。具體有什麼屬性可查看org.springframework.cloud.stream.config.BindingProperties這裡我們通過其destination屬性指定該Binding對應的實際的目的地,對應於RocketMQ就是一個Topic。
  • SpringCloud Stream實戰快速入門(二)
    spring.cloud.stream.bindings.output.content-type=application/json當發送和接收消息時都會被org.springframework.messaging.converter.MessageConverter進行轉換。
  • 《文章推薦系統》系列之基於 Wide&Deep模型的在線排序
    在上篇文章中已經實現了將訓練數據寫入 TFRecord 文件,在這裡可以直接讀取@staticmethoddef read_ctr_records(): dataset = tf.data.TFRecordDataset([".
  • 測評|錄音情報大解放:PS Audio DirectStream DAC
    去年,PS Audio又推出了Perfectwave Directstream DAC(以下簡稱Directstream),無論從型號或外觀上來看,讓人以為是Perfectwave第三代之作。實際上,無論何種訊號格式透過何種端子進入Directstream,這臺DAC皆自動將數字訊號轉成DSD格式再進行數模轉換,與前代機種截然不同!
  • 消息驅動—— Spring Cloud Stream
    想一想,如果以後有多個這樣的服務(需要消費organization數據變更事件),甚至許多類似organization服務和license服務這樣高度耦合在一起的服務群,並且使用同步的「請求-響應」模式,那麼應用內服務的「織網」表演將從此開始。最後你會發現,這個應用的失敗,這張「網」佔了很重的分量。
  • 工程之道 | CPU推理性能提高數十倍,MegEngine計算圖、MatMul優化解析
    在之前我們對天元的極致推理優化進行了綜述《工程之道,MegEngine 推理性能極致優化之綜述篇》。本文則針對天元在推理優化過程中所涉及的計算圖優化與 MatMul 優化進行深度解讀,希望能夠幫助廣大開發者在利用天元 MegEngine「深度學習,簡單開發」的同時,也能夠了解 CPU 優化的相關知識。