진짜 SLAM 시작!!!
vslam에서 사용할 수 있는 feature를 넓힐 수 있다
1. pre-1980
core problem
- 사진의 품질이 좋지 않다
- 2D로부터 3D를 이해한다는 것이 목적 (지금과 목적이 비슷)
- line을 찾는 연구가 활발
- 당시 이미지는 noise가 많고 객체를 찾기 위해서는 전체에서 color pattern을 찾아서 여기서 정보를 추출
- 객체를 구분할 때는 다양한 색을 표현하는 공간의 경계 즉, line이 중요한 지표가 되었다
- gradient operator

lines
sobel operator
- 1962년 gradient operator 기반으로 만들어졌다

- convolution 사용
- sobel에서 뽑아낸 edge들을 파라미터 space에 표현함으로써 안정적으로 line 검출
- 이를 기점으로 robust하게 line을 찾을 수 있게 되었다
canny edge detection
- sobel에서 edge direction 정보와 hysteresis thresholding을 통해 strong edge를 찾는 방법
- hysteresis thresholding : 주변의 분류 결과에 따라서 자신의 분류 결과가 달라질 수 있는 thresholding 기법
- 안정적으로 edge를 검출하고 사용자가 원하는대로 edge의 세밀함을 조절할 수 있다
- 조금 무거운 연산이지만 정확도가 좋다
line detection research
- hough transform과 canny edge detection을 통해 line을 잘 검출할 수 있게 되었다
- line을 통해 물체의 semantic를 추정할 수 있는 primer가 생겼다고 하는 연구 결과가 많았고 실제로 이 primer를 이용해서 segmentation의 정확도를 높이는 연구가 추후에 많이 진행되었다
- 하지만 line 연구가 진행되면서 생긴 질문
- 어떻게 두개의 이미지에서 같은 물체임을 인식할 것인가?
- line을 통해 물체의 semantic를 인식할 수 있다고 생각했는데 이 시점의 변화가 너무 큰 경우 line들간의 연관성을 알기 어려웠다
- 시점이 가까운 경우 line tracking을 통해 알 수 있었지만 각도가 많이 틀어지면 방법이 사라짐
- line이 아닌 다른 기하적인 방법을 찾기 시작
- line-line dot product : 교차점, point사용해서 특징 찾는 연구
- line-line cross prodect : plane을 사용해서 특징 찾는 연구
2. feature detector
- point festure! (VSLAM에서 plane 특징을 잘 사용하지 않는다)
point feature에서 사용되는 단어들
이미지 속에서 local feature를 찾을 건데 이번 강의에서는 point feature에 대해서만 다룬다. point feature는 keypoint와 descriptor로 이루어져 있다. point feature의 픽셀 위치 + point feature가 어떤 객체에서 추출된 것인지 알수 있도록 해당 keypoint 주변의 patch 정보를 분석한 것. 동일한지 판단하려면 descriptor를 비교하여 충분히 비슷하다면 correspondence를 만들수 있다.
keypoint detector
- point feature의 픽셀 위치 (x, y)
- point feature의 특징
- 특징 기술자
- 해당 point feature를 기술할때는 해당 keypoint의 주변을 분석하여 descriptor 객체로 만든다
correspondence matcher
- 두개의 point feature가 실제로 같은 객체를 의미하는지에 대한 매칭 정보
- 매칭을 하기 위해 각각의 descriptor를 비교하여 서로 비슷하면 두 개가 동일한 공간에처 추출된 point feature라고 인식 -> correspondence가 생겼다
local feature
- 이미지 속에 local scale로 이미지를 표현할 수 있는 방법
Moravec (corner detection)
- 사람이 하기 쉬운 작업은 로봇이 하기 어렵고, 로봇이 하기 쉬운 작업은 사람이 하기 어렵다
- robust corner detector의 첫번째 기법
- 픽셀을 기점으로 4방향들로의 gradient를 비교하겨 코너인지 아닌지 판단
Harris Corner
- moravec을 개선시킨 코너 검출기
- 4방향 대신 x, y방향의 gradient만 계산하고 이를 이용하여 코너 방향성을 계산할 수 있는 matrix를 만들었다
- matrix속에서 eigan value를 추출하고 이 값을 코너의 방향성으로 인지하게 하여 보다 더 robust하게 코너 검출
- eigan value를 기반으로 'corner-ness' score를 계산하여 보다 정량적으로 코너인지 에지인지 flat인지 분류
- 'corner-ness' score는 매우 안정적으로 작동


SIFT
- 정확도가 매우 좋다
- 딥러닝 방법 전에 가장 robust한 feature detector
- scale-invariant(불변)와 rotation-invariant에 초점을 둔 local feature 기법
- 이미지를 여러 scale로 복사한 image 피라미드를 만든다 -> 각각의 scale마다 가우시안 블러 이미지를 만든다 -> DOG 이미지를 만든다 -> 이를 분석하면 scale-invarian한 특징을 검출할 수 있다
- descriptor도 제안
- 16x16 patch에서 gradient 계산 -> gradient를 모아 histogram을 만들어서 descriptor 생성
- 메모리, 연산량 높다
- 하지만 매칭이 잘된다

FAST Corner
- descriptor는 없고 keypoint만 찾을 수 있는 방법
- 속도가 매우 빨라서 현재에도 사용된다
- harris의 17배, SIFT의 42배의 속도
- 빠른 motion, rotation(orientation)에도 invariant하다
- 머신러닝을 이용하여 더 빠른 코너 검출을 하는 faster corner 제안, 그 후 faster 방식이 현재 fast라고 불린다
- 방법
- 주변 16개의 픽셀의 밝기값 탐지
- 10개의 연속된 픽셀값이 나머지 6개보가 밝거나 어두우면 코너로 검출

BRIEF descriptor
- fast와 궁합이 잘 맞는다
- float 값이 아닌 binary 값으로 표현
- SIFT : 512byte -> 4096 bi
- BRIEF : 256bit
- hamming distance로 norm 계산

FLANN Library
- descriptor를 빠르게 매칭하는 방법
- 다양한 tree 구조를 가지고 자료구조가 만들어졌다
- 고차원의 데이터 cluster에서 가장 가까운 값을 찾는다
- automatic selection : randomized Kd-tree / Hierachical K-means
- descriptor 종류와 dataset의 크기에 맞는 알고리즘을 자동으로 골라준다
ORB
- oriented FAST + Rotated BRIEF
- SIFT의 정확도를 가지지만 실시간에 작동하는 local feature 목적
- FAST로 keypoint 추출 + BRIEF로 descriptor 계산의 단점
- FAST가 scale invariant 하지 않다
- BRIEF가 rotation invariant 하지 않다
- ORB는 scale, rotation invariant한 local feature 추출!!
- FAST 할때 image pyramid 사용 -> scale invariant
- FAST 할때 keypoint 주변의 gradient를 이용하여 코너의 방향성을 찾고 그 방향에 맞춰 BRIEF를 뽑는다 -> rotation invariant
- 실시간의 경우 ORB를 사용한다 (우선 이 방법으로 확인 후 다른 것들과 성능 비교)
AKAZE
딥러닝 방식의 local feature
- loss function을 기반으로 학습
- GT 데이터 생성하기가 어렵다
- 딥러닝 알고리즘
- SuperPoint
- keynet : keypoint 추출
- hardNet : descriptor 추출
- keynet와 hardNet 조합 많이 사용