안녕하세요. 이번 논문리뷰는 DS-SLAM입니다.
Dynamic 환경에서 semantic SLAM을 이용하여 pose estimation, mapping을 한 SLAM입니다.
Introduction
우선 semantic SLAM의 정의부터 살펴보겠습니다. 최근 핫한 chatGPT에게 semantic SLAM에 대해서 물어보았습니다:)
chatGPT의 답변을 정리해보면 일반적인 SLAM과는 다르게 semantic SLAM은 기하하적 정보뿐만 아니라 semantic 정보( object, scene understanding 등)의 의미도 도출합니다. 보통 딥러닝을 결합하여 환경의 객체들을 분리해내고 이를 통해 dynamic한 환경에서도 보다 정밀한 자율주행을 할 수 있도록 합니다.
DS-SLAM에서는 orb-slam2과 semantic-segmentation 딥러닝 네트워크를 활용하여 dynamic object를 culling합니다. 이렇게 얻는 point는 octo-tree형식으로 mapping하게 됩니다.
Framework
위의 그림은 DS-SLAM의 전체적인 framework입니다. 위에서 언급하였다시피 ORB-SLAM2를 기반으로 합니다. ORB-SLAM시리즈는 1, 2, 3가 있는데 1은 mono camera, 2는 stereo, RGBD 3는 +imu 으로 센서 커버리지가 넓어지는 특징을 갖습니다. DS-SLAM은 RGBD데이터를 활용하기 때문에 ORB-SLAM시리즈 중 2를 선택한 것 같습니다.
DS-SLAM은 5개의 thread를 활용합니다. tracking, semantic segmentation, local mapping, loop closing / map 이렇게 5개의 module을 5개의 thread가 각각 관리하게 됩니다.
첫번째로 tracking thread을 보면, ORB feature를 뽑고 check moving consistency(일정하게 움직이고 있는지) 모듈을 거쳐 outlier를 제거하고 moving points를 뽑아냅니다.
두번째 thread인 semantic segmentation에서 segmentation결과를 뽑아내면(보통 tracking thread보다 오래걸립니다.) tracking thread에서 뽑은 outlier와 segmentation 결과물과 비교를 통해 해당 object를 버리게 됩니다.(엄밀히는 해당 object의 pixel값들)
semantic segmentation
위의 semantic segmentation 모델은 SegNet이라는 모델을 사용하였습니다. 20개의 class를 segment할 수 있고 PASCAL VOC 데이터로 학습된 모델입니다. 특이한 점은 caffe라는 프레임워크를 사용합니다. 텐서플로우나 파이토치에 비해 오래된 프레임워크인데 아마도 c++언어로 개발하기 위해 선택한 것 같습니다.
Moving Consistency Check
위에서 orb feature를 뽑고 outlier 후보군을 뽑아낼 때 언급한 방법입니다.
첫번째 step은 optical flow pyramid를 구합니다. (orb feature의 이전 프레임간의 비교를 통해) pyramid를 통해 다양한 스케일을 커버할 수 있습니다. 이 후 에는 필터링 과정을 거치게 되는데 이미지의 edge부분에 가까운 pair들은 motion blur로 인해 오류가능성이 높을 수 있어서 제거합니다. 또한 extraction한 point를 중앙으로한 3x3 이미지 block 픽셀차이가 너무 큰 경우도 제거합니다.
세번째 단계로 fundamental matrix를 구하게 됩니다. 이 과정에서 epipolar line이 threshold보다 크면 해당 matched point는 움직이는 point라고 판단합니다.
fundamental matrix에 대해서는 아래의 포스팅 참고하세요.
위의 포스팅에서 fundamental matrix부분만 정리해보면 아래의 그림과 같습니다.
첫번째 두번째 단계에서 outlier를 제거한 matched point들을 상대로 fundamental matrix(F)를 구합니다. 다시 이렇게 구한 F와 matched points간의 비교를 합니다. 이상적이라면 위의 그림에서 $P_{2}^{T}FP_{1}$의 값은 0이 나와야 합니다. 하지만 여러가지 노이즈로 인하여 완벽하게 0이 나오기는 힘듭니다. 만약 이 값이 threshold대비 매우 크거나 작다면 moving object pixel이라고 판단하게 됩니다. 아래는 그것에 대한 distance를 나타나게 됩니다. 즉 D값이 크게 되면 moving object pixel이 됩니다. 분모를 보면 epipolar line의 절대값으로 나누어 준 것을 볼 수 있는데 단순히 $P_{2}^{T}FP_{1}$의 절대값이 큰 것으로 moving object pixel을 판단하게 되면 $P_{2}$의 위치가 단순히 epipole대비 멀리 있게 되면 $P_{2}^{T}FP_{1}$의 절대값이 크게 나올 수 있습니다.(노이즈에의해 점 P_{2}가 epipole line위에 있지 않을 경우). 그렇기 때문에 스케일을 맞춰주기 위해 분모term을 추가했다고 생각하시면 됩니다.
outliers rejection
이제 segmentation한 정보와 moving consistency check의 정보를 결합하는 단계입니다. moving consistency check에서 확인한 moving pixel을 segmentation으로 falling시킵니다. 해당 pixel이 segmentation에서 구한 object의 contour안에 들어오면 contour안에 있는 모든 feature point는 삭제시킵니다. 만약 moving pixel 과 segmentation이 combine되는 pixel이 있다면 해당 feature point는 제거하고 다시 match하게 됩니다.
octo map
DS-SLAM의 마지막 thread에서는 mapping을 수행합니다. keyframes마다 mapping과정을 수행하고 octo map의 color는 semantic segmatation을 통해 얻은 sematic label을 뜻합니다. 정리하면 moving object를 제외한 semantic 결과와 RGBD의 depth raw depth를 결합하여 octo map을 만듭니다.
octomap은 3D voxel 공간을 probabilistic fashion으로 표현한 map입니다.
octomap은 occupancy grid map의 3차원 버전입니다. 다음의 3가지의 Assumptions을 포함합니다. 1. free or occupied 2. world is static 3. cells are indepandent
$l$은 log odds score을 사용하는 이유는 computation 때문인데 베이지안 룰에 따라 recursive하게 작은 값들을 곱셉하게 되면 computing 처리에 부담이 있습니다. 따라서 log odds score를 활용하여 덧셈을 통해 이를 해결합니다.
위의 공식은 log odds score가 시간이 지남에 따라서 변화는 값을 내포합니다. 반복적으로 해당 voxel이 점유되었다고 segmentation에서 관찰이 되면 log odds score는 값이 커지게 됩니다. 처음은 각 복셀에 대해 0으로 log odd score는 설정됩니다. 즉 p는 0.5에 해당합니다.
각각의 voxel의 업데이트 방법은 베이지안 법칙에 의해서 incremental하게 업데이트 됩니다. 즉,기존의 log odds score에서 새로 관측된(segmentation 결과값을 스케일링) 결과를 더하여 업데이트합니다.
구체적으로 예를 들면 특정시점 t에 lidar에서 아래와 같은 결과를 측정했다고 할때 라이다 센서가 측정된 부분의 voxel은 1, ray trace에 따라 그 전의 voxel은 0, 알수 없는 부분은 0.5라고 하고 이를 logit하여 각각의 voxel의 기존값에 덧셈을 해준다고 생각하시면 됩니다.
logit맵을 통해서 visulization하면 아래와 같고 이를 inverse하여(위 그림의 5번식) costmap을 얻을 수도 있습니다.
Experimental Result
TUM RGB-D 데이터셋에서 dynamic object가 포함된 데이터셋 부분을 사용하였습니다.
위의 그림은 orb slam2 아래의 그림은 DS-SLAM의 결과로 빨간색선은 GT pose와 estimation pose의 차이입니다.
위의 그림은 octomap을 이용하여 mapping한 결과물입니다. color마다 object label을 입혔습니다.
논문에 따르면 loop-closing도 orb-slam2와 같이 사용된다고 적혀있는데 octomap을 어떻게 최적화시키는지에 대해서는 나와있지않습니다.
이상으로 DS-SLAM 리뷰를 마치겠습니다.
감사합니다.