본문 바로가기
NeRF

[논문 리뷰] Zip-NeRF (ICCV 2023) : Anti-Aliasing, 속도 개선

by xoft 2023. 8. 2.

Zip-NeRF: Anti-Aliased Grid-Based Neural Radiance Fields, Jonathan T. Barron, Google Research, ICCV 2023

 

아래 영상은 최종 결과물입니다.

 

Zip-NeRF는 당시 퀄리티 관점에서 Top인 MipNeRF360속도 관점에서 Top인 iNGP의 장점을 조합한 연구입니다.

  • MipNeRF 360의 Integrated Positional Encoding 사용 → Anti-aliasing을 통해 iNGP보다 8-77%낮은 에러율 달성
  • iNGP의 Grid-based모델링으로 3D coordinate에 대한 interpolation → MipNeRF360보다 24배 빠른 학습 속도 달성

글의 전체적인 내용은 2개의 모델을 합치려다 보니, 생겼던 문제들을 해결하는 방식으로 서술됩니다. Zip-NeRF로 이름을 지은 이유가, Speed가 Zip(=압축)스럽고, Mip와 스펠링이 비슷하고, 지퍼처럼 생긴 aliasing artifact를 개선했기 때문이라고 합니다.

 

제가 리뷰한 논문들 중에 가장 난이도 있는 논문입니다. 때문에 NeRF의 기초 개념들이 많이 생략되었습니다. 이전글들 참조 바랍니다.

[논문 리뷰] NeRF (ECCV 2020) : NeRF 최초 논문

[논문 리뷰] Mip-NeRF 360 (CVPR 2022) : Anti-Aliasing 연구2

[논문 리뷰] Instant NGP(SIGGRAPH 2022) : 인코딩 방법 개선으로 속도 향상

 

 

 

2개 모델 각각의 문제점

  • Grid-based 연구인 iNGP는 학습 속도가 빠릅니다. 하지만 scale에 대해서 explicit하게(<->MLP는 implicit) 이해하는 것이 부족하여, aliasing(신호가 샘플링으로 재구성될 때, 일그러지는 현상)을 만들게 됩니다. aliasing은 jaggies(계단모양픽셀)를 만들거나, scene content를 missing하는 형태로 나타납니다.
  • 반대로 Anti-Aliasing연구인 Mip-NeRF 360은 랜더링 퀄리티는 좋지만, 학습 속도가 느립니다.

 

 

 

모델 조합시 문제점1) Encdoing 방식의 차이

  • NeRF는 ray 위의 3D point들을 Encoding하여 MLP의 입력으로 사용합니다. (MLP 출력값은 RGB, density)
  • Mip-NeRF360은 ray위의 각각의 인접한 3D point 사이를 gaussian 형태로 Encoding하고 MLP의 입력으로 씁니다.
  • iNGP는 ray위의 3D point에 인접한 grid의 8개 3D point들을 Encoding하여 MLP의 입력으로 넣고, MLP 결과로 나온 값을 Interpolation합니다.

=> Ray위의 3D point는 인접한 grid의 8개 3D points값으로 Interpolation 할 수 있지만, Mip-NeRF360의 가우시안 Encoding값은 인접한 grid의 8개 Interpolation 될 수 없습니다.

 

 

 

Mip-NeRF 360의 Anti-Aliasing 분석

논문에 Mip-NeRF는 Fourier Feature를 가지며 gaussian의 표준편차보다 sign함수의 주기가 커질 때, sign함수의 진폭이 줄어든다고 표현되어 있습니다. 이 말을 풀어서 써보자면, Mip-NeRF는 '임의의 입력 신호를 다양한 주파수를 갖는 주기함수들의 합으로 분해해서 표현'하는 Fourier transform(개념과 아래 그림 출처: link)을 따르기 때문에, sub-volume의 크기보다 큰 wavelenght를 가지는 주기함수로부터 sub-volume의 위치를 표현할 수 있습니다.

MipNeRF360에서는 이러한 Fourier Feature를 사용하기 때문에, position과 scale 둘다를 encode 할 수 있었고, 3D scene의 multi-scale representation을 학습 할 수 있었습니다.

 

 

Zip-NeRF에서는 multi-sampling과 feature-downweighting기법을 사용해서, (Mip-NeRF 360의 conical frustum을 isotropic Gaussian 집합으로 바꾸는 방법으로) Aliasing을 해결 하였습니다.  (isotropic과 anisotropic 용어 개념 참조 : link)

