부스트캠프로부터 귀하디 귀한 gpu를 사용할 수 있는 기회를 얻었지만,,, 약 4시간 만이 주어진 상황이었습니다. 또 CUDA를 사용할 수 없는 환경이어서, GSplat 대신 NeRFStudio를 사용해보았습니다.
apt-get install -y gcc libgl1-mesa-glx libglib2.0-0
git clone https://github.com/nerfstudio-project/nerfstudio.git
cd nerfstudio
pip install -e .
설치 방법은 위와 같이 매우 간단합니다. 가상 환경은 conda로 사용하였습니다.
NeRF의 input data로는 3D position과 viewing direction이 존재합니다. 이는 각 카메라 ray로부터 얻어지게 되며, ray 정보를 얻기 위해서는 카메라의 intrinsic/extrinsic 정보를 획득해야 합니다. 2D images로부터 카메라 파라미터를 얻기 위해 COLMAP(Structure-from-motion)을 사용합니다.
NeRF studio에서 제공하는 전처리 기능입니다.
ns-process-data images --data data_folder --output-dir output_folder
해당 함수를 실행하면, 1️⃣ Images를 2/4/8 downsclae하여 output 폴더에 카피하고, 2️⃣ feature extraction, 3️⃣ feature matching, 4️⃣ bundle adjustment까지 수행하여 카메라 파라미터들을 뽑아냅니다.
문제의 colmap입니다... 원격 linux 서버에 gui가 깔려 있지 않아, gpu 환경으로 SFM을 수행하는 데에 어려움을 겪었습니다. 따라서 로컬 환경인 맥북으로 미리 뽑은 카메라 파라미터를 사용하였고, 수행 결과는 다음과 같습니다.
위에서 얻은 binary 파일들을 txt로 변환하는 과정이 필요합니다. CLI에서 해당 명령어를 사용합니다.
colmap model_converter \
--input_path path-to-binary-reconstruction \
--output_path path-to-txt-reconstruction \
--output_type txt
이를 transforms.json에 저장해야 합니다. 코드는 instant-ngp에 존재하는 colmap2nerf.py를 사용하였습니다.
ns-train nerfacto --data data_foler
전처리를 마친 후, nerfacto를 사용하여 custom scene을 학습하였습니다.
Nerfacto는 NeRF Studio에서 자체적으로 개발한 모델입니다. (논문은 존재하지 않습니다.) real scene을 잘 표현하기 위해 고안되었습니다. 중요 특징은 아래와 같습니다.
학습 이후 camera path를 미리 뽑아두는 것을 권장합니다! render 결과를 비디오 형식으로 뽑을 수 있습니다. NeRF로 학습한 scene은 point cloud로 추출 가능합니다. (gs는 ply 형식)
자세한 부분은 ns-export --help로 확인할 수 있습니다.
[1] nerfstudio, https://github.com/nerfstudio-project/nerfstudio/tree/main
[2] nerfacto, https://docs.nerf.studio/nerfology/methods/nerfacto.html