from gradslam.structures.pointclouds import Pointclouds

About_work·2024년 8월 4일
0

global mapper

목록 보기
27/37

Pointclouds 클래스의 역할에 대한 설명

  • Pointclouds 클래스는 3D 포인트 클라우드를 효율적으로 관리하고 조작하기 위한 클래스

1. 포인트 클라우드 데이터의 관리

Pointclouds 클래스는 포인트 클라우드 데이터를 두 가지 형태로 저장할 수 있습니다:

  • 리스트 형태:
    • 각 포인트 클라우드를 (N_b, 3) 형식의 텐서 리스트로 저장
    • 여기서 N_b는 각 배치에서의 포인트 수
  • 패딩된 형태:
    • 모든 포인트를 (B, max(N_b), 3) 형식의 텐서에 저장하고, 필요한 경우 0으로 패딩
    • 여기서 B는 배치 크기입니다.
  • 이 두 가지 저장 형식을 자유롭게 전환할 수 있어, 다양한 연산과 처리를 효율적으로 수행할 수 있음

2. 속성 관리

각 포인트는 다음과 같은 속성을 가질 수 있습니다:

  • points: 3차원 좌표 (X, Y, Z)를 나타냅니다.
  • normals: 포인트의 노말 벡터 (N_x, N_y, N_z)를 나타냅니다.
  • colors: 포인트의 색상 (R, G, B)를 나타냅니다.
  • features: 포인트의 추가적인 특징 벡터 C
  • embeddings: 임베딩 벡터
  • confidences: 신뢰도를 나타냅니다.

각 속성은 리스트 또는 패딩된 텐서 형태로 저장될 수 있습니다.

3. 포인트 클라우드 조작

Pointclouds 클래스는 포인트 클라우드를 다양한 방식으로 조작할 수 있는 메서드를 제공

  • 변환 및 회전: 포인트 클라우드를 회전(rotate_)하거나 변환(transform_)
  • 스케일링: 포인트 클라우드를 특정 배율로 스케일링(scale_)할 수 있음
  • 오프셋 추가: 포인트 클라우드의 각 포인트에 오프셋을 추가(offset_)할 수 있습음
  • 핀홀 프로젝션: 핀홀 카메라 모델을 사용하여 포인트 클라우드를 투영(pinhole_projection_)할 수 있습니다.

4. 포인트 클라우드 입출력

  • 포인트 클라우드를 파일로 저장하거나 파일로부터 로드할 수 있는 기능을 제공:
    • 저장: 포인트 클라우드를 HDF5 파일로 저장(save_to_h5)할 수 있습니다.
    • 로드: HDF5 파일로부터 포인트 클라우드를 로드(load_pointcloud_from_h5)할 수 있습니다.

5. 시각화

  • 포인트 클라우드를 다양한 시각화 도구를 사용하여 시각화할 수 있습니다:
    • Open3D:
      • open3d 라이브러리를 사용하여 포인트 클라우드를 시각화(open3d)할 수 있음
    • Plotly:
      • plotly 라이브러리를 사용하여 포인트 클라우드를 3D 그래프로 시각화(plotly)할 수 있음

6. 내부 속성

클래스 내부에서는 여러 속성을 사용하여 포인트 클라우드의 상태를 관리합니다:

  • _points_list, _points_padded: 포인트의 리스트 및 패딩된 텐서 형태.
  • _normals_list, _normals_padded: 노말의 리스트 및 패딩된 텐서 형태.
  • _colors_list, _colors_padded: 색상의 리스트 및 패딩된 텐서 형태.
  • _features_list, _features_padded: 특징의 리스트 및 패딩된 텐서 형태.
  • _embeddings_list, _embeddings_padded: 임베딩의 리스트 및 패딩된 텐서 형태.
  • _confidences_list, _confidences_padded: 신뢰도의 리스트 및 패딩된 텐서 형태.
  • _num_points_per_pointcloud: 각 포인트 클라우드의 포인트 수.

예시를 통한 설명

1. 포인트 클라우드 생성

points_list = [torch.rand(1, 3), torch.rand(4, 3)]
pcs1 = Pointclouds(points_list)
print(pcs1.points_padded.shape)  # torch.Size([2, 4, 3])
print(len(pcs1.points_list))  # 2

2. 포인트 클라우드 변환

# 4x4 변환 행렬을 사용하여 포인트 클라우드 변환
transform = torch.eye(4)
pcs1.transform_(transform)

3. 포인트 클라우드 저장 및 로드

# 포인트 클라우드 저장
pcs1.save_to_h5('path/to/save')

