본문 바로가기
3D-GS

[논문 리뷰] RadSplat (arXiv2024) : lightweight & 랜더링 속도 향상

by xoft 2024. 4. 30.

RadSplat: Radiance Field-Informed Gaussian Splatting for Robust Real-Time Rendering with 900+ FPS, Michael Niemeyer, Google, arXiv 2024

 

3D Gaussian Splatting(3DGS, 이전글)에서 Gaussian의 갯수를 줄이면 어떻게 될까요? 단순히 줄인다면 랜더링 속도가 향상되면서 이미지 퀄리티가 떨어지게 됩니다. 하지만 RadSplat에서는 이미지 퀄리티를 유지하면서 랜더링 속도를 향상시키는 방법에 대해 소개하고 있습니다. 무엇보다도 놀라운 점은 NeRF분야에서 이미지 퀄리티가 Top인 ZipNeRF보다도 더 높은 퀄리티를 달성하고 있습니다.

 

 

핵심은 Ray Contribution-based Pruning 기법과 Viewpoint-based Visibility Filtering 기법입니다. 하나씩 살펴보겠습니다.

 

 

 

Overview

1. Zip-NeRF(이전글)로 Scene을 학습합니다. + 3DGS의 학습 패러미터들을 초기화합니다.

2. 학습 이미지가 아닌 Zip-NeRF 랜더링 결과를 GT로 두고 3DGS를 학습합니다. optimization하면서, 3D Gaussian Pruning을 수행합니다 (=Ray Contribution-based Pruning) .

3. test view와 가장 가까운 training view를 기반으로 3D Gaussian을 필터링하는 Post-processing을 수행합니다 (=Viewpoint-based Visibility Filtering) .

 

 

 

Gaussian Parameter Initialization

우선 NeRF연구 중에 학습속도가 빠르며 퀄리티가 가장 높은 Zip-NeRF로 Scene을 학습합니다. 그리고 각 scene마다 학습 이미지에서 무작위로 1M개를 샘플링하여, 총 1M개의 3D Gaussian값을 초기화 합니다. 최종적으로 3DGS를 구성하는 아래 6개의 변수를 초기화 하게 됩니다. 
$$ \phi = \left\{ (p_i, k_i, s_i, o_i, q_i) \right\}_{i=1}^{N_{\text{init}}} $$
p : pixel마다 ray를 그리고 랜덤 샘플링 했을 때, depth의 median값으로 point의 위치(x,y,z)를 지정합니다. 아래 수식은 Camera 좌표계에서 World좌표계로 변환수식입니다. r은 카메라 위치, d는 view direction, z는 깊이값, r은 pixel값을 의미합니다.
$$ P_{\text{init}} = \{P_{i,j} | j \in K_{\text{random}}\} \quad \text{with} \quad P_i = r_0(i) + d_{r_i} \cdot z_{\text{median}}(r(i)) $$

