티스토리 뷰

반응형

 

Detection을 주로 연구하다가 3D 쪽에 관심을 갖게 되어 NeRF라는 방법(이제는 자체가 분야가 된..)을 접하게 되었고, 흥미가 생겨 관련하여 연구중에 있습니다. 이번 글에서는 NeRF를 처음 제안한 논문을 소개하고, 이 분야 해당 기술의 동향과 관련 논문을 쭉쭉 소개하고자 합니다.


     1. Intro     

3D 게임, AR/VR 등 다양한 분야의 컨텐츠가 생겨나면서, 우리 주변의 실제 물체를 3D Object화(렌더링) 하여 컨텐츠에 적용시키는 방식은 다양한 분야에서 더욱 많이 쓰이고 있습니다.

 

기존에는 직접 비싼 3D Scanner를 사용하여 실제 물체를 렌더링 시키거나, Photogrammetry 방법을 통해 이미지로부터 Voxel이나 Point Cloud, Mesh 형태의 3D Object를 얻어내곤 했습니다.

 

2020년 ECCV에 Best paper에 Honorable Mention된 NeRF는 이에 효과적인 방법을 제안합니다. 

 

↓ 프로젝트 페이지

 

NeRF: Neural Radiance Fields

A method for synthesizing novel views of complex scenes by optimizing an underlying continuous volumetric scene function using a sparse set of input views.

www.matthewtancik.com

 

NeRF는 Novel View Synthesis라는 분야에 새로운 방식을 제안하는데,

 

Novel View Synthesis는? 특정 몇 개의 시점에서 촬영한 이미지들로부터 주어지지 않은 위치와 방향에서 바라본 대상의 모습을 Continuous 하게 합성해내는 기술입니다.

 

NeRF는 Novel View Synthesis 분야에서, Point Cloud나 Mesh, Voxel 등으로 표현되는 3D Object 자체를 렌더링하는것이 아닌,

3D Object를 바라본 모습(이미지)들을 예측할 수 있는 모델을 만드는 것이 목표입니다.

그림 1. NeRF paper : < Fig 1 >

3D Object를 표현하는 방식 자체가 Storage cost가 많이 들기도 하고,

해당 물체를 바라본 모습의 이미지를 모든 방향에서 알 수 있다면, 즉 어디서 바라보더라도 해당 물체의 모습을 알 수 있다면,

이것 자체로도 물체를 3D 렌더링했다고 보는 것입니다.

 

NeRF는 이 기술에서 혁신적인 방식을 제안하여 좋은 성능을 보였습니다.

 


     2. NeRF : Neural Radiance Field  전체 구조    

그림 2. NeRF paper : < Fig 2 >

구현된 코드를 보면 NeRF는 100개의 input 이미지와 그에 해당되는 100개의 transpose값(이후 pose라고 하겠음)들을 input으로 합니다. pose 값은 4x4 행렬로 물체를 찍은 카메라의 위치로 변환시켜주는 변환 행렬(Extrinsic Parameter)입니다. 쉽게 해당 이미지를 찍은 3D상의 위치로 변환시켜주는 행렬이라고 생각하면 될 것 같습니다.

Camera Calibration ( Intrinsic & Extrinsic Parameter )

실제로 NeRF의 lego train 데이터셋의 pose를 3D로 나타내보면 아래와 같습니다.

 

그림 3. Synthetic Lego Dataset Pose Visualization

학습을 진행할 때 한 iteration마다 하나의 이미지를 Random Sampling 하여 NeRF 모델에 집어넣게 되는데,

해당 input 이미지가 400x400 해상도라고 가정하면, 한 이미지에 160,000개의 픽셀이 있고,

학습의 한 iteration을 돌릴 때마다 160,000개의 픽셀 중 4096개의 픽셀 Sampling 하여 input으로 넣습니다.

(5.3 Implementation Details)

 

이때, NeRF 모델에는 핵심적인 Ray 라는 개념이 존재합니다.

그림 4. NeRF 모델 전체 구조

Ray는 물체를 찍은 방향으로 부터 물체를 향하도록 일직선으로 쏜 선들을 의미합니다.

(a)를 보시면 각 이미지로부터 물체로 향하게 그은 직선들이 보이실겁니다.

 

