오랜만에 쓰는 NeRF 논문 리뷰 

CVPR 2025 NeRF 논문 리뷰 

논문 링크: https://arxiv.org/pdf/2410.16271

프로젝트 페이지: https://linjohnss.github.io/frugalnerf/

코드는 아직 미공개

 


 

Main Figure 

 

Over all Comments 

2장의 input으로도 빠른 학습과 좋은 성능을 동시에 달성

기존의 few-shot 논문들이 쓰는 여러가지 방법(Frequeuncy regularization, voxel grid, external prior) 등을 

적절히 활용하여 상호보완한 논문 

 

여전히 depth-prior(Ld)를 쓴다는 단점은 있고 학습의 복잡도를 아주 해결하지는 못했지만

복잡하다 =/= 나쁘다 이니 괜찮은 결과를 냈으니 Good.

그리고 모델을 엄청 타는 방법들도 아니라서 fexlible하다고 생각 

 

 

 

 

아래는 논문 요약 

의견은 회색 글씨 또는 (괄호)에 작성

그 외의 대부분의 내용은 논문에서 발췌 


Abs

눈에 띄는 점은 Abs 완전 초반부터 특정 논문을 언급하면서 해당 논문들과 비교할 것임을 명시한다. 

: ~~ FreeNeRF and SparseNeRF, use frequency regularization or pre-trained priors but struggle with complex scheduling and bias.

 

보통 few-shot NVS 계열들은 pre-trained prior가 필요하기 마련인데 

Abs만 봤을때는 이런 prior 없이도 잘 작동하고 별도의 복잡한 학습 테크닉도 없는 것으로 보인다 

(but, figure를 봤을 땐 depth prior가 있는 버전, 없는 버전으로 두가지가 존재하는 것 같다)

 

* leverages weight-sharing voxels across multiple scales

* cross-scale geometric adaptation scheme that selects pseudo ground truth depth based on reprojection errors across scales.

 

그 외 논문에서 명시하는 main contribution은 두 가지 

weight-sharing voxel이라는 특이한 개념과 cross-scale geometric adaption을 사용한다.

 

 

Intro

 

 

기존 방법들 a,b,c는 각각의 단점이 있다 

(a) 대표적으로 FreeNeRF : 학습이 오래 걸림 

(b) 다양한 scene에 잘되진 않음 

(c) Pre-trained 된 prior 의존성이 높음 

(-> 본인도 Pseudo GT를 쓰기 때문에 c에 대한 ablation이 있는지 확인 필요)

 

=> FrugalNeRF는 이 모든 방법들을 결합하여 빠른 수렴과 동시에 높은 퀄리티를 달성 

 

* The most accurate scale becomes the pseudoground truth and guides the training across scales, thus eliminating the need for complex voxel upsampling schedules and enhancing generalizability across diverse scenes.

: Abs에서 언급했던 adaptation scheme에 대한 힌트를 살짝 준다 

다양한 scale의 voxel grid를 사용해서 학습을 하되, 가장 reprojection error가 적은 scale이 pseudo GT가 되어 다른 두 scale의 학습을 주도한다. 단순한 sensitivity 기반의 방법으로 complex한 scheduling의 필요성을 줄여준다. 

 

 

Methods

3.2 Overview of FrugalNeRF

The key feature is hierarchical subsampling with weight-sharing multi-scale voxels, ~ (Sec. 3.3).

To prevent overfitting in extreme few-shot scenarios, we apply geometric adaptation for regularization (Sec. 3.4),

along with novel view sampling and additional regularization losses to reduce artifacts (Sec. 3.5).

 

Related works에서 언급했던, voxel 구조가 일반적으로 갖는 overfitting 이슈를 해결하기 위해 

geometry adaptation을 사용했고, 추가적으로 novel view sampling과 regularization loss를 적용했다는 스토리 

 

 

 

 

 

3.3 Weight-Sharing Multi-Scale Voxels

FreeNeRF에서 사용했던 frequency regularization과 동일한 아이디어로,

lower resolution voxel이 전체적인 특성을 잡고 higher resolution voxel이 fine detail을 잡아주는 역할 

 

특이한 점은 FreeNeRF처럼 순차적으로 학습하는 것이 아니라 

Higher resolution voxel을 뽑아서 downsampling 으로 Lower resolution voxel을 만든다. (= weight-sharing)