k : SH(이전글coefficient의 magnitude를 3으로 두면 총 16개의 coefficient가 필요로 합니다. 그 중 앞쪽 1~3개를 Zip-NeRF모델에서 획득한 color값으로 초기화 합니다.
$$ k_i = (k_{i_{1:3}}, k_{i_{4:16}}) \quad \text{where} \quad k_{i_{1:3}} = \text{C}_{\text{neRF}}(r(i)), \quad k_{i_{4:16}} = 0 $$

s : 초기화한 (1M개의) point들 중에서 가장 가까운 point간의 거리를 scale로 지정합니다.
$$ \phi = \{ (p_i, k_i, s_i, o_i, q_i) \}_{i=1}^{N_{\text{init}}} $$
o,q : opacity o는 0.1로, rotation matrix q는 단위행렬(identity matrix)로 초기화 합니다.

 

 

 

Radiance Field-based Supervision

학습 이미지가 아닌 Zip-NeRF의 랜더링 결과로 3DGS를 학습합니다.  학습 이미지보다 Zip-NeRF로 랜더링한 이미지가 노이즈 없고 clean하기 때문입니다. 그만큼 Zip-NeRF 성능이 매우 좋습니다.

아래 Loss로 학습됩니다.

$$ \mathcal{L}(\phi) = (1 - \lambda) \| r_{f}^i - r_{\phi}^i \|_2^2 + \lambda \text{SSIM}(r_{f}^i, r_{\phi}^i) \quad \text{with} \quad i \sim \mathcal{U}(N) $$

i는 pixel, f는 Zip-NeRF랜더링 이미지, Φ는 3DGS랜더링 이미지, λ는 0.2, i~u(N)은 N개 학습이미지에 대해 uniform하게 pixel을 선택한다는 의미입니다. SSIM(이전글)은 2개 이미지간의 화질 손실량을 측정하는데 사용하는 지표입니다.

 

 

Ray Contribution-Based Pruning

학습 이미지들 각각에 대한 ray를 그렸을 때, 기여도가 적은 3D Gaussian을 제거합니다. 제거할 3D Gaussian의 점수를 매기기 위해 Importance Score를 정의합니다.

$$ h(p_i) = \max_{I_f \in I, r \in I_f} \alpha_i^T T_i^r $$

이는 아래 NeRF의 Volume Rendering 수식에서 차용한 것으로 보입니다. 

$$ C_{\text{neRF}} = \sum_{j=1}^{N_s} T_j \alpha_j C_j \quad \text{where} \quad T_j = \prod_{k=1}^{j-1} (1 - \alpha_k), \quad \alpha_j = 1 - e^{-\sigma \delta_j} $$

color값을 빼고 본다면, $ T_i^r $ 는 카메라에서 scene의 surface까지 공간에 대한 투명도를 나타내고, $\alpha_i^T$는 surface의 불투명도를 나타내며 거기에 max값을 사용합니다. 표면에 대한 score를 계산하는 수식이라 생각해 볼 수 있습니다. 논문에서는 해당 score로 ray contribution을 측정한다고 보고 있습니다.

 

해당 score를 활용하여, 특정 threshold(=0.01~0.25)보다 낮은 score를 가지는 3D Gaussian를 pruning하게 됩니다.

$$ m_i = m(p_i) = 1(h(p_i) < t_{\text{prune}}) \quad \text{where} \quad t_{\text{prune}} \in [0, 1] $$

$1()$은 조건을 만족하면 1 아니면 0이라는 의미 $t_{\text{prune}} \in [0, 1]$는 0~1사이의 값이라는 의미입니다.

해당 pruning은 16,000 iteration와 24,000 iteration 때 수행됬다고 합니다.

 

 

 

Viewpoint-Based Visibility Filtering

추가적으로 test scene에서 속도를 향상시키는 post-processing 방법에 대해 제안합니다.

1. 학습 이미지에 대한 카메라 위치로 K-means 클러스터링(k개의 군집으로 묶는 알고리즘)을 수행하고, 각 클러스터의  중심들을 입력 카메라로 지정합니다(K=64). 그리고 랜덤하게 입력 카메라를 추가합니다(=랜덤 카메라 위치는 클러스터링의 목적에 반대되서 의아하네요).

2. 위에서 언급한 pruning방법과 동일하게, 클러스터링된 카메라들에 대해 importance score를 구하고, 이번에는 $ t_{\text{prune}}$(=0.001) 이상인 값들을 찾아 indicate list $m_j^{\text{cluster}}$ 로 구성합니다.

$$ h_j^{\text{cluster}}(p_i) = \max_{I \in I_{T_c}, r \in I} \alpha_i^T T_i^r, \quad m_j^{\text{cluster}} = 1(h_j^{\text{cluster}}(p_i) > t_{\text{cluster}}) $$

3. 각 testset view와 가장 가까운 trainset의 cluster view를 찾습니다.

4. 해당 view에 대한 indicate list $m_j^{\text{cluster}}$ 로 rendering을 수행합니다.

최종적으로 해당 기법은 quality drop없이 FPS를 증가시켰다고 합니다.

 

 

 

Experiment

수행시간은 ZipNeRF 학습시 V100 GPUs 8개로 ∼1h 소요되었고, 3DGS model 학습시 A100 GPU 1개로 ∼1h소요되었습니다. Test시 랜더링 속도는 RTX 3090 GPU로 측정하였다고 합니다.

평가수치에 대한 개념은 PSNR/SSIM/LPIPS 참고바랍니다. 데이터셋은 NeRF데이터셋 참고바랍니다. G(M)은 가우시안의 갯수를 Mega byte로 표현한 수치입니다. Ours Light은 $t_{\text{prune}}$가 0.25이고 Ours는 0.01입니다. Light버전이 좀 더 pruning을 많이한 모델입니다. Zip-NeRF보다도 높은 퀄리티에 높은 랜더링 속도, 작은 메모리크기를 가지는 것을 볼 수 있습니다.

 

 

 

Ablation Study

 

NeRF-based Initialization : 이 기법을 없애게되면, 작은 geometric과 texture detail을 사라지게 합니다.

NeRF-based Supervision : 이 기법을 없애면, exposure 또는 lighting variations, floating artifacts가 발생합니다.

Pruning : 위에 언급된 표를 보면, 이 기법을 없애면 Gaussian의 갯수가 증가하게 됩니다. 아래 그래프를 보면 pruning threshold증가에 따른 퀄리티를 볼 수 있습니다. #는 Gaussian의 갯수입니다. 0.77SSIM에서 Gaussian의 갯수가 10배줄어든 것을 볼 수 있습니다. 

위 오른쪽 그래프는 3DGS와 본논문의 iteration별 이미지 퀄리티를 실험한 결과입니다. 8,000 iteration에서 수렴하는 것을 볼 수 있씁니다.

 

Visibility List-Based Rendering : 이미지 퀄리티는 유지하면서, MipNeRF360데이터셋에서는 평균 10% FPS 향상을 보였습니다. ZipNeRF데이터셋에서는 45% FPS 향상을 보였습니다.

 

 

 

Limitations

1. 3DGS는 0.5~1시간소요되는데 본 논문은 대략 2시간 소요됩니다.

2. Large-scale ZipNeRF scene에서 작은 성능 차이가 발생했습니다.

 

 

 

Closing..

개인적으로 학습 속도를 증가시키는 연구들을 좋아하진 않는데, 이미지 퀄리티가 학습 속도를 상쇄시킬 만큼 기대 이상인 논문이었습니다. 충분한 시간을 갖고 학습해서 서비스 할 수 있는 시나리오라면 적용하기 좋다고 생각됩니다. 해당 연구의 아이디어를 차용해서 얼마나 실용적인 application들이 나올지 후속 논문들이 기대되네요.

댓글