Xiang Gao, Tao Zhang 저자의 'Introduction to Visual SLAM from Theory to Practice' 책을 통해 SLAM에 대해 공부한 내용을 기록하고자 한다.
책의 내용은 주로 'SLAM의 기초 이론', 'system architecture', 'mainstream module'을 다룬다.
포스팅에는 기초 이론만 다룰 것이며, 실습을 해보고 싶다면 다음 github를 참조하자.
https://github.com/gaoxiang12/slambook2
목차
앞선 포스팅에서 살펴본 내용을 간단히 리뷰해보자.
SLAM system은 frontend와 backend로 나뉜다.
Frontend는 Visual Odometry라고도 불리며, 연속된 이미지 정보로 카메라의 움직임을 추정하여 backend에 초기값을 제공해준다.
Visual Odometry(이하 VO) 알고리즘은 크게 두 가지 방법으로 나뉜다.
- Feature Method (= two-view geometry)
- Direct Method
이 중에서 Visual Odometry (1) ~ (5) 포스팅에서는 feature method에 대해 살펴볼 것이다.
Feature Method
Feature Method는 오랫동안 VO의 mainstream이었으며, 이미 많은 발전이 이루어졌다.
Lighting, dynamic objects 등에 민감하지 않고 안정적이어서 성능이 좋다는 특징을 갖는다.
또한 feature method를 학습한다는 것은 이미지의 feature points를 추출하여 matching의 과정을 거친 다음, 연속된 두 frame 간의 카메라 이동을 추정함으로써 Visual Odometry를 알 수 있게 된다는 것을 의미한다.
Visual Odometry의 핵심은 '인접한 이미지로부터 카메라의 motion을 어떻게 추정할 것인가?'인데, 이미지 자체는 밝기와 색상을 encoding한 numerical matrix일 뿐이므로, pixel level에서 바로 카메라의 움직임을 알아내기는 힘들다.
따라서, 다음 과정을 거친다.
- 이미지를 대표하는 features를 고른다. 카메라가 움직이면서 시야각이 조금 변하더라도 이 features는 그대로 남아있으므로, 각 이미지에서 같은 점(같은 부분)이 무엇인지 알 수 있다.
- 이 점을 기반으로 카메라의 pose를 추정하고, 점들의 3차원 공간 상의 위치(좌표)를 알아낸다.
classic SLAM에서는 이 점들을 landmarks라 하고, visual SLAM에서는 image features라 한다.
Features
Feature에 대해 좀 더 알아보자.
Feature는 이미지 정보를 digital로 표현하는 방법 중 하나이다.
원래 이미지는 컴퓨터에서 gray value matrix로 저장되는데, 이때 이미지의 single pixel을 각각 feature로 생각해볼 수 있다. 하지만 visual odometry에서 말하는 feature points는 카메라가 움직여도 남아있는(같은 부분을 표현하는) 점을 말하므로 조도, 변형, material 등에 따라 바뀌는 gray value는 feature가 될 수 없다.
따라서 이미지를 좀 더 안정적으로 특징을 표현할 수 있는 부분을 찾아봐야 한다.
다음 그림을 살펴보자.
상대적으로 두 이미지에서 같은 corner point들은 똑같이 보일 것이고, 같은 edge는 조금 다르게, 같은 block의 경우에는 많이 다르게 보일 것이다.
이러한 corners, edges가 픽셀보다는 훨씬 더 특별하고, 서로 다른 이미지에서의 구별이 잘된다.
하지만, 코너 하나로는 부족하다.
카메라가 회전할 경우에는 corner의 모습이 바뀔 수 있고, 이에 따라 서로 다른 이미지에서 같은 corner인지 판단이 어려워진다.
따라서, 단순한 corner points보다 더 안정적인 local image features를 연구한 결과, image의 features로 SIFT, SURF, ORB 등의 handcrafted features를 사용한다.
Handcrafted features는 다음과 같은 특성을 갖는다.
- Repeatability : 서로 다른 이미지에서 같은 feature를 찾을 수 있어야 한다.
- Distinctiveness : 다른 feature는 서로 다르게 표현되어야 한다.
- Efficiency : 한 이미지 내의 feature point 개수는 전체 pixel보다 훨씬 적어야 한다.
- Locality : feature는 이미지의 작은 일부에만 관련이 있어야 한다.
Feature Point의 구성
Feature point는 두 부분으로 나뉜다.
- Key point (= interest point)
- Descriptor
Key point란, feature point의 위치(좌표)를 나타낸다. (방향이나 사이즈 등 다른 정보를 나타낼 수도 있다.)
각 keypoint는 그에 해당하는 descriptor를 갖고 있으며, descriptor는 key point 주변 정보를 나타내는 vector로, 비슷한 모습의 feature는 비슷한 descriptor를 갖고, 시야나 조명 등에 영향을 받지 않는다.(stable)
따라서 vector space에서 두 feature의 descriptor가 가까이 존재한다면 같은 feature로 볼 수 있다.
Image Features 종류
이미지의 특징점은 여러 종류가 있다. 그중 SIFT, FAST key point, Oriented FAST and Rotated BRIEF (ORB)에 대해 간단히 알아보자.
SIFT (Scale-Invariant Feature Transform)
SIFT는 가장 classic한 image feature로, illumination, scale, rotation 등 이미지의 변형을 모두 고려하므로 계산량이 많다.
SLAM 과정에서 image feature의 추출 및 매칭은 극히 일부 과정이므로, 여기에 많은 계산 시간을 소비할 수 없다.
따라서 SLAM에서 SIFT는 잘 사용하지 않는다.
FAST key point
FAST key point는 detector(검출기)이며, 계산이 아주 빠르다.
하지만, descriptor가 없어 key point 주변의 정보를 알 수 없다.
ORB (Oriented FAST and Rotated BRIEF)
ORB는 real-time 이미지 특징 추출(image feature extraction)에 많이 사용된다.
BRIEF를 descriptor로 사용하면서 Descriptor가 없는 FAST detector의 문제점을 해결하였다.
BRIEF는 binary descriptor로, 계산이 매우 빠르다.
이를 통해 전체 image feature extraction 과정이 매우 빨라졌다.
이제, ORB feature와 추출한 feature를 활용한 matching 과정을 알아보자.
ORB Features
위에서 image feature는 key point, descriptor로 나뉜다고 하였다.
이와 마찬가지로 ORB Feature의 구성은 다음과 같다.
- ORB Key Points (Oriented FAST)
- ORB Descriptor (Binary Robust Independent Elementary Feature, BRIEF)
따라서 ORB feature를 추출하는 과정도 크게 두 과정으로 나뉜다.
- FAST corner point extraction
- 이미지의 corner point를 찾는다.
- 기존 FAST와는 달리, ORB에서는 feature points의 main direction을 계산한다. (Oriented FAST) 이에 따라 다음 과정인 BRIEF descriptor가 rotation에 invariant하도록 한다.
- BRIEF descriptor
- 추출된 feature point 주위의 정보를 나타낸다.
- ORB에서는 BRIEF를 수정하여 이전에 계산했던 direction을 활용하도록 한다.
The FAST Key Point
FAST는 Features from Accelerated Segment Test의 약자로, corner point를 감지하는 방법 중 하나이다.
주로 grayscale에서 이미지의 부분적인 변화를 감지하며, 속도가 빠르다.
주변 pixel과 밝기의 차이가 큰 pixel일수록 corner point일 것이라는 아이디어를 활용하는데, 이때 pixel의 밝기만 따지므로 빠른 것이다.
FAST 알고리즘의 과정은 다음과 같다.
- pixel \(p\)의 밝기를 \(I_p\)로 가정한다.
- threshold \(T\)를 설정한다.
- \(p\)를 center로 하는 반지름이 3인 원 상의 16개 pixel을 고른다.
- 그 pixel에서 밝기가 \(I_p + T\)보다 크고, \(I_p - T\)보다 작은 연속 \(N\)개의 point가 있으면, center pixel인 \(p\)를 feature point로 간주한다. (이때, \(N\)은 보통 12로 잡는데, 이러한 알고리즘을 FAST-12라 한다.)
- 위 과정을 이미지 상의 모든 pixel에 대해 반복한다.
FAST-12 알고리즘에서 더 빠른 계산 속도를 위해 1, 5, 9, 13번 pixel (위, 오른쪽, 아래, 왼쪽 pixel)만 확인할 수도 있다.
이 때에는 4개 중 3개 이상 차이가 클 경우에 \(p\)를 feature point로 본다.
Non-maximal Suppression
이후에 non-maximal suppression(NMS) 방법을 통하여 FAST 알고리즘을 좀 더 보완할 수 있다.
기존 FAST corner point들은 같은 영역에 여러 개가 존재하는 경우가 많은데, 이렇게 corner points가 한 군데에 집중되는 현상을 막기 위해 사용한다.
첫 detection 이후 특정 영역에서 maximal response를 보이는 corner points만 남기는 방법이다.
위 사진과 같이 object detection task에서 한 object에 대해 여러 bounding box를 생성하여 혼란을 주는 경우에도 이 방법을 사용한다.
FAST를 통해 feature points를 계산함으로써 계산 속도가 아주 빨라지지만, 다음과 같은 문제점도 있다.
- 노이즈에 약하며, threshold 값에 의존적이다.
- 방향에 대한 component가 없다.
- 원의 반지름을 3으로 고정하게 되면 scaling problem이 발생한다.
- 여기서 scaling problem이란, 멀리서 봤을 때는 corner이지만, 가까이서 보면 corner가 아닌 문제를 말한다.
따라서 이 단점들을 보완하기 위해 scale과 rotation에 대한 description을 추가해주는 알고리즘이 개발되었다.
이를 Oriented FAST라 하며, ORB에서 사용된다.
Scaling (Image Pyramid)
먼저 scale에 대한 description을 어떻게 추가해주는지 알아보자.
이때 아래와 같은 (multiscale) image pyramid를 사용한다.
피라미드의 바닥에 있는 이미지가 원래 이미지이며, 위로 한 층씩 올라갈 때마다 일정 비율로 해상도가 줄어(downsampled)든다.
이때, 한 층씩 올라갈 때마다 이미지의 스케일(scale)은 커지는 걸까? 작아지는 걸까?
답은 '커진다'이다. 혼동을 막기 위해 스케일(scale)과 크기(size)를 구분할 필요가 있다.
이미지의 size를 축소시킬수록, 즉 위 pyramid에서 한 층씩 올라갈수록 이미지의 scale은 커진다. Scale이 커진다는 뜻은 사물을 넓은 시야에서 본다(이미지가 큰 흐름을 표현한다)는 의미이다.
(size가 동일하지만 이미지가 bluring되어 detail을 잃게 되면 마찬가지로 scale이 커질 수도 있다.)
따라서 해상도가 작은 이미지가 곧 멀리서 본 scene의 역할을 하며, image matching 과정에서 서로 다른 layer의 이미지를 매칭하면서 (부분적으로) scale invariance를 얻을 수 있다.
Rotation
다음으로, rotation에 대한 description을 어떻게 추가하는지 살펴보자.
핵심은 feature point 근처에서 gray centroid(intensity centroid)를 계산하는 것이다.
먼저, 작은 이미지 block (patch) \(B\)에 대해 이미지 block의 moment를 다음과 같이 정의한다.
\( m_{pq} = \sum\limits_{x,y \in B} x^p y^q I (x, y), \quad p, q = \{p, q\} \)
이 moment를 통해 image block의 centroid를 다음과 같이 계산한다.
\( C = \left( \cfrac{m_{10}}{m_{00}}, \cfrac{m_{01}}{m_{00}} \right) \)
Corner의 (geometric) center인 \(O\)와 image block의 centroid인 \(C\)를 연결하여 vector \( \overrightarrow{O C} \)를 얻고, feature point(image block)의 방향(orientation) \(\theta\)를 다음과 같이 정의한다.
\( \theta = arctan \left( m_{01} / m_{10} \right) \)
이렇게 Oriented FAST에서는 FAST corner point가 scale, rotation의 영향을 덜 받도록 하였고, 이를 통해 서로 다른 이미지의 representation 간의 robustness를 크게 향상시켰다.
BRIEF Descriptor
BRIEF는 Binary Robust Independent Elementary Feature의 약자로, binary descriptor이다.
먼저 desription vector가 무엇인지 알아보자.
Description vector는 수많은 0과 1로 이루어진 벡터이며, key point 근처의 두 랜덤 픽셀 \(p, q\)간의 관계를 encoding한다. (\(p\)가 \(q\)보다 크면 1, 아니면 0)
이러한 \((p, q)\) 쌍을 128개 취하면 128차원의 description vector를 얻게 되는데, 이렇게 랜덤으로 선택된 점을 단순 비교하여 binary로 나타내면 속도가 매우 빨라지게 된다. (저장 공간의 차지가 적어지고, real-time 이미지 매칭에 적합하다.)
그런데 원래 BRIEF는 rotation invariance를 갖지 않으므로, ORB에서는 이를 개선하여 FAST에서 계산한 key point의 방향 정보를 사용함으로써 회전된 Steer BRIEF feature를 계산한다.
Oriented FAST and Rotated BRIEF (ORB) Features
이렇게 rotation과 scaling을 모두 고려하므로 ORB는 translation, rotation, scaling에 대해 강인하다.
그리고 FAST와 BRIEF 알고리즘을 결합함으로써 효율적이고, real-time SLAM에서 아주 많이 사용된다.
Feature Matching
Feature matching은 visual SLAM 과정에서 매우 중요하다.
먼저, feature matching을 통해 SLAM에서의 데이터 연관성 문제를 해결할 수 있다. 즉, 이전 feature points와 현재 feature points 간의 일치성을 결정해준다.
그리고 이미지 간의 descriptor를 정확히 매칭하여 이후 SLAM 과정인 pose 추정과 optimization이 수월해진다.
Mismatch Problem
그런데 image feature의 locality, 즉 이미지의 작은 일부만 특징으로 잡는다는 성질 때문에 mismatch 문제가 발생할 수 있다.
왜냐하면 한 scene 내에서 같은 texture가 반복되는 경우, feature description이 비슷해지기 때문이다.
사람이 판단할 때에는 서로 다른 물체임에도 컴퓨터는 vector space에서 비슷한 feature descriptor가 존재할 경우 같은 feature로 판단해버릴 수 있다.
따라서, local feature만 사용하기보다, 다음과 같은 과정을 거쳐 전체적인 맥락에서의 일치성을 판단해 주어야 한다.
예시를 통해 feature matching 과정을 살펴보자.
두 연속된 순간의 이미지 \(I_t, I_{t+1}\)이 있다.
이때 \(I_t\)에서는 features \(x_t^m \; (m=1,2, \dots, M) \)가 추출되었고, \(I_{t+1}\)에서 features \(x_{t+1}^n \; (n=1, 2, \dots, N)\)이 추출되었다.
두 feature 집합 내에서 각각 서로 같은 feature를 나타내는 descriptor를 찾아주어야 할 것이다.
이때 가장 간단한 feature matching 방법은 brute-force 방법이다.
- 각 set의 모든 descriptor 쌍 간의 거리를 계산한다.
- 이때 discriptor가 floating-point type인 경우에는 Euclidean distance를, binary descriptor(BRIEF)인 경우에는 Hamming distance를 사용한다.
- Matching distance(=similarity) 기준으로 정렬하여, 가장 가까운 쌍을 matching point로 정해준다.
이때 Hamming distance란, 서로 다른 digit의 개수이다.
BRIEF에서는 description vector가 0 혹은 1로 이루어져 있으므로, 이 숫자가 다른 것이 많을수록 거리가 멀어지는 것이다.
하지만 이러한 brute-force 방법은 feature point 개수가 많아지면 계산량이 너무 커지므로, SLAM에서는 이 문제를 해결하기 위해 FLANN(Fast Approximate Nearest Neighbor) 알고리즘을 사용하거나 brute-force method 내에서 search range를 정하는 방법 등을 고안하였다.
OpenCV 라이브러리에서 feature extraction과 matching 관련 함수를 제공해준다.
왼쪽 사진은 ORB features를 extraction 한 결과이다.
오른쪽 위 사진은 brute-force matching 결과인데, Filtering을 하지 않으면 위와 같이 틀린 결과까지 모두 표현하여 matching이 제대로 되지 않음을 확인해볼 수 있다.
여기서 Hamming distance가 일정 이하인 결과만 matching 결과로 선택하여 오른쪽 아래와 같이 최종 결과를 얻을 수 있다.
Calculate the Camera Motion
이제 매칭 결과를 통해 카메라의 motion을 추정해 보아야 한다. 해당 내용도 양이 많고 어려워 다음 포스팅에 자세히 다루고, 간단하게 어떤 개념을 다룰 것인지 알아보자.
어떤 카메라를 사용할 것인가, 카메라의 설정을 어떻게 하는가에 따라 motion estimation 방법은 다음과 같이 나뉜다.
- 2D-2D case : Monocular 카메라를 사용한 경우, 2D 픽셀 좌표만 얻을 수 있다. 따라서 두 개의 2D 점들의 집합으로 motion을 추정해야 한다. 이 과정을 Epipolar Geometry라 한다.
- 3D-3D case : Binocular, RGB-D 카메라를 사용한 경우, 혹은 distance를 알고 있는 경우에는 두 개의 3D 점들의 집합으로 motion을 추정한다. 이 때에는 ICP(Iterative Closest Point)라는 방법을 사용한다.
- 3D-2D case : 3D 집합 하나와 2D 집합 하나가 주어진 경우, 3D 점들의 위치와 이 점들의 카메라 상의 projection 위치를 얻고, 카메라의 pose 또한 추정이 가능하다. 이때 PnP(Perspective-n-Point)라는 방법을 사용한다.
최근댓글