Introduction
SLAM Framework을 다룬 앞선 게시물에서 SLAM은 크게 Frontend와 Backend로 나뉨을 설명했습니다. Frontend는 다른 말로 Visual Odometry라고도 하는데요. 오늘은 이 Visual Odometry(VO), 그중에서도 Feature based VO에 대해서 알아보도록 하겠습니다.
Visual Odometry
우리의 친구 Wikipedia에서는 VO에 대해 아래와 같이 설명하고 있습니다.
In robotics and computer vision, visual odometry is the process of determining the position and orientation of a robot by analyzing the associated camera images.
즉 VO는 연속된 이미지들로부터 카메라의 이동 정보를 예측함과 동시에, Backend의 최적화의 연산량과 정확도를 위해 좋은 초깃값을 제공하는 역할을 합니다. 이러한 VO 알고리즘들은 예측 방법에 따라 아래 두 종류로 나뉘게 되며, 각각은 장단점이 있습니다.
- Feature Method

- Direct Method

Feature based VO는 현재까지도 업계 주류로 여겨지며, 표준으로 생각되기도 합니다. 그 이유는 Direct method 기반 VO가 가지고 있는 한계에 근거하는데요. 이를 보기 전에 우리는 VO의 궁극적인 목적을 짚고 넘어가야 합니다. VO의 상용화를 위해서는 두 가지 조건을 충족해야 합니다. 첫째, 광원, 날씨 변화 등 외부 요인에 강인해야 합니다. 우리가 만든 알고리즘이 어떤 환경에서 작동할지는 아무도 장담할 수 없습니다. 그래서 최대한 외부 변수에도 강인해야 합니다. 둘째, 실시간 추적이 가능해야 합니다. VO의 주요 활용처는 자율 주행, Robotics 등 실시간 연산이 굉장히 중요합니다.
유감스럽게도 현재까지의 기술로는 Direct Method는 두 영역 모두에서 Feature based VO보다 상대적으로 취약합니다. 제 블로그에서 많은 지분을 차지하고 있는 Optical Flow를 예로 들면 이해가 쉬울 텐데요. 카메라의 움직임이 없는 상황에서 광원의 위치가 바뀐다면 Optical Flow 결괏값은 0이 아니게 됩니다. 또한, 모든 픽셀들에 대해서 많은 연산을 해야 하는 Optical Flow를 비롯한 여러 Direct Method는 실시간을 지원하기가 힘듭니다. Sparse 하게 계산해 실시간에 가까운 성능을 보이는 알고리즘들도 있지만, 그렇게 되면 Direct Method의 장점인 높은 정확도(광원 변화 없다는 가정)를 상실하게 됩니다.
그렇기에 Feature based VO를 먼저 살펴보고, 이어서 Direct Method를 살펴보도록 하겠습니다. 사실 Direct Method의 경우 많이 다뤄지지 않지만 Optical Flow를 사랑하는 사람으로서 그냥 지나칠 수 없더군요. 실제로 저는 DSO/LDSO 기반의 VSLAM을 공부 중이기도 합니다.
Feature based Visual Odometry
Feature based Visual Odometry의 컨셉은 매우 간단합니다. 프레임이 연속적으로 전달될 경우, 카메라의 움직임은 크지 않을 것입니다. 이 상황에서 각 프레임을 대표할만한 특징점들은 연속적으로 등장할 텐데요. 이런 특징점들의 변화량을 통해 카메라의 움직임을 역으로 추적하는 알고리즘입니다. 실제로 인간이 속도를 인식할 때 이동하는 물체들의 상대 속도를 이용하는 것을 생각하면 꽤나 합리적인 접근이라고 생각됩니다.
이렇게만 들어도 이 알고리즘에서 가장 중요한 포인트를 잡을 수 있습니다. 특징점을 잘 선정하는 것이 알고리즘의 핵심이며, 동시에 제약이기도 합니다. Rule-based 알고리즘들을 통해 일정한 품질의 특징점을 찾기가 쉽지 않기 때문이죠. 하지만 이런 점들은 직접 개발을 하며 체감해 보기로 하고, 좀 더 나아가도록 합시다.
이렇게 중요한 특징점들을 일반적인 SLAM에서는 Landmark라고 부르며, image만을 사용하는 Visual SLAM(VSLAM)에서는 image feature라고 칭하기도 합니다. 아래는 Feature based VO의 일반적인 순서와 실행예입니다.
- Feature Extraction & Matching
- Camera Motion Estimation between two frames