400x400 의 이미지에는 이론적으로 160,000개의 Ray가 3D 물체의 방향으로 일직선을 쏘게 됩니다.

Ray의 방향을 나타내는 viewing direction (d)값과

Ray 직선 내 포함되는 point들의 3d좌표값 coordinates (x : x,y,z)들을 모델 input 에 넣습니다.

input에 들어갈 때 point들은 Sampling을 통해 선택되어 들어가게 되는데, 이 과정은 뒤에서 다루겠습니다.

(256개의 point가 한 ray에서 sampling 된다고 치면, 한번 iteration이 돌 때 4096 x 256 = 2^20 개의 point들이 MLP 모델의 input에 들어간다고 일단 생각하면 됩니다.)

 

그림 5. Input & Output

input으로 넣은 xyz 좌표와 viewing direction 으로부터 MLP 모델은 각 point들의 color와 density를 예측합니다.

한 ray에 대해서 sampling된 256개의 point들의 color와 density 값이 예측되었다고 가정하면,

이 예측된 값들을 Volume Rendering 작업을 통해 하나의 pixel 의 값으로 만들어주고,

이를 실제 이미지의 해당 pixel의 RGB값과 비교하여 Loss(MSE)를 구하는 방식으로 학습이 진행 됩니다.

 

다시말해, NeRF 모델의 전체적인 구조에서, pose 값들을 input으로 넣고, output으로 예측된 이미지(rgb&density)가 나오면

이를 실제 이미지(GT)와 비교하여 Loss를 구하는 방식으로 학습이 진행 됩니다.


     3. Model    

그림 6. NeRF 모델 구조

NeRF는 간단하게 8개의 Linear Layer로 이루어진 MLP 모델을 사용합니다.

sample pixel from image 1024(2^10)개 , sample point from ray 64(2^6)개를 사용하여

input point가 총 65536(2^16)개라고 가정하면

3D coordinates (x : x,y,z) 좌표를 포함하는 65536개의 point로 [65536 , 3] 이 input으로 들어갑니다.

여기서 위 모델 구조의 왼쪽 부분처럼 Positional Encoding 과정을 거쳐

3을 63으로 늘려주는 Positional Encoding 과정을 거쳐 [65536 , 63] 가 input으로 들어갑니다.

( 이는 뒷부분 5.Positional Encoding에서 다시 다루겠습니다. )

8개의 layer를 거쳐 density output을 뽑아내고, 이후 ray의 viewing direction (d) 값을 Input으로 넣어 최종 rgb output 을 얻어냅니다.

모델 구조가 위와같이 되는 이유는, 물체를 바라보는 방향 (viewing direction (d)) 에 따라 물체를 바라보는 rgb 값이 달라진다는 개념을 담았기 때문입니다. 때문에 density를 뽑아낸 후에 input으로 viewing direction이 모델 후반에 들어갑니다.

물체의 3D좌표값(x)은 rgb값과 density 둘 다에 영향을 줍니다.

 


     4. Volume Rendering    

(논문 내 : 4. Volume Rendering with Radiance Fields )

Model의 Output으로 나온 한 Ray의 Color와 density 값들은 한 pixel로 합쳐지는 Volume Rendering 과정을 거칩니다.

합쳐진 pixel rgb값은 실제 이미지의 pixel rgb값과 MSE Loss를 거쳐 Back propagation을 통해 학습이 진행됩니다.

그림 7. Volume Rendering

Ray 내에서 point들을 샘플링할 때, 물체가 있을법한 범위를 정해두고 가장 가까운 point를 near, 가장 먼 point를 far로 정해둡니다.

그림 8. Volume Rendering 수식 1

여기서 Transmittance(투과도)(T(t)) 라는 개념이 들어가는데, near 와 far 사이의 t에서의 점의 weight 값은

near로부터 t 까지의 density 값을 더한 값이 클 수록 작아진다는 개념입니다.

다시 말해, 앞에 가려진 부분의 density가 클 수록, 해당 weight 값이 작아진다는 개념을 수식에 넣은 것입니다.

수식적으로는 t_n 에서 t_f 까지 점들의 투과도 X density X color(rgb) 를 적분하여 Volume Rendering을 완성합니다.

