PointFusion (ICPSLAM)

About_work·2024년 8월 3일
0

global mapper

목록 보기
24/37

1. PointFusion 논문 리뷰

1.1. abstract

  • Real-time or online 3D reconstruction
  • 일반적인 접근 방식은 움직이는 센서를 사용하여, 깊이 측정을 단일 모델에 축적하고 이를 지속적으로 개선하는 것
    • 이러한 시스템을 설계하는 것은
      • 재구성 품질, 속도, 공간 규모 및 장면 가정 간의 미세한 균형을 필요로 함
  • 기존의 온라인 방법은,
    • 작은 객체/장면의 높은 품질 재구성을 달성하기 위해 규모를 희생하거나,
    • 더 큰 장면을 처리하기 위해 실시간 성능 및/또는 품질을 희생하거나, 활성 재구성의 범위를 제한
    • 또한, 많은 시스템은 정적 장면을 가정하고,
      • 장면의 움직임이나 변화를 반영하는 재구성을 견고하게 처리할 수 없습니다.
  • 즉, 카메라 포즈 추정, 데이터 연관, 외부 요소 제거, 깊이 맵을 단일 노이즈 제거 모델로 융합, 동적 객체의 감지 및 업데이트 등을 포함합니다.

1.2. 그림들

  1. 깊이 맵 전처리 (Depth Map Preprocessing)

    • 설명: 입력 Depth Map을 정제하고 노이즈를 제거하는 단계
    • 예시: 만약 일부 픽셀이 이상치(너무 큰 값)거나 깊이 정보가 없는 경우, 이 단계를 통해 이를 제거하거나 보완
  2. 카메라 포즈 추정 (Camera Pose Estimation)

    • 설명: 카메라의 위치 및 자세를 추정하는 단계
      • 입력된 깊이 맵을 사용하여 현재 프레임의 카메라 위치를 계산
    • 예시: 예를 들어, 이전 프레임과 현재 프레임 사이의 변화를 분석하여 카메라가 이동한 거리를 추정
  3. 초기 동적 분할 (Initial Dynamics Segmentation)

    • 설명: 장면 내의 동적 객체를 분할하는 초기 단계입니다. 동적 객체와 정적 배경을 구분
    • 예시: 사람이 걸어가는 방을 촬영한 경우, 움직이는 사람을 배경과 분리하여 동적 객체로 인식
  4. 깊이 맵 융합 (Depth Map Fusion)

    • 설명: 여러 프레임의 깊이 맵을 하나의 통합된 모델로 융합하는 단계입니다. 이를 통해 더 정확하고 완전한 3D 모델을 생성합니다.
    • 예시: 여러 각도에서 방을 촬영한 깊이 데이터를 통합하여 방의 전체 3D 모델을 만듭니다.
  5. 동적 추정 (Dynamics Estimation)

    • 설명: 장면 내 동적 객체의 움직임을 추정하고 업데이트하는 단계
      • 초기 분할 정보를 사용하여 동적 객체의 위치와 움직임을 지속적으로 추적합니다.
    • 예시: 방 안에서 사람이 걸어가는 경우, 시스템은 사람의 위치 변화를 지속적으로 추적하여 실시간으로 업데이트
  6. 표면 분할 (Surface Splatting)

    • 설명: 깊이 맵의 점을 사용하여 3D 표면을 생성하는 기술
      • 융합된 깊이 맵 데이터를 사용하여 표면을 시각화
    • 예시: 융합된 깊이 데이터를 사용하여 방의 벽, 바닥, 천장을 정확하게 표현

1.3. 논문 설멍

  • 3D 모델을 점진적으로 구축하고 업데이트하는 과정을 설명
  1. 카메라 위치 파악 (카메라 포즈 추정)
  2. 3D 모델에 데이터 추가 (데이터 통합)
    • 추정된 카메라 위치를 이용하여, 현재 프레임에서 얻은 3D 점(버텍스)들과 그 점들의 속성(법선 벡터, 반지름 등)을 기존의 글로벌 3D 모델에 통합
    • 쉽게 말해, 이전에 구축된 3D 모델에 새로운 데이터를 추가하는 것
  3. 대응되는 포인트 찾기
    • 새로운 프레임에서 얻은 각 3D 점이 기존의 글로벌 3D 모델에 있는 어떤 점과 가장 잘 맞는지(대응하는지)를 찾습니다.
    • 이를 위해, 현재 카메라 위치와 내재 매트릭스(K)를 이용해
      • 기존 모델의 모든 3D 포인트를 현재 카메라 시점으로 변환하고,
      • 이를 2D 이미지 평면으로 투영합니다.
    • 이 과정에서 각 점의 인덱스를 기록하여, 대응점을 찾는 데 사용됩니다.
  4. 슈퍼샘플링 및 정밀도 향상
    • 여러 모델 포인트가 동일한 2D 픽셀에 투영될 수 있기 때문에, 해상도를 높여 포인트 간의 구분을 더 잘할 수 있도록 합니다.
    • 이 과정을 통해 같은 픽셀에 여러 포인트가 투영되더라도, 그 중 어떤 포인트가 가장 적합한지 더 정확하게 선택할 수 있게 됩니다.
  5. 적절한 대응 포인트 선택
    • 슈퍼샘플링된 픽셀 안에서 적합한 모델 포인트를 선택합니다. 이를 위해 여러 기준을 적용합니다:
      1. 깊이 필터링:
      • 포인트가 현재 카메라에서 너무 멀거나 너무 가까운 경우 제외
      1. 법선 필터링:
      • 법선 벡터의 방향이 너무 다른 경우 제외
      1. 신뢰도:
      • 남은 포인트 중에서 신뢰도가 가장 높은 포인트를 선택
      1. 거리 기준:
      • 만약 여러 포인트가 남아있다면, 카메라에서 가장 가까운 포인트를 선택

