본문 바로가기
NeRF

[논문 리뷰] NeRF-W (CVPR 2021) : Uncertainty 접목 연구

by xoft 2022. 12. 13.

NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections, Ricardo Martin-Brualla, CVPR 2021

 

유명 관광지(Famous Landmarks)에서 여러 사람이 촬영한 사진을 조합해서, 새로운 시점(Novel view)의 이미지 합성이 가능할까요? 아래는 독일의 Brandenburg Gate라는 명소를 Flickr에서 얻은 다양한 사진들입니다.

사람과 차가 움직이고(Transient Objects), 계절, 날씨가 변하고, 태양, 구름 위치가 바뀌게 됩니다(Photometric Variation).

NeRF는 radiance와 density가 (geometrically, materially, photometrically) Static한 Scene을 전제하에 알고리즘이 만들어졌기 때문에, 변화하는 위와 같은 Case는 만들지 못합니다.

 

NeRF in the Wild (NeRF-W)에서는 radiance와 density에 대한 Uncertainty를 측정하고, Static한 네트워크와 Transient한 네트워크를 분리하여 이 문제를 해결했습니다.

 

NeRF-W 저자가 공개한 결과 입니다.

Brandenburg Gate
Sacre Coeur
Trevi Fountain

수백장의 사진(각각 763/830/1689개)에 대해 COLMAP으로 카메라 parameter를 얻고 약 2일간 학습시켰을 때 결과라고 합니다.

뿐만 아니라 embedding vector를 구성하여, 다양한 Illumination(=Style 밤/낮/흐린/맑은 등)로 Scene을 표현할 수 있게 하였습니다.

 

그럼 어떻게 만들었는지 들여다 보겠습니다.

 

 

 

NeRF와 NeRF-W 구조 비교

NeRF와 비교하며 설명해보겠습니다. NeRF에 대한 설명이 필요하다면, 최초 NeRF 이전 포스트 확인 바랍니다.

먼저 입출력 값으로 큰 구조를 먼저 보면, NeRF는 1개의 Network로 되어 있고 NeRF-W는 3개의 Network로 되어있습니다.

 

Input Parameters

NeRF와 position, view direction은 똑같은데, Embedding이라는 것이 추가 되어있습니다. 학습 이미지마다 고유한 vector를 갖도록 구성이 됩니다. 다른 부분이 있다는 것만 확인하고, 뒤에서 다시 언급드리겠습니다.

 

Output Parameters

NeRF에서는 한개의 radiance, volume density를 사용했다면, NeRF-W는 static와 transient으로 구분되어, static radiance, static volume density 그리고 transient radiance, transient volume density로 나누어져 있습니다. static부분은 NeRF와 같이 정적(static)인 사물을 고려한 네트워크이고, transient부분은 Scene 내 사물의 변화(transient)를 고려한 네트워크입니다. Static 부분은 embedding이 추가된 것을 제외하고 MLP1, MLP2가 합쳐져 있다고 생각하면, 기존 NeRF와 비슷구조 입니다. MLP3에서는 View Direction 입력이 사라지고, Uncertainty 출력이 추가되어 있습니다. 여기서도 다른 부분이 있다는 것만 확인하고, 뒤에서 다시 언급드리겠습니다.

 

Rendering

위에 전체 구조에서 Network결과값으로 Pixel의 색상을 계산 할 때 쓰이는 부분만 갖고 왔습니다.

NeRF-W에서는 static radiance, static volume density 그리고 transient radiance, transient volume density으로 Pixel의 Color를 계산합니다. k는 1개 ray위의 sampling된 point들의 순번을 의미하고, i는 이미지의 순번을 의미합니다. NeRF를 다시 설명하자면, 빨간색은 k번째 point가 surface일 정도를 나타내고, 초록색은 k번째 point의 radiance를 나타냅니다. T함수 부분은 1~k-1번째 point들의 투명한 정도를 나타냅니다. NeRF는 volume density와 radiance를 가지고 Volume Rendering의 기본 수식을 그대로 차용하였으며, NeRF-W는 이를 또 변형해 static, transient 두가지 타입으로 구성하였습니다. NeRF-W가 NeRF의 어느 부분과 매칭이 되는지 보기 편하게 빨간, 초록, 노랑으로 표시해두었습니다.

Train시에는 static, transient 부분을 모두 사용하지만, Test시에는 transient부분만 사용합니다.

 

 

 

Latent Appearance Modeling

NeRF-W 에서는 Generative Latent Optimization을 통해서, 이미지에 대한 Apperance Embedding Vector를 최적화 합니다.

GAN(Generative Adversarial Network)에서 Latent Vector와 동일한 개념입니다. 임의의 작은 갯수(48개)로 vector가 구성되며, 초기엔 랜덤으로 초기화되고, MLP를 학습하면서 이미지 i 마다 동일한 vector값이 만들어지게 됩니다.  GAN분야에서는 latent vector를 입력으로 하여 Generator로 이미지를 생성 할 수 있고, latent vector를 수정하면서 스타일도 수정 할 수 있습니다.