Image Feature
위에서도 언급했듯이 결국 Feature based VO에서 가장 중요한 요소는 좋은 image feature(이하 feature)를 선정하는 것입니다. 그렇다면 feature는 뭘까요? 우리의 친절한 이웃, Wikipedia는 아래와 같이 정의를 내리고 있습니다.
More broadly a feature is any piece of information which is relevant for solving the computational task related to a certain application.
정말 모호하죠? 어떠한 정보도 feature가 될 수 있습니다. 어떻게 하면 좋은 feature를 선정할 수 있는지 영감을 얻으러 왔다가 더 큰 고민을 얻고 가네요. 이미지에서 가장 쉽게 떠올릴 수 있는 것은 pixel입니다. 사실 이미지는 pixel을 제외한 어떤 것도 존재하지 않죠. 이제 거의 다 왔습니다.
픽셀 자체로는 밝기 정보 이외에는 어떠한 정보도 가지고 있지 않습니다. 그렇다고 모든 픽셀들에 대해 계산을 진행하는 접근법은 미친 짓이지요. 물론 Direct Method는 그 미친 짓에서 출발하기는 했습니다. 그렇다면 특별한 픽셀을 찾는 것은 어떨까요? 그게 아니라면 픽셀들을 묶는 것은 어떨까요?
특별한 픽셀을 찾는 접근에서 corner를 떠올릴 수 있습니다. 픽셀들을 묶는 접근법에서 edge, block을 떠올릴 수 있죠. 그리고 결론적으로 우리는 corner point를 feature로 선정할 것입니다. 여러 이유가 있겠다만, 개인적으로 제일 생각하기 쉬운 이유는 아래와 같습니다.

Edge(선)와 block(면)은 3D 세상에서 회전과 이동이 발생할 경우 2D 세상에 완전히 반영되지 않습니다. 차원이 축소되기 때문이죠. 이러한 내용은 다음 게시물에서 설명하고 있으니, 궁금하신 분들은 참고 바랍니다. 그러나 corner(점)은 어떤가요? 차원 축소로 인한 왜곡이 없지는 않지만, 나머지와 비교했을 때 현저히 적습니다. 적어도 변화가 있음이 나타나기는 하고, 면이 선으로 변하거나 선이 점으로 변할 수는 있어도 점이 사라질 수는 없습니다. 그래서 corner를 feature로 선정하지 않았을까 저는 생각합니다. 물론 계산량이 큰 이유겠지만 아무튼 그렇습니다.
Feature Detection Algorithms
이제 feature에 대한 정의를 끝냈으니, feature를 프레임에서 찾아봅시다. Corner detection 분야는 굉장히 핫했던 분야로 현재까지도 널리 사용되는 알고리즘들을 많이 배출했습니다. 대표적으로는 Harris corner, FAST corner, GFTT corner 등이 있는데요. 대부분 2000년 이전에 제안된 알고리즘들인데 현재까지도 많은 사랑을 받고 있습니다. 이번 포스트에서는 각각에 대해 자세히 다루지는 않을 것이나, 추후에 기회가 된다면 코드와 함께 다뤄보도록 하겠습니다. 지금은 각각의 paper들에 대한 링크만 걸어두었으니, 관심 있으신 분들은 참고 부탁 드립니다.
이제 한 프레임에서 feature, 즉 corner를 획득할 수 있게 되었습니다. 그러나 두 프레임의 feature를 비교하기 위해서는 단순히 corner를 뽑는 것으로는 부족합니다. 코너들 역시 카메라의 이동에 따라 왜곡이 포함된 변화량을 갖게 됩니다. 그렇기 때문에 이 feature(코너)가 프레임 속에서 어떤 역할을 하는지, 혹은 이 feature가 대표하는 영역은 어떤 특징을 띄고 있는지에 대한 정보가 필요합니다. 이를 위해 추가적인 정보를 담은, handcrafted feature들을 이용하게 됩니다. 이를 위해 개발된 알고리즘의 대표적인 예시로는 SIFT, SURF, ORB 등이 있습니다.
다음 시간에는 handcrafted feature 알고리즘들의 개선된 feature에 대해 알아보도록 하겠습니다. Key point와 Descriptor에 대해 이야기한 후, 대표적인 예시로 ORB feature를 다룰 예정입니다. 긴 글 읽어주셔서 감사하고, 같이 공부했으면 하는 주제가 있으면 댓글이나 메일로 요청 부탁 드립니다.
Introduction
SLAM Framework을 다룬 앞선 게시물에서 SLAM은 크게 Frontend와 Backend로 나뉨을 설명했습니다. Frontend는 다른 말로 Visual Odometry라고도 하는데요. 오늘은 이 Visual Odometry(VO), 그중에서도 Feature based VO에 대해서 알아보도록 하겠습니다.
Visual Odometry
우리의 친구 Wikipedia에서는 VO에 대해 아래와 같이 설명하고 있습니다.
In robotics and computer vision, visual odometry is the process of determining the position and orientation of a robot by analyzing the associated camera images.
즉 VO는 연속된 이미지들로부터 카메라의 이동 정보를 예측함과 동시에, Backend의 최적화의 연산량과 정확도를 위해 좋은 초깃값을 제공하는 역할을 합니다. 이러한 VO 알고리즘들은 예측 방법에 따라 아래 두 종류로 나뉘게 되며, 각각은 장단점이 있습니다.
- Feature Method