그림 9. Volume Rendering 수식 2

코드로는 t_n와 t_f 사이의 point들을 Random Sampling 하여 모델에 넣어 color, denity 값을 구한 후,

위 값들 ( 투과도 X density X color(rgb) ) 을 모두 더해줍니다.

Random Sampling을 하는 이유는 Ray를 등분해서 discrete한(일정한) 데이터를 뽑아내게 되면, 한정된 점만 뽑히기 때문에 continuous하지 못한 모델이 되기 때문입니다.

이 과정이 일단 기본적인 모델 구조이고, Coarse Model 이라고 합니다.

뒷부분에 설명할 Fine Model은 이에 대한 성능을 끌어올리기 위해 ray 내에 density가 높은 부분에 추가적인 Sampling을 진행하여 전체적인 모델을 완성합니다. (6. Hierarchical Volume Sampling)


     5. Positional Encoding    

(논문 내 : 5.1 Positional Encoding )

Deep Network는 Lower frequency로 편향되어 학습되는 경향이 있습니다. 이를 해결하여 high frequency 영역까지 표현할 수 있는 모델로 만들어주기 위해 NeRF는 Positional Encoding 과정을 거칩니다. 

'그림 6. NeRF 모델 구조' 앞부분에 잠깐 언급했는데,

3D coordinates (x : x,y,z) 좌표의 65536개 point [65536 , 3] input으로 넣는다고 가정하면,

이 input 에 대한 정보를 늘려주는 과정이 positional encoding 입니다. Data augmentation 개념으로 보면 이해가 편할 듯 합니다.

그림 10. Positional Encoding

3D (x : x,y,z) 좌표에 대해서 L=10 , Viewing Direction(d)에 대해서 L=4 를 적용하여

( ex) L=10이면 하나의 input에 대해 sin, cos 0부터 9까지 20개 데이터 생성 )

X(x,y,z)(3) 는 60개 data 생성, d(3)는 24개 data 생성. ( original input 을 포함하면 63, 27개 )

( viewing direction은 방향을 나타내는 3차원 내 벡터이므로 3개의 input )

이를 input으로 넣음으로 high frequency의 영역까지 표현할 수 있도록 합니다.


     6. Hierarchical Volume Sampling    

(논문 내 : 5.2 Hierarchical volume sampling)

기존 '4. Volume Rendering'에서 한 Ray 내에서 Random Sampling을 통해 point를 Sampling 하여 Coarse Network를 완성했었지만, NeRF는 여기서 한 단계 더 진행합니다.

기존 Coarse Model 에서 구했던 weight값 ( density X Transmittance ) 을 Normalize하여

piecewise-constant PDF(Probability Density Function) 를 구하고,

이 ray내의 distribution으로부터 point들을 다시 sampling합니다.

coarse Network Sample point는 64 , Fine 128 라고 할 때, Coarse Network에서 사용했던 Weight값(alpha X Transmittance)과 비슷한 분포를 가지는 point들을 128개 뽑습니다. (Inverse Transform Sampling Method)

 

쉽게말해서, density가 높은 값들을 위주로 다시 Sampling 하여 Volume Rendering시킵니다.

density가 높은 쪽에 분포한 point들이 실제로 의미있는 값들이 많을 것이라는 가정을 수식에 담은 것입니다.

 

NeRF는 이렇게 Coarse Model(C_c)을 돌려서 나온 값과 GT(실제값)와의 Loss,

Fine Model(C_f)을 돌려서 나온 값과 GT와의 Loss 를 각각 구하여 더한 것으로 전체 Loss를 정합니다.

Coarse Network 와 Fine Network의 Loss를 더해준다.

 


     7. Results    

그림 11. NeRF Results

NeRF 는 기존의 방법들보다 물체의 뒷부분 표현을 잘하고, 기존의 Ghost Effect들을 성공적으로 제거하여 깔끔한 물체를 렌더링합니다.

성능도 여러 데이터에서 높은 성능을 보입니다.

그림 12. NeRF Results

PSNR, SSIM, LPIPS 세 측정 방법에서 모두 우수한 성능을 보이는 것을 확인할 수 있습니다.

그림 13. Ablation Study

