안녕하세요.
이번 포스팅은 3DV가 요근래 어떤식으로 발전 혹은 연구되어왔고 또 최근에 나온 기법들은 무엇들이 있는지 general한 시각으로 살펴보겠습니다.
3DV에서는 결국 사람이 보는 2D plane으로 어떻게 잘 rasterization하냐 혹은 2D plane의 pixel들을 어떻게 3D로 reconstruction하냐라는 문제로 압축할 수 있습니다.
그래서 초기에는 이를 위한 여러 파라미터를 줄이는 방식으로 연구를 하였다면
2000년도에 SfM이 대표적입니다.
여러개의 2D image에서 keypoints와 matching point를 찾고 이를 이용하여 3D space상으로 reconstruction하는 방법입니다. matching된 keypoint를 mapping point로 하기때문에 3D space상에 pointcloud형태로 존재하게 됩니다.
이를 mesh형태로 만들어 3D model로 만들어내는 식으로 발전되게 됩니다.
대표적인 application은 https://github.com/colmap/colmap 이 있습니다.
다음으로는 NeRF입니다. NeRF는 ray tracing방법을 이용하여 5개의 파라미터를 mlp를 태워 color,density를 구하고 이를 volumn redering operation을 이용하여 해당 pixel의 GT값과의 비교를 통해 학습을 진행하게 됩니다.
NeRF는 나온지 얼마안되었지만 굉장히 히트를 쳤고 여러 갈래들이 나왔습니다. prerequisite으로 필요한 pose가 noise혹은 없는 환경에서 rendering하거나, 학습 시간을 줄이는 방법, input image를 최소화하는 방법, huge scale scene에서의 방법, dynamic model에서도 잘 rendering하는 방법들 굉장히 여러분야가 있습니다.
그중 Mip-NeRF는 google에서 발표한 23년이 지나가는 현시점에 성능SOTA인 논문입니다.
ray tracing에서 직선형태가 아닌 원뿔형태로 공간을 더 크게하여 학습을 하는 방법입니다.
다음으로는 nvidia에서 나온 Instant NGP입니다. 기존의 NeRF의 positional encoding부분을 multiresolution hash encoding를 사용합니다.
3D 공간의 여러 resolution의 grid로 나누고 해당 꼭지점들을 hash-map을 통해 feature map을 만들고 rendering하고 싶은 점과 linear interpolation으로 해당 point의 feature map을 여러 resolution grid를 이용해 만들게 됩니다. 이를 NN에 넣게 됩니다.
NeRFstudio가 현재 대표적인 framework입니다.
마지막으로 Gaussian Splatting입니다.
Gaussian Splatting관련 포스팅한 내용은 없어서 좀 더 자세히 살펴보겠습니다.
우선 NeRF처럼 SfM먼저 돌려야하는데 여기서는 추가적으로 SfM points가 필요합니다. SfM은 위에서 간략하게 말씀드린 keypoints-> matching point를 뽑고 3D 공간으로 reverse-projection한 3D points입니다. initialization단계에서 3D points위치들에 3D gaussian을 random(색,투명도,크기)하게 생성합니다. 이후 3D gaussian을 해당 image plane으로 projection시키고 differentiable tile rasterizer로 rendering된 이미지를 만들게 됩니다. 이를 실제 이미지와 비교하여 loss계산하고 3D gaussian까지 backward process로 업데이트를 하게됩니다. (training)
위의 3D gaussian수식이고 x(pose), sigma(분산)으로 나타내어지는데 이를 아래와 같이 scale matrix와 rotation matrix로 decomposite하여 학습에 사용합니다.
adaptive density control에서 좀더 샤프하게 3D gaussian으로 rendering하는 기법을 나타냅니다.
rasterizer부분을 보면, 우선 screen을 16x16타일로 쪼개서 각 타일마다 view frustum을 방법을 사용합니다. 너무 가깝거나 먼 영역을 제외하는 방법인 것 같습니다. 그 다음에 Gaussian 3D가 어떤 순서로 배치되어있는지 순서를 결정합니다.
rasterizer할때 sorting된 3D gaussian 앞쪽부터 뒤쪽까지 각 타일마다 병렬처리를 이용하여 rasterize했다고 합니다.
실험결과를 보면 높은 성능을 굉장히 짧은 시간안에 렌더링하는 걸 볼 있습니다.
이상으로 3DV 흐름을 살펴보았습니다. 물론 이외에도 엄청나게 많겠지만 최근의 흐름에서는 일단 위의 방법들을 줄기로해서 살펴보시면 될 것 같습니다