ZED 景深攝影機範例#6/8 – Object detection

本文為 ZED 景深攝影機原廠範例,共有八個範例,請根據 ZED 的範例程式頁面,取得 C++ / Python / C# 等範例原始碼。說明如下:

  1. Hello ZED: 入門範例,說明如何連接 ZED 攝影機,並於終端機中顯示裝置序列編號。
  2. Image Capture: 開啟 ZED 攝影機,取得影像,並於終端機中顯示時間戳記、影像尺寸。
  3. Depth Perception: 取得畫面的深度資料與點雲,並於終端機中顯示指定點的距離。
  4. Camera Tracking: 啟用位置追蹤,可即時更新攝影機的位置與指向。
  5. Spatial Mapping: 啟用地圖繪製,可擷取環境的網格或融合點雲。
  6. 3D Object Detection: 偵測畫面中的物體,並進行 3D 定位 (只適用於 ZED 2 機型)。
  7. Using Sensors: 取得攝影機的 IMU、氣壓計與磁力感測器資料。
  8. Body Tracking: 追蹤人體骨架

範例06 – 3D 物件偵測

本範例將說明如何操作 ZED 3D 攝影機對空間(僅適用 ZED2 / ZED2i) 中的人體進行偵測、分類與定位。偵測與定位可於靜止或移動的攝影機狀態下進行。

註:原廠頁面每段都提供了 C++ / Python / C# 的範例程式,在此只列出 Python 範例。

以下執行畫面來自 ZED 原廠文件,除了可看到正確框住人體之外,也有標示不同ID與移動軌跡線(下右圖):

前置作業

  • 下載最新版的 ZED SDK (請點我)
  • 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
  • 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)

程式總覽

開啟攝影機

本範例將使用 ZED SDK 中的 Object Detection AI 模組。如先前範例,首先要建立、設定並開啟攝影機。

# Create ZED objects
zed = sl.Camera()
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD720
init_params.depth_mode = sl.DEPTH_MODE.ULTRA
init_params.sdk_verbose = True

# Open the camera
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
    # Quit if an error occurred
    exit()
open the camera

啟用 3D 物件偵測

在啟用物件偵測之前要先指定 AI 模組的 ObjectDetectionParameters。本範例使用設定如下:

# Define the Object Detection module parameters
detection_parameters = sl.ObjectDetectionParameters()
detection_parameters.image_sync = True
detection_parameters.enable_tracking = True
detection_parameters.enable_mask_output = True

# Object tracking requires camera tracking to be enabled
if detection_parameters.enable_tracking:
    zed.enable_positional_tracking()
enable 3D object detection
  • image_sync:決定要在每一張畫面中都偵測物件,或在獨立執行緒中以非同步方式執行。
  • enable_tracking:決定是否要在不同畫面中追蹤物件,並盡可能保留相同的 ID。一定要先啟用 positional tracking 才能從不同的攝影機動態中獨立偵測物件的動作。
  • enable_mask_output:對已偵測到的物件輸出 2D 遮罩。由於這需要額外的運算,如果不會用到的話請將其停用。

啟用物件偵測時會一併載入 AI 模型,這項操作需要幾秒鐘。首次使用 AI 模型時,模型會根據您的硬體進行大約數分鐘的最佳化作業,不過別擔心,這個神經網路模型最佳化作業只要執行一次就好。

print("Object Detection: Loading Module...")
err = zed.enable_object_detection(detection_parameters)
if err != sl.ERROR_CODE.SUCCESS:
    print("Error {}, exit program".format(err))
    zed.close()
    exit()
load module and check errors

取得物件資料

使用 retrieveObjects() 函式搭配用於儲存物件資料的 Objects 參數,即可取得影像中已偵測到的物件相關資料。

由於已啟用 image_sync,因此對於每個 grab 呼叫而言,影像都會被送入 AI 模組中並輸出各 frame 中已偵測到的物件。另外也把信心閾值設為 40,來保留一定信心程度以上的偵測結果。

# Set runtime parameter confidence to 40
detection_parameters_runtime = sl.ObjectDetectionRuntimeParameters()
detection_parameters_runtime.detection_confidence_threshold = 40

objects = sl.Objects()

# Grab new frames and detect objects
while zed.grab() == sl.ERROR_CODE.SUCCESS:
    err = zed.retrieve_objects(objects, detection_parameters_runtime)

    if objects.is_new:
        # Count the number of objects detected
        print("{} Object(s) detected".format(len(objects.object_list)))

        if len(objects.object_list):
            # Display the 3D location of an object
            first_object = objects.object_list[0]
            position = first_object.position
            print(" 3D position : [{0},{1},{2}]".format(position[0],position[1],position[2]))

            # Display its 3D bounding box coordinates
            bounding_box = first_object.bounding_box
            print(" Bounding box 3D :")
            for it in bounding_box:            
                print(" " + str(it),end='')
detect objects with AI module

停用模組並離開程式

退出程式之前需要先停用各模組並關閉攝影機。請注意也可透過 zed.close() 語法來正確停用所有啟用中的模組。有必要的話,也可透過 destructor 自動呼叫close() 函式。

# Disable object detection and close the camera
zed.disable_object_detection()
zed.close()
disable modules and exit

這樣就完成啦!

下一步

您現在已經知道如何取得來自 ZED 立體攝影機的影像、深度與 3D 物件資料。如果想要偵測場景中的不同物體,並在即時點雲中顯示該物體的 3D 邊界框的話,請參考 3D Object Detection 範例。

註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/3d-object-detection/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。