Local feature 기반의 물체인식을 위한 방법(SIFT, SURF 등)에 관한 내용입니다
--
물체인식에 관한 이야기 - (1) 시작하기 (20100723)
--
오늘은 "3일에 만드는 고속물체인식시스템"의 1일차에 해당하는
SIFT특징 추출 부분을 구현하고 그 내용을 정리해 보고자 합니다.
* 주의
SIFT는 특허에 등록(U.S. Patent 6,711,293)되어 있으니
상용화 등에 이용하실 분들은 David Lowe(lowe@cs.ubc.ca) 선생님께 문의해주세요.
■ SIFT 특징 추출
알고리즘에 대한 부분은 후에 또 정리하겠습니다.
먼저 공부하실 분은 아래 논문을 참고 해주세요.
(위의 특허에도 알고리즘은 설명이 잘 되어 있습니다. 참고하세요.)
* SIFT 논문
물체인식에 관한 이야기 - (1) 시작하기 (20100723)
--
오늘은 "3일에 만드는 고속물체인식시스템"의 1일차에 해당하는
SIFT특징 추출 부분을 구현하고 그 내용을 정리해 보고자 합니다.
* 주의
SIFT는 특허에 등록(U.S. Patent 6,711,293)되어 있으니
상용화 등에 이용하실 분들은 David Lowe(lowe@cs.ubc.ca) 선생님께 문의해주세요.
■ SIFT 특징 추출
알고리즘에 대한 부분은 후에 또 정리하겠습니다.
먼저 공부하실 분은 아래 논문을 참고 해주세요.
(위의 특허에도 알고리즘은 설명이 잘 되어 있습니다. 참고하세요.)
* SIFT 논문
여기에서는 코딩에 초점을 맞추겠습니다.
OpenCV에는 SIFT함수가 없으므로
Rob Hess씨가 C언어로 이쁘게 만들어주신 라이브러리를 이용하기로 합니다.
(우선 퍼뜩 결과를 시험해 보고 싶으니까요.)
OpenCV를 사용하기 위해서는 사전에 설치가 필요하기 때문에 인스톨 해주세요.
작년부터는 OpenCV2.x 버전이 업데이트 되고 있는 것 같던데,
다운로드 및 자세한 설치 방법은
OpenCV 2.0 설치 (VS 2008, 윈도우 7)을 참조해주세요.
아, 제 작업환경은 Windows 7, VS2008, OpenCV2.0입니다.
Rob Hess씨의 프로그램은 OpenCV1.1에서는 정상적으로 동작을 하고,
OpenCV2.0에서도 조금만 수정하면 동작이 가능하다고 하는군요.
그럼 Rob Hess씨의 홈페이지로부터
SIFT Feature Detector의 압축파일(zip, 9.4M)을 다운로드 받으셔셔
압축을 푸시면 여러가지 파일들이 있지만,
특징의 추출을 위해서 최소한으로 필요한 내용은 아래와 같습니다.
(매칭 단계는 이후에 차근차근 해보도록 하겠습니다.)
siftfeat.c : 메인 함수 sift.c / sift.h : SIFT 추출 함수 imgfeatures.c. / imagefeatures.h : SIFT 특징 표현 및 보존 함수 utils.c utils.h : 유틸리티 함수 beaver.png : 테스트 영상 |
위의 함수들을 자신의 프로젝트에 추가해서 사용하면 됩니다.
* David Lowe선생님의 SIFT descriptor와 Oxford VGG의 Affine covariant feature detectors의 내용을 포함하고 있는 듯 합니다.
OpenCV2.0에서 MinGW로 컴파일을 하니 몇개의 에러가 있다고 하는군요.
그에 따른 저자의 수정은 다음과 같습니다.
imagefeatures.c의 373행
cvEigenVV( &M, &V, &E, DBL_EPSILON, 0, 0 ); |
siftfeat.c의 28, 29행과
char* img_file_name = "beaver.png"; char* out_file_name = "beaver.sift"; |
72행의
cvSaveImage( out_img_name, img, 0 ); |
아직까지 여러가지 경고들은(저의 경우 23개) 남아있지만 컴파일은 가능합니다.
저도 우선 프로그램의 동작을 확인 해보는 것이 목적이므로 콘솔기반에서
위의 내용들을 시도해 보았습니다.
특별히 별다른 에러는 없었지만 저도 파일의 경로 부분은 수정을 하였습니다.
siftfeat.c의 28행의 입력영상 경로와 파일이름,
그리고 29행의 키포인트의 128차원 벡터의 내용이 저장되는 파일의 이름을 수정하였습니다.
beaver.png을 입력영상으로 프로그램을 돌려봅니다.
정확하게 나왔는지는 모르겠지만, 아래와 같은 결과를 얻을 수 있습니다.
위의 결과 영상에서 화살표의 시작점은 특징점의 위치를 나타냅니다.
그리고 화살표의 길이는 스케일,
화살표의 방향은 경사도가 가장 강한 방향을 나타내고 있는 듯 합니다.
위 영상의 경우 114개의 특징점이 검출 되었네요.
SIFT 특징점의 표시방법은
키포인트의 점만 표시 하거나, 화살표, 원 등의 여러가지가 있는 듯 합니다.
특징점의 스케일이나 화살표의 방향 등에 대해서 더 정확하게 알기 위해서
아무래도 이제부터는 알고리즘 적인 부분에 대한 이해가 필요한 것 같네요.
하지만, 우선은 각 특징점을 128차원의 특징 벡터로 나타내는 것에 대해서만
알아보도록 하겠습니다.
각각의 키포인트 128차원의 내용은 beaver.sift라는 파일에 텍스트로 저장되어 있습니다.
화살표 하나에 128차원 벡터입니다. 파일의 내용은 아래와 같습니다.
114 128 --> 키포인트의 개수(114)와 특징벡터의 차원수(128차원) 101.350424 136.130888 40.169873 0.771085 // 특징점 #1 --> 첫 번째 키포인트의 Y좌표, X좌표, 스케일, 방향 0 0 0 0 3 1 0 0 2 23 46 15 18 3 0 0 6 20 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 36 0 0 81 95 57 47 185 114 2 7 185 155 19 6 19 6 1 22 22 0 0 0 0 0 0 1 0 0 0 0 37 8 0 0 91 12 0 1 185 144 11 35 185 50 0 0 23 28 8 95 40 1 0 0 0 0 0 4 0 0 0 0 0 0 0 0 11 5 0 0 4 2 0 0 49 20 0 0 1 0 0 1 0 0 0 0 0 0 0 0 --> 벡터의 값들로 각 행의 개수는 20 127.871534 71.100559 15.768594 -2.024589 // 특징점 #2 1 2 2 72 63 12 1 1 133 93 1 4 2 7 4 44 133 115 0 0 0 0 0 20 9 4 0 0 0 0 0 0 23 0 1 9 107 20 1 8 133 5 0 0 0 1 5 133 132 14 0 0 0 0 8 133 14 1 0 0 0 0 0 8 26 0 0 0 126 37 8 22 133 47 0 0 0 0 3 52 131 41 0 0 0 0 2 36 1 0 0 0 0 0 0 2 2 0 0 0 34 105 80 24 111 15 0 0 0 1 55 66 79 21 0 0 0 0 0 5 0 0 0 0 0 0 0 0 |
즉,
위의 beaver.png영상의 경우 128차원의 벡터 114개에 의해서 표현된다는 것을 의미합니다.
이 벡터 114개를 물체 데이터베이스에 등록해 두게 됩니다.
128x114 = 14592, 꽤 방대한 수치입니다.
저는 가로축을 X축, 세로축을 Y축, 그리고 좌측 상단을 (0,0)으로 하는
영상좌표계를 기준으로 생각하고 위 표내의 주석을 나타내었습니다.
아직 잘은 모르겠습니다만,
화살표의 크기가 클수록 더 중요한 키포인트로 해석해도 좋을까요?
키포인트를 점으로 표현하기
여기에서는 키포인트를 화살표가 아닌 점으로 표현해 보겠습니다.
특징점을 표현하는 부분인 imagefeatures.c의 595~597행을
아래와 같이 수정해주면 됩니다.
// cvLine( img, start, end, color, 1, 8, 0 ); // cvLine( img, end, h1, color, 1, 8, 0 ); // cvLine( img, end, h2, color, 1, 8, 0 ); cvCircle(img, cvPoint(start_x, start_y), 2, cvScalar(0,255,255,255), -1, 0, 0); |
인화 누님의 사진도 한 번 돌려봅니다.
SIFT란 무엇인지, 그 속을 들여다 봅시다.
위에서 추출된 SIFT의 키포인트는 영상의 특징을 잘 표현하고 있는 것을 알았습니다.
정말 그런가?
그럼, 위의 키포인트라는 녀석들은 어떤 방법으로 선택되어 지는가?
128차원의 벡터는 어떤식으로 구성되어 지는가?
각각의 구성값들은 어떻게 얻어 지는가?
등을 알기 위해서는 위에서도 언급되었듯이 알고리즘에 대한 세부적인 공부가 필요합니다.
SIFT는 상당히 복잡한 연산과정들을 가지고 있고,
가우시안 평활화, Difference of Gaussian(DoG), 영상의 미분, 강도의 기울기 등
영상처리에 관련된 이론들을 모른다면 이해하기가 어려워 보입니다.
저자 또한 어슴푸레 대략적으로 내용을 이해하고 있다고 하네요.
그런 가운데에서 한 가지 착각했던 것은,
SIFT는 색상정보를 사용하지 않는 것일까 였다고 하네요.
실제로도 그레이 스케일 영상으로부터 추출하고 있네요.
아래에 SIFT 관련 참고문헌(일본어, 영어)들을 아래에 정리해 두었습니다.
참고하시면 도움이 되실 듯 합니다.
그리고 이것들을 참고해 그 중 C++의 SIFT프로그램을 만들어 볼 생각이라고 합니다.
* SIFT 관련 참고문헌
SIFT Tutorial (일문) - 후지요시(藤吉)선생님의 SIFT 해설자료, 그림이 많고 이해하기 쉽다.
SIFT 1부터의 작성하는 블로그 (일문)
- 순서에 따라 조금씩 구현하고 있으므로 이해하기 쉽다.
Rob Hess씨의 SIFT 특징 추출 모듈 사용해 보기 (일문)
- Rob Hess씨의 프로그램 실행방법
SIFT++ (영문)
SIFT for MATLAB (영문) - MATLAB을 이용한 SIFT
Scale Invariant Feature Transform (영문) - Wikipedia
Keypoint Detector (영문) - David Lowe선생님의 홈페이지
David G. Lowe, Object Recognition from Local Scale-Invariant Features (PDF), Proc. of IEEE Intl. Conf. on Computer Vision (ICCV), pp. 1150-1157, 1999
David G. Lowe, Distinctive Image Features from Scale-Invariant Keypoints (PDF), Intl. Jour. of Computer Vision (IJCV), 60(2), pp.91-110, 2004
--
다음은 물체인식에 관한 이야기 - (3) SURF 특징추출하기를 공부해 보겠습니다.
--
물체 인식에 관한 이야기 - 목록
물체인식에 관한 이야기 - (1) 시작하기
물체인식에 관한 이야기 - (2) SIFT특징 추출
물체인식에 관한 이야기 - (3) SURF 특징추출하기
물체인식에 관한 이야기 - (4) 특징점의 매칭
물체인식에 관한 이야기 - (5) 물체 모델의 데이터 베이스 작성
물체인식에 관한 이야기 - (6) 선형탐색을 이용한 특정 물체 인식
물체인식에 관한 이야기 - (7) 최근접탐색의 고속화
--
* 본 자료의 내용은 aidiary의 내용을 바탕으로 하고 있습니다.
* 일본어가 가능하신 분은 직접 aistudy 블로그에 엑세스하셔서 보는 것이
저의 허접한 번역과 부족한 코멘트 보다는 훨씬 이해도 쉽고 유익하리라 판단됩니다.
--
20100810