Paper/Neural rendering

SuGaR: Surface-Aligned Gaussian Splatting for Efficient 3D Mesh Reconstruction and High-Quality Mesh Rendering

침닦는수건 2023. 11. 24. 20:45
반응형

내 맘대로 Introduction

 

곧 나오지 않을까 했는데 역시나 나왔다. 3D gaussian으로부터 geometry를 뽑아내는 연구. DreamGaussian과 같이 무식하게 voxel 공간 잡고 marching cube 돌리는 방식말고 방법론부터 새로 고민한 연구가 나왔다. 개인적으로 3D gaussian이 geometry에 맞아떨어지게 수렴하는 것이 보장되지 않는다는 점이 단점이라고 생각했었는데 3d gaussian to mesh 문제를 풀면서 이 문제까지 한 번에 푼 점에서 박수를 쳐주고 싶었다.

 

논문 자체는 결과 사진이 많이 차있어서 분량 대비 내용이 간단하다. 3d gaussian이 학습되는 과정에서 surface에 나란히 정렬되도록 regularization을 가하는 부분과 poisson reconstruction으로 mesh를 얻어내는 부분으로 구성되어 있다.

 

조립형 논문이 아닌 한걸음 나아간 논문 같다.

 

메모하며 읽기


3d gaussian recap 국룰이다.
1)  3d gaussian이 mesh surface와 일맥상통하도록 regularization하는 방법

2) 학습완료된 3d gaussian에서 mesh 뽑아내는 방법

3) 뽑아낸 mesh와 3d gaussian을 joint optimization해서 한 번 더 업데이트하는 방법이 소개된다.

regularization term은 출발할 때 두가지 가정을 한다. 

1) 한 공간을 커버하는 대표 3d gaussian이 자리잡아 neighbor와 겹 치는 영역이 작을 것이다. (큼직큼직하게 적은 수가 있을 것이다)
2) 학습이 잘 완료되었다면 surface와 잘 맞아떨어져서 flat한 모양을 하고 있을 것이다!

1) 설명----

가정 1)을 이용해서, 수식(1)과 같이 원래는 frustrum 전체를 고려해서 density만을 만드는데,  수식(2)와 같이 대표하는 gaussian 하나의 density도 만들어서 사용한다.

여기서 대표하는 gaussian을 선정하는 방식은 3차원 위치 p에 영향을 가하는 gaussian 중 가장 거리가 가깝고 covariance가 큰 gaussian으로 선정한다.

--------------
이 g와 g*를 직접적으로 비슷하게 만드는 loss term은 없지만 뒤에 둘 다 loss term 안에서 사용된다.

결과적으론 한 위치 p에 기여하는 모든 gaussian, g 가 대표 gaussian, g*와 유사해져야 하므로 대표 gaussian 외에는 도태되도록 유도된다.



2) 설명 ---

두번째 가정이 gaussian이 학습이 잘 되었다면 flat하다는 가정이다. 

flat gaussian, 즉 2D gaussian에 가깝게 수렴이 되었다면 2d covariance를 구하는 수식(4) LHS이 수식(5) RHS과 같이 단순화될 수 있다. 

의미를 보면, 2d gaussian을 평면으로 보아 법선벡터를 이용해 내적으로 projection하는 식으로 구현해도 그만이라는 소리다. 

역시나 수식(5)에서 만든 density와 수식(1)로 만든 원래 density 간의 직접 loss는 없지만 뒤 loss term에 녹아들어가 있다. 자세히 보면 d(p)가 있고 d(p_bar)가 있는데 여기서 앞서 만든 g, g*가 들어가있는 것을 볼 수 있듯이!

d(p)와 d(p_bar)를 비교하는 기능이 들어가게 되면 3d gaussian이 학습 과정에서 flat해지도록 유도된다. 

-------------------
추가적으로 투명,반투명 물체를 고려하지 않기 때문에 웬만하면 opacity가 0 아니면 1일 것이라고 가정해주었다. 그래서 opacity이 되도록 하는 과정도 끼어넣어준 것 같다.

방법은 잘 모르겠다만 각 gaussian마다 1-opacity 같은 loss를 몇 iteration 돌려줄 것 같다.

-----------

최종 loss를 구현할 때는 density level에서 하지 않고 수식(6)을 통해 sdf화해서 sdf level에서 loss를 구한다.

수식(6)이 복잡해보이지만 사실 수식(5)에 있는 exp를 벗겨내는 역할을 한다. exp를 벗겨내고 앞의 상수를 제거해보면, 3d point, p가 가장 가까운 flat gaussian과의 거리가 나온다. 즉, SDF인 셈이다.

최종적으로 (일반적인 3d gaussian들 갖고 수식(3~5)를 거쳐만든 sdf와 대표 3d gaussian 하나 갖고 수식(2~5)를 거쳐만든 sdf)를 비교하는 것이 loss다. (수식7)

--------------
이런 저런 가정을 하지만 핵심은 원래 3d gaussian은 절대 건드리지 않는다. 원래 디자인 그대로인 3d gaussian을 대표값 외에는 도태되도록, flat하도록 유도하는 loss만 추가해준 것이다. 