- Direct Method

Feature based VO는 현재까지도 업계 주류로 여겨지며, 표준으로 생각되기도 합니다. 그 이유는 Direct method 기반 VO가 가지고 있는 한계에 근거하는데요. 이를 보기 전에 우리는 VO의 궁극적인 목적을 짚고 넘어가야 합니다. VO의 상용화를 위해서는 두 가지 조건을 충족해야 합니다. 첫째, 광원, 날씨 변화 등 외부 요인에 강인해야 합니다. 우리가 만든 알고리즘이 어떤 환경에서 작동할지는 아무도 장담할 수 없습니다. 그래서 최대한 외부 변수에도 강인해야 합니다. 둘째, 실시간 추적이 가능해야 합니다. VO의 주요 활용처는 자율 주행, Robotics 등 실시간 연산이 굉장히 중요합니다.
유감스럽게도 현재까지의 기술로는 Direct Method는 두 영역 모두에서 Feature based VO보다 상대적으로 취약합니다. 제 블로그에서 많은 지분을 차지하고 있는 Optical Flow를 예로 들면 이해가 쉬울 텐데요. 카메라의 움직임이 없는 상황에서 광원의 위치가 바뀐다면 Optical Flow 결괏값은 0이 아니게 됩니다. 또한, 모든 픽셀들에 대해서 많은 연산을 해야 하는 Optical Flow를 비롯한 여러 Direct Method는 실시간을 지원하기가 힘듭니다. Sparse 하게 계산해 실시간에 가까운 성능을 보이는 알고리즘들도 있지만, 그렇게 되면 Direct Method의 장점인 높은 정확도(광원 변화 없다는 가정)를 상실하게 됩니다.
그렇기에 Feature based VO를 먼저 살펴보고, 이어서 Direct Method를 살펴보도록 하겠습니다. 사실 Direct Method의 경우 많이 다뤄지지 않지만 Optical Flow를 사랑하는 사람으로서 그냥 지나칠 수 없더군요. 실제로 저는 DSO/LDSO 기반의 VSLAM을 공부 중이기도 합니다.
Feature based Visual Odometry
Feature based Visual Odometry의 컨셉은 매우 간단합니다. 프레임이 연속적으로 전달될 경우, 카메라의 움직임은 크지 않을 것입니다. 이 상황에서 각 프레임을 대표할만한 특징점들은 연속적으로 등장할 텐데요. 이런 특징점들의 변화량을 통해 카메라의 움직임을 역으로 추적하는 알고리즘입니다. 실제로 인간이 속도를 인식할 때 이동하는 물체들의 상대 속도를 이용하는 것을 생각하면 꽤나 합리적인 접근이라고 생각됩니다.
이렇게만 들어도 이 알고리즘에서 가장 중요한 포인트를 잡을 수 있습니다. 특징점을 잘 선정하는 것이 알고리즘의 핵심이며, 동시에 제약이기도 합니다. Rule-based 알고리즘들을 통해 일정한 품질의 특징점을 찾기가 쉽지 않기 때문이죠. 하지만 이런 점들은 직접 개발을 하며 체감해 보기로 하고, 좀 더 나아가도록 합시다.
이렇게 중요한 특징점들을 일반적인 SLAM에서는 Landmark라고 부르며, image만을 사용하는 Visual SLAM(VSLAM)에서는 image feature라고 칭하기도 합니다. 아래는 Feature based VO의 일반적인 순서와 실행예입니다.
- Feature Extraction & Matching
- Camera Motion Estimation between two frames