scene안에 존재하는 anistropic sub-volume들을 그 sub-volume의 shape로 근사하는 point집합으로 바꾸면, 그 point들은 어떤 scale을 가진 isotropic Gaussian으로 가정됩니다. 이러한 가정은 sub-volume에 걸쳐있는 feature grid의 적분값을 근사 할 수 있게 만듭니다. 이러한 feature들을 downweight하고 평균내면, iNGP grid에서 scale-aware한 prefiltered된 feature들을 얻을 수 있습니다.

 

 

 

Multi-Sampling

instant-NGP는 MLP가 coordinate를 입력으로 요구되지만, Mip-NeRF 360은 gaussian 형태의 입력을 요구합니다. 이를 맞추기 위해서 Multi-sampling 기법이 제안됩니다.

 

Ray위의 점을 샘플링(검정선위에 검정점)하고, 인접한 점을 t0, t1라고하면, 그 점 사이의 conical frustum(원뿔절단체) 모양을 근사하는 6개 점을 선택합니다. 논문에선 6-point hexagon pattern을 가진다고 표현되어 있으며, 아래 공식을 갖고 points가 선택되어집니다. 학습시에 랜덤성을 갖게 하기 위해, flip되고 30도씩 rotation됩니다. 수식은 t0와 t1 좌표값으로 전개되며, 이렇게 선택된 6개의 점은 r*tj/root(2)를 표준편차(0.5로고정?)로 가진 isotropic Gaussian의 평균값으로써 사용되어집니다.

 

 

 

Downweighting

multisampling이 aliasing을 제거하는데 효율적이지만, 각 multisample points에 대해 trilinear interpolation을 naive하게 적용하는 것은 여전히 high frequency에서 aliasing을 만들었다고 합니다. 그래서 각 multi-sample의 isotropic Gaussian크기가 각 grid cell크기에 fit한지에 대한 정도로 각 grid cell scale마다 feature를 re-weight하였습니다. 가우시안 크기가 interpolation되어지는 cell보다 크다면, 신뢰 할 수 없는 값이기 때문에, downweighted되어져야 합니다.

 

iNGP에서는 coordinate x에서 각 Grid Level의 Vertex로 interpolation될 때, grid 해상도 크기 n으로 scaling 후 interpolation을 했었습니다. Zip-NeRF에서는 coordinate x가 아닌 mean x와 std(standard deviations) σ 으로 구성된 Gaussians 집합으로 interpolation했습니다. Gaussian CDF를 reasoning함으로써, scale-dependent한 downweighting factor w로 scaling하여 [-1/2n, 1/2n]^3 큐브 범위 안의 각 Gaussian's PDF의 부분을 계산 할 수 있었습니다.

 

Vertex의 값이 평균이 0인 normal distribuion을 갖도록 weight decay를 설계했습니다. 이러한 설계를 통해, Gaussian이 zero-mean을 가정하는 것은 각각의 multisample의 Gaussian이 아래 수식에 관한 grid feature로 근사하게 합니다.

위 수식을 토대로, 각 multisample의 interpolated feature에 대한 weighted mean값은 conical frustum에 대한 expected feature 근사치를 계산하는 것으로 볼 수 있습니다.

 

 

 

 

모델 조합시 문제점2) Z-Aliasing

Z-Aliasing은 카메라가 z축으로 이동하면, 특정 영역의 density가 사라지는 현상입니다.

 

Mip-NeRF 360 개념 중 Proposal MLP는 training과 rendering시, ray위의 어떤 점들을 sampling 할 것 인지를 찾는 함수이며, 점 간의 간격(interval)을 계산합니다. Sample point의 color와 density는 proposal MLP가 아닌 NeRF MLP를 통해 계산됩니다. MipNeRF 360 이전글 의 "MLP를 어떻게 설계하였는가?" 단락을 참고 바랍니다. Z-aliasing은 이 Proposal MLP로 인해 발생합니다.

 

Mip-NeRF 360은 Proposal MLP방식을 통해 속도와 퀄리티 향상을 보였지만, volume density를 출력하는 MLP의 입력 coordinate에 대해 부드럽지 않게(non-smooth) mapping을 학습하는 경향을 보였습니다(아래 왼쪽 그림 Loss부분). 이 Proposal MLP가 "skips" scene 영역을 만들게 되며 이 영역이 artifact로 간주됩니다. mip-NeRF 360에서는 감지하기 힘들었지만, 빠르게 optimize하는 특성을 가진 MLP대신에 iNGP를 백앤드로 proposal network를 사용한다면, camera가 z축으로 움직일 때 시각적으로 더 두드러져 보이게 됩니다. 

 