이렇게 함으로써 geometry consistency를 유지할 수 있다고 함 

추가적으로 model size나 memory size를 추가적으로 사용하지 않아도 됨 

(그러나 향후 loss를 보면 각 scale별로 loss를 계산하기 때문에 코드를 봐야겠지만 memory 추가가 제로는 아닐듯)

 

loss는 각 크기의 voxel에서 각각 rendering 한 후 각 scale의 이미지에서 나온 loss를 전부 더해서 학습 

l은 각 voxel의 scale level

 

 

3.4 Cross-scale geometric adaptation

cross-scale geometric adaptation은 few-shot scenarios의 한계를 GT depth data없이 해결하기 위해 도입한 방법

3.3에서 설명하듯이 다양한 scale의 voxel을 사용하게 되면 optimal scale을 찾는 것이 essential하기 때문 

 

train view i 에서 각 voxel scale에 대해 depth 값을 계산 한 후 

인접 view인 j에 i에서 계산한 RGB 값을 warping한다. 

이를 실제 j의 RGB와 MSE 계산을 해서 그 error가 가장 적은 scale을 pseudo GT로 선정

pseudo GT scale의 Depth에 맞춰서 타 scale의 Depth를 학습한다 (eq(9)) 

 

 

개념적으로 설명하면 어느 정도 학습을 한 뒤, depth값을 계산해서 인근 view로 projection을 해보고 (일종의 validation view)

NeRF의 최종 loss은 color MSE loss가 가장 낮게 나오는 scale을 GT로 삼아서 나머지의 scale의 Depth를 학습시킨다는 것

 

특이한 점은 novel view과 train view (= train view i와 novel view j) 모두 해당 depth loss를 적용한다 

\

(albation을 보니까 Lgeo랑 후술할 Ld를 둘다 안쓴 실험이 없는 것 같은데 이 부분은 좀 마이너스다 

section 3.4라는 중요한 위치를 내어준 것 치고는 ablation이 완벽히 변인통제된 것 같진 않다)

모쪼록 아래 Figure6를 보면 효과는 확실히 알 수 있다 

depth 관련 loss다 보니 확실히 PSNR등 보다는 depth map에서 그 효과가 확실히 보인다 

 

 

3.6 Total Loss 

추가적으로 Lreg, Lsd, Ld를 사용함 (Ld는 depth prior loss로 선택적으로 적용)

 

 

Experiments

Eval: ViP-NeRF와 동일한 방법을 사용 

사소한 부분이지만 pytorch 프레임 워크를 사용하여 학습이나 GPU 연산을 할 때

torch를 매번 device에 올려주는 것이 번거로울 수 있다 

 

 

 아래는 보통 일반적으로 python에서 pytorch를 사용할 때 이미지 등의 텐서를 gpu로 설정해주는 코드이다 

 

 

 

또한 일반적으로 numpy를 torch tensor로 변형하면 아래와 같이 cpu에 로드되면서 tensor로 변형된다 

 

 

위 두가지 경우 새로운 tensor를 생성하면 cpu에 로드되며,

아래의 경우처럼  numpy 등 타 data type에서 tensor로 변형했을 시 본래의 data type을 그대로 이어받게 된다 

 

그러나 tensor 연산 시 두 텐서가 data type이 다르거나 로드되어있는 디바이스가 다르면 연산이 진행되지 않는다 

(아래는 두 tensor의 device가 다른 경우)

 


 

위와 같은 두 가지 귀찮은 경우를 방지해 주기 위해 아래와 같은 코드를 최상단에 적어주면 

tensor의 기본 device와 data type을 설정할 수 있어 보다 편리한 디버깅 및 학습이 가능하다 

 

torch.set_default_tensor_type('torch.cuda.FloatTensor')
# () 내부에 원하는 device와 data type 설정

 

 

torch 세팅 후 rand로 tensor 설정해주자 가장 첫번째 사진처럼 
torch.rand (기본 설정 data type=double)로 tensor를 생성해도 
gpu에 로드되어있는 float32타입의 tensor가 생성되는 것을 확인할 수 있다. 

 

 


소소한 기능이고 코딩 습관에 따라 오히려 불편할 수도 있겠지만, 
소소하게 편리한 학습이 가능한 코드 발견해서 로그! 😀

 

 

