Mask3Dをカスタムデータで学習 -s3disデータセット作成1-【Python】

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

はじめに

前回は Mask3D のデモの動かし方について説明しました。

今回は Mask3D をカスタムデータで学習させるための s3dis形式のデータセットの作成方法について説明します。

前提条件

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

  • Windows11
  • Realsense
  • Python3.10
  • CloudCompare

RealSense で点群データを撮影・保存を実行

まずは、必要なライブラリをインストールしていきます。

pip install pyrealsense2 numpy opencv-python open3d

realsense_capture.py

import pyrealsense2 as rs
import numpy as np
import cv2
import open3d as o3d
import datetime

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)
align = rs.align(rs.stream.color)

vis = o3d.pybind.visualization.Visualizer()
vis.create_window('PCD', width=640, height=480)
pointcloud = o3d.pybind.geometry.PointCloud()
geom_added = False
number = 1

while True:
    dt0 = datetime.datetime.now()
    frames = pipeline.wait_for_frames()
    frames = align.process(frames)
    profile = frames.get_profile()
    depth_frame = frames.get_depth_frame()
    color_frame = frames.get_color_frame()
    if not depth_frame or not color_frame:
        continue

    # Convert images to numpy arrays
    depth_image = np.asanyarray(depth_frame.get_data())
    color_image = np.asanyarray(color_frame.get_data())
    o3d_color_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB)

    img_depth = o3d.geometry.Image(depth_image)
    img_color = o3d.geometry.Image(o3d_color_image)
    rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth(img_color, img_depth, convert_rgb_to_intensity=False)

    intrinsics = profile.as_video_stream_profile().get_intrinsics()

    pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(intrinsics.width, intrinsics.height, intrinsics.fx, intrinsics.fy, intrinsics.ppx, intrinsics.ppy)
    pcd = o3d.pybind.geometry.PointCloud.create_from_rgbd_image(rgbd, pinhole_camera_intrinsic)

    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.005)
    alpha = 0.015
    # mesh = o3d.pybind.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(voxel_down_pcd, alpha)
    # mesh.compute_vertex_normals()

    pointcloud.points = pcd.points
    pointcloud.colors = pcd.colors

    if geom_added == False:
        vis.add_geometry(pointcloud)
        geom_added = True
    vis.update_geometry(pointcloud)
    vis.poll_events()
    vis.update_renderer()

    cv2.imshow('bgr', color_image)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
    elif key == ord("c"):
        # o3d.io.write_triangle_mesh("./capture/capture-"+str(number)+".ply", mesh)
        o3d.io.write_point_cloud("./capture/pcd-"+str(number)+".ply", pcd)
        number += 1

    process_time = datetime.datetime.now() - dt0
    print("FPS: " + str(1 / process_time.total_seconds()))

pipeline.stop()
cv2.destroyAllWindows()
vis.destroy_window()
del vis

上記を実行した状態で、cを押すとキャプチャされます。

今回キャプチャした点群を、CloudCompareで確認します。

ここから、検出したい点群を抽出していきます。
今回は

  • リップ
  • キーボード
  • その他

で点群を抽出していきます。

CloudCompareの使い方はこちらの記事で説明しています。

また、切り出した点群に色を付けるのは Edit → Colors → Set Unique で色付けできます。
点群はすべて ASCii 形式で保存してください。

キーボードの点群

リップの点群

その他

おわりに

今回は、点群データのアノテーションまでについて説明しました。

点群データのアノテーションは三次元的に切り出しを実行する必要があるので、かなり時間がかかりますね。

次回は、作成したアノテーションデータから、s3disデータセット形式へ変換する方法について説明します。

コメント

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