物体の三次元姿勢推定 CenterSnap -準備編- 【Python】

AI
スポンサーリンク
スポンサーリンク

はじめに

前回は CenterSnap のデモを動かしました。

今回からは物体の三次元姿勢推定 CenterSnap について説明していきます。
Gen6D は ViT のような画像全体の認識でしたが、CenterSnap は、インスタンスセグメンテーションのように判別することができます。
まずは、三次元データを用意していきます。

CenterSnap の github はこちらです。

前提条件

前提条件は以下の通りです。

  • Windows11 (三次元モデルの準備にのみ使用)
  • Ubuntu22 (モデル準備以降に使用)
  • Python3.10.x
  • CloudCompare
  • open3d == 0.16.0
  • こちらの記事を参考に 三次元モデルを作成していること

三次元モデルの確認

COLMAP で作成した三次元モデルを確認していきます。

object_point_cloud.ply というファイル名で出力しました。
これを CloudCompare で確認していきます。

なんとなくラズパイと分かるような点群データが作成されています。

三次元モデルの修正

COLMAP で作成された .ply ファイル は、メッシュ情報がありません。

このままでは、Blender や blenderproc では扱えないので、メッシュ情報を付加していきます。

convertPLY2mesh.py

import open3d as o3d

number = 1


#pcd = o3d.cuda.pybind.geometry.PointCloud.create_from_rgbd_image(rgbd, pinhole_camera_intrinsic)

pcd = o3d.io.read_point_cloud("./object_point_cloud.ply")
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.001)
alpha = 0.015
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(voxel_down_pcd, alpha)
mesh.compute_vertex_normals()

o3d.io.write_triangle_mesh("./capture-"+str(number)+".ply", mesh)

alpha = 0.015 ですが、これは要改善です。対象の点群データに合わせて数値を調整する必要があります。

出力は capture-1.ply です。これを CloudCompare で表示していきます。

メッシュが確認できました。(Triangle Mesh の必要があるかも…?)

このまま、法線情報を付加していきます。

メッシュを選択して、上のツールバーから Edit → Normals → Compute → Pre-Triangle で法線ベクトルを計算します。
そのまま、Ctrl + s で点群を保存してください。

Blender のインストールとメッシュデータの表示

続いて、作成されたメッシュを編集するために Blender をインストールしていきます。

Blender のインストーラは、こちらからダウンロードしてください。

インストールが完了したら、Blender を開いて初期状態のキューブを削除してください。

その後、File > Import > Stanford(.ply) で、capture-1.ply を読み込んでください。

以下の画像のように、表示されているはずです。

角度や位置を変更しながら、ラズパイを原点に移動させてください。

また、scale を xyz 全方向に 1000 倍しておいてください。

最終的に、以下のようになります。

ここまできたら、File > Export > Wavefront(.obj) でファイルを出力してください。
ファイル名は capture-1.obj とします。

作業ディレクトリの作成

ここからは、Ubuntu22 で作業を行います。

mkdir makeNOCS
cd makeNOCS
mkdir -p models_obj/lm/models

今作成した models_obj/lm/models に、先ほど作成したcapture-1.ply, capture-1.obj, capture-1.mtl をコピーします。

cd models_obj/lm/models
mv capture-1.ply obj_000001.ply
mv capture-1.mtl obj_000001.mtl
mv capture-1.obj obj_000001.obj
cd ..
touch camera.json

さらに、models/lm に camera.json を作成します。

camera.json

{
  "cx": 325.2611083984375,
  "cy": 242.04899588216654,
  "depth_scale": 1.0,
  "fx": 572.411363389757,
  "fy": 573.5704328585578,
  "height": 480,
  "width": 640
}

これらの数値は、使用するカメラに合わせて変更してください。
一般的なカメラでいいよという方は、上記の数字で問題ありません。

おわりに

今回はここまでとします。

次回は、blenderproc を使用して、仮想シーンを作成していきます。

コメント

タイトルとURLをコピーしました