안녕하세요. 후니대디 입니다.
이번에는 CVPR '22 에 등재된 NICE-SLAM 간략하게 리뷰해보겠습니다.
Abstract
해당논문은 일단 RGB-D camera만을 다루며, learning based slam이며 NeRF의 Volume Rendering과 AE의 아이디어를 이용하여 Map과 pose estimation을 하는 방법을 제안합니다. 저자가 말하는 contribution은 real-time으로 large-scale도 가능한 점입니다. 그 이유로 iMAP과 다르게 single large MLP를 사용하지 않고, multi tiny MLP를 이용한 점을 이유로 말하는데요. 자세한 건 아래서 살펴보겠습니다.
NeRF의 사전 학습은 아래의 포스트를 참고해주세요.
Method
위 그림이 NICE-SLAM의 overview입니다. 해당 그림으로도 상당부분 이해가 가능합니다.
Training과정은 오른쪽에서 왼쪽으로 진행됩니다. NeRF에서와 같이 하나의 픽셀에서 ray를 쏴 sampling된 point들에 resolution이 다른(즉, voxel 크기가 다른) 3 종류의 Feature Grid에 매칭되는(interpolation) value가 MLP에 입력으로 들어갑니다. 이때 하나의 MLP가 쓰이지 않고 3개의 geometry MLP와 1개의 Color MLP로 나눠져 들어가게됩니다( Residual method 등 약간의 ML technic이 쓰입니다.) 이 후 나오는 값을 NeRF의 Volume Rendering equation (nerf와 살짝다릅니다)을 통해 Depth estimation과 RGB(color)값을 output으로 얻어냅니다. 이 후 실제 RGB-D카메라에서 얻은 실제 Depth값과 RGB값과의 비교를 loss function으로 활용하고 backpropagation을 통해 MLP를 학습시킵니다.
TEST시에는 왼쪽에서 오른쪽으로 진행됩니다. 즉 input값으로 RGB-D의 depth값과 RGB값이 들어오면 training된 MLP를 통해 반대로 Feature grid(Map)과 pose를 estimation합니다.
마치 NeRF는 cost function으로 사용하고, 전체적인 메카니즘은 AE를 닮았습니다.
Model Architecture
MLP가 크게 3가지의 종류로 나눠져 있습니다.
1. Mid & Fine level
수식을 풀어 설명하자면,
mid level occupancy는 해당 camera pose에서의 이미지의 sampling된 point(p)와 middle feature grid에서 p에 대응되는 값(interpolation으로 구함)을 input으로 하여 tiny MLP 에 입력되고 나온결과와
fine level occupancy에서 마찬가지로 sampling된 point, 그에 대응되는 middle featrue grid에서의 값, high feature grid에서 대응되는 값이 input으로 하여 독립된 tiny MLP에 입력되고 나온 결과를 aggregation합니다.
2. coarse level
couarse level은 이제 그림을 보면 아시겠지만 point와 그에 대응되는 low featrue grid에서의 값이 input으로 들어가 MLP를 거쳐 occupancy value를 구하게 됩니다. coarse level 모듈의 역할이 있는데 벽, 바닥과 같은 먼가 큰 geometry정보를 캐치하기 위함입니다. 이를 통해 large scale에서도 tracking할 수 있는 역할을 합니다.
3. 위의 각각 3개의 MLP모델은 ConvONet이라는 pre-trained모델을 사용합니다.
4. color에 대한 MLP model도 따로 빼서 이루어져있고 해당 모델은 pre-trained모델을 쓰지않습니다.
5. input 으로 모든 MLP model에 들어가는 point는 NeRF와 마찬가지로 positional encoding과정을 거칩니다. 여기서는 gaussian positional encoding을 사용합니다. 아시다시피 이 부분은 high-frequency영역의 accuracy를 높이기 위함입니다.
Rendering & Depth
NeRF와 비슷한 방식으로 rendering과 depth를 뽑습니다. 위에서 나온 occupancy value들 총3개를 사용합니다. 아시다시피 각각의 픽셀에서 쏜 ray에서 샘플링된 point의 weight를 뽑습니다.
weight를 뽑는 식은 NeRF와는 다소 차이가 있습니다. 아래 논문을 참고하시면 디테일한 부분을 알 수 있습니다.
모든 포인트의 weight를 구하고 sum하여 해당 pixel의 최종 depth와 color, depth various 값을 계산합니다.
Recap
전체적인 흐름을 다시 보겠습니다.
일단 voxel map(feature grid), pose, RGB-D sensor(depth, color)의 data가 필요합니다. 학습은 feature grid와 pose가 input으로 들어갑니다. MLP는 총 4개(3개의 geometry, 1개의 color)로 이루어지며 residual 등의 테크닉이 사용됩니다. 주어진 pose에서 샘플링을 통해 선택된 image pixel에서 ray를 쏘고 그 ray 선상의 있는 point를 또 다시 샘플링합니다(NeRF 참고). 샘플링된 point들의 geometry information은 feature grid에서 interpolation을 해야합니다. 이렇게 얻은 geometry info, color, pose를 input으로하여 4개의 MLP를 통해 나온 output(occupancy value) 값 3개(2개의 MLP를 aggregation 되어 1개로 취합됩니다.)은 rendering 수식을 통해 2가지 type의 depth(coarse, fine), color를 구하게 됩니다.
Loss
1. Map Loss
학습의 사용되는 loss는 L1를 사용합니다.
Depth의 loss function은 위와 같습니다. 현재의 frame과 key frame을 중 uniform sampling을 통해 M개의 픽셀을 선택하여 아래 수식을 적용합니다.즉, 실제 카메라에서 얻은 depth와 color값과 method를 통해 얻은 값을 비교하는 것 입니다. loss 부분이 뒤에 나와 헷갈릴수 있지만, 이 sampling을 통해 먼저 pixel을 선택하고 해당 pixel에서 쏜 ray상의 points이 통해 위의 method를 거치게 됩니다. 아시다시피 계산 중간에 sampling을 하면 미분 불가능 하여 backpropagation이 되지 않습니다.
color부분은 간단하여 설명드릴 것이 없지만, depth부분은 좀 더 디테일한 과정이 있습니다.
처음 시작할때는 coarse depth는 사용하지 않습니다. 아마 저자가 앞에서 이야기했듯이 large-scale,즉 어떤 큰 scene에 대한 판단을 하는 역할을 하는 것이 coarse기 때문에 처음에는 fine depth만 활용하는 것 같습니다. 이후 두번째 부터는 coarse depth와 fine depth를 둘다 사용하여 optimization합니다.
또한 NICE-slam에서는 BA를 사용합니다. keyframe마다 BA를 통해 optimization합니다.
람다는 weighting factor로 시나리오마다 high-resolution이 더 잘 수렴되는 부분이 있는데 그럴때 이 weighting factor를 만저줍니다.
Tracking을 위한 loss function로 따로 존재합니다.
Depth의 various 값을 구하고 이 값과 위에서 구한 color loss를 합는 것을 최종 Loss로 활용합니다.
2. Tracking Loss
아래는 traking loss eq입니다. 위에서 구한 depth loss와 color loss를 이용하여 R|T를 minimize하는 optimization을 합니다.
3. dynamic object
또한 NICE-slam에서는 dynamic object에 영향을 덜 받기위해 tracking loss가 median loss값의 10배가 넘는 pixel부분은 remove합니다.
Experiments
실험결과 간략하게 살펴보겠습니다. 사용한 파라미터는 논문에 친절하게 나와있습니다. 혹시 구현이 필요하시면 Experiments 목차 처음 단락을 보시면 됩니다.
Map 정확도 관련 실험입니다. 전체적인 metric에서 nice-slam의 수치가 우수합니다.
Ablation study결과입니다. satuation 된 후의 depth loss 값은 high-resolution과 low-resulution을 혼합한 모델의 성능이 가장 우수합니다.
사실 개인적으로 충격은 tracking쪽 벤치마크에서 ORB의 압도적인 성능차이 입니다. 10년도 더 지난 알고리즘이 아직도 SOTA라니.. 참고로 ORB는 휴리스틱한 method입니다.
저자는 iMAP과의 비교를 많이 하였습니다. 아마 iMAP을 ref잡고 연구하여 그렇지 않을까합니다. iMAP대비 MAP, Tracking, computing time모두 훌륭한 것을 지표를 통해 알 수 있습니다.
conclusion
결론입니다. Nueral implicit 한 방법으로 dense한 map을 비교적 빠르게 작성하는 알고리즘? 정도로 볼 수 있을 것 같습니다. 사실 전 헤비하지 않은 장비로 sparse하게 online으로 맵을 작성하고 대신 tracking과 noise에서 좀 더 robust한 알고리즘을 선호합니다. dense한 맵은 offline으로 따로 module로 빼는? 암튼 그렇습니다.
NICE-slam 은 tracking쪽에서 기존의 sota를 넘어서지 못하는 부분, loop closure가 없는 부분이 좀 더 보완할 점이 되겠습니다.
cvpr oral 발표 영상을 끝으로 마치겠습니다:)