# 포인트 클라우드 로드
loaded_pcs = Pointclouds.load_pointcloud_from_h5('path/to/save')

4. 포인트 클라우드 시각화

import open3d as o3d

# Open3D를 사용한 시각화
pcd = pcs1.open3d(index=0)
o3d.visualization.draw_geometries([pcd])

메서드 설명: open3d

  • open3d 메서드는 배치 내의 특정 포인트 클라우드
    • Open3D 라이브러리를 사용하여 시각화하거나 추가 처리할 수 있는 open3d.geometry.PointCloud 객체로 변환
    • 이 메서드는 색상 정보, 법선 벡터 포함 여부포인트 클라우드에서 최대 포인트 수를 설정하는 옵션을 제공

인수:

  1. index (int):

    • 배치에서 변환할 포인트 클라우드의 인덱스를 지정
    • 이는 원하는 포인트 클라우드의 위치를 나타내는 0부터 시작하는 인덱스입니다.
    • 타입: int
  2. include_colors (bool):

    • True인 경우, 생성된 open3d.geometry.PointCloud 객체에 색상 정보를 포함
    • 기본값: True
  3. max_num_points (Optional[int]):

    • 생성된 포인트 클라우드에 포함할 최대 포인트 수를 지정합니다. None으로 설정하면 모든 포인트가 포함됩니다.
    • 타입: Optional[int]
    • 기본값: None
  4. include_normals (bool):

    • True인 경우, 생성된 open3d.geometry.PointCloud 객체에 법선 벡터를 포함합니다.
    • 기본값: False

반환값:

  • pcd (open3d.geometry.PointCloud):
    • 지정된 인덱스의 포인트 클라우드를 나타내는 open3d.geometry.PointCloud 객체
    • 제공된 인수에 따라 색상과 법선을 포함할 수 있음

메서드 워크플로우:

  1. 포인트 클라우드 초기화:

    • open3d.geometry.PointCloud 객체를 생성합니다.
    pcd = o3d.geometry.PointCloud()
  2. 포인트 샘플링(필요한 경우):

    • 지정된 포인트 클라우드의 포인트 수를 가져옵니다.
    • max_num_points와 전체 포인트 수를 비교하여 샘플링이 필요한지 확인합니다.
    • 샘플링이 필요한 경우, 무작위로 인덱스를 선택하여 필요한 수의 포인트를 선택합니다.
    num_points = self.num_points_per_pointcloud[index]
    torch_points = self.points_list[index]
    subsample = max_num_points is not None and max_num_points < num_points
    if subsample:
        perm = torch.randperm(num_points)
        point_inds = perm[:max_num_points]
        torch_points = torch_points[point_inds]
  3. 포인트를 NumPy 배열로 변환:

    • 포인트를 PyTorch 텐서에서 NumPy 배열로 변환합니다.
    • open3d.geometry.PointCloud 객체에 포인트를 설정합니다.
    numpy_points = torch_points.detach().cpu().numpy()
    pcd.points = o3d.utility.Vector3dVector(numpy_points)
  4. 색상 포함(필요한 경우):

    • 색상을 포함하는 경우, 포인트의 색상을 가져와 샘플링이 필요한 경우 샘플링합니다.
    • 색상 값이 [0, 255] 범위에 있는 경우를 위해 정규화합니다.
    • 색상 값을 [0, 1] 범위 내로 클램프합니다.
    • 색상을 NumPy 배열로 변환하고 open3d.geometry.PointCloud 객체에 설정합니다.
    if self.has_colors and include_colors:
        torch_colors = self.colors_list[index]
        if subsample:
            torch_colors = torch_colors[point_inds]
        if (torch_colors.max() > 1.1).item():
            torch_colors = torch_colors / 255
        torch_colors = torch.clamp(torch_colors, min=0.0, max=1.0)
        numpy_colors = torch_colors.detach().cpu().numpy()
        pcd.colors = o3d.utility.Vector3dVector(numpy_colors)
  5. 법선 포함(필요한 경우):

    • 법선을 포함하는 경우, 포인트의 법선을 가져와 샘플링이 필요한 경우 샘플링합니다.
    • 법선을 NumPy 배열로 변환하고 open3d.geometry.PointCloud 객체에 설정합니다.
    if self.has_normals and include_normals:
        torch_normals = self.normals_list[index]
        if subsample:
            torch_normals = torch_normals[point_inds]
        numpy_normals = torch_normals.detach().cpu().numpy()
        pcd.normals = o3d.utility.Vector3dVector(numpy_normals)
  6. 포인트 클라우드 반환:

    • 구성된 open3d.geometry.PointCloud 객체를 반환합니다.
    return pcd

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글