Paper/Neural rendering

Self-Calibrating Neural Radiance Fields

침닦는수건 2023. 10. 30. 01:08
반응형

내 맘대로 Introduction

이 논문은 NeRF의 필수 요건인 known camera parameters 가 없을 때 이들은 같이 최적화할 수 있는 방법론을 소개한 논문이다. 비슷한 컨셉의 논문이 있겠지만 가장 유명하고 심플하다. NeRF MLP를 학습하는 과정에서 주어진 이미지의 intrinsic, extrinsin을 모를 때 적용할 수 있는 방법으로 1개의 카메라로 쭉 찍은 상황을 가정한다. 

 

핵심 아이디어는 camera parameter 도 learnable 형태로 디자인하는데 학습 안정성을 높이는 것이다. 

 

메모하며 읽기

기본적으로 self calibration 분야에 닿아있는 논문이므로, 비슷하게 fx, fy, cx, cy, distortion + nonlinear camera distortion(사실 이건 굳이 안해도 될 것 같은데 넣었더라) 을 찾는다. 

일반적인 이미지를 주로 다룰  것이므로 pinhole camera 만을 대상으로 했다. 

camera parameter들을 learnable 형태로 디자인할 때 기본적으로 residual을 추정하도록 했다. initial value 없이 그냥 최적화하면 모든 알고리즘이 그렇듯 깨지기 때문에 여기서도 초기화를 전제로 하고 residual을 찾는다. 

cx, cy야 이미지 해상도로 맞추면 될 것 같고 fx, fy 는 주어진 이미지들이 하나의 카메라로 찍힌 이미지를 가정하므로 대충 homography 이용해서 초기화할 것 같다. 

extrinsic 역시 나와있진 않지만 essential matrix 구해서 초기화할 것 같고 표기법만 neural network가 다루기 쉽게 특별한 rotation representation을 썼다. (이 표현법은 knowhow글에서 소개한 적 있다.)

distortion은 수식이 복잡하고 기존 표기법이랑 달라보이지만 그냥 COLMAP fisheye 모델이고 나발이고 헷갈릴 뿐 그냥 radial distortion 만 썼고, tangential distortion은 없다고 했다. 

그냥 k1 k2 p1 p2 중 k1 k2 만 썼다는 소리

수식(5)에서 분모에 들어가는 cx cy가 fx fy의 오타가 분명한 것 같다... 저런 수식은 본적도 없음

오타라고 가정하면 수식(6)의 d는 그냥 radial distortion의 polynomial이므로 간단하다. 
이 distortion은 나도 calibration하면서 처음 보는데, 논문 내용을 읽고 직관적으로 이해한 바에 따르면 우리가 픽셀을 다룰 떄 픽셀 좌표는 픽셀의 정중앙을 가정한다.

그런데 픽셀의 정중앙을 센터로 가정하는게 맞는지, 그리고 픽셀 ray를 쏠 때 중앙점이 카메라 센터랑 일치한다고 보는게 맞는지 의심하는 distortion 같다.

이미지 센서가 우글우글 일그러져 있을 때 발생하는 distortion이지 않을까 싶다.

(위에서 tangential distortion은 무시할 수준으로 취급해서 빼놓고 왜 tangential distortion보다 더 무시해도 괜찮은 distortion을 모델링에 넣어뒀는지 잘 모르겠다. 왠지 리뷰어가 지적했거나 contribution 추가하는 관점에서 넣을 것 같다.)

픽셀 중앙 좌표가 한 픽셀 안에서 얼마나 움직여야 하는지, 픽셀 ray 원점을 카메라 센터에서 얼마나 움직여야 하는지 residual을 구한다. (이건 픽셀 마다 구하는거라 개수가 엄청 많을 것 같다.)



따라서 전체 픽셀 ray에 관여하는 파라미터들은 위 그림과 같다.


이제 학습을 할텐데, 카메라 자세가 불안정한 상태이기 때문에 한 사용할 수 있는 첫번째 단서는 당연히 2d correspondence일 것이다. (논문에서 어떤걸 사용했는지 말은 안했지만 superpoint+superglue처럼 좋을 것을 썼으리라...)

2d correpondence를 갖고 카메라 포즈에 대한 loss를 설계할 수 있을 것인데 첫번째는 ray가 3차원 상에서 정확히 만나는지 비교하는 방법일 것이고 두번째는 ray를 2차원으로 projection 시켜서 이미지 레벨에서 정확히 만나는지 비교하는 방법일 것이다.


먼저 전자를 보면 그림에서 빨간 선과 같이 서로 완벽히는 교차하지 않는 ray간의 3d 거리를 최소화하는 식일 것이다.

이 방법은 충분히 의미가 있으나 loss 관점에서 보면 이미지에서 멀리 떨어진 점은 크게, 가까운 점은 작게 나오는 경향이 있으므로 고르게 업데이트 되리라 기대하긴 어렵다.

따라서 2d 에서 비교하는 (파란색) 방법을 썼다고 한다.

epipolar constraint를 이용해 point-to-line 거리를 loss로 사용하는 것과 비슷한 개념인데 여기선 왜곡이 해결되지 않은 이미지를 대상으로 하므로 line 대신 point를 썼다. 그게 차이점이라고 논문에서 명시적으로 적기도 함. 왜곡이 있어도 사용이 가능하다.
2d correspondence로 시작해서 카메라 포즈 추정할 때 자주 등장하는 이슈가 projection function은 수식 상 카메라 뒤에서 오는 빛을 받아도 같은 projected value를 만들어낼 수 있으므로 가끔 카메라가 뒤집힌다. 

그러한 이슈가 여기서도 당연히 발생할 수 있으므로 매 ray마다 뒤집혔는지 안뒤집혔는지 depth + rotation 값이 항상 양수로 카메라 앞에 있도록 확인했다. 
NeRF니까 rendering loss로 backpropagation하면 끝이다. 

gradient 수식을 직접 적은 것은 그냥 자세히 설명하려고 한 것이고 직접 구현해서 optimize한 것은 아닌 것 같다.


수렴이 원체 오래 걸리는 NeRF인데 카메라 포즈까지 최적화하려고 하면 당연히 잘 안됐을 것이다.

그래서 통째로 학습하면 당연히 안되기 때문에 extrinsic -> intrinsic -> distortion 순서로 학습되도록 함과 더불어서 임의의 intrinsic으로 고정해두고 로 NeRF를 조금 학습시켜두는 curriculum learning 기법도 필요했다고 한다. 



 
반응형