1.4. 수학적 설명


2. PointFusion 클래스 설명

  • PointFusion 클래스는 ICPSLAM 클래스(https://velog.io/@jk01019/ICPSLAM)를 상속받아
    • RGB-D 이미지 시퀀스를 사용하여 포인트 클라우드와 카메라의 위치 및 자세를 계산하는 SLAM 모듈
  • PointFusion은 PointFusion 논문(참조: Point-based Fusion)에 기반한 기법을 사용하여 점 기반 융합을 수행

2.1. 주요 구성 요소 및 기능

  1. 입력 파라미터
    • 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_pctgt_pc 사이의 거리 임계값.
    • lambda_max, B, B2, nu:
      • gradicp 방법에 필요한 추가 파라미터.
    • device: 내부 텐서를 위한 장치. 기본적으로 CPU.
    • use_embeddings: 임베딩 사용 여부.
    • embedding_fusion_method: 임베딩 융합 방법.

2.2. 이론적 배경

  • 점 기반 융합 (Point-based Fusion)
    • 점 기반 융합은, 포인트 클라우드에서 점들의 위치 및 속성(예: 색상, 법선 벡터 등)을 사용하여 지도를 생성하고 업데이트하는 기법
    • PointFusion 클래스는
      • 거리 임계값과 각도 임계값을 사용하여 불필요한 점들을 제거하고,
      • 가우시안 필터를 적용하여 노이즈를 줄입니다.

3. step, (_localize+ _map) 메서드

4. _map

  • pointcloudslive_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,
        )

4.1. _map/update_map_fusion

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

4.1.1. 주요 기능:

  • 입력 파라미터:
    • dist_th: 거리 임계값으로,
      • 포인트 간의 거리 차이가 이 값보다 작아야 매칭
    • dot_th:
      • 도트 프로덕트 임계값으로,
      • 포인트 간의 노멀 벡터 간의 각도가 이 값보다 작아야 매칭
    • sigma:
      • 가우시안의 표준 편차로, 융합 과정에서 사용
      • 원본 논문에서는 경험적으로 0.6을 사용
    • use_embeddings: 임베딩을 사용할지 여부를 나타내는 플래그
    • embedding_fusion_method:
      • 임베딩 융합 방법을 지정하는 문자열
      • 기본값은 "slam"

4.1.2. 세부 동작:

  1. 포인트클라우드와 RGB-D 이미지 간의 대응 관계 찾기:
    • find_correspondences:
  2. 포인트 융합:
    • fuse_with_map 함수
      • 라이브 프레임의 포인트를 글로벌 맵의 포인트와 융합
      • 이 함수는 sigma 값을 사용하여 가우시안 융합을 수행

4.1.3. _map/update_map_fusion/find_correspondences

  • 자세한 내용은 Point-based Fusion 논문의 4.1절을 참조하세요:
  • 이 함수는 라이브 프레임의 점들글로벌 맵의 점들 사이의 1 대 1 대응 관계를 찾기 위한 일련의 단계를 수행
    • 이를 통해 각 라이브 프레임 점에 대해 글로벌 맵에서 가장 적합한 점을 식별
  1. 활성 맵 포인트 찾기 (find_active_map_points):
  2. 유사한 맵 포인트 찾기 (find_similar_map_points):
  3. 고유한 대응 관계 찾기 (find_best_unique_correspondences):
  • pc2im_bnhw(반환값):
    • (num_unique_correspondences, 4) shape
    • 이 텐서는 각 행이 배치 인덱스(b), 포인트 인덱스(n), 투영된 라이브 프레임의 높이(h), 너비(w)를 포함하는 고유 대응 관계를 나타냅니다.
    • 즉, 라이브 프레임의 각 점에 대해 가장 적합한 글로벌 맵의 점을 나타냅니다.

