MesonGS: Post-training Compression of 3D Gaussians via Efficient Attribute Transformation
3D Gasussian Splatting으로 서비스하기 위해선, 속도도 중요하지만 모델 크기도 중요한 요소 중에 하나입니다. 여러 compression 기법이 적용되어 있는 연구를 소개드리고자 합니다.
Overview
① Pruning Gaussians : 중요하지 않은 Gaussian을 제거합니다. view-dependent, view-independent 를 둘다 고려합니다.
② Voxelization : voxel로 구성된 좌표계로 만들기 위해 octree를 사용해서, Geometry compression합니다.
③ Replacement : 3D-GS를 구성하고 있는 parameter의 크기를 줄입니다. 3DGS의 Gaussian rotation 쿼터니언 표기법을 Euler angle표기법으로 변환하여 줄 일 수 있고, opacity, SH coefficient 등에 중요하지 않은 값들을 분류합니다.
④ RAHT(Region Adaptive Hierarchical Transform)
⑤ Quantization : block을 quantization합니다.
⑥ Clustering : color를 표현하는 sperical harmonic coefficient를 압축하기 위해, vector quantization을 적용합니다.
⑦ Entropy coding : 이렇게 압축된 모든 구성 요소는 LZ77 codec으로 압축됩니다.
Gaussian Pruning
중요한 Gaussian 포인트만 남기고 나머지를 제거해서, 전체 데이터 크기를 줄이는게 목표입니다. 랜더링 결과에 중요도를 평가하는 방식으로 작동합니다. view-dependent 중요도 $I_d$와 view-independent 중요도 $I_i$곱으로 정의됩니다. $$ I_g = I_d × I_i$$ $I_d$는 Gaussian point가 특정 픽셀에 얼마나 기여하는지를 기반으로 계산하며 LightGaussian에서 제안한 기법을 사용했습니다. $P$는 하나의 Gaussian이 랜더링되는 픽셀 집합이고, i는 Gaussian의 index, $\alpha$는 opacity입니다. opacity를 사용해 gaussian의 기여도를 평가하게 됩니다. (다른 연구 VQHF는 Gaussian과 관련있는 sample points의 평균값으로 중요도를 매겼었고, C3DGS에서는 backward gradient를 중요도로 사용했었다고 합니다.)
$I_i$는 Gaussian의 부피(Volume)으로 계산되며, Gaussian의 scale vector에 의해 결정됩니다. $$ I_i = \left( V_{\text{norm}} \right)^{\beta}$$ $V_{\text{norm}}$은 전체 Gaussian를 부피 값을 기준으로 sorting하고 상위 90%를 0과 1사이로 정규화합니다. $\beta$는 $I_i$의 크기를 조절하기 위한 미리 정의되는 hyperparameter입니다.
저자가 실험해봤을 때 Gaussian의 약 40%가 전체 중요도(=$I_g$)의 80%이상을 차지하는 것을 확인했고, Gaussian을 제거해도 랜더링 품질을 유지 할 수 있었다고 합니다.
때문에 threshold값을 정의하여 해당 값 이하의 Gaussian Point를 제거하는 방식을 사용했습니다.
Geometry Compression
Octree형태로 공간(voxel)을 분할합니다. octree는 3개 차원을 1/2씩 분할하여 총 8개의 공간(voxel)으로 만들 수 있습니다 이 voxel은 필요한 해상도에 도달할 때까지 반복해서 분할 됩니다. 밀집된 영역은 더 깊게 분할 되고 포인트가 없다면 분할되지 않습니다. 각 voxel은 8bit로 표현되며, 각 voxel의 8개 하위 voxel의 점유되었는지 여부를 나타내는 용도로 사용됬습니다. 압축과정에서 octree깊이를 조절하여 octree의 크기를 제어했고, 적절한 해상도를 유지하면서 파일 크기를 맞추는데 초점이 맞춰졌습니다. 하나의 voxel 내에 여러 gaussian point가 존재 할 경우 그 gaussian의 attribute(=color, size, rotation등)를 평균화하여 중복을 제거했다고 합니다. 이 말은 octree의 깊이가 엄청 깊고, voxel의 크기가 gaussian이 10개 미만으로 들어갈만큼 작다고 추측되어 집니다.
일반적으로 octree로 구성할 경우, 밀집된 영역만 세밀하게 표현 할 수 있으므로 3D공간을 표현 할 때 효율적이며, 빈 공간을 적절히 무시하면서 차지된 공간만 효율적으로 저장 할 수 있습니다. 이 단계는 뒤에서 설명드릴 RAHT 알고리즘에서 사용됩니다.
Attribute Transformation and Compression
3D Gaussian에서 중요한 attribute와 중요하지않은 attribute로 구분했습니다.
- impoartant attribute는 opacity, scale, rotation/Euler angles, SH 1D+coefficient이고
- unimportant attribute는 SH 0D coefficient로 두었습니다.
important attribute를 압축 방법을 아래에서 하나씩 소개하겠습니다.
Replacement
3D-GS의 Rotation 정보는 기본적으로 쿼터니언으로 되어있습니다. 총4개의 실수값으로 되어 있는데, 이 용량을 줄이기 위해서 3개 실수값으로 구성된 오일러 각도로 변환하게 됩니다. 논문에서는 쿼터니언→오일러 각도→rotation matrix 변환이 언급되어 있는데 일반적인 수식이므로 첨부를 생략하겠습니다. 아래 왼쪽 그림은 오일러 각도입니다.쿼터니언은 4개의 복소수로 구성되어 있어서 찾아봐도 별도의 그림이 없습니다.(그림 출처 : link)
이전 다른 연구인 C3DGS에서는, 쿼터니언(4개)+scale(3개)를 공분산 행렬로 변환할 때 공분산 행렬이 대각성분을 기준으로 symetric한 점에 착안해서, upper triangular matrix(예시, 위 오른쪽 matrix)를 사용해서 압축을 시도 했었습니다. 하지만 이 값을 뒤에서 설명드릴 quantization(실수값을 근사화해서 저장)할 경우 항상 양수가 되어야 할 값이 음수로도 변환되기도 해서 퀄리티의 하락이 발생했다고 합니다.
RAHT(Region adaptive hierarchical transform)
RAHT는 3D Point Cloud를 압축하는 "Compression of 3d point clouds using a regionadaptive hierarchical transform, 2016" 연구에서 제안된 방법입니다. Octree 형태의 구조에서 (위에서 언급한) gaussian importatnt attribute들을 coefficient형태로 바꿔서 압축합니다. coefficient는 하나의 direct current(DC)와 여러개의 alternating current(AC)로 구성됩니다. 논문에선 이를 어떻게 적용하는지 (3차원이 아닌) 2차원 예시로 설명하고 있습니다.
voxel이 $a_0, a_1, a_2$ 이 주어집니다. $a_0$우측엔 octree의 voxel이 없는 예시입니다. x축부터 연산합니다. $a_0$는 짝이없어서 연산하지 않고, $a_1$, $a_2$는 $T_1$으로 연산됩니다. w는 voxel내 gaussian의 갯수로 구성됩니다.
T함수를 거쳐서, DC coefficient인 d와 AC coefficient인 c로 만들어집니다. 같은 방법으로 y축을 연산합니다. 그리고 Decoding을 한다고 짧게 언급만 되어 있습니다. 그 외 별다른 설명이 없어서 추측을 해보자면(소설을 써보자면..), 이렇게 만들어진 $d_2$, $c_1$, $c_2$는 0~1사이의 실수값으로 구성되어 있고, 해당 연산이 octree의 깊이별로 만들어지게 될 것 같습니다. 그리고 깊이별로 gaussian important attribute가 주어지면, 여기에 AC, DC값이 곱해지면서 leaf node엔 원래 값이 만들어지지 않을까 추측해봅니다.
이렇게 하면 인접한 Gaussian들의 attribute 간의 coefficient만 저장하면 되므로 많은 값이 압축되게 됩니다.
Block quantization
양자화는 적은 원 bit수를 적은 bit수로 표현하는 것을 말합니다. 논문에서는 DC coefficient는 양자화하지 않고, AC coefficient를 양자화하게됩니다. DC를 양자화 하지 않는 이유는 (0,0,0) 좌표에서 원본 attribute를 갖고 있기 때문이지 않을까합니다. gaussian attribute를 하나의 채널로 한번에 양자화하게 될경우 정보 손실이 커지므로, gaussian attribute의 각 채널을 여러 block으로 나눠서 양자화 하고 있습니다. 각 block c에 대해 아래 수식으로 양자화를 수행합니다.
b는 bit-width이고 Z의 [ ] 부호는 반올림 (rounding-to-nearest)하고 clamp()는 min값이하를 min으로 만들어주고, max값이상을 max로 만들어주는 수식을 의미합니다. 블록내 값을 제한하여 양자화 오차를 줄일 수 있다고 합니다. c는 양자화 전 attribute이고 $c_q$는 양자화된 attribute입니다. 8bit로 양자화 할 때, scale vector는 exponential 형태라 오차를 크게 확대 시키기 때문에 scale vector의 경우 양자화 하지 않는다고 합니다.
추가로 decoding을 위해 모든 block의 attribute별로 min,max값을 저장해둔다고 합니다.
Clustering 1+D SH coefficients
3DGS의 color값은 SH coefficient(이전글 참조)로 저장됩니다. SH는 모델 크기의 85.7%를 차지하기 때문에, 압축에 중요한 attribute입니다. 1차원 이상의 SH coefficient에 대해 미리 정해진 codebook을 사용해 양자화를 진행합니다. 이 차원이라는 것은 Y_l^m(\theta, \phi) 에서 l에 해당합니다.
기존 coefficient 32bit를 단순히 1bit로 압축을 할 경우 (아래 가운데 그림과 같이) reflection이 사라지기 때문에 이 방법을 사용하지 않았다고 합니다.
논문에서는 codebook에서 원본과 가장 유사한 값과 매칭시켜 code값을 저장하는 방식을 사용합니다. 이를 통해 고정된 크기의 code word로 대체되어 SH 계수의 의 저장 공간을 크게 줄이게 됩니다. 이방법을 적용한 결과는 가장 오른쪽 그림에 해당합니다. 추가적으로 memory 점유율과 encoding time을 줄이기 위해, batch단위로 clustering 기법을 적용합니다. 여러 iteration에 걸쳐서 해당 방법이 수행됩니다. w/o FT는 뒤에서 언급될 finetuning을 하지 않은 경우 결과를 의미합니다.
Encoding
최종적으로 아래와 값들이 만들어집니다.
- Octree
- DC coefficients, AC Quantized coefficients
- Codebook, mapping table
- Metadata : 각 block의 quantized된 coefficient, octree depth, block size의 Min-Max 실수 값
이들을 한번 더 LZ77 codec으로 압축합니다.
Finetune
1) 기존 방법들과 비교를 하기 위해서, 2) backpropagation을 할 수 없는 이전 방법론들의 문제를 해결하기 위해서 finetune방법을 제안하고 있습니다. 가지치기된 3D Gaussian의 좌표를 고정하고, 해당 attribute를 finetune합니다.
forward process시에 encoding, decoding process를 simulate하였고, backward process시에 gradient를 전파하기 위해서 straight-through estimator를 적용했습니다(이 부분은 정확히 이해가 되지 않습니다).
Experiments
3DGS에서 많이 사용되는 Mip-NeRF360, Tank&Temples, Deep Blending, NeRF-Synthetic 데이터셋에 대해 실험했습니다.
3D-GS 대비 랜더링 퀄리티는 약간 감소하고, 모델 사이즈는 확연히 줄였습니다. compression 다른 연구인 C3DGS대비, 랜더링 퀄리티는 약간 향상하고 사이즈도 약간 줄였습니다.
Qualitve comparision입니다.
해당 scene에 관해서, 육안으로는 큰 차이가 없는 것을 볼 수 있습니다.
Pruning 실험결과입니다.
purning 결과만 보기위해, 모든 method에 대해 66%의 gaussian을 제거하였고 quality를 비교하였습니다. 본 논문이 더 적은 gaussian으로 높은 랜더링 퀄리티를 보이는 것을 확인 할 수 있습니다.
encoding 속도입니다.
compression을 위한 encoding시간을 비교하였을 때, 본 연구(MesonGS)가 빠르게 encoding되는 것을 볼 수 있습니다. 해당 결과는 finetuning을 하지 않았을 경우라고 합니다. Gaussain의 갯수가 2만개 이하일 경우엔 CPU에서도 빠르게 encoding 할 수 있었다고 합니다.
final 저장 크기 구성을 octree, metadata, important attribute, unimportant attribute로 나눠서 언급하고 있습니다.
synthetic-NeRF데이터셋에서 43%, 0.04%, 34%, 23% 이고,
Mip-NeRF360데이터셋에서는 39%, 0.02%, 47%, 14% 로 저장됬습니다.
octree와 important attribute가 전체의 50%이상을 차지하고 metadata는 적은 비중을 차지하는 것을 볼 수 있습니다.
RAHT 실험 결과입니다.
8bit로 quantization을 진행하였습니다. 앞서 언급하였듯이 scaling factor를 quantization할 경우(가장 오른쪽) 퀄리티가 낮아짐을 볼 수 있습니다. 위에서 R+는 RAHT를 나타냅니다. 4번째 그림이 최종적으로 사용된 모델입니다.
Block Quantization 결과입니다.
타우는 pruning threshold를 의미합니다. 타우가 작아지면 가우시안갯수가 많아지므로 모델크기는 커지고 퀄리티도 좋아집니다. block quantization의 경우, 모델크기는 커지면서 PSNR이 향상되는 것을 볼 수 있습니다.
Ablation Studies
cluster는 SH coefficient quantization을 나타내고 TQ는 RAHT를 나타내고 Q-scales는 quantizing scale을 나타냅니다.
Pruning시에 66% 없앴다고 했기에, 1/3크기로 줄어듭니다. bound scene인 synthetic-NeRF에서 압축률이 더 좋은 것을 확인 할 수 있습니다.SH quantization시에도 1/4로 줄어드는 것을 볼 수 있습니다. 거기에 RAHT에서 1/(2.5) 으로 줄어듭니다.
그 외, pruning의 threshold가 중요하다는 점을 한번 더 강조하고 있습니다. 8bit로 양자화 했을 때, 아이러니하게도 33%가지치기한 결과가 66%가지치기한 결과보다 퀄리티가 더 낮았다고 합니다. 33% 가지치기할 경우 너무 많은 포인트가 남아있어서, 양자화 후 과도한 정보 손실이 발생하게 되어서 나타난다고 하는데, 정확히 이해가 되진 않습니다. 16bit 양자화 할경우엔 33% 가지치기한 결과가 더 좋은 성능을 보였다고 합니다.
Closing..
3DGS compression에 대해 여러 방법론을 알 수 있는 논문이라 생각됩니다. 3D-GS로 서비스화가 점점되고 있는 상황에서 중요한 논문이라 생각되어집니다. 아쉬운 부분은 encoding은 열심히 했는데, decoding시 rendering속도가 언급안되어 있는점입니다. rendering 속도가 느리다면 서비스에 사용 할 수 없을텐데, 서비스에 상관없이 단순히 compression rate만 높인 논문인지 알 수가 없네요. 코드가 공개되어 있어서 빌드를 해볼 수는 있습니다. 혹시 실행해 보신분 있으시다면, 댓글 부탁드리겠습니다.
'3D-GS' 카테고리의 다른 글
[논문 리뷰] DiffusionGS (arXiv 2024) : Single Image-to-3D (0) | 2025.01.02 |
---|---|
[논문 리뷰] Long-LRM (arXiv 2024) : 3DGS 학습 1.3초 (0) | 2024.12.16 |
[논문 리뷰] TransGS (arXiv 2024) : 실시간 얼굴 editing (0) | 2024.09.22 |
[논문 리뷰] 3DGStream (CVPR 2024) : Free-view Video 생성 (0) | 2024.09.08 |
[논문 리뷰] Scaffold-GS (CVPR 2024) : MLP기반 3DGS (4) | 2024.08.25 |
댓글