CVPR 2024에 게재된  3D gaussian splatting을 이용한 SLAM입니다.

 

Code: https://github.com/spla-tam/SplaTAM

Video: https://www.youtube.com/watch?v=jWLI-OFp3qU

 

이 논문의 특징은 앞서 리뷰한 Gaussian Splatting SLAM과 유사합니다. Gaussian을 이용하여 camera tracking과 mapping을 했습니다. 그리고 RGB-D SLAM이므로 depth 캠이 필요합니다.

 

전체 flowchart는 다음과 같습니다.

 

우선 Gaussian의 parameter를 오리지널 3 DGS와 살짝 다르게 정의합니다.

 

왼쪽은 기존의 3DGS gaussian 파라미터이고 오른쪽은 이 논문에서 정의한 gaussian 파라미터입니다.

  • Mean (3 채널) → Mean (3 채널) - $\mu$
  • Covariance (6 채널) → Covariance (1 채널) - $r$
  • Color (SH coefficient 16 채널) → Color (RGB 3 채널) - $\textbf {c}$
  • Opacity (1 채널) → Opacity (1 채널) - $o$

여기서 다른 점은 Covariance와 Color의 표현을 다르게 하고 있습니다. 

 

원래 Covariance는 6 채널로 gaussian의 모양을 찌그러뜨리거나 늘려서 타원의 모양으로 만들 수 있었는데(anisotropic), 이 논문에서는 채널을 하나만 사용하여 구(sphere)의 형태를 유지합니다.(isotropic)

 

또한, color는 SH coefficient를 사용하지 않고 단순히 RGB 3 채널을 이용하여 파라미터 개수를 줄여주었습니다.

 

Gaussian을 식으로 나타내면 다음과 같습니다.

이 gaussian을 이용하여 color, depth, silhouette3가지 이미지들을 만들어 낼 수 있습니다.

왼쪽부터 color, depth, silhouette 을 정의하는 수식

$\mathbf {p}$ 는 pixel 좌표를 말하며, $\mathbf {c}_i$ 는 i번째 gaussian의 color, $d_i$  는 i번째 gaussian의 depth입니다.

 

오리지널 3 DGS에서 color 이미지를 rendering 하는 방식에서 착안해 depth와 silhouette을 정의했습니다.

 

그리고 이렇게 세 가지 이미지를 rendering 하여 tracking, densification, mapping을 하게 됩니다.

 

Initialization

3D 상에 맨 처음 gaussian을 생성하는 단계입니다.

 

맨 처음 frame의 모든 pixel로부터 gaussian을 생성합니다.

 

생성되는 gaussian의 mean은 depth를 이용하여 3D 좌표를 복원한 점, 색깔은 pixel의 색깔, 불투명도는 0.5, 크기는 반경이 한 픽셀이 되도록 depth에 초점을 나눈 값으로 설정합니다.

gaussian의 크기

 

 

Tracking

3D 상에 존재하는 gaussian으로 camera pose를 추정하는 단계입니다.

 

이때 constant velocity을 이용해서 대략적인 camera pose 예측을 먼저 하고 최적화를 통해서 추정합니다.

 

앞서 정의한 color, depth, silhouette으로 loss 식을 정의 합니다.

 $S(\mathbf {p})>0.99$ 는 silhouette 이미지를 rendering 하여 잘 보이는 부분의 pixel만을 loss 식에 포함시키겠다는 의미입니다. 그리고 color, depth rendering과 color, depth ground truth 간의 $\mathbf {L}_1$ loss를 사용하여 loss 식을 정의하고,

이 식이 최소화 시키는 방향으로 최적화를 시켜 camera pose를 추정합니다.

 

Densification

Gaussian이 부족하여 표현이 잘 되지 않는 부분에 gaussian을 생성하는 단계입니다.

 

여기서 적절하게 표현된 부분은 gaussian을 추가로 생성하지 않고, 표현이 잘 되지 않는 부분에만 gaussian을 생성합니다.

 

아래 수식은 어느 pixel에서 gaussian을 생성하는지 결정하는 식입니다.

 

Silhouette 이미지에서 0.5 이하인 픽셀은 표현이 잘 안 됐다고 판단하여 gaussian을 생성합니다. 그리고 ground truth depth보다 rendering되는 depth가 큰 경우와 동시에 depth error가 median depth error(MDE) * $\lambda$ 보다 큰 경우에 표현이 잘 안됐다고 판단하여 생성합니다.

 

Gaussian Map Updating

생성했던 3D gaussian들을 최적화하여 파라미터를 업데이트하는 단계입니다.

 

모든 frmae에 대해서 gaussian을 업데이트하는 것이 아니라 k개의 frame들을 선택하여 업데이트합니다.

  • 현재 frame
  • 가장 최근의 keyframe
  • 현재 frame과 overlap 되는 k - 2 개의 keyframe들

keyframe은 n번째 frame 마다 keyframe으로 지정됩니다. 또한, 여기서 overlap의 기준은 현재 frame의 depth을 point cloud 변환하고, 이 변환된 point cloud와 각 keyframe의 frustum 안에 있는 point 수를 갖고 판단합니다.

 

이 단계에서는 camera pose는 업데이트하지 않습니다.

 

loss 식은 tracking 수식과 비슷하지만 silhouette 이미지는 이용하지 않았다고 합니다. 대신 SSIM loss를 RGB 렌더링에 추가했고, 크기가 너무 크거나 불투명도가 거의 0인 불필요한 gaussian들을 제거합니다.

 

 

Result

Camera pose estimation 성능입니다. ORB-SLAM에는 미치지 못하는 경향이 있습니다.

 

Rendering quality 성능입니다.