4.1.3.1. _map/update_map_fusion/find_correspondences/find_active_map_points

  • 각 프레임에서 활성 상태인 글로벌 맵 포인트의 인덱스
  • 이들이 라이브 프레임에 투영된 위치를 찾음
    • 이 함수는 전체 pointcloud를 전부 고려하지 않고, 현재 프레임에서 관측된 포인트만을 추려냅니다.
    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)
4.1.4.3.1. 주요 작업 흐름
  1. 초기화 및 변환:

    • rgbdimages의 포즈 정보를 이용해, 전역 지도 점들을 현재 프레임 좌표계로 변환
    • 이를 위해 inverse_transformation 함수가 사용
    • 변환된 점들이 카메라 앞에 있는지 확인
  2. 투영:

    • 변환된 점들을 카메라의 이미지 평면으로 투영
    • 투영된 점들이 이미지 프레임 내에 있는지 확인
  3. 활성 점 필터링:

    • 이미지 프레임 내에 있으며 카메라 앞에 있는 점들만을 활성 점으로 간주하고, 해당 점들의 좌표를 계산
  4. 결과 반환:

    • 활성 점들의 배치 인덱스, 점 인덱스, 이미지 평면 내의 좌표를 포함하는 텐서를 반환

4.1.3.2. _map/update_map_fusion/find_correspondences/find_similar_map_points

  • 이 단계는 라이브 프레임의 각 점에 대해, 가장 가까운 거리와 유사한 법선 벡터를 가진 글로벌 맵의 포인트만을 선택
    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 함수는
    • 전역 지도에서 특정 조건(거리 및 법선 벡터의 유사성)을 만족하는 활성 점들을 찾아
    • 라이브 프레임에 투영된 위치를 반환하는 역할을 함
  • 이 조건은 전역 지도에서의 점들이
    • 라이브 프레임(live frames)의 동일한 픽셀 위치에 투영된 점들과 가까운 거리와 유사한 법선 벡터를 가져야 한다는 것
4.1.3.2.1. 주요 작업 흐름
  1. 활성 점 좌표와 법선 벡터 추출:

    • pc2im_bnhw에 따라 라이브 프레임의 활성 점들의 좌표와 법선 벡터를 추출
  2. 조건 필터링:

    • 활성 점들과 전역 지도 점들 사이의 거리법선 벡터의 유사성을 기준으로 조건을 만족하는 점들을 필터링
  3. 결과 반환:

    • 조건을 만족하는 활성 점들의 인덱스(pc2im_bnhw_similar)와 필터링된 점들의 마스크(is_similar_mask)를 반환

4.1.3.3. _map/update_map_fusion/find_correspondences/find_best_unique_correspondences

  • 동일한 라이브 프레임 픽셀에 투영된 글로벌 맵의 여러 포인트 중, 가장 신뢰도(confidence counter)가 높은 포인트를 선택 (일대일 대응 관계를 생성)
    • 신뢰도가 같은 경우, 관측 광선(viewing ray)에 가장 가까운 포인트를 선택
    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(반환값):

    • (num_unique_correspondences, 4) shape
    • 각 행은 배치 인덱스, 포인트 인덱스, 높이, 너비를 포함

4.1.4. _map/update_map_fusion/ fuse_with_map

    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 함수는 라이브 프레임에서 얻은 새로운 데이터를
    • 글로벌 맵에 병합하여 맵을 최신 상태로 유지하는 역할

4.1.4.1. 주요 기능

  1. 기존 포인트 업데이트:
  • 라이브 프레임의 데이터를 글로벌 맵의 기존 포인트들과 병합하여
    • 위치, 법선, 색상 및 신뢰도 카운트 등을 가중 평균으로 업데이트
    • 신뢰도 카운트(alpha_image/point의 신뢰도)는 가우시안 분포를 사용하여 계산
      • 구체적으로는, 센서와의 거리가 먼 point일수록 신뢰도가 낮아지는 것 같음.
  • 병합된 결과는 inv_updated_ccounts를 사용하여 정규화됩니다.
  1. 새로운 포인트 추가:
  • 글로벌 맵에 포함되지 않은 라이브 프레임의 새로운 포인트들을 추가
  • 이를 위해 new_mask를 사용하여 새로운 포인트를 식별하고, 이를 글로벌 맵에 추가
  1. 임베딩 병합:
    • use_embeddings 옵션이 참일 경우, 새로운 포인트 클라우드 데이터에 포함된 임베딩(특징 벡터)을 기존 맵의 임베딩과 병합
    • 이 과정에서 두 가지 방법(slambayes) 중 하나를 선택하여 임베딩을 병합할 수 있습니다.
    • slam 방법: 가중 평균을 사용
    • bayes 방법: 베이즈 확률론적 방법을 사용하여 임베딩을 병합

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

0개의 댓글