본문 바로가기
NeRF

[API 리뷰] NeRF Studio : NeRF 통합 Framework

by xoft 2023. 2. 27.

NeRF를 쉽고 편리하게 구현 할 수 있는 API이자 Framework인 nerfstudio 에 대해 소개합니다. 

https://user-images.githubusercontent.com/3310961/194017985-ade69503-9d68-46a2-b518-2db1a012f090.gif https://user-images.githubusercontent.com/3310961/194020648-7e5f380c-15ca-461d-8c1c-20beb586defe.gif

nerfstudio에서는 NeRF모델을 구현하는데 필요한 Data Preprocess, Data Loader, Model Training, Visualizing, Rendering을 API형태로 제공합니다. 그리고 API로 만든 NeRF 소스코드들을 제공합니다. Framework를 소개하는 논문도 있습니다.

A Modular Framework for Neural Radiance Field Development, Matthew Tancik , arXiv 2023

본 글에서는 공식 홈페이지 의 내용을 정리 했습니다.

nerfstudio에서 지원하는 NeRF 모델 / Component 모듈 / 데이터 전처리 / Viewer를 소개하고, 추가로 개발 환경 셋팅 후 실행 결과 까지 소개하겠습니다.

 

 

Supported NeRF Models

2023년 2월 27일 기준으로 지원하는 논문은 다음과 같습니다. 제가 이전에 리뷰한 논문들도 있습니다.

 

Supported Component Modules

NeRF 알고리즘 구현에 필요한 다양한 타입의 Camera Model, Ray Sampler, Encoder, Spatial Distortion들도 API로 제공합니다. 각 컴포넌트에 대해 시각화해서 깔끔하게 문서화 되어 있습니다. 한번씩 클릭해보시길 바랍니다.

 

Supported Data Preprocess

다양한 입력 데이터에 대해 전처리도 지원합니다.

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

API에서 제공하는 ns-process-data 명령어의 첫번째 인자에 Data Type을 넣고 입력 Path, 출력 Path를 넣어주면 학습이 가능한 형태로 전처리 됩니다. 각 Data Type별로 처리되는 App은 아래 Requirements에 표시되어 있습니다. 가장 많이 쓰는 COLMAP의 경우 nerfstudio에서 제공하는 Docker파일을 설치하면 자동으로 설치되어 있습니다.

Data Capture Device Requirements Speed
📷 Images Any COLMAP 🐢
📹 Video Any COLMAP 🐢
📱 Polycam IOS with LiDAR Polycam App 🐇
📱 KIRI Engine IOS or Android KIRI Engine App 🐇
📱 Record3D IOS with LiDAR Record3D app 🐇
🖥 Metashape Any Metashape 🐇

 

 

Web Viewer

모델을 학습 할 때 중간 결과물들을, 학습 후에 최종 결과물들을 Web Viewer로 확인 할 수 있습니다.

해당 Viewer를 통해서 Image, Video를 Rendering 할 수 있고, Point Cloud, Mesh도 Export 할 수 있습니다. 

게임할 때 많이 쓰는 w, a, s, d와  마우스 왼쪽, 오른쪽, 휠 클릭을 통해서 View 시점을 바꿀 수 있습니다.

아래 영상에 잘 설명되어 있습니다. 

 

 

지원하는 기능 소개는 여기까지 하고 개발 환경 셋팅 방법을 소개하겠습니다.

 

 

 

nerfstudio 개발 환경 셋팅

Linux, Windows 다양한 설치 방법을 제공합니다. -> nerfstudio 내 설치 방법 설명

저는 Windows 에서 Docker를 기반으로 설치 하였습니다.

 

1. Docker 설치 : Docker Download

2. CUDA 11.8 설치 : NVIDIA Driver Download  (CUDA버전을 맞추기시길 바랍니다.)

3. Docker Image를 아래 명령어로 다운로드 (글 작성 시점에서는 0.1.18 입니다. 시간이 오래 소요됩니다. 체감상 약 30분)

docker pull dromni/nerfstudio:0.1.18

4. Docker Container를 아래 명령어로 실행

  • -v옵션은 폴더 동기화 입니다. 저는 C드라이버 내 d\nerfstudio폴더를 만들고, 그 폴더 내 data라는 폴더와 .cache라는 폴더를 만들었습니다. 각 폴더를 container내의 폴더와 연결 시켰습니다.
  • -p는 포트 연결입니다. 7007은 Web Viewer를 위한 포트이고, 3389는 원격접속을 위한 포트입니다. 3389는 안하셔도 됩니다.
  • 마지막줄 ^는 윈도우 명령 프롬프트(윈도우+r -> cmd)로 했을 때 줄바꿈 기호입니다. 다른 툴을 쓰시면 바꾸시길 바랍니다.
