多攝像頭應(yīng)用越來(lái)越流行;它們對(duì)于實(shí)現(xiàn)自主機(jī)器人、智能視頻分析( IVA )和 AR / VR 應(yīng)用至關(guān)重要。無(wú)論具體的用例如何,都必須始終執(zhí)行一些常見(jiàn)任務(wù):
俘虜
預(yù)處理
編碼
陳列
在許多情況下,您還希望在攝像頭流上部署 DNN ,并在檢測(cè)上運(yùn)行自定義邏輯。圖 1 顯示了應(yīng)用程序的一般流程。
圖 1 本項(xiàng)目實(shí)施的管道流程
在本文中,我將展示如何在 NVIDIA Jetson 平臺(tái)上高效地實(shí)現(xiàn)這些常見(jiàn)任務(wù)。具體來(lái)說(shuō),我介紹了 jetmulticam ,一個(gè)易于使用的 Python 軟件包,用于創(chuàng)建多攝像頭管道。我在一個(gè)帶有環(huán)繞攝像頭系統(tǒng)的機(jī)器人上演示了一個(gè)特定的用例。
多攝像頭硬件
選擇相機(jī)時(shí)要考慮的參數(shù)有很多:分辨率、幀速率、光學(xué)、全局/滾動(dòng)快門(mén)、界面、像素大小等。
在這個(gè)特定的多攝像頭設(shè)置中,可以使用以下硬件:
NVIDIA Jetson Xavier NX 單元
Leopard Imaging 提供的支持 GMSL2 的 carrier board
Leopard Imaging 的 3 × IMX185 GMSL2 cameras
IMX185 攝像頭的視野約為 90 °。如圖 2 所示,以 270 °的總視場(chǎng)相互垂直安裝。
圖 2 安裝攝像頭是為了最大限度地提高水平視野
攝像頭使用 GMSL 接口,該接口在距離 Jetson 模塊幾米遠(yuǎn)的位置提供了很大的靈活性。在這種情況下,可以將攝像頭升高約 0.5 米,以獲得更大的垂直視野。
圖 3 GMSL 接口可以靈活地將攝像頭定位在遠(yuǎn)離 Jetson 模塊的位置
開(kāi)始使用 Jetmulticam
首先,在 Jetson 板上下載并安裝 NVIDIA Jetpack SDK 。然后,安裝jetmulticam軟件包:
$ git clone https://github.com/NVIDIA-AI-IOT/jetson-multicamera-pipelines.git $ cd jetson-multicamera-pipelines $ bash scripts/install_dependencies.sh $ pip3 install Cython $ pip3 install .
基本多攝像機(jī)流水線(xiàn)
安裝完成后,可以使用CameraPipeline
類(lèi)創(chuàng)建基本管道。通過(guò) initializer 參數(shù)傳遞要包含在管道中的攝影機(jī)列表。在下面的示例中,元素[0, 1, 2]
對(duì)應(yīng)于設(shè)備節(jié)點(diǎn)/dev/video0
、/dev/video1
和/dev/video2
。
from jetmulticam import CameraPipeline p = CameraPipeline([0, 1, 2])
就這樣,管道已經(jīng)初始化并啟動(dòng)?,F(xiàn)在,您可以從管道中的每個(gè)攝像頭讀取圖像,并以numpy
陣列的形式訪(fǎng)問(wèn)它們。
img0 = p.read(0) # img0 is a np.array img1 = p.read(1) img2 = p.read(2)
通常,在一個(gè)循環(huán)中讀取相機(jī)是很方便的,如下面的代碼示例所示。管道從主線(xiàn)程異步運(yùn)行,read
始終獲取最新的緩沖區(qū)。
while True: img0 = p.read(0) print(img0.shape) # >> (1920, 1080, 3) time.sleep(1/10)
更復(fù)雜的人工智能管道
現(xiàn)在,您可以構(gòu)建更復(fù)雜的管道。這一次,使用CameraPipelineDNN
類(lèi)組成更復(fù)雜的管道,以及NGC目錄PeopleNet和DashCamNet中的兩個(gè)預(yù)訓(xùn)練模型。
import time from jetmulticam import CameraPipelineDNN from jetmulticam.models import PeopleNet, DashCamNet if __name__ == "__main__": pipeline = CameraPipelineDNN( cameras=[2, 5, 8], models=[ PeopleNet.DLA1, DashCamNet.DLA0, # PeopleNet.GPU ], save_video=True, save_video_folder="/home/nx/logs/videos", display=True, ) while pipeline.running(): arr = pipeline.images[0] # np.array with shape (1080, 1920, 3) dets = pipeline.detections[0] # Detections from the DNNs time.sleep(1/30)
下面是管道初始化的分解:
- 攝像機(jī)
- 模型
- 硬件加速
- 保存視頻
- 顯示視頻
- 主回路
攝像機(jī)
首先,與前面的示例類(lèi)似,cameras
參數(shù)是傳感器列表。在這種情況下,使用與設(shè)備節(jié)點(diǎn)關(guān)聯(lián)的攝像頭:
-
/dev/video2
-
/dev/video5
-
/dev/video8
cameras=[2, 5, 8]
模型
第二個(gè)參數(shù) models 使您能夠定義要在管道中運(yùn)行的預(yù)訓(xùn)練模型。
models=[ PeopleNet.DLA1, DashCamNet.DLA0, # PeopleNet.GPU ],
在這里,您將從NGC部署兩個(gè)經(jīng)過(guò)預(yù)訓(xùn)練的模型:
- PeopleNet:一種能夠識(shí)別人、臉和包的物體檢測(cè)模型。
- DashCamNet:能夠識(shí)別四類(lèi)對(duì)象的模型:汽車(chē)、人、路標(biāo)和自行車(chē)。
有關(guān)更多信息,請(qǐng)參閱 NGC 中的model cards。
硬件加速
模型使用NVIDIA 深度學(xué)習(xí)加速器( DLA )實(shí)時(shí)運(yùn)行。具體來(lái)說(shuō),可以在 DLA0 ( DLA Core 0 )上部署 PeopleNet ,在 DLA1 上部署 DashCamNet 。
在兩個(gè)加速器之間分配模型有助于提高管道的總吞吐量。此外, DLA 甚至比 GPU 更節(jié)能。因此,在最高時(shí)鐘設(shè)置的滿(mǎn)載情況下,系統(tǒng)消耗的電量?jī)H為~ 10W 。最后,在這種配置中, Jetson GPU 仍然可以使用 Jetson NX 上的 384 CUDA 內(nèi)核自由加速更多任務(wù)。
下面的代碼示例顯示了當(dāng)前支持的模型/加速器組合的列表。
pipeline = CameraPipelineDNN( # ... models=[ models.PeopleNet.DLA0, models.PeopleNet.DLA1, models.PeopleNet.GPU, models.DashCamNet.DLA0, models.DashCamNet.DLA1, models.DashCamNet.GPU ] # ... )
保存視頻
接下來(lái)的兩個(gè)參數(shù)指定是否存儲(chǔ)編碼的視頻,并定義用于存儲(chǔ)的文件夾。
save_video=True,
save_video_folder="/home/nx/logs/videos",
顯示視頻
作為最后的初始化步驟,將管道配置為在屏幕上顯示視頻輸出,以便進(jìn)行調(diào)試。
display=True
主回路
最后,定義主循環(huán)。在運(yùn)行期間,圖像在pipeline.images
下可用,檢測(cè)結(jié)果在pipeline.detections
下可用。
while pipeline.running():
arr = pipeline.images[0] # np.array with shape (1080, 1920, 3)
dets = pipeline.detections[0] # Detections from the DNNs
time.sleep(1/30)
下面的代碼示例顯示了結(jié)果檢測(cè)。對(duì)于每次檢測(cè),您都會(huì)得到一個(gè)包含以下內(nèi)容的字典:
- 對(duì)象類(lèi)
- 以像素坐標(biāo)定義為[左、寬、頂、高]的對(duì)象位置
- 檢測(cè)置信度
>>> pipeline.detections[0] [ # ... { "class": "person", "position": [1092.72 93.68 248.01 106.38], # L-W-T-H "confidence": 0.91 }, #... ]
用自定義邏輯擴(kuò)展人工智能管道
作為最后一步,您可以使用 DNN 輸出擴(kuò)展主循環(huán)以構(gòu)建自定義邏輯。具體來(lái)說(shuō),您可以使用攝像頭的檢測(cè)輸出在機(jī)器人中實(shí)現(xiàn)基本的人員跟隨邏輯。源代碼可在 NVIDIA-AI-IOT/jetson-multicamera-pipelines GitHub repo 中找到。
要找到要跟蹤的人,請(qǐng)解析管道。檢測(cè)輸出。此邏輯在 find_closest_human 函數(shù)中實(shí)現(xiàn)。
根據(jù) dets2steer 中邊界框的位置計(jì)算機(jī)器人的轉(zhuǎn)向角。
如果人在左圖中,最大限度地左轉(zhuǎn)。
如果人在正確的形象中,盡量向右轉(zhuǎn)。
如果人在中心圖像中,則按邊界框中心的 X 坐標(biāo)成比例旋轉(zhuǎn)。
生成的視頻將保存到/home/nx/logs/videos,正如您在初始化過(guò)程中定義的那樣。
解決方案概述
下面簡(jiǎn)要介紹一下在下面的示例中配置jetmulticam works. The package dynamically creates and launches a GStreamer pipeline with the number of cameras that your application requires. Figure 4 shows how the underlying GStreamer管道時(shí)的外觀(guān)。如您所見(jiàn),系統(tǒng)中所有關(guān)鍵操作(由綠色方框表示)都受益于硬件加速。
圖 4 系統(tǒng)的內(nèi)部組件 jetmulticam package
首先,使用多個(gè)攝像頭nvarguscamerasrc在視頻圖上捕獲。使用nvvidconv或nvvideoconvert重新縮放每個(gè)緩沖區(qū)并將其轉(zhuǎn)換為 RGBA 格式。接下來(lái),使用服務(wù)器提供的component對(duì)幀進(jìn)行批處理 DeepStream SDK 。默認(rèn)情況下,批次大小等于系統(tǒng)中的攝像頭數(shù)量。
要部署 DNN 模型,請(qǐng)利用 nvinfer 元素。在演示中,我在 Jetson Xavier NX 上提供的兩種不同加速器 DLA core 1 和 DLA core 2 上部署了兩種型號(hào), PeopleNet 和 DashCamNet 。然而,如果需要的話(huà),可以將更多的模型堆疊在彼此之上。
生成的邊界框被nvosd元素覆蓋后,使用nvoverlaysink將其顯示在 HDMI 顯示屏上,并使用硬件加速的 H264 編碼器對(duì)視頻流進(jìn)行編碼。保存到。 mkv 文件。
Python 代碼中可用的圖像(例如pipeline.images[0])通過(guò)回調(diào)函數(shù)或 probe 解析為numpy數(shù)組,并在每個(gè)視頻轉(zhuǎn)換器元素上注冊(cè)。類(lèi)似地,在最后一個(gè)nvinfer元素的 sinkpad 上注冊(cè)了另一個(gè)回調(diào)函數(shù),該元素將元數(shù)據(jù)解析為用戶(hù)友好的檢測(cè)列表。有關(guān)源代碼或單個(gè)組件配置的更多信息,請(qǐng)參閱 create_pipeline 函數(shù)。
結(jié)論
NVIDIA Jetson 平臺(tái)上的硬件加速與 NVIDIA SDKS 結(jié)合,可以實(shí)現(xiàn)卓越的實(shí)時(shí)性能。例如,下面的示例在三個(gè)攝像頭流上實(shí)時(shí)運(yùn)行兩個(gè)對(duì)象檢測(cè)神經(jīng)網(wǎng)絡(luò),同時(shí)保持 CPU 利用率 低于 20% 。
本文展示的Jetmulticam包使您能夠用 Python 構(gòu)建自己的硬件加速管道,并在檢測(cè)之上包含自定義邏輯。
關(guān)于作者
Tomasz Lewicki 是 NVIDIA 的嵌入式工程實(shí)習(xí)生。他擁有圣何塞州立大學(xué)計(jì)算機(jī)工程碩士學(xué)位,華沙工業(yè)大學(xué)華沙工業(yè)大學(xué)機(jī)器人工程學(xué)學(xué)士學(xué)位。他的興趣集中在計(jì)算機(jī)視覺(jué)和機(jī)器人應(yīng)用的深度學(xué)習(xí)上。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5063瀏覽量
103436 -
攝像頭
+關(guān)注
關(guān)注
60文章
4857瀏覽量
96033
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論