mip-NeRF360의 z-aliasing의 근본적 원인은 proposal network를 학습할 때 사용되는 "interlevel loss"입니다. interlevel loss는 proposal network의 출력값이 NeRF network 출력값 보다 작게 만드는 Loss입니다.(<- Mip-NeRF 360과 Zip-NeRF의 서술된 방식을 토대로 주관적으로 많이 압축, 의역한 한 문장입니다.) 이를 해결하기 위해, continuous하고 smooth한 loss를 설계하였습니다.

 

위 그림은 Predicted된 값과 GT값의 차이로 Loss가 계산되어지면, Loss가 NeRF MLP로 전파되어 학습되고, NeRF MLP의 값을 모방하도록 Proposal MLP가 학습되는 그림을 보입니다. NeRF Network는 fine한 points에 대해 모델링하기 때문에 좁은 사각형으로 그린 것으로 보이고, Proposal Network는 coarse한 영역 대해 모델링하기 때문에 큰 사각형으로 그린 것으로 보입니다. 왼쪽 그림처럼 Loss에 단차가 있을 경우, z-aliasing이 발생하고, 오른쪽과 같이 Loss에 단차가 없도록 만드는 방법에 대해서 아래에서 다룹니다.

 

 

 

Blurring a Step Function

ray위의 distance를 smooth하게 만드는 loss 함수를 설계하기 위해, discrete한 piecewise-constant 함수를 continuous한 piecewise-linear 함수로 바꾸는 알고리즘이 필요합니다. discrete한 1D signal을 smoothing하는 것은 Gaussian filter를 통과시키면 되기 때문에 단순합니다. 하지만 단차가 생기는 경계지점(=endpoints)을 continuous하게 만드는 것은 다루기가 어렵습니다. 샘플된 point의 간격이 넓으면(위의 왼쪽그림 NeRF W), 각 point는 더 좁은 영역의 값을 커버하기 때문에, 단순히 convolution을 하거나 rasterizing하는 것은 안됩니다. 때문에 아래와 같은 방법을 제안합니다.

s는 1개 ray위의 점을 의미하고, w는 point에 대한 weight값으로써, 카메라에서 Point까지의 투명도 값과 Point의 불투명도를 나타내는 alpha값을 곱한 값입니다. 이전 NeRF코드리뷰 글에서 3/5지점에 코드와 설명 참고바랍니다. s,w는 NeRF MLP의 값을 나타내고, s헷,w헷은 Proposal Network의 값을 의미합니다. 

1) 점사이의 간격으로 w를 normalize합니다. pdf의 적분값이 1이하가 되도록 만듭니다.

2) radiaus r을 정하고, 2*r만큼 convlove(합성곱)합니다. 그러면 사다리꼴형태의 연속함수가 된다고 합니다.
    : 이 부분은 이해하지 못했습니다. Filtering by repeated integration(1986)제목의 논문이 인용되어 있습니다.

3) MLP Network에서 샘플링된 points에 대한 pdf를 cdf으로 만듬으로써,

4) Proposal Netork에서 샘플링된 points에 해당하는 weight를 quadratic interpolation(4개점으로 interpolation)으로 계산 할 수 있게 합니다.

5) 그렇게 획득한 weight값(초록색)과 Proposal Network를 통해 계산된 weight값(노란색)간의 Loss를 계산하여, Proposal Network를 업데이트 합니다. 초록색을 blurred NeRF weight라고 지칭합니다. 이 때 사용하는 Loss함수는 아래와 같습니다.

위 수식에 대한 의미를 다시 생각해보겠습니다. s와 s헷의 좌표 차이가 존재해서, Loss값이 제대로 전파를 못했지만, 이러한 계산 과정을 통해 NeRF network의 값을 Proposal network로 smooth하게 전달 할 수 있게 합니다.

 

 

 

 

Normalizing Metric Distance

Mip-NeRF 360에서는 ray위에서 샘플링 할 구간을 t_near과 t_far로 parameterize하였고, 0~1값으로 normalized하였습니다. t좌표계를 사용하여 랜더링하였고, normalized된 공간은 s좌표계를 사용해서 proposal network의 point를 resampling하였습니다. 두 좌표계를 transform 할 수 있는 일대일함수를 g로 정의 하였었습니다. Mip-NeRF 360에서 사용되던 interlevel loss에서는 단순한 transformation에서 일관성(=불변성)을 보였기 때문에, g함수가 큰 영향을 주지 않았습니다. 하지만 위에서 소개한 Zip-NeRF 방법을 사용할 경우 일관성이 사라지면서 g함수의 교체가 필요해졌습니다.

