오랜만에 쓰는 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를 사용할 때 생기는 문제라는 거를 알아냈다

공부 참고자료: https://gaussian37.github.io/ml-concept-t_sne/

 

t-SNE 개념과 사용법

gaussian37's blog

gaussian37.github.io

 

위 글로 공부하면서 내가 필요한 포인트만 정리:

t-분포는 소표본으로 모평균을 추정하는 분포로, 

모집단이 정규분포와 유사하나, 모표준편차를 모를때 주로 사용한다 

 

일반적으로 정규분포보다 큰 표준편차를 갖는다고 가정하는데, 

이는  정규분포 상에서는 i 번째 변수와 적당히 떨어진 j, 멀리 떨어진 k의 확률이 꼬리로 갈수록 차이가 나지 않기 때문이다.

큰 표준편차를 갖는(=꼬리가 두터운) 분포를 가정하면 변수끼리의 거리가 확률의 차이에 반영된다. 

 

 

 

 

t-sne는 비선형적 방법 / PCA는 선형적 방법이다 

t-sne는 iterative한 방법으로 feature 집단을 계산하고 sklearn을 이용하는 방법은 아래 매뉴얼을 따라하면 된다

https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html 

'딥러닝 공부 > 짧은 AI' 카테고리의 다른 글

어쩌다보니 공부한 domain adaptation  (0) 2023.01.09
Representation Learning  (0) 2022.08.18

문득 카페에서 t-sne 사용법을 위해 PCA에 대해 공부를 다시 하다가 

학습을 전달하는 교육자나 학습을 받아들이는 학생이나 

모두 첫 시작은 "이것을 왜 배우는가"에 대한 고민이어야 한다는 점이 다시 한번 와닿았다. 

 

학창시절 방학특강 등으로 고등수학을 선행하다보면 "그래서 이게 뭔소리..?"라는 생각이 자주 들었다.

지금 당장 내용을 이해할만큼 머리가 성숙한 것도 아니고,

어떻게든 이해하도록 반복학습을 할 단원도 아니니 단순히 머릿속을 스쳐지나가는 과정이 되어버렸다.

 

그래서 나는 중학생을 과외할 때도 항상 이 과정의 단원은 왜 이렇게 구성되어 있는지, 

이걸 지금 배워서 나중에 뭐에 써먹는지를 설명해주고 시작한다 

(예를 들어, 극한을 배울 때는 나중에 미분을 할 때 이렇게 저렇게 사용한다,

삼각함수를 배울 때는 이건 각도를 실수로 바꾸는거다 or 길이나 넓이를 구할 수 있다 등등)

 

학부시절에 사실 공부에 너무 집중을 못했는데 

공학수학을 배울때 당최 이걸 왜 배우는지.. 를 이해를 못해서 마음이 안붙었던 것 같다 (라는 좋은 핑계이지만..)

PCA도 학부 / 대학원 거치면서 10번도 넘게 배웠을텐데 

연구에 필요해서 찾아보니 드디어 기억속에 어떻게 구하는 건지 제대로 자리잡아 장기기억으로 넘어간 것 같다

 

나중에 교육을 다시 업으로 하는 날이 온다면 꼭 기억하고 싶어서 짧게 기록해둔다

무엇이던 그걸 왜 하는지 목표설정과 이해가 우선이다 !

 

Lecture: Computer Vision by Andreas Geiger 

본 게시글은 아래 링크의 Andreas Geiger 교수님의 튀빙겐 대학의 CV 강의를 듣고 사견과 함께 요약/정리한 글입니다 

https://www.youtube.com/playlist?list=PL05umP7R6ij35L2MHGzis8AEHz7mg381_ 

 

Computer Vision — Andreas Geiger

Lecture: Computer Vision (Prof. Andreas Geiger, University of Tübingen) Course Website with Slides, Lecture Notes, Problems and Solutions: https://uni-tuebin...

www.youtube.com


Artificial Intelligence

: AI란 추상화과 컨셉화를 통해 사람에게 주어진 문제를 해결(또는 해결 보조)하려는 시도이다. 

아래와 같은 세부 분화들을 포함하고 있다. 

https://www.youtube.com/watch?v=mQgjfvjjW3Q&list=PL05umP7R6ij35L2MHGzis8AEHz7mg381_&index=2

 

Computer Vision

: Computer Vision은 light를 의미로 재구성하는 것이다 

그 응용으로는 Robotics, Medial applications, 3D modeling, Autonomous Driving 등이 있다 

 

Computer Vision vs Computer Graphics

Computer Vision vs Image Processing

: IP에 CV가 관여하기도 한다. IP는 본 강의의 주요 범위는 아님

Computer Vision vs Machine Learning

: ML의 많은 툴들이 CV에 적용되고 있으며

ML이 CV의 실행 시간을 많이 줄여주었기 때문에 CV가 상업적으로 성공할 수 있었던 요인중 하나이다. 

특히 2015년 ImageNet Classification Challenge에서 ResNet이 

사람의 오차범위를 넘는 성능을 보여주면서 CV의 전반에 ML이 자리잡았다

 

https://www.youtube.com/watch?v=mQgjfvjjW3Q&list=PL05umP7R6ij35L2MHGzis8AEHz7mg381_&index=2

 

 

Why is Visual Perception Hard?

: 우리가 사진을 보는 방식과 컴퓨터가 사진을 보는 방식이 다르다

같은 사진을 0~255 사이의 픽셀값으로 본다면 의미를 찾는 것이 더 어렵다. 

 

또한 이미지는 3D 세상의 Projection이고, 그 과정에서 소실되는 정보가 있다

(사족: 그러한 소실되는 정보에 대해 추상화가 가능한 사람은 의미를 파악하는게 쉽지만,

Machine은 그러한 추상화를 할 수 없다.)

또한 View point와 illumination 등에 따라 물체의 pixel이 바뀐다. 

같은 의자라도 다양한 모양을 갖기 때문에 추상화가 더더욱 필요하다

'딥러닝 공부 > 주제별 정리' 카테고리의 다른 글

[CV] 1.1 Introduction - Organization  (0) 2023.08.20

Lecture: Computer Vision by Andreas Geiger 

본 게시글은 아래 링크의 Andreas Geiger 교수님의 튀빙겐 대학의 CV 강의를 듣고 사견과 함께 정리한 글입니다 

https://www.youtube.com/playlist?list=PL05umP7R6ij35L2MHGzis8AEHz7mg381_ 

 

Computer Vision — Andreas Geiger

Lecture: Computer Vision (Prof. Andreas Geiger, University of Tübingen) Course Website with Slides, Lecture Notes, Problems and Solutions: https://uni-tuebin...

www.youtube.com

 


Computer Vision이란 무엇인가? 

: 사람의 인지 능력을 machine으로 구현하려는 시도이며, light(이미지)를 의미로 재해석하는 방법이다. 

 

예를 들어, 2D-3D의 예시를 들었을 때 아래와 같이 unconstrained된 이미지의 모음을 

재해석하고 조립하여  새로운 view와 새로운 appearance의 이미지를 생성할 수 있다. 

 

https://www.youtube.com/watch?v=YW1cIaOBkI8&list=PL05umP7R6ij35L2MHGzis8AEHz7mg381_&index=1

 

 

'딥러닝 공부 > 주제별 정리' 카테고리의 다른 글

[CV] 1.2 Introduction  (0) 2023.08.20

+ Recent posts