메뉴 바로가기 본문 바로가기

3D Scene 합성: NeRFstudio 활용기

  • 진경원
  • 2023.09.18

 


 

   
 

 

[들어가며]

 

본 글은 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis (ECCV2020) 논문을 기반으로 다양한 모델과 API를 사용할 수 있게 하는 NeRFstudio에 대한 글입니다. 기존의 3D Reconstruction 작업은 이미지를 통해 3D 물체를 복원해서 인테리어, 엔터테인먼트, 건축 등 다양한 분야에서 사용되지만 복원된 object가 실제 view처럼 보여주지는 못합니다. NeRF는 물체의 복원 보다는 기존에 없었던 새로운 camera position 에서의 장면의 복원에 가깝다고 할 수 있습니다.

 

 

 

위 그림처럼 NeRFstudio는 입력으로 다양한 각도에서 찍힌 사진을 가지고 3D 복원을 통해서 기존에 이미지에 찍히지 않은 사진 사이 사이의 각도에서의 view를 복원해 주는 기술입니다. 즉, 3D 복원의 목적보다는 ‘새로운 camera position에서 바라본 이미지는 어떻게 생겼을까?’를 복원하는 것이며, 3D Recon이 잘 되어야 새로운 position에서도 이미지를 잘 예측할 수 있습니다.

 

테스트 시에 임의의 camera parameter(K’, R’, t)를 실제 view와 유사하게 만드는 게 목적입니다.

 

 

 

간략하게 NeRF의 구조를 설명하면, Structure from Motion을 사용해 camera calibration을 하여 camera parameter를 구한 다음 수행하는 것입니다.

 

 

 

 


(x,y,z, θ, Φ)(position, direction) 5개를 F에 input으로 넣어 주는데, x,y,z는 3D point 값, θ, Φ는 view의 각도를 나타냅니다. Neural network F_{θ}는 output으로 3D field를 예측하는데 그 결과 값은 (r,g,b,σ) 이고 어떤 color를 가지는지에 대한 (r,g,b)값과, occupancy(이미지의 내부인지 아닌지)에 대한 σ로 나오게 됩니다. 

 

 


 

위 사진처럼 한 점의 색상(보라색 박스)를 나타내는 건 하나의 3D point가 아니라 ray를 따라 지나는 공간이 합쳐진 것이라고 생각하면 됩니다.

 

모든 이미지에 대해 각 r,g,b,σ를 구하고, 이 값은 ray에 대해 volume rendering 한 값입니다. ray r(t) 는 o + td (o : cam center, d : unit direction, t : 길이)로, 따라서 r(t)는 t에 따라 변하는 ray의 3D point입니다. 아래 계산을 통해 나온 값과 2D 이미지의 ground truth color를 가지고 두 값 사이의 차이를 계산해서 실제 보이는 view와 유사하게 만들어 주는 게 목표입니다.

 

 


 

C(r)는 Ray r에 대한 2d color 값으로 적분을 통해 t의 변화에 따라 continuous하게 값이 있습니다.

σ는 point r(t)가 주어졌을 때의 density이고, c(r(t),d)는 point와 direction이 주어졌을 때의 color입니다.

T는 accumulated transmittance로 어떤 3D point가 있을 때 보이는 점과 안 보이는 점에 따라 weight를 크거나 작게 설정해 주는 값입니다. 이는 아래의 그림과 같이 한 2D point에 대한 color 값이 ray를 따라 합쳐지는데, 가려진 물체가 있다면 가려진 부분의 영향을 반영하기 위해서 입니다. 즉, 2D color(C(r))는 그 ray에서 만나는 점들의 density와 color의 intergration 입니다.

 

 

 


 

아래 그림에서 t부터 tn까지 intergration이므로 지수 값이 커질수록 지수함수 그래프가 작아지게 되어 T(t)가 작아지게 됩니다.

 

 

따라서 T(t)값이 매우 작아지기 때문에 다른 값에 상관없이 color C(r) 값에 영향이 없게 됩니다.

 

 

아래는 NeRF의 결과물입니다.

 


 

 

NeRFstudio는 NeRF, instant-ngp, nerfacto … 등등 NeRF에서 파생된 여러 방법들을 구현해 놓고, 실험해 볼 수 있는 framework 입니다. Viewer, 모델, 전처리 등등 API로 구현되어 있어서 손쉽게 사용할 수 있습니다.

 

<실험 환경>

  • 도커 이미지
    • docker pull dromni/nerfstudio:0.1.19
  • 도커 컨테이너 실행
    • docker run --gpus all -d -it --name Nerfstudio --ipc=host -v {/local_path}:/workspace/nerfstudio 306e47db70ad


<데이터>

