컴퓨터비전/실습

[컴퓨터비전/실습] Instant-NGP with Custom Dataset

김과분 2023. 12. 13. 16:20
728x90

NeRF(Neural Radiance Fields)

 카메라가 어떤 위치에서 이미지 관찰했을 때, 해당 공간의 3D 구조와 빛의 반사를 설명하는 3D 장면을 학습하며, 이를 통해 실제 촬영한 이미지에 기반하여 3D 장면을 생성하거나 다양한 시각에서 장면을 렌더링할 수 있다.

NeRF 개선 방향 및 기술 동향: https://xoft.tistory.com/5

 

[논문 정리] NeRF 개선 방향 및 기술 동향

NeRF(Neural Radiance Fields) 최초 논문에서는 확장 가능한 여러 가능성을 남긴체로 간단하게 핵심 개념을 소개하였었습니다. NeRF 최초 논문(ECCV2020)에 대한 설명은 이전 포스트 참조 바랍니다. 본 글에

xoft.tistory.com

 

Instant NGP(Instant Neural Graphics Primitives)

 NVIDIA에서 만들었으며, NeRF의 성능에 비해 속도가 느리다는 단점을 해결한 모델로, Multi-resolution decomposition과 Hashing을 이용하여 극적인 속도 향상과 SOTA performance를 동시에 달성하였다.

https://github.com/NVlabs/instant-ngp#building-instant-ngp-windows--linux

 

GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more

Instant neural graphics primitives: lightning fast NeRF and more - GitHub - NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more

github.com

 

추천 강의

https://www.youtube.com/watch?v=Yejdb9l1w2Q

https://www.youtube.com/watch?v=C9JHhkDJSpM

 

 

Custom Dataset 만들기

참고 영상: https://www.youtube.com/watch?v=VsFHX8IgX1o

 

1. 3D 모델링하고자 하는 객체/공간이 담긴 짧은 영상/이미지 준비

좋은 NeRF 데이터 취득 방법

 카메라 촬영 방법 및 궤도에 따라 NeRF 결과가 달라질 수 있다.
 이에 대해 실험한 결과도 있는데, 이 내용은 나중에 다루어보도록 하겠다.

 

 촬영 기법의 경우, 아크샷(객체를 기준으로 하고, 카메라가 그 주위를 360도 공전하는 방법)을 기본적으로 하고, 다른 촬영 기법을 결합하는 방법이 이상적이었다. 


참고 자료: https://sonbosung.github.io/NeRFMaverick/

 

SOCIAL MEDIA TITLE TAG

SOCIAL MEDIA DESCRIPTION TAG TAG

sonbosung.github.io

2. 필요한 패키지 설치

$ pip install ffmpeg
$ pip install opencv-python
$ sudo apt install colmap

 

3. colmap2nerf.py raw 파일 다운로드

위 링크에서 다운로드 가능: https://github.com/NVlabs/instant-ngp/blob/master/scripts/colmap2nerf.py

CPU 환경에서 실행 시, 코드 수정 필요 (하지만 강력히 비추!)
# 124번째 줄 다음과 같이 수정: --SiftMatching.use_gpu 0 추가
match_cmd = f"colmap {args.colmap_matcher}_matcher --SiftMatching.guided_matching=true --SiftMatching.use_gpu 0 --database_path {db}"​

4. colmap2nerf.py 실행 -> transforms.json 파일 생성

취득한 영상/이미지 와 colmap2nerf.py를 하나의 폴더에 넣고, 그 경로에서 cmd 실행

# video (비디오 파일명: video.MP4)
$ python3 [본인 경로]/colmap2nerf.py --video_in video.MP4 --video_fps 1 --run_colmap --aabb_scale 16

# image (이미지 파일 담긴 폴더명: images)
$ python3 [본인 경로]/colmap2nerf.py --images images --run_colmap --aabb_scale 16

 

video_fps의 경우 1초 당 프레임 개수를 말하며, 1일 경우 1초 당 1개의 이미지 프레임을 추출한다.

이미지의 경우, 50~150장 정도가 이상적이므로, 이에 맞춰 fps를 맞춰준다.

142장 images (20초짜리 video, video_fps=7)

 

이렇게 하면 데이터셋이 담긴 images 폴더 및 Instant-NGP에서 실행할 수 있도록 변환한 transforms.json 파일이 생성된다.

 

Instant-NGP 사용해보기

개발 환경

Ubuntu 20.04.6 LTS

python 3.8.10

NVIDIA GeForce RTX 3090

CUDA 12.3

필요 환경 세팅

$ sudo apt-get install build-essential git python3-dev python3-pip libopenexr-dev libxi-dev libglfw3-dev libglew-dev libomp-dev libxinerama-dev libxcursor-dev