개념 정의는 수식(7)까지해서 끝났는데 사실 구현적으로 어려운 부분이 있다. 

바로 3d point, p는 어떤 p를 골라서 학습에 사용할 것이냐는 점이다. 공간의 모든 위치를 사용하는 것은 당연히 어렵다. 3d gaussian이 분포할만한 주변 위치에서 p를 뽑아주는 것이 맞다.

이러한 문제는 rendered depth를 만들어서 풀었다. 일단 training view에서 각 pixel마다 depth를 rendering한다. 방법은 color하듯이 적분하는 방식인데 color가 아닌 distance를 opacity따라 적분하는 방식이다. 

이렇게 만들어진 depth가 의미하는 바는, surface 위치다. 따라서 surface 주변에 3d gaussian이 있을 것이라고 가정하는 상황에서 좋은 초기 위치가 된다. 

rendered depth 주변에 위치하는 gaussian을 갖고 sampling해서 3d point, p를 만들어 학습에 사용한다.

----------------
추가적으로 하나 더 regularization term을 구현했다. sdf까지 계산했으니 gradient(sdf) <-> normal 이 같아야 한다는 loss를 걸어주었다.

조금 더 확실하게 3d gaussian이 flat해서 sdf가 normal과 맞아떨어지도록 유도하는 식이다. 게다가 normal은 대표 3d gaussian, g* 값을 써서 대표 3d gaussian이 지배적으로 성장하도록 더 돕는다.
결과적으로 regularization term을 넣으면 3d gaussian이 큼직큼직, flat하게 학습되어서 뒷단 mesh화까지 해보면 성능 차이가 확연히 드러난다. 

mesh를 뽑는 방식은 poisson reconstruction을 사용할 것이다. 

간단히 말해 level set (sdf나 TSDF처럼 surface까지 거리를 표현하는 수치)를 갖고 있는 point들을 3d gaussian을 기준으로 많이 생성해낸다음

point cloud를 poisson reconstruction통과 시켜 mesh를 얻어내는 방식이다. 




이 때 핵심은 학습 완료된 3d gaussian을 갖고 주변에 어떻게 point를 생성하냐는 점이다. 

surface 개념이 필요하므로 앞서 3d point, p를 생성할 때 처럼 rendered depth의 힘을 빌린다. 

각 training view에서 rendered depth를 만든 다음. rendered depth를 이용해 잡은 초기 위치 주변으로 -3sigma ~ 3 sigma 범위 안에서 point를 생성했다. 

(여기서 사용한 sigma가 notation을 보면 g*가 아니라 g 인 것을 보아 여러 gaussian을 고려한 것 같은데 구체적인 내용은 코드를 봐야할 것 같다. 근데 대충 대표 gaussian으로 했거나 가장 큰 sigma로 했을 듯!)

point를 생성한 뒤에는 각 point에서 density를 수식(3)과 같이 얻어내서 부여하면 된다. density가 일종의 level set 수치니까.

poisson reconstruction은 이 point w/ density를 보면서 특정 level set, lambda(=0.3)가 이루는 surface를 찾아 mesh화 할 것이다.

수식(7) (9)를 이용해 3d gaussian이 surface와 잘 맞아떨어지고 flat하도록 유도했지만 그렇게 되었다고 기대할 수 있지 보장할 순 없다.

이 부분이 아쉬웠는지 좀 더 깔끔하게 하기 위해 저자들은 explicit하게 3d gaussian을 surface에 갖다 붙이고 flat화하는 작업을 더 수행했다. (너무 깔끔하게 구현한 것 같다!)



1) 학습 완료된 3d gaussian으로 mesh를 뽑아낸 뒤에 기존 3d gaussian은 다 버린다.

2) mesh face마다 정해진 개수의 3d gaussian(scale과 rotation을 자유도를 제한함) 를 다시 새로 할당함

3) 새로 할당한 gaussian의 위치는 못변하게 고정하고, 자유도가 제한된 scale, rotation 그리고 opacity, color만 재학습한다.

다시 말해 고정된 gaussian으로 다시 처음부터 학습돌려주는 것이다.

이러면 최종적으로 나온 gaussian들은 explicit하게 surface에 고정된 체로 학습완료된 gaussian이기 때문에 모양도 더 예쁘고 개수도 일정하다.
학습 과정은 단계가 많다보니 조금 복잡한 편

1) 아무것도 없이 원래대로 7000번 학습

2) 현재 gaussian들의 opacity만 1이 되도록 cross entropy 2000번 학습

3) opacity 0.5 이하 다 소멸시키고 regularization term 2개 더해서 6000번 학습

4) mesh 생성

5) mesh surface에 새로 gaussian 할당해서 고정한 뒤 새로 학습

4~5) 과정은 마지막에만 하는 것이 아니라 2000, 7000, 15000과 같이 중간 중간 해서 계속 위치 바로잡는 과정을 해줬다고 한다.
반응형