본문 바로가기
NeRF

[논문 리뷰] RawNeRF (CVPR 2022) : HDR, Denoising, Defocus연구

by xoft 2023. 1. 29.

NeRF in the Dark: High Dynamic Range View Synthesis from Noisy Raw Images, Ben Mildenhall, CVPR2022

 

어두운 이미지, 아주 밝은 이미지, 대비(contrast)가 큰 이미지들을 NeRF로 Rendering 가능할까요? NeRF에서는 8bit인 이미지만 Rendering 할 수 있습니다.기존 NeRF에서는 대비가 크지 않은 Scene들에 대해 다루었으며, 색상 채널당 8비트인 LDR(Low Dynamic Range) 이미지들을 사용했었습니다.

그럼 LDR은 어떤 문제가 있을까요? LDR은 일반적인 스마트폰 카메라로 촬영하면 저장되는 방식이며, 밝기의 표현 범위가 제약되어 있습니다. 아래는 밝기 표현 범위가 제한 되어 있을 경우 문제입니다. (출처 : link)

카메라 촬영 할 때, 이런 현상 많이 겪어 보셨죠? 밝은 부분이 잘보이면 어두운 부분이 잘 안보이고, 어두운 부분이 잘보이면 밝은 부분이 잘 보이지 않습니다. 이를 개선한 방식으로써, 채널당 8bit의 정수표현법이 아닌 채널당 32bit로 floating point 실수 표현법으로 이미지들을 저장하여 다양한 밝기 범위를 표현하는 HDR(High Dynamic Range) 이미지가 있습니다. 요즘 스마트폰에는 HDR 촬영 옵션이 있다고 합니다.

일반적으로 TV, 스마트폰의 디스플레이에서는 채널당 8bit만을 표현 할 수 있기 때문에, HDR영상을 획득하였더라도, Tone Mapping알고리즘을 통해 HDR을 LDR로 압축 변환되어 사용됩니다.

 

RawNeRF에서는 NeRF을 응용해서 LDR이 아닌 HDR Scene Representation을 했으며, 일반 카메라로 촬영된 이미지들에 대한 특징과 문제점을 설명하고, noise가 있는 raw 이미지들을 입력으로 HDR 이미지를 합성하는 방법에 대해 다루고 있습니다.

 

논문의 기여 포인트는 다음과 같습니다.

  • HDR 이미지를 생성하여 Exposure를 다양하게 Rendering
  • HDR 이미지를 Novel View로 Rendering
  • Noise가 있는 Raw 이미지들을 Denoising
  • Depth정보에 약간의 트릭을 사용하여 다양한 초점 거리로 Rendering

 

 

논문 저자가 공개한 결과물 영상입니다.

HDR View Synthesis

Denoising

출처 : https://bmild.github.io/rawnerf/

 

 

Raw NeRF를 이해하기 위해서는 카메라와 이미지에 관한 배경지식이 많이 필요합니다.

 

배경 지식 - Noisy한 Raw Input Image

적은 contrast(대비)에 깔끔하고 noise-free한 이미지들은 기존 NeRF에서 잘 작동합니다. 하지만 모든 real 이미지에는 어느 정도 noise가 있고, 카메라 postprocessing pipeline의 각 단계에 의해 이미지가 훼손되게 됩니다. 논문에서는 카메라 postprocessing pipline들 중 RawNeRF와 관련된 4가지 방식을 언급해주고 있습니다.

 

 

Raw Camera Measurments

이미지를 촬영할 때, 카메라 센서 위 pixel들을 타격하는 광자들은 전자 신호로 변환되어, high bit-depth 디지털 신호(10~14bit)로 저장됩니다. 카메라 센서에는 noise가 있는데, 이 noise값 만큼을 측정하여 빼주게 됩니다. black level이라는 음수 offset을 적용하게 됩니다. 아래 사진의 왼쪽은 black level 보정 전 20~255의 range를 갖고 있다고 가정하면, 오른쪽은 black level 보정 후 0~255의 range를 갖게 된 이미지 입니다. black level noise를 획득하기 위해서 카메라 센서 가장자리에 금속막 뚜껑을 덮어서 빛을 못들어오게 한 후, 여기서 발생한 센싱 값만큼을 빼주는 원리라고 합니다. (출처 : link)