#Expected all tensors to be on the same deivce

#tensor device 설정

#Can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first

github 내가 자주 쓰는 커맨드들 한번 정리하긴 해야되는데...

매번 생각하면서 일단 오늘은 오늘 해결한 에러부터 아카이빙!

 

vscode에서 github을 쓰면 자동으로 commit tracking도 해주고, 

privae repository push pull할때 비번도 저장해주고 좋은 기능이 많긴한데, 

가끔은 쓸데 없이 강한 보안을 보이기도 한다...

오늘 만난 에러도 그 중 일부

 

에러메세지: 

Missing or invalid credentials.
Error: connect ECONNREFUSED /run/user/1022/vscode-git-131701c717.sock

 

 

git clone, push, pull 등등에서 요즘 반복적으로 이런 에러를 만난다. 

 

해결책1. 비슷한 권한 문제가 요즘 많이 생겨서 

git.name, email, 비번을 저장해서 일시적으로 해결했다

 

git config --global user.name {이름}
git config --global user.email {이메일}

아래는 github 계정의 토큰을 내가 사용하려는 원격저장소에 한해서 저장하는 방법이다

단, clone은 이미 진행되어서 로컬-원격이 연결된 상태에서 사용가능한다. 

git remote set-url origin https://{토큰}@github.com/{연결하려는 저장소 유저 이름}/{레파지토리}.git
# ex. git remote set-url origin https://{토큰}@github.com/Seonjipark/SNU_FaceDetection.git

# github access token을 모른다면 아래 게시글 참조해서 발급받고 저장해둘 것!

https://curryyou.tistory.com/344

 

GitHub 토큰 인증 로그인: Personal Access Token 생성 및 사용 방법

Git Hub에서 ID/PW기반의 Basic Authentication 인증을 금지하고, ID/Personal Access Token 방식의 Token Authentication 인증을 요구하고 있다. 앞으로는 소스코드를 push/clone하려고 하면, 아래와 같은 문구가 뜨면서

curryyou.tistory.com

 

 


해결책2. 근데 1번 방법으로 해결해줘도 authentic error가 계속 일어나고, 

심지어 이건 clone시에는 사용하지도 못한다

그래서 검색해본 결과 vscode가 문제라는 것을 알 수 있었고

settings에 git.terminal을 검색해서 Git:Terminal Authentication 체크박스를 해제해주면 문제가 없어진다

 

오늘도 해결완료!

세상에서 제일 짜증나는 상황 중 하나..

nvidia-smi하면 GPU util은 분명 먹고 있으나 process name에는 안잡히는 상황이 종종 생긴다 

생긴다고 듣기만 했지 내가 만난 적은 두번째였고 

첫번째는 선배가 알아서 꺼줘서 내가 해결해본적이 없어서 오늘은 내가 해결해야했다 ! 

 

일단 첫번째는 구글링 & chatGPT.. 

chatGPT의 추천대로 

nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

위 커맨드로 검색하니 진짜 PID는 나온다 !! 

 

근데 PID는 뜨는데 kill -9 PID를 치면 No such process라고 뜨는 얼척 없는 상황 발생..?

 

대충 이런 상황이 내가 쓰던 메모리들이

CPU-GPU단에서 기존 프로세스 종료할 때 종료되지 않고

잔여한 상황이라는 거는 알아서 PID로 정상적으로 한번에 종료되진 않을 수도 있다고는 생각했지만

뭐라고 검색해야할 지 몰라서 막막한 상황...

 

결국 htop가 nvidia-smi보다 정확할테니 

htop로 들어간 후 MEM 기준으로 sorting하니 상위 프로세스가 떠서 

상위에 뜨는 PID들을 하나하나씩 다 삭제해주니 결국 util이 0이 되었다 

참고로 htop에 뜨는 PID들은 아주 많았고, 위 커맨드로 찾은 8292는 아니었다..

왜 그런지는 자세히는 모르고, 깔끔한 해결책을 찾은 것도 아니지만 일단 해결했으니 아카이빙 😇

 

+) 추가: 이 GPU 유령 memory 문제는 대부분 DDP module이나 dist 모듈 등 

multi GPU를 사용할 때 생기는 문제라는 거를 알아냈다

+ Recent posts