Paper/Neural rendering

Generalizable Patch-Based Neural Rendering

침닦는수건 2023. 7. 7. 12:27
반응형

내 맘대로 Introduction

제목만 보고 NeuralWarp 처럼 patch 단위로 color loss를 매기는 논문인 줄 알았는데 조금 느낌이 다르다. NeRF 류 중에 generalization을 목적으로 하는 논문들은 대부분 deep feature에 의존한다. 이미지에서 feature를 추출하고 feature에서 시작하는 NeRF다. 하지만 이 논문은 generalization의 관점을 바꾸어서, 네트워크에게 실제 이미지를 어떻게 조합해서 NeRF를 학습해야 하는지 그 방법을 알려주어 해결하려고 한다. feature에 모든게 담기길 원하는 것이 아니라 실제 입력 이미지에서 patch를 떼어온 다음 patch를 사용하는 방법을 네트워크에게 학습시킨다. 

 

이러한 컨셉으로 학습이 되면 네트워크는 방법을 배운 셈이 되기 때문에 입력 이미지가 달라진다 한들 같은 방법으로 동작하여 준수한 성능을 낼 수 있다고 한다. 위 그림을 읽어보면 대충 컨셉을 이해할 수 있는데 epipolar contraint를 쓰는 컨셉이고 epipolar line 상 1) point 별 분석(노란색), 2) 전체 point 분석(녹색) 와 3) epipolar line 간 분석(하늘색), 총 3가지 방법을 학습시킨다. 

 

추가 차이점으로는 patch를 다루다보니 patch에 유리한 ViT 구조를 차용했다는 점과, 직접 패치를 다루기 때문에 volume rendering class의 volume 잡아두기 같은 것들이 필요가 없다는 점이다. 

 

메모하며 읽기


학습없이 generalization 가능한 네트워크를 학습하는 것이 목표이며, 1) light field representation, 2) patch 다루는 법 3) transformer rendering network가 핵심이다.


Light field가 어떻고 저떻고 써있는데 결국은 ray를 어떻게 표현할지 그 표현법을 말한다. 독특하게 plucker coordinate을 사용해서 ray representation을 사용했는데 내 경험에 의하면 이 표현법이 ray 간의 거리나 각도 계산이 편했던 것 같다.

Light Field Neural Rendering 이 글에 위에 말한 light slab이나 two sphere가 무엇을 뜻하는지 적어두었다.
patch extraction은 간단하다. 일단 화각이 많이 겹쳐야 patch 간의 비교가 의미가 있기 때문에 (각도가 너무 다르면 2D patch들이 담은 3D 공간들이 서로 직각일 수도 있으니 비교가 무의미함) camera pose를 기준으로 가까운 N개 시점을 묶어주는 것으로 시작한다.

화각에 따른 clustering이 끝나면 target point를 이용해 neighbor view에 epiploar line을 그리고 M개의 point를 sampling한다. 이때 point를 뽑는 기준은 epipolar line 상에서 고른 depth로 뽑는다 (이미지에서 고르게 뽑는 것이 아니라)
ViT 구조를 쓰기 때문에 patch embedding이 들어가야 하는데, patch를 이미지 구조에 맞추어 만드는 것이 아니라 epipolar line에 맞추어 만들기 때문에 매번 바뀌어서 learnable embedding으로 만들 수가 없다. 

따라서 position 정보를 넣어주기 위해 특별한 patch embedding과 positional encoding이 들어가야 했는데, 3가지를 넣는다. 첫번째는 ray, 두번째는 ray를 따라 떨어진 거리, 세번째는 카메라 포즈다. 
일반적으로 임의의 이미지로 학습을 한다고 하면 카메라 포즈를 구할 때 SfM 파이프라인을 태우기 마련이다. 이러면 scale이 안나오는 문제가 있는데 scale에 depedent하게 학습을 시켜버리면 generalization에 문제가 생기기 때문에 기본적으로 SfM의 결과 중 maximum depth를 normalization함으로써 해결한다. 

normalization했을 때 origin과 orientation을 어떻게 잡을 것이냐 하는 문제는 수많은 카메라 중 reference 카메라 1개, 그리고 그 카메라의 ray 중 하나를 잡고 그 카메라 위치가 origin (0,0,0), ray의 방향이 orientation (0,0,1)이 되도록 맞춘다고 한다.

글이 길지만 핵심은 epipolar line 상에서 patch를 떼어내서 가지고 있는데 이를 효과적으로 다루기 위해선 self-attention과 cross-attention을 갖고 있는 transformer 구조가 제 격이란 말이다. 총 3개의 transformer로 구성되어 있으며, line 간, line 별 attention 하는 느낌이다. 

추가적으로 color를 feature에서 prediction하는 것이 아니라 reference view들에서 떼어와서 만들도록 함으로써 네트워크가 scene을 더 잘 배우도록 유도한다.
첫번째 transformer, visual feature transformer는 같은 depth에 대해서 epipolar line "간" aggregation을 담당한다.

target ray에 대해서 다른 view의 epipolar line에서 feature들을 가져와서 transformer를 태운다.

두번째 transformer, epipolar aggregator transformer는 한 view에 대해서 epipolar line 상 aggregation을 담당한다. line 1개 단위로 합치는 셈이다.

aggregation 시 weighting 을 담당하는 녀석은 learnable이다.
세번째 transformer는 reference view aggregator transformer로, 역시 epipolar line "간" aggregation인데 첫번째 transformer와 다르게 point 레벨이 아닌 line 전체 레벨에서 aggregation한다. 이 때 역시 weighting을 담당하는 녀석은 learnable이며 앞서 두번째 learnable weight와 같이 조합된다. (point 레벨 weight * line 레벨 weight 이므로 어떤 line의 어떤 point가 중요한지 가리키게 됨)

그 weight로 원본 referece image들의 color를 떼어와서 합치면 rendering color가 돼야 한다.
반응형