black level offset을 적용한 후의 signal들이 (셔터가 열려 있는 동안) 카메라 센서로 도달하는 광자(photons) 갯수와 비례하는 noisy measurement(수치)가 됩니다. 광자들이 센서에 도달할 때 확률 분포(포아송 process)을 따른다라는 "shot" noise, 아날로그 전자 신호에서 디지털 신호로 변환될 때 전자회로의 "read" noise로 구분해 볼 수 있습니다. 이러한 noise들은 0 mean의 Gaussian으로 모델링 될 수 있습니다. 

 

 

Color Filter Demosaicking

카메라 센서를 좀 더 깊게 보면, 모든 pixel 화소들 각각은 RGB값을 저장하지 않고, 각 화소는 흑백의 밝기만을 감지하고 아래 그림과 같이 센서 위에 칼라 필터가 결합됩니다.  (출처 : link1 , link2)

Green 2개, Red 1개, Blue 1개로 구성된 2x2 사각형으로 구성된 Bayer Color Filter가 카메라에 적용되어 있다고 합니다. 각 화소는 R,G,B중에 한가지 색만을 감지 할 수 있기에 "mosicked"데이터가 만들어집니다. 논문에서 반복해서 언급되는 Mosaicked Raw Image들이 이에 해당 합니다. 각 화소에 없는 색상은 Demosicking 알고리즘을 사용해 interpolation하여 전체 color를 생성해내게 됩니다. 이 interpolation에서 공간적으로 noise가 발생하고, checkerboard pattern은 서로 다른 noise를 만들게 됩니다.

 

 

Color Correction and White Balance

Color correction은 영상의 색감을 사람이 인식하는 본연의 색처럼 보이게 하는 기법이고, white balance는 카메라 촬영시 영상의 픽셀을 무작위로 뽑아 색 온도를 판단하고 균형을 조절하는 (현실의 흰색을 영상에서도 흰색으로 볼 수 있게 하는) 기법입니다(출처 : link1 , link2). 

카메라마다 color filter에 대한 스펙트럼이 다양하고, 카메라 color space에서 standard color space로 이미지를 convert하기 위해 3x3 color correction matrix가 사용됩니다. color correction matrix를 통해 좌표로 색상을 표현하는 chromaticity 색도 다이어그램에서 white point(=reference white)를 맞춰주게 됩니다.

chromaticity

 

사람은 다양한 light source에 의해 만들어지는 color 색조에 대해 강인하지만, 카메라는 white balance coefficient로 각 color 채널을 scaling하여 색조를 조정해야 합니다. 이를 위해서도 matrix transform가 사용됩니다. 결과적으로 Color Correction과 White Balance과정에서 Noise가 발생하게 됩니다.

 

 

Gamma Compression and Tonemapping

