본문 바로가기
NeRF

[논문 리뷰] FreeNeRF (CVPR 2023) : 적은 입력 + 퀄리티 개선 연구

by xoft 2023. 4. 14.

FreeNeRF: Improving Few-shot Neural Rendering with Free Frequency Regularization, Jiawei Yang, CVPR 2023

 

 

이번 논문 리뷰는 간단하게 진행하겠습니다. 가짜연구소 김선호님의 세미나를 듣고 작성하였습니다. 

-> FreeNeRF 세미나 유튜브 바로가기   

기존 논문 리뷰 방식과 다르게 전체 개념은 해당 세미나를 통해 이해하였고, 세부 개념들은 논문을 다 읽지 않고, 발췌독하여 작성하였습니다.

 

 

적은 입력 이미지(3개~9개)로 학습하고, Novel View에서 높은 퀄리티로 랜더링하는 방법에 관한 연구입니다.

NeRF 코드에서 단 1줄만을 수정했고, 2개의 Regularization Term을 적용해서 기존 연구를 개선했다고 합니다.

  • NeRF의 Frequency Encoding 개념에서 Frequnecy Range를 Regularization
  • 카메라 가까이에 있는 Point에 대한 Density를 Regularization

이 두 가지를 소개하겠습니다.

 

 

 

기존 접근법들의 문제점

Transfer Learning 기반 PixelNeRF, MVS-NeRF 에서는 Large Scale Multi-view dataset로 pre-training이 필요했습니다.

 

Depth-Supervised 기반 DS-NERF, Dense Depth Prior에서는 Depth가 external supervisory signal 필요하였고 이로 인해 training pipeline이 복잡해졌습니다.

 

Patch-based Regularization 기반 DietNeRF, RegNeRF, NeRF meet differential geometry 에서는 별도로 semantic/ geometric/apperance consistency(일관성)를 맞춰야 했었고 요구되었고, 그로 인한 patch rendering으로 인해 연산 비용이 증가했습니다.

 

 

 

Frequnecy Regularization

최초 NeRF의 Positional Encoding(이전 글 참조) 을 진행할 경우에 p가 아래와 같은 배열로 구성이 됩니다. p는 입력좌표값 x,y,z일 경우 3채널로 될 수 있고, view dierection θ,φ 일 경우 2채널이 됩니다. 이 값들이 Positional Encoding을 통해 입력 feature의 차원을 2*L배 만큼 증가해줬었습니다. 입력값 p를 그대로 Network에 넣어주기엔, 입력 feature 차원이 너무 적으므로 feature의 크기를 증가시키기 위해 사용되어 졌었습니다.

그리고 원래 입력값과 Positional Encoding한 값을 concatnation해서 Network의 입력으로 사용했었습니다.

이러한 설계가 Few Shot을 입력으로 학습하게 될 경우, 적은 입력으로 Overfitting하게 된다고 보았습니다. L을 증가시킬 경우 High Frequency를 갖고 가게 되어 Overfitting이 되고, L을 감소시킬 경우 Overfitting은 줄어들지만 Low Frequency를 갖게 되어 영상의 퀄리티가 낮아지게 됩니다. 때문에 L 값을 조절하여, 양쪽의 장점을 갖고 오고자 하였습니다.

 

 

이를 개선하기 위해, 소스코드에서 아래 한줄을 수정했다고 합니다.

위 식에서 L은 코드상 상수로 고정되어 있고, visible ratio인 x%]를 통해 차원의 크기를 조절해주게 됩니다. (논문 수식에서 괄호 오타가 난 것 같네요.) 그리고 부등호를 설명하자면, 배열의 int(L*x%])  이후의 값은 모두 0으로 처리한다라는 python 문법입니다.

예를 들면, 입력 좌표가 Positional Encoding을 통해 2*L배 차원이 늘어났다면,  x가 1.0이면 2*L배만큼 차원이 증가 되는 것이고, x가 0.2이면 2*L*0.2배만큼 차원이 증가되게 됩니다.

다르게 표현하자면, x가 크면 high frequency feature를 만들고, x가 작으면 low frequency feature를 만들게 됩니다.

논문에서는 x를 Training Interation Step에 따라 다르게 적용해서, low freqency feature부터 high frequency feature까지 모두 대응할 수 있도록 하였습니다.

(4)의 좌측항은 FreeNeRF의 Positional Encoding 결과값이고, 우측항의 ⊙ 왼쪽은 기존 neRF의 Positional Encoding 결과값, 오른쪽은 Mask Term입니다. Mask가 위에 설명한 코드와 매칭이 됩니다.

(5) 수식을 보면, NeRF의 Positional Encoding 결과 배열의 i번째 bit가 특정 조건을 만족할 경우에 출력되는 값으로 표시되어 있습니다.  T는 총 iteration 수이고, t는 현재 iteration입니다. 초기 iteration 에서 t가 0일 때는 앞쪽 3bit만 1이 됩니다. 초기 입력값이 좌표일 경우 3bit 배열(view direction일 경우 2bit 배열)이므로 Positional Encoding이 적용되지 않은 상태입니다. t가 T에 가까워 질수록, 모든 bit가 1이 되므로 최초 NeRF와 같은 Positional Encoding값을 사용하게 됩니다. t가 0 일 때, t가 T일 때 양 극단의 경우만 설명했었고, 그 중간에 단계에서는 위 수식을 보면 Linear하게 1인 bit가 증가하는 것을 생각해 볼 수 있습니다. 분기문이 많은데, 위 수식을 코드상으로 한줄로 작성했다고 합니다.

 