Image Feature
위에서도 언급했듯이 결국 Feature based VO에서 가장 중요한 요소는 좋은 image feature(이하 feature)를 선정하는 것입니다. 그렇다면 feature는 뭘까요? 우리의 친절한 이웃, Wikipedia는 아래와 같이 정의를 내리고 있습니다.
More broadly a feature is any piece of information which is relevant for solving the computational task related to a certain application.
정말 모호하죠? 어떠한 정보도 feature가 될 수 있습니다. 어떻게 하면 좋은 feature를 선정할 수 있는지 영감을 얻으러 왔다가 더 큰 고민을 얻고 가네요. 이미지에서 가장 쉽게 떠올릴 수 있는 것은 pixel입니다. 사실 이미지는 pixel을 제외한 어떤 것도 존재하지 않죠. 이제 거의 다 왔습니다.
픽셀 자체로는 밝기 정보 이외에는 어떠한 정보도 가지고 있지 않습니다. 그렇다고 모든 픽셀들에 대해 계산을 진행하는 접근법은 미친 짓이지요. 물론 Direct Method는 그 미친 짓에서 출발하기는 했습니다. 그렇다면 특별한 픽셀을 찾는 것은 어떨까요? 그게 아니라면 픽셀들을 묶는 것은 어떨까요?
특별한 픽셀을 찾는 접근에서 corner를 떠올릴 수 있습니다. 픽셀들을 묶는 접근법에서 edge, block을 떠올릴 수 있죠. 그리고 결론적으로 우리는 corner point를 feature로 선정할 것입니다. 여러 이유가 있겠다만, 개인적으로 제일 생각하기 쉬운 이유는 아래와 같습니다.

Edge(선)와 block(면)은 3D 세상에서 회전과 이동이 발생할 경우 2D 세상에 완전히 반영되지 않습니다. 차원이 축소되기 때문이죠. 이러한 내용은 다음 게시물에서 설명하고 있으니, 궁금하신 분들은 참고 바랍니다. 그러나 corner(점)은 어떤가요? 차원 축소로 인한 왜곡이 없지는 않지만, 나머지와 비교했을 때 현저히 적습니다. 적어도 변화가 있음이 나타나기는 하고, 면이 선으로 변하거나 선이 점으로 변할 수는 있어도 점이 사라질 수는 없습니다. 그래서 corner를 feature로 선정하지 않았을까 저는 생각합니다. 물론 계산량이 큰 이유겠지만 아무튼 그렇습니다.
Feature Detection Algorithms
이제 feature에 대한 정의를 끝냈으니, feature를 프레임에서 찾아봅시다. Corner detection 분야는 굉장히 핫했던 분야로 현재까지도 널리 사용되는 알고리즘들을 많이 배출했습니다. 대표적으로는 Harris corner, FAST corner, GFTT corner 등이 있는데요. 대부분 2000년 이전에 제안된 알고리즘들인데 현재까지도 많은 사랑을 받고 있습니다. 이번 포스트에서는 각각에 대해 자세히 다루지는 않을 것이나, 추후에 기회가 된다면 코드와 함께 다뤄보도록 하겠습니다. 지금은 각각의 paper들에 대한 링크만 걸어두었으니, 관심 있으신 분들은 참고 부탁 드립니다.
이제 한 프레임에서 feature, 즉 corner를 획득할 수 있게 되었습니다. 그러나 두 프레임의 feature를 비교하기 위해서는 단순히 corner를 뽑는 것으로는 부족합니다. 코너들 역시 카메라의 이동에 따라 왜곡이 포함된 변화량을 갖게 됩니다. 그렇기 때문에 이 feature(코너)가 프레임 속에서 어떤 역할을 하는지, 혹은 이 feature가 대표하는 영역은 어떤 특징을 띄고 있는지에 대한 정보가 필요합니다. 이를 위해 추가적인 정보를 담은, handcrafted feature들을 이용하게 됩니다. 이를 위해 개발된 알고리즘의 대표적인 예시로는 SIFT, SURF, ORB 등이 있습니다.
다음 시간에는 handcrafted feature 알고리즘들의 개선된 feature에 대해 알아보도록 하겠습니다. Key point와 Descriptor에 대해 이야기한 후, 대표적인 예시로 ORB feature를 다룰 예정입니다. 긴 글 읽어주셔서 감사하고, 같이 공부했으면 하는 주제가 있으면 댓글이나 메일로 요청 부탁 드립니다.