사람은 밝은 영역에 비해 어두운 영역에서 작은 상대적인 변화를 잘 식별한다고 합니다. 현실 공간의 빛을 linear하다고 본다면, 눈은 nonlinear하게 인지합니다. 이러한 원리를 기반으로, 밝은 영역에서는 적은 bit로 표현하고 어두운 영역에서는 많은 bit로 표현하는 nonlinear한 gamma curve를 적용합니다. 이를 RGB gamma compression이라고 합니다. 아래는 입력 pixel intensity에 따라 변환 pixel intensity의 관계를 나타내는 다양한 gamma curve를 나타냅니다. 1/8, 1/4쪽 curve가 일반적으로 gamma curve이고, gamma curve에 따라 이미지를 다양하게 표현 할 수 있습니다. (출처 : link1 , link2

Tone mapping은 HDR 이미지를 LDR로 압축해주는 알고리즘입니다. 다르게 표현하면 채널당 32bit인 이미지를 8bit인 이미지로 바꿔줍니다. 고성능 카메라 중에는 HDR이미지를 한번에 촬영 할 수 있는 센서가 있지만, 스마트폰을 포함한 일반적인 디지털 카메라에서는 다양한 노출로 채널당 8bit인 여러 이미지들을 획득(bracketing)하여 HDR 이미지를 구성해주게 됩니다. 아래는 스마트폰으로 HDR이미지를 획득하여 tone-mapped된 HDR 이미지를 획득하는 과정을 보여줍니다.(출처 : link)

Tonemapping을 통해 Linear한 HDR value들이 nonlinear한 LDR space로 mapping 됩니다. 위에 언급된 noise들 중에서 tone mapping은 가장 과감한 noise 효과를 가진다고 표현하고 있습니다. 밝고 어두운 영역의 정보가 사라지고, non-linear한 tonemapping curve가 적용 된 후의 noise들은 가우시안 분포 또는 zero mean을 보장 할 수 없다고 부연 설명하고 있습니다.

 

 

Camera Exposure

논문을 이해하기 위해 추가적으로 찾아본 내용입니다. 카메라 노출값은 아래의 3가지 Type으로 조절됩니다. (출처 : link)

Aperture(조리개)를 열고 닫는 정도에 따라, Shutter Speed에 따라, 센서의 민감도인 ISO에 따라, Exposure이 조절됩니다. 논문에서는 Aperture과 ISO값을 고정한체 Shutter Speed를 변화하며 Exposure를 변경하고 있습니다.

 

HDR 개념 정리 글에 일상에 쓰이는 개념들을 추가적으로 정리해두었습니다.

 

 

 

Algorithm

Overview

NeRF에서 사용하는 image들은 카메라 자체에서 내부적으로 Raw Image들을 Postprocess하여 만든 채널당 8bit인 LDR이미지 입니다. NeRF에서는 LDR이미지를 입력으로 다양한 view의 LDR 이미지들을 합성하여 출력하게 됩니다.

RawNeRF에서는 Raw Image를 바로 입력값으로 받습니다. 학습된 모델은 다양한 viewpoint와 다양한 focus로 HDR 이미지를 랜더링 할 수 있습니다. 추가적인 post processing을 통해, 다양한 노출로 랜더링 할 수 있고 tonemapping을 통해 표준 디스플레이에서 출력 할 수 있는 LDR이미지로 랜더링 할 수 있습니다.

 

 

 

Data

데이터를 획득 할 때, 아이폰X로 특정 앱(Halide app, Adobe Light-room app)을 사용해 12MP해상도(6000x4000)에 Adobe DNG포맷으로 저장하여 채널당 12-bit인 Raw Image를 획득하였다고 합니다. Raw data는 Bayer Color Filter와 같이 언급된 mosicked형태이며, pixel마다 1개 color로 되어 있습니다.

 

3개의 서로 다른 Scene을 촬영하였고, Scene마다 동일ISO를 사용했습니다. Scene마다 101개의 noisy 이미지와 1개의 GT이미지로 구성되어 있습니다.

노이즈가 두드러지는 이미지를 획득하기 위해 Fast Shutter speed로 손에 들고 있는 상태로 움직이면서 100장을 촬영했습니다. (다양한 shutter speed를 사용했을 거라 추정됩니다.) 삼각대에 고정한 채로 50-100배 긴 노출로 안정된 이미지들을 촬영한후 HDR+알고리즘을 사용하여, HDR Ground Truth를 만들었습니다. denoising 함수를 위한 noisy한 input "base frame"을 위해, 삼각대에 고정한 채로 기본 fast shutter speed로 1장을 촬영했습니다. 

postprocess된 image들로 COLMAP을 사용해서 pose값을 계산하였습니다.

 

 

Variable Exposure Training

다양한 shutter speed로 촬영하는 "bracketing"을 사용하여 이미지를 획득하면, 여러 exposure들에서 보존되는 밝은 highlight의 이점들을 merge 할 수 있고, faster exposure에서는 어두운 영역에서 detail을 잡을 수 있습니다. RawNeRF는 이 특징을 유사하게 만들었습니다. exposure time(=shutter speed)와 이미지가 주어지면, shutter speed에 따른 밝기 값을 조절함으로써, shutter speed와 매칭되는 이미지를 RawNeRF로 만들 수 있습니다. 이 개념을 도입하기 위해 실험했는데, sensor의 miscalibration 때문에 shutter speed와 exposure를 align할 수 없었다고 합니다. 그래서 shutter speed마다 per-color-channel scaling factor(α)값을 만들었습니다. 이 scaling factor(α)값은 RawNeRF모델을 학습할 때 같이 학습되어지게 됩니다. network의 출력값 y^이 주어질 때, exposure값은 min(y^·t·α, 1)이 됩니다.

NeRF와 비교(최초 NeRF 이전포스트 참조)하였을 때, RawNeRF는 이런 구조이지 않을까 합니다. 정확하지 않습니다. 소스 코드 분석후에 해당 내용 업데이트 할 예정입니다. 

 

 

Loss function

최종적으로 (4)가 Loss공식이며, (1)~(3)은 (4)를 도출해내기 위한 공식입니다.

(1) 추정한 color값 y^과 noisy 입력 color값 y를 tonemapping curve(Ψ) 적용하여 Loss를 계산하려고 했지만, tonemaaping이 nonlinear하여 converge 할 수 없었습니다.

(2) 그래서 weighted Loss를 적용하려 했습니다.

(3) y^를 weight적용하되, stop-gradient(sg)를 적용하여 학습되지 않는 변수로 지정합니다. tonemapping curve의 gradient가 적은 Artifact와 percetually하게 높은 퀄리티를 보였기 때문에 이를 적용하였다고 합니다.

(4) 최종적인 수식입니다.

 

대비가 높은 이미지(a)를 테스트하였을 때, (b)는 수식(1)의 결과, (c)는 수식(4)에 대한 결과입니다. HDR이미지를 HDR+알고리즘을 통해 tonemapping해서 랜더링했습니다. (b)는 밝은 영역을 잘 처리하지만, 어두운 영역에서 퀄리티가 좋지 않습니다. (c)는 더 선명하고 어두운 영역에서도 좋은 퀄리티를 볼 수 있습니다.

 

 

 

Implementation Details

mip-NeRF (이전 포스트 참조) 를 base로 하고, MLP의 activation 함수를 sigmoid에서 exponential 함수로 바꾸고, 16k random rays의 batch를 갖는 Adam optimizer를 사용하였다고 합니다. 부분적으로 transparent한 floater artifacts를 막기 위해 volme density에서는 regularization loss를 사용했다고 합니다. activation을 sigmoid에서 exponential 함수로 바꿈으로써 linear radiance value들을 더 잘 매개변수화(parameterize)했다고 합니다.

 

 

 

Postprocessing

Raw Image를 획득한 후에 Metadata를 사용하여 직접 Post-processing을 구현하여 사용했습니다.

Black Level은 배경지식 부분에서 설명하였듯이 영상 전체적으로 pixel 값을 빼준다고 했었습니다. Whtie Level은 영상 전체적으로 intensity를 더해주는 것이라 생각됩니다. colormatrix2는 카메라 센서에서 얻은 색상 스펙트럼 값을 실제 눈으로보는 색상과 맞도록 조절해주는 color correction matrix입니다.

논문의 supplement에 postprocess 알고리즘입니다. 자세한 수치는 논문 참고바랍니다.

1-2) 12bit인 raw data를 32bit로 변환시켜주고