위 함수를 power transform이라고 부릅니다. 이를 시각화하면 아래와 같습니다.

왼쪽 그림은 t좌표계에 관한 그래프이고, 오른쪽 그림은 s좌표계에 관한 그래프입니다. 원점에서 함수의 경사도가 1이기 때문에, 원점 주변에서의 s좌표계의 값은 t좌표계의 값과 비례합니다. 그리고 원점에서 멀어질수록, log만큼 차이가 납니다. 이 함수를 통해 다른 normalization 사이의 smooth한 interpolation을 할 수 있게 만들었습니다.오른쪽 그림을 보면, Zip-NeRF의 Power transform값은 P(2x,-1.5)에 해당되는데 s좌표계의 0~1/2에서 roughly linear하고, 1/2~1사이에서 inverse와 inverse-squre사이에 존재합니다(->모든 구간에서 적절한 경사를 가집니다?라고 해석해도 될듯합니다.)

 

 

 

Implementation Detail

Mip-NeRF360과 같이 proposal sampling은 64개로 하고 r을 0.03으로, fine samplinge은 32개 사용하고 r을 0.003으로 하였습니다. r은 Blurring Stepfunction에서 사다리꼴 연속함수 만들 때, 사용되었던 값입니다.

네트워크 부분에서는 각 round마다 iNGP와 MLP를 분리해서 사용하였고, NeRF MLP는 iNGP보다 더 큰 view-dependent branch (branch==network?)를 사용했다고 합니다.


fine scale의 magnitude로 coarse scale에 penalizing하는 것과 처럼,

Grid내 Vertex 값을 penalizing(loss값전파)을 하는 것 보다, Vertex값을 제곱하고 mean하는게 더 효과적이었다고 합니다. 이 방법으로 상당한 성능 개선이 있었다고 합니다.

 

anti-aliased interlevel loss의 loss multiplier(가중치)는 0.01, normalized weight decay에서 loss multipler 0.1을 사용했습니다.

 

 

 

실험 결과

기존 연구 대비 높은 PSNR/SSIM/LPIP (PSNR/SSIM/LPIPS 이전글) 을 가집니다.

4946x3286의 고해상도인 Mip-NeRF 360데이터셋으로 테스트 하였습니다.  scale factor는 down-scale의 배율입니다. 8x는 8배 줄인 이미지입니다. mip-NeRF360 + iNGP는 ZipNeRF에서 적용한 기법을 적용하지 않고 naive하게 붙인 모델입니다.  ablation study를 같이 진행한 표인데, Zip-NeRF에서 제안한 Multisampling을 붙였을 때 높은 성능을 보인 것을 볼 수 있습니다.

학습 속도에 대한 표입니다. 속도에 대해서는 공정하지 못했다고 생각드는게, 상단 4개에 대해서는 1개의 RTX-3090을 사용했고, 아래 3개에 대해서는 8개의 V100 GPU를 사용했습니다. 랜더링 시간은 mip-NeRF360은 7.4초, mip-NeRF360+iNG는 0.2초, zip-NeRF는 0.9초 입니다.

랜더링한 결과입니다. 자전거 spoke가 매우 가늘어서 학습하기가 쉽지 않은데, Zip-NeRF에서는 높은 퀄리티로 랜더링해냅니다. 위에서 부터 순서대로 1x, 2x, 4x, 8x down-scale한 이미지로 보입니다.

 

 

 

 

Closing...

Google Research라서 그런지, 매년 Quality면에서 성능의 정점을 찍네요. Mip-NeRF, Mip-NeRF360 모두 같은 저자입니다. 다음 연구로 quality, speed, sample-efficency를 달성한다고 하는데, 내년에는 어떤 연구결과가 나올지 기대되네요. 다만 논문이 나올 때마다, 논문 내용이 너무 어려워서.. 난관이 예상됩니다.. 제 GPU(RTX-3080)에선 모델이 메모리에 올라가지 않더군요. 지인이 A6000 1장으로 돌려봤는데, 약 10시간 정도 소요됬다고 합니다. iNGP와 같이 저사양 GPU만으로 높은 퀄리티로 랜더링 할 수 있는 모델이 나오길 기대합니다.

댓글