신경 방사 필드는 렌더링 손실을 사용하여 단일 장면의 입력 뷰를 재현하도록 훈련된 단순 완전 연결 네트워크(무게는 ~5MB)이다. 네트워크는 공간 위치 및 보기 방향(5D 입력)에서 색상과 불투명도(4D 출력)로 직접 매핑하여 볼륨 렌더링을 사용하여 새 뷰를 차별화할 수 있다.
NeRF를 최적화하는 데는 해상도에 따라 몇 시간에서 하루 또는 이틀 정도 소요되며 GPU 하나만 있으면 됩니다. 최적화된 NeRF에서 이미지를 렌더링하는 데는 해상도에 따라 1초에서 최대 30초도 걸리지 않는다.
GitHub - bmild/nerf: Code release for NeRF (Neural Radiance Fields)
Code release for NeRF (Neural Radiance Fields). Contribute to bmild/nerf development by creating an account on GitHub.
github.com
데이터셋을 수집하는 방법은 LLFF의 방식과 동일하다.
주의! frame의 1/8이상 움직이면 명확한 output이 나오지 않으므로, 이에 대해 주의하며 데이터를 수집해야한다.
NeX와 달리 카메라의 각도가 돌아가도 결과물이 잘 나오는 편이다.
NeX는 절대 카메라가 틀어지면 안되고 무조건 수평으로 잘 잡아가면서 이미지를 수집해야 결과물이 잘 나온다.
https://github.com/Fyusion/LLFF
GitHub - Fyusion/LLFF: Code release for Local Light Field Fusion at SIGGRAPH 2019
Code release for Local Light Field Fusion at SIGGRAPH 2019 - GitHub - Fyusion/LLFF: Code release for Local Light Field Fusion at SIGGRAPH 2019
github.com
LLFF에 대한 세팅이 되어있지 않을 시, 이에 관한 세팅을 해줘야한다.
이는 Github의 LLFF 세팅을 동일하게 진행하면 된다.
1) repository clone
2) manual Installation 따라하기
pip install -r requirements.txt
sudo apt-get install libglfw3-dev
3) image 데이터를 LLFF/data/[설정이름]/images 안에 넣고 LLFF 위치에서 아래의 코드를 돌린다.
python imgs2poses.py data/[설정이름]
예를 들어 LLFF/data 내에 5k라는 폴더 안에 images 를 넣었을 때,
python imgs2poses.py data/5k
여기까지 진행하면 LLFF에 대한 세팅이 마무리된다.
Nerf 학습의 경우, Code에서 Parameter를 수정하지 않고, txt 파일 만으로 코드를 돌리게 된다.
이에 관하여 정리를 하자면,
1) Nerf clone
2) conda 환경 새로 만들기
conda create -n "test" python=3.7
3) yaml 파일에 맞춰 conda 환경 세팅
conda env create -f environment.yml
4) 학습을 위한 txt 파일 조정
4-1) .txt 파일 만들기 (주석은 빼고 쓰세요.)
expname = test // output의 이름 설정
basedir = ./logs
datadir = ./data/5k // llff에서 만들어진 데이터 전체를 복붙한다.
dataset_type = llff
// 아래 값들은 변경하지말고 사용하시오.
factor = 8
llffhold = 8
N_rand = 1024
N_samples = 64
N_importance = 64
use_viewdirs = True
raw_noise_std = 1e0
4-2) 360도 도는 데이터
- 360도 도는 데이터를 통해서도 output을 뽑아낼 수 있는데, 이에 관한 내용은
We recommend using the imgs2poses.py script from the LLFF code. Then you can pass the base scene directory into our code using --datadir <myscene> along with -dataset_type llff. You can take a look at the config_fern.txt config file for example settings to use for a forward facing scene. For a spherically captured 360 scene, we recomment adding the --no_ndc --spherify --lindisp flags.
위의 내용을 참조하면 된다.
(--no_ndc --spherify --lindisp flags를 추가하면 된다.)
5) nerf 학습
txt파일이 다 만들어졌고 이를 사용하여 nerf 학습을 돌리면 된다.
만든 txt 파일을 nerf의 최상단 디렉토리에 넣어두고
python run_nerf.py --config test.txt
이 코드를 돌려주면 돌아간다.
= 추가 내용
- NeX 대비 코드가 가벼워 VRAM Error가 발생할 위험이 적다.
다만, 100만회 학습이 진행되는데, loss가 지속적으로 나오니 loss 가 떨어지지 않거나 오히려 올라가는 등의 overfitting 경향이 보이면 학습을 중지시키면 된다.
-output은 학습된 weight 값과 rendering 된 영상과 이미지가 출력된다.
-지속적인 실험 결과, 결과치는 50만회 이상에서 적절하게 나오는 것으로 확인되었고,
- 원본 이미지인 5k이미지 이상의 값을 넣어야 화면의 사이즈가 크게 나오는 것을 확인했다.
- 이에 관해서는 parameter 수정을 통해 사이즈를 키울 수 있으나, 적절한 값이 있으므로 가능한 이미지의 사이즈의 변환을 건드리지 않는 편이 가장 학습 결과가 좋게 나온다.
- 추가적으로 output에서 끝단의 이미지가 밀리거나 검정 부분이 나오는 이슈에 대해서는 spiral 카메라 모션을 적용한 상태에서 output 영상을 렌더링하므로 데이터를 충분히 좌우와 하단 까지 수집하지 않아서 발생하는 이슈로, 이에 대한 이미지를 수집하면 해결된다.
'딥러닝 > Virtual Production' 카테고리의 다른 글
[NeX] 3. NeX코드 데이터셋을 만들어서 돌려보자. - LLFF로 필요한 것들 추출 (1) | 2021.09.15 |
---|---|
[NeX] 2. NeX코드 데이터셋을 만들어서 돌려보자. - Colmap 설치 (0) | 2021.09.15 |
[NeX] 1. NeX코드 설명/설치 (0) | 2021.09.15 |
[SMPLicit] SMPLicit 개발 로그 (0) | 2021.09.15 |