3-4) 최대가 1, 최소가 0이 되도록 black level, white level로 rescale해주고, bilinear demosaick(mosaick 이미지들의 주변 색상으로 interporation)해줍니다.

5-6) white balance를 적용하고, color correction matrix와 XYZ-to-RGB matrix가 combine된 3x3 transform matrix로 color transform해줍니다.

7-8) white level을 맞춰주기 위해  exposure를 조절하고, 0에서 1사이 값을 벗어나는 경우 버려줍니다.

 

 

 

Result

NeRF의 문제점

Noisy img를 확대 했을 때 Bayer Color Filter모양이 약간 보이는 것으로 봐서 raw image를 demosaick한 이미지로 보입니다. NeRF는 Postprocessed된 LDR이미지로 학습한 후 랜더링한 결과이고 RawNeRF는 raw image로 학습 후 HDR 랜더링하고 post processing한 결과입니다. Luminance가 1 이상인 경우 표현못하는 것을 볼 수 있습니다.

어두운 영역을 비교하였으며, NeRF는 nonlinear tonemap으로 인해, lumination의 최소값이 0.006정도가 되는 것을 볼 수 있습니다.

 

 

Denosing 비교 실험

기존 denosing 연구는 입력 이미지 갯수가 1~5로 적어서 명확한 비교는 되지는 않습니다. ( 평가 지표 Link ) Raw 결과값에 대해서는 기존 denosing연구보다 성능이 좋지 않습니다. RawNeRF에서는 postprocessing때 12bit를 floating point로 바꾸고 white, black level로 normalize하였었습니다. 이 이유에 대해 논문에서는 다른 소스로 얻은 raw data이기 때문에 diffrent color tint를 갖게 되었다고 합니다. 때문에 각 논문의 raw output을 GT raw 이미지로 매칭하는 per-color-channel affine transform을 하여서 비교하였다고 합니다. 테이블 오른쪽 열의 Affine-aligned sRGB에 해당합니다. 이렇게 비교할 경우 RawNeRF가 더 좋은 퀄리티를 보이는 것을 볼 수 있습니다.

