5개 파트중 마지막 부분인 run_nerf 인데
1000줄 가까이 되는 코드를 올리는건 좀 그렇고
각 클래스나 함수들의 역할만 정리해서 올리는 식으로 하겠다.
Import Statements:
Global Variables:
device
: 현재 사용 가능한 디바이스 (CUDA GPU 또는 CPU) 설정np.random.seed(0)
: 랜덤 시드 설정DEBUG
: 디버깅 모드를 위한 플래그Utility Functions:
batchify(fn, chunk)
:메모리 사용량을 줄이기 위해 주어진 함수 fn
을 작은 배치로 적용하는 함수를 반환한다.
run_network(...)
: 주어진 입력과 네트워크 함수에 대해 네트워크를 실행한다.
필요한 경우 view directions도 포함된다.
batchify_rays(...)
: 레이를 작은 미니배치로 렌더링하여 OOM (Out of Memory) 오류를 방지한다.
render(...)
: 주어진 카메라 설정과 레이를 사용하여 이미지를 렌더링 한다.
render_path(...)
: 주어진 카메라 경로를 따라 이미지 시퀀스를 렌더링 한다.
create_nerf(args)
: NeRF의 MLP 모델을 인스턴스화하고, 필요한 경우 체크포인트에서 가중치를 로드하며, 렌더링에 필요한 인수를 반환한다.
raw2outputs 함수:
render_rays 함수:
config_parser 함수:
훈련 함수 (train
): NeRF 모델을 훈련하는 주요 훈련 루프다.
데이터 로딩: 데이터셋 유형 (llff
, blender
, LINEMOD
, deepvoxels
)에 따라 데이터셋을 로드한다.
이는 이미지, 포즈 및 기타 필요한 데이터가 포함된다.
훈련 설정: 코드는 훈련 환경을 설정한다.
모델, 최적화 도구 및 기타 훈련 매개변수 정의가 포함된다.
훈련 루프: 모델이 훈련되는 주요 루프이며, 다음과 같은 순서로 진행된다:
로그 및 저장: 훈련 중에 코드는 다양한 메트릭 (PSNR 및 손실과 같은)을 로그로 기록하고 지정된 간격으로 모델 가중치를 저장한다.
주 실행: 스크립트가 주 프로그램으로 실행되면 기본 텐서 유형을 CUDA 텐서로 설정하고 (GPU에서 실행하도록 지시) train
함수를 호출하여 훈련을 시작하게 된다.