이러한 설계를 통해, Learning Process를 안정화시키고, Catastropic Overfitting을 방지했다고 합니다. 

 

 

 

Occlusion Regularization

Frequency Regularization으로는 적은 수의 이미지를 입력으로 인해, ill-posed 문제 때문에, novel view에서는 artifacts가 발생 했었습니다. 물체가 카메라에 엄청 가까이에 위치하였을 때 이러한 현상이 두드지는 것을 발견했습니다. 입력 데이터가 많은 경우에도 발생했었기에 Mip NerF 360에서 Distortion Loss를 통해 이를 해결하였지만 few-shot 환경에서는 적용 할 수 없었습니다.

실선 박스가 train view이고, 점선 박스가 test novel view입니다. (a)영역과 (b) 영역은 데이터가 1장씩 밖에 없습니다. 분석해보니 (a), (b)영역이 카메라 가까이에 있는 것이라고 해석 되었다고 합니다. Mip-NeRF 360에서도 적은 수의 overlapped되는 영역이 발생할 경우 floater가 발생했다고 합니다. 때문에 카메라 가까이에 있는 영역에 penalty를 주는 방식으로 설계하게 됩니다.

 

카메라 가까이에 있는 Floater(떠다니는 잡음 voxel)를 제거해주기 위해, Ray 위 카메라로 부터  M번째 point까지 volume denstiy에 대해 penalty를 주어, M번째 Point까지의 Volume density값이 0이 되도록 만들었습니다. mk는 Ray위의 점 갯수 K만큼의 배열이고, 상수 M번째 bit까지는 1, 그 이후는 0으로 구성된 mask입니다.

 

 

 

Implementation

NeRF와 mipNeRF를 개선하였다고 합니다. Blender dataset에 대해 NeRF의 성능을 개선하기 위해서 DietNeRF 소스코드를 사용하였고, DTU dataset과 LLFF dataset에 대해 Mip-NeRF(이전글 바로가기)의 성능을  개선하기 위해 RegNeRF 소스코드를 사용했다고 합니다.

Frequency Regularization에서 세부 Hyper-Parameter입니다.

3-view에 대해선 T = 90% ∗ total iteration

6-view에 대해선 T = 70% * total iteration

9-view에 대해선 T = 20% * total iteration

Occlusion Regularization에서 세부 Hyper-Parameter입니다.

LLFF dataset, Blender dataset 에서 M =20

DTU dataset 에서 M = 10

 

 

 

Evaluation 

평가지표에 대해서는  PSNR/SSIM/LPIPS 글에 소개해두었습니다.

 

Blender (최초 NeRF논문에서 Realistic Synthetic) 데이터셋 평가

  • non-Lambertian Reflectance를 갖는 8개 Object에 대해 800x800이미지
  • ship, chair, drums, ficus, hotdog, lego, materials, mic

 

 

DTU 데이터셋 평가

  • 400x300 해상도에 88개 Train셋, 15개 Test셋 

 

 

 

LLFF (최초 NeRF에서 Real Forward-Facing) 데이터셋 평가

  • 정면에서 촬영한 Real Scene 8장면에 대해 1008x756 이미지
  • fern, trex, orchid, flower, fortress, horns, leaves, room

 

 

Training Time 평가

NeRF와 Mip-NeRF보다 약간 느린 것을 볼 수 있습니다.

 

 

 

Ablation Study

Frequency Regularization Parameter 변경 실험

x축이 mask에 대한 최대 visible ratio x%을 나타냅니다. 위에서 언급한 Hyperparameter T를 결정하는 변수입니다. 파란색 PSNR은 높을 수록 좋고, 주황색 LPIPS는 적을 수록 좋습니다.  각 데이터셋에 대해 실험을 통해 T를 산출했다고 합니다.

Frequency Regularization을 위한 최대 visible ratio x%를 높게 가져가면 LPIPS score가 떨어지고 PSNR은 올라가며 Trade-off가 발생했습니다.

 

 

 

Occlusion Regularization Parameter 변경 실험

각 데이터셋 마다 최적의 Hyper parameter M이 달랐습니다. Occlusion Regularzation이 near-camera object에 대한 표현을 방해했기에, Scene마다 적절한 M을 채택해야 합니다.

 

 

 

Closing..

처음엔 코드 한줄 고쳐서 CVPR을 통과했다니 놀라웠었는데, Few Shot Task를 진행 할 경우 Aritifact가 발생하는 원인을 찾기 위해 많은 실험이 진행됬었네요. 카메라와 가까운 거리에 Panelty만 주더라도, Artifact를 없앨 수 있다는 점이 신기했습니다. 프로젝트 공홈에 Multi-shot에서 anti-aliasing 개선하는 연구인 Mip-NeRF와 비교하는 결과 gif 이미지를 올려둬서 잘 모르는 사람이 보면 엄청난 결과라고 오해 할 수 있게 만들어 뒀네요. 비교 대상이 RegNeRF나 PixelNeRF가 되면 연구 효과가 두드러지지 않아서 그런가 싶습니다. 위에서 언급한 2가지 Regularization 아이디어가 다른 연구에서도 쉽게 적용 될 것 같습니다.

댓글