Ablation Study 실험입니다.

#Im 은 training input 이미지의 개수, L은 positional Encoding의 L값 ,

N_c , N_f는 coarse Model과 fine Model에서 각각 한 Ray 내에서 Sampling 되는 point들의 개수를 뜻합니다.

 

그림 14. 학습 결과.gif

필자가 직접 NeRF를 구현하여 실험하였을 때, 실제로 물체에 가려진 물체에 대한 표현이라던지, 특정 측면에서 바라봤을 때의 빛의 표현같은 것들을 잘 나타낸 모델임을 확인할 수 있었습니다.

다만 기존 Training Data(synthetic)는 반 구의 여러 방면에서 찍은 100장의 이미지였고,

실제 25장 정도의 custom data로 학습을 진행했을 때는 성능이 잘 나오지 않는 것을 확인할 수 있었습니다.

 

 구현 코드

 

GitHub - nuggy875/NeRF_pytorch_paeng: Reimplementation of NeRF (Neural Radiance Fields) (ECCV2020)

Reimplementation of NeRF (Neural Radiance Fields) (ECCV2020) - GitHub - nuggy875/NeRF_pytorch_paeng: Reimplementation of NeRF (Neural Radiance Fields) (ECCV2020)

github.com

 

     8. NeRF의 단점    

모든 분야가 그러하듯, 특정 한 분야에서 한 획을 긋는 논문이 나오면, 해당 논문의 단점을 커버하는 방향으로 많이 발전을 합니다.

NeRF가 혁신적인 방법이었음에도 여러가지 단점들이 존재합니다. 그리고 NeRF가 나온 20년 3월부터 지금까지 그 단점들을 커버하는 수 많은 논문들이 쏟아져 나왔습니다.

후에 나온 iNeRF의 저자가 작성한 Survey 논문을 보면 흐름을 대략 파악할 수 있습니다.

Survey 논문 : NEURAL VOLUME RENDERING: NERF AND BEYOND

그리고, 해당 저자가 github에 정리해놓은 논문 목록이 있으니, 이를 확인하는 것도 흐름 파악에 도움이 됩니다.

githubhttps://github.com/yenchenlin/awesome-NeRF

 

1. (Performance) NeRF는 Training 및 Rendering 속도가 느립니다.

NeRF 모델 하나당 한 물체를 표현할 수 있다는 점에서 한 물체를 표현하는데 학습 한 번을 완료해야 합니다.

이러한 측면에서 봤을 때 학습을 (200k~300k 기준) 한 번 돌리는데 대략 1~2일정도 걸리고,

즉, 물체를 표현할 수 있는 모델을 만드는 데 이 정도 시간이 걸립니다.

대표적으로 DeRF(21CVPR) , NeRF++ 가 performance를 개선하는 방향으로 연구가 진행되었고,

비교적 최근에 나온 plenoxel(22CVPR)은 Neural Network 없이 10분 내로 Training을 완료합니다.