NeRFstudio 공식 페이지에서는 다양한 방법의 input data를 지원하고 있습니다.

추가적인 어플리케이션 없이 이미지와 video 파일을 통해 진행해보도록 하겠습니다. 우선 한 물체에 대해 연속적인 촬영을 통해 얻은 이미지나 영상을 사용합니다. 영상의 frame 전부가 사용되지는 않습니다.

ns-process-data {images, video} --data {DATA_PATH} --output-dir {PROCESSED_DATA_DIR}

downscale 과정 때문에 시간이 많이 소요되는데 --num-downscales 0 옵션을 추가해 주면 downscale 없이 더 빠르게 진행이 가능합니다.

 

 

<실행 화면>



 

<학습 수행>

ns-train nerfacto --data {PROCESSED_DATA_DIR} --vis viewer

viewer 경로가 다음 형식으로 커맨드 창에 나오게 됩니다.

https://viewer.nerf.studio/versions/23-05-01-0/?websocket_url=ws://localhost:7007

인터넷 브라우저에 주소를 입력하면 아래와 같은 화면 구성을 볼 수 있습니다. 주어진 이미지를 가지고 학습이 되는 것을 실시간으로 볼 수 있는데, 사실 NeRF 학습은 model이 학습한다는 개념보다 이 이미지들에 대해 3D scene을 예상하는 학습이라고 생각하시면 됩니다. 예를 들어 우리가 사용한 사람의 이미지는 그 이미지에 대하여 복원한 결과물을 보여줄 수 있지만 다른 건물이나 물체에 대해서는 복원할 수 없습니다.

 

좌클릭, 휠을 통해 실시간으로 복원되는 장면을 확인할 수 있습니다.

 



 

 

 

 

<렌더링>

아래와 같이 RENDER 클릭 후 원하는 장면에서 ADD CAMERA 버튼을 눌러 녹색 박스 형태의 카메라 시점을 추가 할 수 있습니다. 우측 사진과 같이 추가한 카메라 시점들의 경로가 붉은색 선으로 표현 되게 됩니다.


 


 

이름, 해상도, FPS 등 설정을 하고 우측 중앙의 RENDER를 누르면 팝업 창으로 명령어가 출력되고, 그 명령어를 사용해서 렌더링 된 영상을 획득할 수 있습니다.

 

 

<결과물> 

41장을 사용한 영상과, 300장 이상의 이미지를 사용하여 렌더링 한 영상입니다.

 

      

 

 

[끝으로]

3D object reconstruction에 대한 관심과 기술들이 빠르게 발전 하고 있는 가운데, NeRF라는 3D 장면 복원 task에 대해 알아 보았습니다. 3D 공부를 하던 중 우연히 Instant-ngp라는 NVIDEA에서 NeRF를 사용하여 개발한 모델 영상을 보게 되었고, 기존의 NeRF보다 훨씬 빠른 속도로 복원할 뿐만 아니라 디테일한 부분까지 사실과 비슷하다는 것이 놀라웠습니다. 또한, GUI로도 개발된 Instant-ngp를 직접 사용해 보고 더 흥미를 느꼈습니다. 이후 NeRF에 대해 공부하고, NeRFstudio라는 툴을 통해 많은 관련된 기술들을 사용해 본 경험을 테크 블로그를 통해 나누고 싶었습니다. 처음부터 scene 복원이나 3D reconstruction을 접하는 사람은 camera parameter부터 시작해서 3D 개념에 대한 이해가 어려울 수 있습니다. 개념에 대한 이해도 중요하지만 접근성 좋은 도구를 사용하여 3D 복원에 대한 실질적인 작업 수행과 결과물을 통해 흥미를 느끼거나, 새로운 작업을 시도해 볼 수 있습니다. 특히 NeRFstudio는 이러한 관점에서 사용자가 영상 또는 이미지를 통해 손쉽게 3D 복원 작업을 시도할 수 있고, 현재 나와 있는 다양한 NeRF 기반의 모델들이 잘 정리되어 있기 때문에 빠르게 여러 작업에 대한 이해와 결과물을 획득 할 수 있기에 좋은 시도가 될 수 있을 것 같습니다. 저처럼 많은 분들이 사용에 도움이 되고, 흥미를 느끼는데 도움이 되었으면 좋겠습니다.



[Reference]

https://arxiv.org/pdf/2003.08934.pdf

https://www.matthewtancik.com/nerf

https://www.notion.so/Lecture-26-NeRF-7c340e39708340e99fea2dc7b76f1ce1?pvs=4

https://docs.nerf.studio/en/latest/

https://github.com/nerfstudio-project/nerfstudio

https://docs.nerf.studio/en/latest/reference/cli/ns_process_data.html