docker run --gpus all -v C:\d\nerfstudio\data:/workspace/ ^
-v C:\d\nerfstudio\.cache:/home/user/.cahce/ ^
-p 7007:7007 -p 3389:3389 ^
--name nerfstudio -it dromni/nerfstudio:0.1.18

위 2개 명령어로 간단하게 설치가 됩니다.

 

docker로 접속합니다. 접속하면, container 내 /workspace 에 진입되게 됩니다.

docker attach nerfstudio

 

 

 

 

실행 결과

데이터 전처리

집에 있는 튜브 인형을 Iphone SE3 기본 카메라로 앱으로 11초 촬영 후에 카카오톡으로 PC 전송했습니다.

1280x720 해상도, 30FPS, 11초, 2.97MB의 영상을 입력 Video로 사용하였습니다. (아래 영상은 블로그 업로드를 위해 압축했습니다. 크롬 사용하는 경우 상단에 ABP라는 빨간 아이콘을 선택해서 이 웹사이트 광고 차단을 해제해야 영상이 보이네요... )

 

 

그리고 c:\d\nerfstudio\data에 my_video.mp4라는 이름으로 셋팅해놓고 아래 명령어를 입력했습니다.

ns-process-data video --data /workspace/my_video.mp4 --output-dir /workspace/preprocessed_data

그러면 Docker내 /workspace/preprocessed_data와 Local PC내 c:\d\nerfstudio\data\preprocessed_data에 COLMAP에 의해 camera pose파일이 생성됩니다. i7-12700F, RTX3060기준 속도를 측정하였을 때, COLMAP으로 Pose 파일을 생성하는데 약 12분 소요되었습니다. (COLMAP이 GPU를 사용하는지 모르겠네요..)

 

데이터가 준비되었으니, 다음으로 Model을 아래 명령어로 학습합니다.

 

 

모델 학습

ns-train nerfacto --data /workspace/preprocessed_data

1번째 인자에 알고리즘명을 넣으면 됩니다. nerfacto는 nerfstduio 제작자가 만든 알고리즘입니다. 따로 논문은 없습니다.  위에서 언급했던 supported nerf 모델을 1번째 인자로 넣으면 됩니다.

 

아래는 학습후에 캡처한 화면입니다.

학습 시간은 1 iteration 당 약 0.043초로 봤을 때, 30000 iteration을 수행하면 약1290초 이며, 약 22분정도 소요됬습니다.

(i7-12700F, RTX3060기준 속도 측정)

 

 

결과 Rendering

위에 초록색으로 표시된 http주소를 웹브라우저에 입력하면, Web Viewer를 볼 수 있습니다.

WebViewer에서 Rendering할 Camera Path를 설정해줬습니다. 정육각형 안에 있는 긴 줄이 입력 데이터를 나타내고, Camera1~9로 캡셔닝 된 사각뿔들과 빨간색 선이 Rendering할 결과 View Direction에 대한 Camera Path에 해당합니다.

ADD CAMERA 버튼으로 카메라를 추가해준 후에, RENDER 버튼을 눌렀습니다.

COPY COMMAND 버튼을 누른 후, 콘솔로 돌아가서 ctrl+c를 누른 후 copy한 명령어를 붙여 넣습니다.

ns-render --load-config outputs/-workspace-preprocessed_data/nerfacto/2023-02-26_143732/config.yml --traj filename --camera-path-filename /workspace/preprocessed_data/camera_paths/2023-02-26_143732.json --output-path renders/preprocessed_data/2023-02-26_143732.mp4

7분 44초가 소요됬습니다.

 

결과 Video는 1920x1080 해상도, 24FPS, 4초,  9.37MB로 만들어 졌습니다. (아래 영상 또한 블로그 업로드를 위해 압축했습니다.)

 

 

 

Closing..

NeRF 연구에 필요한 모듈들이 상당히 정리가 잘되어 있는 API 였습니다. 최대한 NeRF 연구를 하기 편하도록 만들어 두었습니다. API 개발 저자들이 계속적으로 contributor들을 찾고 있고, 이를 위해 discord까지 운영하고 있습니다. 앞으로 나올 NeRF연구들이 해당 API 기반으로 많이 작성 될 것 같습니다. 앞으로 나올 NeRF모델들을 통합 해줄지 기대가 되네요.

댓글