AI : NeRF 기본개념

수빈·2023년 1월 31일

AI

목록 보기
1/2

https://www.youtube.com/watch?v=FSG5bCkNWWo

과거에는 Discrete한 scene representation 방법들인 voxel, point cloud, mesh등이 자주 사용되었다. 하지만 각각의 한계점들이 있었고, 그렇기에 최근에는 continuous function을 base로 한 MLP 기반 representation들이 각광받고 있다.

이러한 MLP 기반 representation들은 저차원의 좌표들을 input으로 받고, 각각의 input에 대해 적당한 output을 내놓기 위해 train된다.

이차원 scene의 representation같은 경우, (x,y) 좌표를 주고, 그에 해당하는 RGB값을 output하는 것을 예시로 들 수 있다. 이것은 그 역할을 수행하는 네트워크가 이 이미지 자체를 기억하도록 만드는 것이라고 볼 수 있다. 그러므로 이 방법은 <정보를 네트워크 안에 기억시키는 것>이다.

그리고 coordinate-based 3차원 scene representation의 경우에는 3차원 공간 안에서 특정한 pixel이 어떤 물체로 인해 occupy 되고 있는지 여부를 판단하는 network를 만드는 것이 관건이다. 왜냐하면 (x,y,z) 좌표를 주었을 때, 달랑 RGB값만 output하게 하는 것은 3D scene을 represent하기에 충분하지 않기 때문이다.

여기서 NeRF의 기본 개념이 나오는데, 좌표에다가 viewing direction을 추가로 주고, output으로 RGB값과 density, 즉 volume을 얼만큼 차지하고 있는지(occupancy)를 같이 output한다. 이 과정은 모두 fully-connected network를 통해 수행되며, 이 네트워크 안에서 기억되고 있는 3차원 scene에 대한 정보를 NeRF라고 하는 것이다.

NeRF를 수행할 때는, volume ray casting이라는 방법을 사용한다. 3차원 영역의 dataset이 있고, 그 영역을 특정한 viewpoint로 바라보았을 때, 바라본 scene이 2D image로 rendering 된다면 어떠한 color를 가질 것인지 계산하는 방법이다. 우리가 특정한 viewpoint에서 ray를 쐈다고 생각하고, 그 ray가 지나가는 영역 중 관심있는 영역이 시작하는 위치와 끝나는 위치를 명시한다. 그리고 ray 상의 점들 중 그 두 위치 사이의 점들에 대해서 focus하게 되는데, 그 모든 지점에 대해서 수식을 적용하고 density 등을 구하게 된다면 너무나 많은 계산량이 필요하기 때문에, sampling을 하여 그 영역 상의 몇몇 지점들에 대해서 3D color와 density등을 계산하게 된다.

NeRF Training은 대강 7개의 단계로 나뉜다.
1) Viewpoint selection : 어떤 방향에서 볼 것인지 정하기
2) Ray composition : ray를 시작하는 위치와 방향 등을 사용해 구체적으로 명시
3) Select 5D input samples along the ray : coarse network, 그리고 fine network 이렇게 똑같은 성능, 똑같은 구조의 network 2개를 쓰게 된다. coarse network에서는 point들을 uniform하게 뽑아 color contribution을 계산하고 pdf를 얻어내는 역할을 수행하고, fine network는 얻어낸 pdf를 바탕으로 실제로 물체가있는 부분에 집중하여 sampling을 하는 과정을 거친다.
4) Query into MLP : 앞에서 얻은 sample들의 5차원 정보를채ㅣㅐ MLP를 통과시킴.
5) Get predicted color + density : 원하는 값을 얻어냄. color가 view-dependent한 것에 비해 density는 volume-dependent하지 않다는 것이 특징이다.
6) Render color using volume ray casting : 특정한 viewpoint에서 봤을 때의 2D color등을 volume rendering을 통해 계산해내기
7) Compute Rendering loss : 예측한 color와 실제 color 사이의 차이를 제곱하여 계산한다. coarse network의 rendering loss와 fine network의 rendering loss를 모두 구하여 loss로 사용한다. coarse network의 loss까지 계산하는 이유는 우리가 coarse network가 판단하고 내놓은 pdf를 기반으로 sample을 하여 fine network를 돌리기 때문이다. (coarse network도 학습이 필요!!)

마지막으로 NeRF에서 좌표를 넣어주고, RGB값과 density값을 받는 것으로 끝낸다면, high frequency detail을 모두 놓친, standard fully-connected network를 통과한 뿌연 image가 나오게 된다. 그렇기 때문에 transformer에서도 사용되는 메커니즘인 'positional encoding'이라는 적절한 전처리 과정을 사용해주어 detail을 모두 복원해준다. 5D의 저차원 data를 high-frequency function을 통해 high dimensional한 space로 mapping 해주어 network를 통과시킨다면 -> 실제 데이터가 가지고 있는 high-frequency 정보를 조금 더 잘 표현해 줄 수 있음.
아무튼 이렇게 positional encoding을 적용하여, 훨씬 더 좋은 결과를 낸다.

profile
CS공부 하고 있는 수빈입니다.

0개의 댓글