Published on

REVIEW | 3D Gaussian Splatting (SIGGRAPH 2023)

3D gaussian splatting 분석을 위해 따로 파놓은 포스팅이다. 글을 보기 전에 아래 글을 읽고 오면 좋다.

그래도 이게 무엇인지 간단하게는 짚어보자.

Gaussian Splatting

NeRF의 등장으로 여러 이미지를 입력으로 연속적인 장면을 인공지능으로 풀어내는 것이 가능해졌다. Gaussian Splatting은 여기서 더 나아가 이것을 실시간으로 풀어내는 것이 가능함을 시사한다.

여기서 독특한 점은 NeRF는 말그대로 Neural Model을 사용하여 novel view synthesis가 가능한 한데, 3DGS(이하 gaussian splatting)은 인공지능 기반에 의한 학습이 아니라는 거다.

"torch기반 프레임워크로 파라미터들을 최적화를 한다" 라고 봐도 무방하다. 실제로 논문에서는 NeRF 방법을 implicit, 3DGS를 explicit으로 언급하는 부분에서 알 수 있다. (딥러닝 method들은 블랙박스이므로 훈련과정이 어떻게 돌아가는지 모르므로..)

What is gaussian?

gaussian 함수는 아래와 같이 정의할 수 있다.

gaussian

anisotropic(비등방성) 기반이기 때문에 공간에 따라 위아래 scaling이 되어있다. gaussian 중심은 initial로 들어가는 point cloud 점들이거나 최적화 과정에서 생겨난 point이다. 관련 논문들에서는 mean으로 표현된다.

Similarity with NeRF

전반적인 방법은 NeRF와는 크게는 벗어나진 않는다. 픽셀의 색을 결정할 때 NeRF에서는 RAY/depth에 따라 density와 인근 sample의 거리의 곱을 alpha 값으로 ray 위 모든 값들을 더해서 rgb를 구한다. 3DGS는 density 대신 tile(sample)당 gaussian들을 depth 정렬 후 순차적으로 alpha blending하여 rgb를 결정한다.

formula

물론 말로는 굉장히 다르지만, alpha 값을 어떻게 구하느냐만 다르다.

3DGS는 이 부분을 gaussian projection으로 계산되는데, NeRF는 이부분을 MLP를 해결한다는 점에서 연산량이 차이난다.

How to gaussian splatting

Method를 정리하면 아래와 같다.

  • input: camera intrinsic(pinhole), camera extrinsic(w2c)
  • output: rgb image(rendered)
  • label: rgb image(ground truth image)
  • function: splatting algorithm
  • parameter: gaussian position, sh, covariance, alpha value
  • loss: l1 loss

방법은 생각보다 큰 틀은 어렵지 않다. 3단계로 나뉜다.

algorithm

Initial value

gaussian splatting 코드를 돌려보면 colmap으로 전처리해서 들어가는데, 뜯어보면

  • images(label): pinhole 이미지
  • sparse
    • point3Ds.txt: point cloud
    • images.txt: camera extrinsics(world frame 기준)
    • cameras.txt: camera intrinsics

point cloud를 gaussian 위치와 색을 기준으로 초기화하고 Covariance의 경우 gaussian state에서 초기로 선언한 scale과 rotation 정보에 따라 초기화가 된다. alpha값도 마찬가지(gaussian의 경우 diff-gaussian-rasterization 렌더링 코드를 뜯어보면 확인해볼 수 있다)

Optimization

가우시안을 기반으로 이미지를 렌더링하고 label 이미지와 차이를 loss로 두어서 gradient로 전파해서 최적화하게 된다.

Adpative control

alpha 값이 특정 threshold(0.005)보다 낮으면 gaussian을 제거(pruning)을 하게 되고 아니면 denification 과정을 거친다. densification에서는 scale에 따라 gaussian의 크기가 클 경우 split을, 작을 경우 clone을 하게 된다.

Summary

  1. point cloud 토대로 초기화
  2. gaussian 배치 최적화 후 렌더링
  3. threshold에 따라 조건에 따라 gaussian 조절

Limitation

원래 결과물을 가지고 포스팅하려고 했으나 개인 사정으로 사진 첨부는 일단 생략하고 개인적으로 느낀 아래 결과를 남긴다.

Floaters

데이터를 넣고 훈련 결과 상에서 floater이 생기는데, 이 방향이 camera ray 방향에 따라 생기게 된다. 위 densification 과정에서 point cloud에서 없던 gaussian이 생기는 것으로 보아 clone이 되어서 그런 것 같?다.

가우시안을 제거하는 과정을 위해 100 iteration 별로 alpha 값을 0으로 초기화를 한다고 하지만, 데이터가 적은 경우에서는 있다고 판단되어서 그려지게 되는게 아닌가 싶다.

Broken gaussians

벽쪽을 보면 가우시안이 flat하지 않게 되는데, 이 또한 view dependent 문제로 인한 결과이지 않을까 싶다.

Only pinhole image label

pixel당 ray에 따라 연산이 되다 보니 pinhole 이미지만 고수하는 한계점이 있다. 이와 관련해서는 별도로 pinhole 이미지로 전처리하거나 혹은 rendering 부분에서 별도로 계산이 필요할 것 같다,

Further works

보통은 위 limitation으로 후속으로 논문들이 나왔는데 보통 gaussian state를 최대한 활용해서 loss를 계산해서 전파한다거나 카메라 렌즈의 경우 rendering 파트에서 재연산해서 이미지를 만드는 것 같다.

gaussian splatting은 더나아가서 mesh로 만든다거나 slam에 적용되는 등 다양하게 활용 관련하여 논문들이 꾸준히 나오고 있다. 또한, floater 제거에 있어서 neural model을 작게 넣는다던지 camera extrinsic을 estimate하면서 그린다거나(colmap-free) depth 관련해서 estimation된 결과물로 넣는 등등 다양하게 개선된 내용의 논문들 또한 나오고 있다.

앞으로 내가 개선할 것은 최대한 ply에 나오는 depth 정보라던가 normal로 개선을 하고 마무리해볼 것 같다.

Reference

Authors