Paper/Neural rendering

Revising Densification in Gaussian Splatting

침닦는수건 2024. 4. 22. 13:51
반응형

내 맘대로 Introduction

 

메타에서 나온 논문인데 기존 3DGS의 고질병인

1) densification이 제멋대로여서 성능/메모리 이슈 있음

2) pruning을 opacity의 주기적 초기화로만 처리해서 학습에 충격이 가해짐 -> 성능 문제로 이어짐

3) threshold가 사용되는데 gradient-threshold여서 직관적이지 않음. -> 튜닝이 어려움.

 

위 3가지를 완화하는 방법론을 소개하는 논문이다. 3DGS를 처음 읽었을 때 내가 바로 느꼈던 문제점인데 바로 해결에 착수한 논문이라 신기하면서 반갑다. 

 

핵심 아이디어는 3) threshold를 pixel error 기반으로 다시 만들어 직관적 튜닝이 가능하도록, 2) opacity를 0으로 초기화하지 않고 매번 찔끔찔끔 줄이도록 하는 것 (결국 0으로 되도록) 1) densification이 메모리 한계에 다다르면 1개만 추가되도록 억제하는 것이다.

 

그림이 하나도 없다.

 

메모


기존 방식은 gradient threshold를 사람이 정하고 넘으면 증식, 낮으면 무시하는 식이다. 

증식 시에는 똑같은 값을 가진 분신을 만드는 식으로 나누며 삭제는 주기적으로 모든 GS의 opacity를 0.01로 초기화해서 죽을 놈이 알아서 죽도록 하는 수동적인 방법이다. 
그러면 문제점이 많다.
1) 일단 어떤 gradient 값이 threshold로 적합할 지 정하는게 어렵다. 공간의 크기나, 물체의 크기에 영향을 받기 마련.
2) gaussian의 총 개수, 즉 최종 메모리 사용량 억제가 안됨. 무제한 증식해버릴 수도 있으니
3) threshold 미만은 아예 컨트롤을 안하는데, 이런 애들도 제 역할을 해줘야 디테일이 표현된다. 



gradient 값 기준 threshold를 가장 직관적으로 옮긴다면 단연 loss에도 사용하는 pixel color error일 것이다. 

따라서 각 gaussian 마다 pixel error를 얼마나 발생시키는지 그 error 크기를 threshold로 잡을 것을 제안한다. (SSIM)

렌더링 과정에서 한 픽셀에 gaussian이 얼마나 기여하는지는 이미 알고 있음. 그래서 각 gaussian이 대응되는 pixel들을 전부 모은다음. 가장 큰 pixel error를 해당 gaussian의 error score로 정의한다. 

이 error score가 특정 값 이상이면 증식, 아니면 냅두기 
구현도 간단하다. 수식 상 gradient 계산 시 pixel error가 튀어나도록 디자인하기 위해서 각 gaussian마다 scalar 값을 하나 추가로 부여했다. 이 값은 크게 무슨 의미가 있는 값은 아니고 맨 아래 수식처럼 이 e에 대한 gradient를 계산하도록 하면 나오는 출력이 pixel error로 맞아 떨어진다. 따라서 수식을 위한 dummy variable이다. 실제로 업데이트되지도 않음. 그냥 0임.

densification하기로 결정된 3DGS는 같은 값을 갖는 분신을 만드는 식이었으나, 그렇게 하면 위 그림 처럼 너무 큼직한 애가 하나 더 생겨버리는 모양이 된다. 새로 생긴 분신은 본체가 표현하지 못한 분량을 표현하는 목적에 맞춰져야 하는데 본체랑 존재감이 똑같다 보니 역할을 제대로 하지 못한다.

수식으로 보면 alpha compositing할 때, 본체를 지난 이후에 1-a로 줄어드는데 본체랑 똑같은 분신을 통과하면 (1-a)^2로 팍 줄어들어버린다. 그러면 새로운 업데이트는 (1-a)^2 남은 애가 발생시키는 에러로 이루어지니 업데이트 힘이 약할 수 밖에 없다.

따라서 새로운 방식으로 densification할 때 분신을 만들되, 본체의 값도, 분신의 값도 본래 본체 값의 1-sqrt(1-a)로 줄여서 만들자는 것이다. 이러면 수식 상 에러가 일으키는 힘이 본체 1번 통과했을 때 업데이트 힘과 비슷하게 유지된다.

densification 용량 억제는 일단 자유롭게 쭉 가다가, 한계에 다다르면 그 때부터는 픽셀 별로 앞서 계산한 error score가 가장 큰 GS 1개만 추가하는 방식이다. 해당 픽셀 렌더링에 개입하는 모든 GS를 densification하도록 하는것이 아닌 가장 큰 1개만. 그럼 메모리는 정말 미미하게 늘어난다.

그렇게 하면 증식 속도가 굉장히 무난하게 올라간 뒤 수렴한다. 기존 3DGS가 울컥 울컥 올라가는 것은 중간에 opacity 0 초기화 때문이다. 근데 뒤에 후술하겠지만 새로운 방식에서는 opacity 0으로 충격적 초기화하는 방식은 안쓰기 때문에 더 스무스함.

pruning을 위해 opacity 0 충격적 초기화를 하는데, 새 방식에서는 그렇게 안하고 매 densification 시도마다 opacity를 linear하게 0.001씩 빼주는 방식으로 했다. 그러면 매번 계속 opacity를 작아지도록 강제하는 것인데 정말 중요한 애들은 그걸 이기고 여전히 커질 것이고 쓸 모 없는 애들은 루프를 돌다가 0으로 수렴해버릴 것이기 때문이다. 더 완만하고 안전한 pruning이라고 생각함

근데 모든 gs를 opacity 0을 향해 가도록 유도하는 방식이기 때문에 전체 opacity가 낮아져버리는 경향이 생길 수도 있다. 따라서 이를 억제하기 위해서 alpha compositing 다 하고 나서 남은 값이 0이 되도록. 다른 말로는 픽셀 color를 해당 픽셀을 구성하는 gaussian이 100% 꽉 채워서 렌더링하도록 한다. 
이 논문 가치가 높아 보인다.
반응형