$ gedit ~/.bashrc
# 아래 내용 수정 (본인 cuda 버전 맞게!)
export PATH="/usr/local/cuda-12.3/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH"

$ source ~/.bashrc

$ git clone --recursive https://github.com/nvlabs/instant-ngp
$ cd instant-ngp

instant-ngp$ cmake . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
instant-ngp$ cmake --build build --config RelWithDebInfo -j

 

실행

instant-ngp$ ./instant-ngp --scene [본인 경로]/transforms.json

 

Instant-NGP 사용법: https://happy-obok.tistory.com/70

 

2D 이미지로 3D 만들기 - Instant NGP 애플리케이션 사용방법 설명(NeRF/Instant NeRF/딥러닝/인공지능/Nvid

Instant NGP(Inastan Neural Gaphics Primitives)는 2D 이미지를 입력하면 3D로 변환해 주는 딥러닝 모델인 NeRF를 발전시킨 모델 중 하나입니다. original NeRF 모델 보다 학습 시간이 짧으면서 고품질로 3차원 재구

happy-obok.tistory.com

프로그램 조작키의 경우, 공식 GitHub에도 자세히 나와있다.

 

3D 모델링 전체 결과

 

원본의 경우, 계산량이 많아 픽셀이 깨지는 모습을 확인할 수 있었다.

훈련 결과가 마음에 들지 않으면 reset training하는 방법도 있다(미세하게 다른 결과가 나오기도 함).

 

왼쪽 : 3D 모델링 객체 crop 결과, 오른쪽 : 원본 이미지

 

Crop 시 계산량이 줄기 때문에 로스 그래프가 안정적이게 되고, 객체도 선명하게 나오는 것을 확인할 수 있었다.

 

촬영하지 않은 각도에서의 3D 모델링 결과

 

따로 촬영하지 않은 객체의 아래쪽의 경우, 선명하지는 않지만 아래쪽을 어느정도 만들어주는 모습을 확인할 수 있었다.

 

성능 평가 방법

Instant NGP로 생성된 NeRF 영상과 원본 영상이 얼마나 유사한지를 평가하기 위해 다음과 같은 방법을 사용할 수 있다.

1. R/E (Reprojection error)

 입력 영상을 이용하여 COLMAP을 통해 생성된 3D point를 2D 이미지에 재투영한 점과 2D 이미지의 특징점 사이의 픽셀 거릿값으로 오차를 계산한다.

 작은 값일 수록 오차가 적음을 의미한다.

COLMAP 시 생성되는 colmap_text/points3D.txt

 

위 points3D.txt파일을 엑셀에 옮겨 ERROR 값의 평균을 계산하면 R/E 값을 구할 수 있다.

points3D.txt를 엑셀에 옮겨 ERROR 평균(R/E) 구하기: '=AVERAGE(...)'

 

2. PSNR (Peak Signal-to-Noise Ratio), SSIM (Structural Similarit Index Measure)

 생성된 NeRF 영상에서의 화질 손실 양을 평가하며, 큰 값일 수록 유사도가 큼을 의미한다.

 이는 ffmpeg 패키지를 이용하여 계산할 수 있다.

 

- source.mp4 : 원본 영상, target.mp4 : 3D 모델링 영상 (Instant NGP에서 export 가능)
- target.mp4의 경우, 빠른 비디오 렌더링을 위해 5초로 제한

# PSNR(average)
ffmpeg -i "source.mp4" -i "target.mp4" -lavfi psnr -f null -
# 결과 예시
[Parsed_psnr_0 @ 0x558d38027b00] PSNR ... average:13.050187 ...

# PSNR + SSIM(All)
ffmpeg -i "source_resize.mp4" -i "target.mp4" -lavfi "[0:v][1:v]ssim;[0:v][1:v]psnr" -f null -
# 결과 예시
[Parsed_ssim_0 @ 0x56140efdb280] SSIM ... All:0.384209 (2.105663)
[Parsed_psnr_1 @ 0x56140efddcc0] PSNR ... average:13.050187 ...

# 원본 영상 resize 필요할 때
ffmpeg -i source.MP4 -s 1920x1080 -c:a copy source_resize.mp4

 

참고 자료: https://teus.me/740

 

ffmpeg으로 PSNR/SSIM 간단하게 계산하기

영상의 품질을 정량적으로 표현하는 것은 쉬운 일이 아니다. 일단, 단순하게 사진/동영상 하나를 두고 품질을 표현하는 건 불가능하다. 품질을 정량적으로 표현하려면 두 개의 사진/동영상을 두

teus.me

 

728x90