想定する読者
stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人
前提
ZED SDK 4.0
Ubuntu 20.04
ZED2i
Python 版のAPI
注意: ZED SDK 4.1 がリリースされています。
このドキュメントはまだZED SDK 4.0 でしか検証していません。
既に用意されているcustom detector
- zed sdk 4.0をインストールしてあり、上記のバージョンで
-
git clone git@github.com:stereolabs/zed-sdk.git
してあることを前提とした記述です。 ./object detection/custom detector/python/pytorch_yolov8/
./object detection/custom detector/python/pytorch_yolov5/
- 実行のしかた
$ python3 detectory.py
これで、COCO 80 カテゴリでの物体検出が可能になっています。
それ以外の検出器でのOpenCVの画像形式での物体検出
ZED SDKでは標準の物体検出の他に、yolov5でもyolov8 でもないcustom detector を用いた物体検出が可能です。(yolox を使いたい人もいるでしょう。)
OpenCVと同じデータ形式で画像が扱えるのですから、
GPUの使えるライブラリで物体検出ができるのは当然なことです。
TensorRTが使えるのですから、TensorRT化した重みファイルを使って推論を行うと、
変換前の重みファイルを使って推論する場合よりは高速化できます。
cvimg = image_left.get_data()
のようにして取得した画像cvimgは、opencvの画像なので、channel数を3にしてRGBもしくはBGRのその検出器が必要とするデータ形式にしたうえで、推論を実行させます。
その結果を以下に述べるようにZED SDK に渡してやることができます。
ZED SDKだからこそできること
空間としての解釈・点群との連動・世界座標系との関係
- ステレオカメラであるZED2i を使っているのだから、検出結果を空間として理解したいよね。
- 標準の検出器で結果を3Dとして解釈しているのだから、カスタムの検出器でもできることを期待します。
- そう、カスタムの検出器でもできるんです。
カスタムモデルの検出器を用いた場合の例題
# 2Dでの検出情報を、ZED SDKでのデータ形式の変換する。
# - 次の関数は、使用している検出器の戻り値によって異なります。
# -関数の戻り値はsl.CustomBoxObjectData型のリストになります。
detections = detections_to_custom_box(det, image_net)
# 変換した結果をZED SDKに渡す。
zed.ingest_custom_box_objects(detections)
# zed.retrieve_objects()の実行
zed.retrieve_objects(objects, obj_runtime_param)
# このようにすると,objectsの中に対応するデータが得られます。
sl.CustomBoxObjectData型
このデータ構造は、2Dの検出器での検出結果をZED SDK に渡すときに用いるデータ形式です。
class CustomBoxObjectData(builtins.object)
(中略)
| bounding_box_2d
| CustomBoxObjectData.bounding_box_2d: np.array[int][int]
|
| is_grounded
| CustomBoxObjectData.is_grounded: bool
|
| label
| CustomBoxObjectData.label: int
|
| probability
| CustomBoxObjectData.probability: float
|
| unique_object_id
| CustomBoxObjectData.unique_object_id: str
3Dとして解釈し直したあとのデータ型
sl.ObjectData 型
bounding_box # 直方体としてのbounding boxです。8点の空間座標があります。
dimensions # その座標系と単位での物体のbounding boxの大きさになります。
viewerの適切な設定をすれば、top_view での物体の配置を可視化することができます。