SLAM, SfM, NeRF 간의 차이를 알아보자
최근에 3차원 모델링으로 NeRF가 많은 관심을 받으면서 예전에 3차원 복원에 활용되었던 SLAM과 SfM 기술 간의 차이가 모호하게 해석되는 상황이 발생하고 있다. 실제로 필자는 관련 질문을 랩실 후배에게 받기도 했으니....... 이번 차례에 한 번 정리해보자.
1. NeRF는 기본적으로 들어가는 인풋이 camera pose값과 rgb이미지 값이고 아웃풋이 novel view synthesis, 즉 새로운 2D 이미지를 만들고 이를 통해 3차원을 덴스하게 radiance field 할 수 있게되는거라(원래 NeRF 논문 제목도 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis임) sfm이나 slam이 사전적으로 활용됨! 왜냐? sfm나 SLAM은 말 그대로 카메라 포즈를 추론하는데 쓰이거든! 실제로 NeRF 처음 나왔을 때 카메라 포즈를 알려고 가장 먼저 하는게 rgb 개별 이미지에 따른 카메라 포즈를 추론하기 위해 SfM으로 가장 유명한 COLMAP을 돌려서 포즈를 추론해서 인풋으로 넣습니다.
2. 그러면 SfM과 SLAM은 뭔데 카메라 포즈를 추론하는거냐? 우선 SLAM부터 보더라도 말 그대로 Simultaneously Localization and Mapping이라, 동시에 지도도 만들면서 내 위치도 추정하는거라, 내 위치를 추정한다는 게 내가 가지고 있는 인풋 이미지의 포즈값도 같이 추론하는거거든! 그래서 이런 걸로 NeRF에 들어가는 카메라 포즈값으로 활용한다는거고~ 그 내위치를 추정하는 과정에서 결국 위치라는 건 내 주변 지도를 알아야 상대적으로 지도상에서 내가 어디라는 걸 추론할 수 있는 상대적 개념이라, 그 과정에서 맵도 같이 만들어지는거~ 그 맵을 덴스하게 만들면 3차원 리컨에 쓰이고 그 결과물이 NeRF와 같이 렌더링 된 걸로 할 수도 있겠지? 근데 보통 SLAM은 실시간이 중요하니까 sparse하게 맵을 만드는 편이고 그래서 ORB SLAM같은거 보면 결과물이 굉장히 스팔스합니다~~
3. 그러면 SfM은 뭐냐? SfM은 SLAM과 다르게 비실시간성을 가지고 SLAM보다 더 정밀한 리컨스트럭션을 목표로 합니다. 그래서 처음 SfM이 나온 Built Rome in a day를 보시면, 콜로세움을 나름 덴스하게 만드는데 24시간이 걸리는 걸 볼 수가 있죠. 그래서 SLAM은 좀 더 트랙킹 오리엔티드, SfM은 좀 더 렌더링 오리엔티드라 볼 수가 있고, 그렇기에 카메라 포즈 추론 정확도는 SfM이 더 높습니다. 그래서 NeRF에서도 SfM의 대표주자인 COLMAP을 쓴 거구요.
4. 그리고 NeRF가 SfM과 SLAM과 다른 게 또 뭐냐라고 한다면, SLAM과 SfM은 인풋을 단순히 RGB 이미지만 하는 게 아니라 Depth 도 있고 imu도 있고 다양하게 변주를 주면서 카메라 포즈와 형성되는 맵의 정확도를 늘리려고 합니다~ 반면 클래식 NeRF의 경우 카메라 포즈(실제로는 카메라 위치랑 viewing direction)랑, rgb 이미지만 인풋으로 주어지고, 결과값은 rgb값과 density가 나오는 겁니당! 그래서 인풋과 아웃풋이 완전히 달라용