[open3d / reconstruction system (Tensor)] 2. TSDF Integration

About_work·2024년 9월 14일
0

SLAM

목록 보기
7/12

1. TSDF integration

  • TSDF(Truncated Signed Distance Function) integration
  • 이 과정은 Kinect나 RealSense와 같은 RGB-D 센서로부터 상대적으로 노이즈가 많은 깊이 이미지를 받아서,
    • 알려진 카메라 자세를 기반으로 깊이 데이터를 복셀 블록 그리드(Voxel Block Grid)에 통합
  • TSDF 통합은 노이즈를 줄이고 부드러운 표면을 생성하는 데 도움이 됩니다.
  • 통합 과정은 주로 두 단계로 구성됩니다.
    • 첫 번째는 (희소한) 블록 선택 및 활성화이며,
    • 두 번째는 (밀집된) 복셀 값 통합
  • 이 예제는 examples/python/t_reconstruction_system/integrate.py에서 확인할 수 있습니다.

1.1. 활성화 단계(Activation)

  • 현재 깊이 이미지에서 역투영된 포인트를 포함하는 블록을 먼저 찾습니다.
  • 다시 말해, 현재 보기 프러스텀(viewing frustum) 내에서 활성 블록을 찾는 것입니다.
  • 내부적으로, 이는 중복 없는 블록 좌표를 생성하는 프러스텀 해시 맵이러한 블록 좌표를 활성화하고 쿼리하는 블록 해시 맵을 사용하여 구현됩니다.
# examples/python/t_reconstruction_system/integrate.py
frustum_block_coords = vbg.compute_unique_block_coordinates(
    depth, depth_intrinsic, extrinsic, config.depth_scale,
    config.depth_max)

1.2. 통합 단계(Integration)

  • 이제 frustum_block_coords에 해당하는 블록 내의 복셀을 처리할 수 있습니다.
  • 이 작업은 이러한 관련된 모든 복셀을 입력 이미지에 투영하고 가중 평균을 수행하는 것으로, 이는 해시 맵 작업 없이 순수하게 기하학적인 과정입니다.
  • 보정된 매개변수를 가진 raw depth 이미지를 사용하여 최적화된 함수로 활성화하고 TSDF 통합을 수행할 수 있습니다.
  • 필요에 따라 컬러 데이터를 포함할 수도 있습니다.
  • TODO
    • 기본 vbg.integrate 함수가 어떤 로직으로 integrate를 수행하는지 파악
# examples/python/t_reconstruction_system/integrate.py
if config.integrate_color:
    color = o3d.t.io.read_image(color_file_names[i]).to(device)
    vbg.integrate(frustum_block_coords, depth, color, depth_intrinsic,
                  color_intrinsic, extrinsic, config.depth_scale,
                  config.depth_max)
else:
    vbg.integrate(frustum_block_coords, depth, depth_intrinsic,
                  extrinsic, config.depth_scale, config.depth_max)

1.3. 데이터 타입 조합

  • 현재 최적화된 함수를 사용하려면 다음과 같은 데이터 타입의 조합을 가정
  • 순서는 깊이 이미지, 컬러 이미지, 복셀 그리드의 TSDF, 복셀 그리드의 가중치, 복셀 그리드의 컬러 순입니다.

1.3.1. CPU

template void IntegrateCPU<uint16_t, uint8_t, float, uint16_t, uint16_t>(FN_ARGUMENTS);
template void IntegrateCPU<uint16_t, uint8_t, float, float, float>(FN_ARGUMENTS);
template void IntegrateCPU<float, float, float, uint16_t, uint16_t>(FN_ARGUMENTS);
template void IntegrateCPU<float, float, float, float, float>(FN_ARGUMENTS);

1.3.2. CUDA

template void IntegrateCUDA<uint16_t, uint8_t, float, uint16_t, uint16_t>(FN_ARGUMENTS);
template void IntegrateCUDA<uint16_t, uint8_t, float, float, float>(FN_ARGUMENTS);
template void IntegrateCUDA<float, float, float, uint16_t, uint16_t>(FN_ARGUMENTS);
template void IntegrateCUDA<float, float, float, float, float>(FN_ARGUMENTS);
  • 더 일반화된 기능을 위해서는 매크로와/또는 커널 함수를 확장하고 Open3D를 처음부터 컴파일하여 최대 성능(예: GTX 1070에서 약 100Hz)을 얻을 수 있습니다.
  • 또는 Customized Integration을 따라 빠른 프로토타입(~25Hz)을 구현할 수 있습니다. (https://velog.io/@jk01019/open3d-Customized-Integration)

1.4. 표면 추출(Surface Extraction)

  • 제공된 API를 사용하여 표면 포인트를 추출할 수 있습니다.
# examples/python/t_reconstruction_system/integrate.py
pcd = vbg.extract_point_cloud()
o3d.visualization.draw([pcd])

mesh = vbg.extract_triangle_mesh()
o3d.visualization.draw([mesh.to_legacy()])
  • extract_triangle_mesh마칭 큐브 알고리즘을 적용하여 메쉬를 생성
  • extract_point_cloud는 비슷한 알고리즘을 사용하지만 삼각형 면 생성 단계를 생략

1.5. 저장 및 로드(Save and Load)

  • 복셀 블록 그리드는 .npz 파일 형식으로 저장 및 로드할 수 있으며, 이는 numpy를 통해 접근할 수 있습니다.
# examples/python/t_reconstruction_system/integrate.py
for i in tqdm(range(n_files)):
  • 위에서 언급한 복셀 블록 그리드의 .npz 파일에는 다음과 같은 항목이 포함됩니다:

  • attr_name_tsdf: 값 버퍼 인덱스: 0

  • attr_name_weight: 값 버퍼 인덱스: 1

  • attr_name_color: 값 버퍼 인덱스: 2

  • value_000: TSDF 값 버퍼

  • value_001: 가중치 값 버퍼

  • value_002: 색상 값 버퍼

  • key: 모든 활성 키

  • block_resolution: 8

  • voxel_size: 0.0059 = 3.0 / 512

  • CUDA:0: 디바이스

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

0개의 댓글