• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    增強現實/虛擬現實

    使用 NVIDIA Jetson 實現實時多攝像頭管道

    多攝像頭應用越來越流行;它們對于實現自主機器人、智能視頻分析( IVA )和 AR / VR 應用至關重要。無論具體的用例如何,都必須始終執行一些常見任務:

    • 俘虜
    • 預處理
    • 編碼
    • 陳列

    在許多情況下,您還希望在攝像頭流上部署 DNN ,并在檢測上運行自定義邏輯。圖 1 顯示了應用程序的一般流程。

    Flowchart showing the data flow in the application. From left to right it contains the following stages: MIPI-CSI cameras, image capture , preprocessing , image batching, custom application logic, and H.264 encoding stage. The pipeline ends in "save to filesystem" stage.
    圖 1 。本項目實施的管道流程

    在本文中,我將展示如何在 NVIDIA Jetson 平臺上高效地實現這些常見任務。具體來說,我介紹了 jetmulticam ,一個易于使用的 Python 軟件包,用于創建多攝像頭管道。我在一個帶有環繞攝像頭系統的機器人上演示了一個特定的用例。最后,我添加了基于 DNN 對象檢測的自定義邏輯(人員跟蹤),以獲得以下視頻中顯示的結果:

    ?
    視頻 1 。 演示顯示了 3 個獨立攝像頭,視野約為 270 °。紅色框對應 DashCamNet 檢測,綠色框對應 PeopleNet 。 PeopleNet 檢測用于執行人員跟蹤邏輯

    多攝像頭硬件

    選擇相機時要考慮的參數有很多:分辨率、幀速率、光學、全局/滾動快門、界面、像素大小等。有關 NVIDIA 合作伙伴提供的兼容攝像頭的更多信息,請參閱 comprehensive list

    在這個特定的多攝像頭設置中,可以使用以下硬件:

    IMX185 攝像頭的視野約為 90 °。如圖 2 所示,以 270 °的總視場相互垂直安裝。

    Diagram of three cameras, each with approximately 90 deg field-of-view. The cameras are mounted such that the total FOV is around 270 degrees.
    圖 2 。安裝攝像頭是為了最大限度地提高水平視野

    攝像頭使用 GMSL 接口,該接口在距離 Jetson 模塊幾米遠的位置提供了很大的靈活性。在這種情況下,可以將攝像頭升高約 0.5 米,以獲得更大的垂直視野。

    Diagram containing a camera and Jetson Xavier NX module connected with a coaxial cable spanning up to 15m.
    圖 3 。 GMSL 接口可以靈活地將攝像頭定位在遠離 Jetson 模塊的位置

    開始使用 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 .

    基本多攝像機流水線

    安裝完成后,可以使用CameraPipeline類創建基本管道。通過 initializer 參數傳遞要包含在管道中的攝影機列表。在下面的示例中,元素[0, 1, 2]對應于設備節點/dev/video0/dev/video1/dev/video2

    from jetmulticam import CameraPipeline
    p = CameraPipeline([0, 1, 2])

    就這樣,管道已經初始化并啟動。現在,您可以從管道中的每個攝像頭讀取圖像,并以numpy陣列的形式訪問它們。

    img0 = p.read(0) # img0 is a np.array
    img1 = p.read(1)
    img2 = p.read(2)

    通常,在一個循環中讀取相機是很方便的,如下面的代碼示例所示。管道從主線程異步運行,read始終獲取最新的緩沖區。

    while True:
    img0 = p.read(0)
    print(img0.shape) # >> (1920, 1080, 3)
    time.sleep(1/10)

    更復雜的人工智能管道

    現在,您可以構建更復雜的管道。這一次,使用CameraPipelineDNN類組成更復雜的管道,以及 NGC 目錄 PeopleNetDashCamNet 中的兩個預訓練模型。

    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)

    下面是管道初始化的分解:

    • 攝像機
    • 模型
    • 硬件加速
    • 保存視頻
    • 顯示視頻
    • 主回路

    攝像機

    首先,與前面的示例類似,cameras參數是傳感器列表。在這種情況下,使用與設備節點關聯的攝像頭:

    • /dev/video2
    • /dev/video5
    • /dev/video8
    cameras=[2, 5, 8]

    模型

    第二個參數 models 使您能夠定義要在管道中運行的預訓練模型。

     models=[
    PeopleNet.DLA1,
    DashCamNet.DLA0,
    # PeopleNet.GPU
    ],

    在這里,您將從 NGC 部署兩個經過預訓練的模型:

    • PeopleNet :一種能夠識別人、臉和包的物體檢測模型。
    • DashCamNet :能夠識別四類對象的模型:汽車、人、路標和自行車。

    有關更多信息,請參閱 NGC 中的 model cards

    硬件加速

    模型使用 NVIDIA 深度學習加速器 ( DLA )實時運行。具體來說,可以在 DLA0 ( DLA Core 0 )上部署 PeopleNet ,在 DLA1 上部署 DashCamNet 。

    在兩個加速器之間分配模型有助于提高管道的總吞吐量。此外, DLA 甚至比 GPU 更節能。因此,在最高時鐘設置的滿載情況下,系統消耗的電量僅為~ 10W 。最后,在這種配置中, Jetson GPU 仍然可以使用 Jetson NX 上的 384 CUDA 內核自由加速更多任務。

    下面的代碼示例顯示了當前支持的模型/加速器組合的列表。

    pipeline = CameraPipelineDNN(
    # ...
    models=[
    models.PeopleNet.DLA0,
    models.PeopleNet.DLA1,
    models.PeopleNet.GPU,
    models.DashCamNet.DLA0,
    models.DashCamNet.DLA1,
    models.DashCamNet.GPU
    ]
    # ...
    )

    保存視頻

    接下來的兩個參數指定是否存儲編碼的視頻,并定義用于存儲的文件夾。

    save_video=True,
    save_video_folder="/home/nx/logs/videos",

    顯示視頻

    作為最后的初始化步驟,將管道配置為在屏幕上顯示視頻輸出,以便進行調試。

    display=True

    主回路

    最后,定義主循環。在運行期間,圖像在pipeline.images下可用,檢測結果在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)

    下面的代碼示例顯示了結果檢測。對于每次檢測,您都會得到一個包含以下內容的字典:

    • 對象類
    • 以像素坐標定義為[左、寬、頂、高]的對象位置
    • 檢測置信度
    >>> pipeline.detections[0]
    [
    # ...
    {
    "class": "person",
    "position": [1092.72 93.68 248.01 106.38], # L-W-T-H
    "confidence": 0.91
    },
    #...
    ]

    用自定義邏輯擴展人工智能管道

    作為最后一步,您可以使用 DNN 輸出擴展主循環以構建自定義邏輯。具體來說,您可以使用攝像頭的檢測輸出在機器人中實現基本的人員跟隨邏輯。源代碼可在 NVIDIA-AI-IOT/jetson-multicamera-pipelines GitHub repo 中找到。

    1. 要找到要跟蹤的人,請解析管道。檢測輸出。此邏輯在 find_closest_human 函數中實現。
    2. 根據 dets2steer 中邊界框的位置計算機器人的轉向角。
      • 如果人在左圖中,最大限度地左轉。
      • 如果人在正確的形象中,盡量向右轉。
      • 如果人在中心圖像中,則按邊界框中心的 X 坐標成比例旋轉。

    生成的視頻將保存到/home/nx/logs/videos,正如您在初始化過程中定義的那樣。

    解決方案概述

    下面簡要介紹一下在下面的示例中配置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管道時的外觀。如您所見,系統中所有關鍵操作(由綠色方框表示)都受益于硬件加速。

    Block diagram contains color-coded elements of the computer vision pipeline. Most elements are green, representing the pipeline elements that are NVIDIA hardware-accelerated.
    圖 4 。系統的內部組件 jetmulticam package

    首先,使用多個攝像頭nvarguscamerasrc在視頻圖上捕獲。使用nvvidconvnvvideoconvert重新縮放每個緩沖區并將其轉換為 RGBA 格式。接下來,使用服務器提供的component對幀進行批處理 DeepStream SDK .默認情況下,批次大小等于系統中的攝像頭數量。

    要部署 DNN 模型,請利用 nvinfer 元素。在演示中,我在 Jetson Xavier NX 上提供的兩種不同加速器 DLA core 1 和 DLA core 2 上部署了兩種型號, PeopleNet 和 DashCamNet 。然而,如果需要的話,可以將更多的模型堆疊在彼此之上。

    生成的邊界框被nvosd元素覆蓋后,使用nvoverlaysink將其顯示在 HDMI 顯示屏上,并使用硬件加速的 H264 編碼器對視頻流進行編碼。保存到。 mkv 文件。

    Python 代碼中可用的圖像(例如pipeline.images[0])通過回調函數或 probe 解析為numpy數組,并在每個視頻轉換器元素上注冊。類似地,在最后一個nvinfer元素的 sinkpad 上注冊了另一個回調函數,該元素將元數據解析為用戶友好的檢測列表。有關源代碼或單個組件配置的更多信息,請參閱 create_pipeline 函數。

    結論

    NVIDIA Jetson 平臺上的硬件加速與 NVIDIA SDKS 結合,可以實現卓越的實時性能。例如,下面的示例在三個攝像頭流上實時運行兩個對象檢測神經網絡,同時保持 CPU 利用率 低于 20%

    本文展示的Jetmulticam包使您能夠用 Python 構建自己的硬件加速管道,并在檢測之上包含自定義邏輯。

    ?

    +2

    標簽

    人人超碰97caoporen国产