LDR NeRF는 Mip-NeRF를 사용하여 LDR이미지로 학습하였을 때의 결과이고, Un+RawNeRF는 single raw denoiser를 사용 후의 데이터로 학습했을 때의 결과입니다. RawNeRF가 가장 좋은 성능을 보이는 것을 볼 수 있습니다. 

 

 

Shutter Speed 실험

Shutter speed에 따른 퀄리티 실험입니다. shutter speed가 느릴경우 노이즈가 적은 데이터를 얻고, 빠를 경우 노이즈가 아주 많은 것을 볼 수 있습니다. Clean한 이미지를 사용하였을 때 LDR NeRF가 좋은 성능을 보이고, 노이즈가 많아질수록 RawNeRF의 성능이 좋은 것을 볼 수 있습니다.

 

 

Defocusing 이미지 합성

3D model이 주어질 때, 물리기반 renderer는 각 lens element를 통해 refracted(굴절)한 ray를 tracing함으로써 camera lens defocus 효과를 정확히 시뮬레이션 할 수 있습니다. 하지만 연산량이 너무 많습니다. RawNeRF에서는 volume density를 통해 depth값을 얻을 수 있다는 NeRF의 특성을 활용했습니다. Depth layer마다 blur를 다양하게 적용하여 defocus효과를 만들었습니다. 

 

 

Closing..

예전부터 궁금했던 논문이라 읽었는데, 카메라 센서와 이미지 저장에 관한 배경지식이 많이 필요로 해서 읽기가 어려웠습니다. NeRF 내용은 살짝 들어가고 대부분 데이터와 카메라 이론에 관한 내용이네요. 직전에 리뷰했던 iMap NeRF에 이어서 다양한 분야의 연구가 NeRF 기본 아이디어를 통해 개선되고 있는 것을 느낍니다. HDR 이미지의 특성을 이용해 다양한 Application을 만드는 것이 흥미로운 논문이었습니다.

 

 

Reference

HDR : link1 , link2

Exposure : link1 , link2

Black Level Compensation : link

Poisson Process : link

Bayer Color filter : link 

White Balance : link 

Gamma compression (=Gamma Correction) : link

tone mapping : link

chromaticity : link

댓글