Plenoxel 성능 (출처: https://alexyu.net/plenoxels/?s=09)

Plenoxel 프로젝트 페이지 : https://alexyu.net/plenoxels/?s=09 

 

 

2. (Static) NeRF는 Static한 Scene에 대해서만 성능이 좋습니다.

다시말해 움직이는 물체가 있는 Scene에 대해서 많은 Noise를 생성합니다.

대표적으로 D-NeRF(21CVPR) , Nerfies(21ICCV) , HyperNeRF(Nerfies와 같은 저자) 가 해당 문제를 해결합니다.

출처 : (Nerfies) https://nerfies.github.io/

Nerfies 프로젝트 페이지 : https://nerfies.github.io/

 

3. (Lightning) NeRF는 같은 환경에서 촬영한 이미지에 대해서만 성능이 좋습니다.

Static 한 물체더라도 날씨, 시간등에 따라 명암, 색상 빛 조건 등이 다를 수 있고,

Real world에는 사실 스튜디오에서 찍는게 아닌 이상 이런 데이터들이 더 많습니다.

NeRF는 이런 다양한 환경에서 찍은 하나의 물체에 대해서 학습이 어렵습니다.

대표적으로 NeRV(21CVPR) , NeRD(21CVPR) , NeRF in the wild (21CVPR) 등이 해당 문제를 해결하는 방향으로 연구를 진행하였습니다.

출처 : (NeRF-w) https://nerf-w.github.io/

NeRF in the wild 프로젝트 페이지 : https://nerf-w.github.io/

 

4. (Generalize) NeRF는 general한 Model이 아닙니다.

다시말해, NeRF는 한 Model로 하나의 물체만 만들어낼 수 있는 zero-shot Learning과 비슷한 개념의 모델입니다.

즉, Lego 데이터로 학습한 모델로 Ship 데이터를 예측할 수 없습니다.

 

학습시간도 오래걸리는데 Generalize하지도 않다. 이는 실생활에 쓰이기에 상당히 inefficient 합니다.

이를 해결하기 위해서도 다양한 방법들이 소개되어왔습니다. GIRAFFE(21CVPR) , pixel-NeRF(22CVPR) ...

출처 : PixelNeRF (https://alexyu.net/pixelnerf/)

pixel-NeRF 프로젝트 페이지 : https://alexyu.net/pixelnerf/

 

 

5. (Few Shot) NeRF는 다양한 시점의 너무 많은 training set이 필요합니다.

NeRF에 input으로 들어가는 synthetic Training dataset은 100개입니다.

한 물체를 렌더링(학습) 하기 위해 100장의 사진을 찍는것은 inefficient합니다.

몇 장의 사진만으로 물체를 렌더링 할 수 있다면 실생활에 더 많이 쓰일 것 같습니다. (1.performance와 비슷한 개념)

pixel-NeRF(22CVPR) , DietNeRF(21ICCV) 등이 해당 연구에 힘써주었습니다.

최근에는 Nvidia에서 혁신적인 논문을 소개하여 화제가 되기도 했습니다. (Instant-NGP)

Instant-NGP 프로젝트 페이지 : https://nvlabs.github.io/instant-ngp/

 

6. (Pose Estimation) NeRF는 Input으로 Camera Parameter 값이 들어가야 합니다.

NeRF를 학습 하기위해서는

Pose 값, 다시말해 물체를 촬영한 카메라의 위치를 알기 위한 intrinsic parameter와 extrinsic parameter 값이 필요합니다.

 

일반인이 스마트폰 카메라 등으로 물체를 촬영하여 학습을 하기에는, 너무 많은 정보들이 필요합니다.

이를 해결하기 위해 pose를 estimate 한다던지, pose 자체를 학습하는 등의 연구가 진행되어 왔습니다.

iNeRF(21IROS) , NeRF-- , GNeRF(21ICCV) , BARF(21ICCV) , SCNeRF(21ICCV) 등이 해당 문제를 해결하기 위한 방법을 제안합니다.

출처 : iNeRF : pose가 학습되어지는 과정

iNeRF 프로젝트 페이지 : https://yenchenlin.me/inerf/

 

 

 


물론 이 6개의 분야만 있는게 아닙니다.

다양한 환경의 다양한 방법의 Contribution을 가지고 NeRF 관련 많은 논문들이 쏟아져 나오고 있습니다.

 

 

가까운 미래에는 스마트폰 카메라로 찍은 몇 장의 사진 만으로 물체를 3D Rendering 할 수 있을 것 같습니다.

 

 

수식적으로 더 자세한 내용은 아래 링크를 참여해도 좋을 것 같습니다.

https://csm-kr.tistory.com/64

 

[Nerf] NeRF(Neural Radiance Fields for View Synthesis) 리뷰 및 구현 (ECCV2020)

안녕하세요 pulluper 입니다 :) 이번포스팅은 ECCV2020 에서 best paper를 받으며 Nerf 바람을 불러온 첫 논문 NeRF(Neural Radiance Fields for View Synthesis)에 대하여 알아보도록 하겠습니다. https://arxiv.org/pdf/2003.08

csm-kr.tistory.com

 

 

 

 


Paper : https://arxiv.org/abs/2003.08934

Official Code : https://github.com/bmild/nerf 

Project Page : https://www.matthewtancik.com/nerf

Survey Paper : https://arxiv.org/abs/2101.05204v2

Survey Github : https://github.com/yenchenlin/awesome-NeRF

 

 

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함