작은 객체/장면의 높은 품질 재구성을 달성하기 위해
규모를 희생하거나, 더 큰 장면을 처리하기 위해
실시간 성능 및/또는 품질을 희생하거나, 활성 재구성의 범위를 제한단일 노이즈 제거 모델로 융합
, 동적 객체의 감지 및 업데이트 등을 포함합니다. 깊이 맵 전처리 (Depth Map Preprocessing)
카메라 포즈 추정 (Camera Pose Estimation)
초기 동적 분할 (Initial Dynamics Segmentation)
깊이 맵 융합 (Depth Map Fusion)
동적 추정 (Dynamics Estimation)
표면 분할 (Surface Splatting)
PointFusion
클래스는 ICPSLAM
클래스(https://velog.io/@jk01019/ICPSLAM)를 상속받아 PointFusion
논문(참조: Point-based Fusion)에 기반한 기법을 사용하여 점 기반 융합을 수행odom
: 사용하려는 오도메트리 방법.gt
(ground truth), icp
(Iterative Closest Point), gradicp
(Gradient-based ICP) 중 선택.dist_th
: 거리 임계값. 포인트 클라우드 내에서 포인트들을 필터링할 때 사용.angle_th
: 각도 임계값. 점들의 법선 벡터 간의 각도로 필터링할 때 사용.sigma
: 가우시안 벨의 폭. 원본 논문에서는 0.6을 사용.dsratio
: 다운샘플링 비율. 입력 프레임을 ICP 수행 전에 다운샘플링하는 데 사용.numiters
: 최적화를 수행할 반복 횟수.damp
: 비선형 최소 제곱을 위한 감쇠 계수.dist_thresh
: src_pc
와 tgt_pc
사이의 거리 임계값.lambda_max
, B
, B2
, nu
: gradicp
방법에 필요한 추가 파라미터.device
: 내부 텐서를 위한 장치. 기본적으로 CPU.use_embeddings
: 임베딩 사용 여부.embedding_fusion_method
: 임베딩 융합 방법.점들의 위치 및 속성(예: 색상, 법선 벡터 등)
을 사용하여 지도를 생성하고 업데이트하는 기법PointFusion
클래스는 거리 임계값과 각도 임계값을 사용하여 불필요한 점들을 제거
하고, pointclouds
와 live_frame
을 입력으로 받아, 거리 임계값, 각도 임계값, 가우시안 폭
을 사용하여 def _map(
self, pointclouds: Pointclouds, live_frame: RGBDImages, inplace: bool = False
):
return update_map_fusion(
pointclouds,
live_frame,
self.dist_th,
self.dot_th,
self.sigma,
inplace,
use_embeddings=self.use_embeddings, # KM
embedding_fusion_method=self.embedding_fusion_method,
)
def update_map_fusion(
pointclouds: Pointclouds,
rgbdimages: RGBDImages,
dist_th: Union[float, int],
dot_th: Union[float, int],
sigma: Union[torch.Tensor, float, int],
inplace: bool = False,
use_embeddings: bool = False, # KM
embedding_fusion_method: str = "slam", # KM
) -> Pointclouds:
r"""Updates pointclouds in-place given the live frame RGB-D images using PointFusion.
(See Point-based Fusion `paper <http://reality.cs.ucl.ac.uk/projects/kinect/keller13realtime.pdf>`__).
Returns:
gradslam.Pointclouds: Updated Pointclouds object containing global maps.
"""
batch_size, seq_len, height, width = rgbdimages.shape
pc2im_bnhw = find_correspondences(pointclouds, rgbdimages, dist_th, dot_th)
pointclouds = fuse_with_map(
pointclouds,
rgbdimages,
pc2im_bnhw,
sigma,
inplace,
use_embeddings=use_embeddings,
embedding_fusion_method=embedding_fusion_method,
)
return pointclouds
dist_th
: 거리 임계값으로, 포인트 간의 거리 차이가 이 값보다 작아야 매칭
dot_th
: 포인트 간의 노멀 벡터 간의 각도가 이 값보다 작아야 매칭
sigma
: use_embeddings
: 임베딩을 사용할지 여부를 나타내는 플래그embedding_fusion_method
: find_correspondences
: fuse_with_map
함수sigma
값을 사용하여 가우시안 융합을 수행라이브 프레임의 점들
과 글로벌 맵의 점들
사이의 1 대 1 대응 관계를 찾기 위한 일련의 단계를 수행find_active_map_points
):find_similar_map_points
):find_best_unique_correspondences
):pc2im_bnhw
(반환값): b
), 포인트 인덱스(n
), 투영된 라이브 프레임의 높이(h
), 너비(w
)를 포함하는 고유 대응 관계를 나타냅니다. 각 프레임에서 활성 상태인 글로벌 맵 포인트의 인덱스
와 이들이 라이브 프레임에 투영된 위치
를 찾음 pc2im_bnhw = find_active_map_points(pointclouds, rgbdimages)
pc2im_bnhw, _ = find_similar_map_points(
pointclouds, rgbdimages, pc2im_bnhw, dist_th, dot_th
)
pc2im_bnhw = find_best_unique_correspondences(pointclouds, rgbdimages, pc2im_bnhw)
초기화 및 변환:
rgbdimages
의 포즈 정보를 이용해, 전역 지도 점들을 현재 프레임 좌표계로 변환inverse_transformation
함수가 사용투영:
활성 점 필터링:
결과 반환:
pc2im_bnhw = find_active_map_points(pointclouds, rgbdimages)
pc2im_bnhw, _ = find_similar_map_points(
pointclouds, rgbdimages, pc2im_bnhw, dist_th, dot_th
)
pc2im_bnhw = find_best_unique_correspondences(pointclouds, rgbdimages, pc2im_bnhw)
find_similar_map_points
함수는 활성 점 좌표와 법선 벡터 추출:
pc2im_bnhw
에 따라 라이브 프레임의 활성 점들의 좌표와 법선 벡터를 추출조건 필터링:
거리
와 법선 벡터
의 유사성을 기준으로 조건을 만족하는 점들을 필터링결과 반환:
pc2im_bnhw_similar
)와 필터링된 점들의 마스크(is_similar_mask
)를 반환 pc2im_bnhw = find_active_map_points(pointclouds, rgbdimages)
pc2im_bnhw, _ = find_similar_map_points(
pointclouds, rgbdimages, pc2im_bnhw, dist_th, dot_th
)
pc2im_bnhw = find_best_unique_correspondences(pointclouds, rgbdimages, pc2im_bnhw)
이를 통해 포인트 클라우드의 중복된 포인트를 제거하고, 가장 적합한 포인트를 선택하여 매핑의 정확성을 높입니다.
pc2im_bnhw_unique
(반환값):
batch_size, seq_len, height, width = rgbdimages.shape
pc2im_bnhw = find_correspondences(pointclouds, rgbdimages, dist_th, dot_th)
pointclouds = fuse_with_map(
pointclouds,
rgbdimages,
pc2im_bnhw,
sigma,
inplace,
use_embeddings=use_embeddings,
embedding_fusion_method=embedding_fusion_method,
)
fuse_with_map
함수는 라이브 프레임에서 얻은 새로운 데이터를 alpha_image
/point의 신뢰도)는 가우시안 분포를 사용하여 계산inv_updated_ccounts
를 사용하여 정규화됩니다.new_mask
를 사용하여 새로운 포인트를 식별하고, 이를 글로벌 맵에 추가use_embeddings
옵션이 참일 경우, 새로운 포인트 클라우드 데이터에 포함된 임베딩(특징 벡터)을 기존 맵의 임베딩과 병합slam
과 bayes
) 중 하나를 선택하여 임베딩을 병합할 수 있습니다.slam
방법: 가중 평균을 사용 bayes
방법: 베이즈 확률론적 방법을 사용하여 임베딩을 병합