NeRF-W에서도 똑같이 Embedding Vector을 사용해서 스타일 수정이 가능합니다. 맑은 날씨의 이미지로 latent vector를 만들어 두면, 해당 latent vector을 입력으로 다양한 view direction에서 맑은 날씨의 이미지들을 합성 할 수 있습니다. 논문에서는 illumination condition을 embed할 수 있는 continuous space를 identify하도록 optimization한다고 표현하고 있습니다. 아래는 양쪽 사진에 대해 latent vector를 만들어 놓고, 이 값들을 linear하게 interpolation하여 중간 사진들을 합성한 이미지 결과를 나타내 두었습니다.

이 개념은 단순하게 설계되어, 기존 NeRF에서 Appearance Embedding Vector를 입력값으로 추가하고 Optimization해주는 방법으로 적용하게 됩니다. Transient 부분에서도 동일한 개념으로 Transient Embedding이 추가됩니다.

 

 

 

Transient Object

NeRF에는 없는 Transient Object를 고려하는 부분입니다. static에서 사용한 MLP1은 그대로 쓰고, Appearance Embedding과 동일한 역할인 Transient Embedding이 사용됩니다.

여기서는 Bayesian learning framework를 적용하여, Uncertainty를 모델링합니다. 관측된 pixel의 강도(intensity)에는 항상 noise가 내재되어 있고(aleatoric특성), 이러한 noise는 입력 이미지에 의존적(heteroscedastic)이다라 전제를 두고 접근합니다. observed된 color를 isotropic normal distribution으로 보고, predicted된 Mean값을 ci으로 정의, Variance를 βi로 정의합니다.  NeRF-W에서는 같은 Position이라도 다른 스타일의 이미지에 의해 만들어지므로, 다른 색상값을 갖게 됩니다. 약 800개의 학습하는 입력 이미지를 대상으로, 특정 Position(x,y,z)에 대해 색상값은 조금씩 다르게 되므로 Mean(ci)과 Variance(βi)가 모델링 되어질 수 있습니다. 이 Variance를 통해, Uncertinty를 측정 할 수 있게 됩니다.

 

Uncertinty(βi)는 학습시 Loss에서만 사용되어집니다.

1번째 term에서는 Uncertinty(βi) 가 크면, GT와 Predicted Color에 대한 L2 loss의 영향력이 작아지게 합니다. 작아지면 반대로 됩니다. 2번째 term에서는 Uncertinty(βi)가 너무 커지지 않게 regularization하는 역할입니다. 마지막 term은 transient density가 너무 커지지 않도록 Regularization을 합니다.

Test시에는 uncertainty와 transient를 모두 제거합니다.

 

아래 이미지들로 좀 더 설명해보겠습니다.

Training 시에는 (a)와 (b)를 만들고 이를 composite하여 (c)를 만듭니다. 그리고 (c)와 GT인 (d)를 비교하여 학습을 합니다. 이 때, βi를 출력하면 (e) 이미지를 획득 할 수 있습니다. Test시에는 (a)이미지만 사용하게 됩니다.

 

 

 

Optimization

NeRF-W는 NeRF와 같이 coarse model, fine model로 나누어져 있고 동시에 optimization합니다. fine model은 아래 Loss를 사용하고, coarse model은 latent vector를 생성하는 Generative Latent Optimization만 합니다.

 

 

Experiments

평가를 위해 사용된 데이터의 갯수는 다음과 같습니다.

평가를 할 때, 이미지의 반틈으로 embedding vector를 optimization하고, 나머지 반틈으로 성능을 측정하였다고 합니다.

평가지표에 대한 상세 내용은 여기에 정리해두었습니다. ->  평가 지표 Link

기존 연구보다 높은 퀄리티를 가집니다. 3개의 Scene에서 NRW가 LPIPS가 좋게 나오는데, 실제로 카메라가 움직이며 연속적인 이미지를 그릴 때, unrealistic하다고 합니다. checkerboard artifacts가 발생한다고 합니다. 자세한 퀄리티 비교는 저자가 만든 유튜브에서 확인하면 좋습니다. 약간의 설명만 있고, 전체적으로 퀄리티를 비교해서 보여주는 영상입니다.

 

 

 

 

Closing...

Uncertainty 개념을 적용하여 Large Scene을 Rendering한다는 점에서 흥미로운 연구였습니다. NeRF로 Relighting, Style 변형 관련된 논문을 다음번에 읽을려고 했는데, 맛보기 식으로 읽은 것 같네요. Limitation으로 training 갯수, 카메라 calibration error에 민감하다고 합니다. 다른 논문에서 이를 해결 할 것 같습니다. 비공식적인 소스코드가 https://github.com/kwea123/nerf_pl/tree/nerfw 에 있습니다. 파악할 때 참고 하였습니다. Bayesian learning에 관련해서 좀 더 흥미가 생기는 논문이었습니다.

댓글