はじめに
前回は CenterSnap のデモを動かしました。
今回からは物体の三次元姿勢推定 CenterSnap について説明していきます。
Gen6D は ViT のような画像全体の認識でしたが、CenterSnap は、インスタンスセグメンテーションのように判別することができます。
まずは、三次元データを用意していきます。
前提条件
前提条件は以下の通りです。
- 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 を使用して、仮想シーンを作成していきます。
コメント