Paper/Neural rendering

K-Planes: Explicit Radiance Fields in Space, Time, and Appearance

침닦는수건 2023. 11. 14. 21:08
반응형

내 맘대로 Introduction

 

이 논문이 이전 논문 HexPlane 과 완전 동일한 주제로 동일한 학회 CVPR2023에 공개된 논문이다. 다루는 task는 똑같이 dynamic scene neural rendering인데 방법도 똑같다. 사실 그림까지 비슷해서 표절 논문이라고 맨처음에 생각할 정도였다.  교신 저자가 angjoo kanazawa이니... 그런 짓을 할 것 같진 않고 정말 유연히 같은 아이디어로 나온 논문이라고 봐야할 것 같다. 

 

x,y,z,t 4차원 정보를 encoding해서 NeRF를 학습시킬 때 메모리 이슈와 성능 이슈로 plane represenation을 선택했고 xy,yz,zx,xt,yt,zt 총 6개 평면을 사용했다. (완전 HexPlane과 동일하고 심지어 용어도 겹침 ㅋㅋ... 학회장에서 두 논문 저자 서로 소름돋지 않았을까.) 

 

K-planes의 K 그리고 그림의 Higher dimensions이 의미하는 바가 K가 3~4보다 클 수 있음을 암시하는 것 같은데, 만약 더 추가하고 싶은 차원이 있다면 가능하다는 열린 가능성을 의미하는 것이지 실제로는 4차원이 논문에 기재된 최고 차원이다. 

 

HexPlane과 차이점은 거의 없고 분석 측면에서 K-Planes가 조금 더 생각을 많이 했다는 느낌 정도가 있다.

비교 지표에 HexPlane이 없는 걸 보면 정말 서로 존재를 몰랐던게 맞다.

 

메모하며 읽기


그림 마저 HexPlane과 동일해서 놀랐다.. 

K차원이 주여졌을 때 KC2 평면을 뽑아  사용한다는 이야기 

(사용한 regularization loss 마저 TV loss...로 동일하다. 소름.)
실제로 time dimension이 추가된 4차원을 다루므로 4C2 = 6개의 평면을 사용한다. query point (x,y,z,t)가 들어왔을 때 해당하는 평면으로 projection되어 6개의 feature를 뽑아오고 이를 다 "곱해서" 최종 feature를 만든다.

(HexPlane에서는 곱하고 concat하는 방식을 썼는데 여기선 전부 곱하는 방식을 택함)

전부 다 곱해버리면 feature가 굉장히 꼬여버릴 것 같은데 이렇게 한 이유를 따로 설명해준다. 



위 그림과 같이 모두 곱하는 형태 (Hadamard product)가 아니면 정확하게 4차원 공간 상에서 한 위치를 표현하는 능력이 없다는 주장이다. 더하면 왼쪽 그림과 같이 교차하는 선까지 포함되게 된다고 한다. (듣고 보니 그런 것 같기도 !)



ablation까지 해줘서 반박 불가. (이런 분석적인 면모가 HexPlane 논문보다 좋은 듯)

또한 hadamard product로 구현하면 이 점이 의미 부여(해석)가 용이하다는 점이다. 

직관적으로 time dimension은 동적 물체일 때만 활성화가 되어야 하니 static part의 경우 그냥 모두 1이 되어서 곱해졌을 때 아무 의미가 없도록 수렴해야 한다. (실제로 모두 1로 초기화하고 loss를 가해서 그렇게 학습되도록 유도함) 

그러면 나중에 time dimension 값이 1인 지점을 찾으면 static인지 아닌지 구분할 수 있다는 장점이 생김. 뭔가 해석할 수 있는 부분이 생긴다는 주장.
성능 끌어올리기 위해 multi-scale쓰는 것은 국룰인가보다. HexPlane에서는 점점 해상도를 올려가는식(upsample하는 식)으로 했는데,

여기서 아예 해상도 별로 6개 평면을 따로 잡고 (메모리는 약간 손해) 모든 해상도에서 나온 feature를 concat해서 사용했다.

TV loss인데 plane 레벨에 적용했다. (이마저도 HexPlane과 동일...소름 돋는다.)

plane을 채우고 있는 feature들이 주변 위치끼리는 유사하도록 억제해서 locality가 유지되도록 한다.
time dimension에 한해서만 한 번 더 regularization을 해준다.

time이 껴있는 평면에 대해서만 시간에 따라 feature의 변화량이 너무 크지 않도록 smoothness loss (gradient를 줄이는 loss)를 걸어줬다.


----
그리고 아까 hadamard product로 구현함으로써 static part의 경우 시간이 곱해져도 그대로여야 하므로 static part일 경우 time feature가 모두 1이 되어야 한다고 했다.

이를 보조하기 위해 time plane은 전부 1로 초기화 해주고 loss도 1에서 크게 벗어나지 못하게 했다. (static이 더 많을 테니!)

최종적으로 만들어낸 x,y,z,t aggregated feature를 r,g,b로 decoding해주는 네트워크는 크게 2가지 디자인 초이스를 제공했다.

첫번째는 feature를 weight로 생각해서 r, g, b basis function을 찾아내는 것이다. opacity basis function도 당연히 있다.

즉 aggregated feature * red basis function = red value가 되도록 basis function을 만들어내고 사용하는 방식이다. 역시나 MLP로 만든다. 

이렇게 하면 속도는 조금 더 빠를 수 있을 것 같다. 
두번째 초이스는 그냥 일반 NeRF처럼 MLP 통과시켜서 opacity뽑고, 또 MLP 통과시켜 rgb 뽑는 구조다. 
NeRF in the wild처럼 빛 변화나 날씨 변화까지 녹여낸 K-planes를 만들어낼 수도 있다고 하는데 이건 NeRF-W 그대로 따라서 카메라 (시점)마다 per-image feature를 할당하고 같이 decoding하는 식으로 설계하면 된다고 한다.
복원 공간을 잡는 팁은 forward facing scene이면 NDC, 열린 공간이면 Mip-NeRF360처럼 했다.
point sampling 역시 Mip-NeRF360이 하듯 proposal network 구조를 붙여서 해결했다.

loss function도 가져왔을 듯.
ray 자체를 고르는 것도 random ray sampling이 아니라 texture가 복잡한 곳에서 더 뽑아주는게 좋다고 밝혀져있는데 DyNeRF에서 사용한 방식을 차용해서 점진적으로 복잡한 곳에서 많이 뽑아줬다.

반응형