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 模組。如先前範例,首先要建立、設定並開啟攝影機。

[pastacode lang=”python” manual=”%23%20Create%20ZED%20objects%0Azed%20%3D%20sl.Camera()%0Ainit_params%20%3D%20sl.InitParameters()%0Ainit_params.camera_resolution%20%3D%20sl.RESOLUTION.HD720%0Ainit_params.depth_mode%20%3D%20sl.DEPTH_MODE.ULTRA%0Ainit_params.sdk_verbose%20%3D%20True%0A%0A%23%20Open%20the%20camera%0Aerr%20%3D%20zed.open(init_params)%0Aif%20err%20!%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20%23%20Quit%20if%20an%20error%20occurred%0A%20%20%20%20exit()” message=”open the camera” highlight=”” provider=”manual”/]

啟用 3D 物件偵測

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

[pastacode lang=”python” manual=”%23%20Define%20the%20Object%20Detection%20module%20parameters%0Adetection_parameters%20%3D%20sl.ObjectDetectionParameters()%0Adetection_parameters.image_sync%20%3D%20True%0Adetection_parameters.enable_tracking%20%3D%20True%0Adetection_parameters.enable_mask_output%20%3D%20True%0A%0A%23%20Object%20tracking%20requires%20camera%20tracking%20to%20be%20enabled%0Aif%20detection_parameters.enable_tracking%3A%0A%20%20%20%20zed.enable_positional_tracking()” message=”enable 3D object detection” highlight=”” provider=”manual”/]
  • image_sync:決定要在每一張畫面中都偵測物件,或在獨立執行緒中以非同步方式執行。
  • enable_tracking:決定是否要在不同畫面中追蹤物件,並盡可能保留相同的 ID。一定要先啟用 positional tracking 才能從不同的攝影機動態中獨立偵測物件的動作。
  • enable_mask_output:對已偵測到的物件輸出 2D 遮罩。由於這需要額外的運算,如果不會用到的話請將其停用。

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

[pastacode lang=”python” manual=”print(%22Object%20Detection%3A%20Loading%20Module…%22)%0Aerr%20%3D%20zed.enable_object_detection(detection_parameters)%0Aif%20err%20!%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20print(%22Error%20%7B%7D%2C%20exit%20program%22.format(err))%0A%20%20%20%20zed.close()%0A%20%20%20%20exit()” message=”load module and check errors” highlight=”” provider=”manual”/]

取得物件資料

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

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

[pastacode lang=”python” manual=”%23%20Set%20runtime%20parameter%20confidence%20to%2040%0Adetection_parameters_runtime%20%3D%20sl.ObjectDetectionRuntimeParameters()%0Adetection_parameters_runtime.detection_confidence_threshold%20%3D%2040%0A%0Aobjects%20%3D%20sl.Objects()%0A%0A%23%20Grab%20new%20frames%20and%20detect%20objects%0Awhile%20zed.grab()%20%3D%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20err%20%3D%20zed.retrieve_objects(objects%2C%20detection_parameters_runtime)%0A%0A%20%20%20%20if%20objects.is_new%3A%0A%20%20%20%20%20%20%20%20%23%20Count%20the%20number%20of%20objects%20detected%0A%20%20%20%20%20%20%20%20print(%22%7B%7D%20Object(s)%20detected%22.format(len(objects.object_list)))%0A%0A%20%20%20%20%20%20%20%20if%20len(objects.object_list)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Display%20the%203D%20location%20of%20an%20object%0A%20%20%20%20%20%20%20%20%20%20%20%20first_object%20%3D%20objects.object_list%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20position%20%3D%20first_object.position%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%203D%20position%20%3A%20%5B%7B0%7D%2C%7B1%7D%2C%7B2%7D%5D%22.format(position%5B0%5D%2Cposition%5B1%5D%2Cposition%5B2%5D))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Display%20its%203D%20bounding%20box%20coordinates%0A%20%20%20%20%20%20%20%20%20%20%20%20bounding_box%20%3D%20first_object.bounding_box%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20Bounding%20box%203D%20%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20it%20in%20bounding_box%3A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%22%20%2B%20str(it)%2Cend%3D”)” message=”detect objects with AI module” highlight=”” provider=”manual”/]

停用模組並離開程式

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

[pastacode lang=”python” manual=”%23%20Disable%20object%20detection%20and%20close%20the%20camera%0Azed.disable_object_detection()%0Azed.close()” message=”disable modules and exit” highlight=”” provider=”manual”/]

這樣就完成啦!

下一步

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

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *