차근차근/OpenCV

3 일에 만드는 고속 특정 물체 인식 시스템 (2) SIFT 특징 량 추출

예쁜꽃이피었으면 2014. 7. 30. 10:16

http://aidiary.hatenablog.com/entry/20091024/1256384360

3 일에 만드는 고속 특정 물체 인식 시스템 (1) 물체 인식이란 (2009-10-18)의 연속이다.

이번에는 이미지에서 SIFT (Scale-Invariant Feature Transform)이라는 국소 특징 량을 추출하는 곳을 만들어 보려고합니다.

SIFT 특징 량 추출

우선 국소 특징 량의 대표라고도 할 수 SIFT를 시도합니다. OpenCV에는 SIFT를 추출하는 함수가 없었기 때문에 Rob Hess 씨가 C 언어로 구현 한 라이브러리를 시도합니다. 내부에서 OpenCV를 사용하고 있으므로 사전에 OpenCV의 설치가 필요합니다. 구현은 OpenCV 1.1에서되는 것 같습니다만, 2.0에서도 조금 재 작업과 움직였습니다. Rob Hess 씨의 홈페이지 에서 SIFT Feature Detector의 zip 버전을 떨어 뜨립니다.

(주) Hess 씨의 사이트가 업데이트 된 것을 현재는 GitHub에 OpenSIFT 라는 프로젝트로 출판하고 있습니다.

압축을 풀면 여러 파일이 있지만 SIFT를 추출하는 데 필요한 최소는

  siftfeat.c - 메인 함수
  sift.c sift.h - SIFT 추출 용 함수
  imgfeatures.c imgfeatures.h - SIFT 특징 량을 그리기 저장하는 함수
  utils.c utils.h - 유틸리티 함수
  beaver.png - 테스트 이미지

입니다. 이것들을 자신의 프로젝트에 추가합니다. OpenCV2.0에서 컴파일하면 몇 가지 오류가 나온 * 1 때문에 치유합니다. imgfeatures.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 );

수정합니다. 아직 여러 가지 경고는 나오지만 일단 컴파일 할 수 있습니다. beaver.png라는 이미지에서 실행하면 아래와 같은 이미지가 표시됩니다.

f : id : aidiary : 20091024173330p : plain

화살표의 시작점은 키포인트의 위치, 화살표의 길이는 스케일, 화살표의 방향은 경사 강도가 가장 강한 방향을 나타내고있는 것입니다. SIFT의 표시 방법은 키포인트의 점만 표시 화살표로 표시, 원으로 표시 등 여러 가지 같네요. 스케일이나 경사 강도가 무엇을 의미하는지는 좀 더 조사가 필요합니다. 당면은 SIFT의 키포인트의 위치와 각각의 점이 128 차원의 특징 벡터로 나타낼 수 만 억제두면 좋을까?

각각의 키 포인트 128 차원 벡터, beaver.sift라는 파일에 저장되어 있습니다. 화살표 1 개에 대해 128 개의 숫자 (128 차원 벡터)입니다. 아래와 같은 파일입니다.

114 128 <--- 키포인트의 수와 특징 벡터의 차원 수
101.350182 136.130755 40.169879 0.771085 <--- 첫 번째 키포인트의 X 좌표, Y 좌표, 스케일, 방향
 0 0 0 0 3 1 0 0 2 23 46 15 18 3 0 0 6 20 13 1 <--- 들여 쓰기 된 숫자가 128 차원 벡터 (20 개에서 줄을 서기)
 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 1​​9 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
127.871536 71.100579 15.768590 -2.024589 <--- 두 번째 키 포인트
 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 0 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

위 이미지의 경우 128 차원 벡터 114 개에 의해 표현 될거야. 이 128 차원 벡터 114 개를 물체 모델 데이터베이스에 등록 할 수 있습니다. 꽤 엄청난 수치입니다. 이 파일을 잘 관찰하면 아무래도 키 포인트는 스케일이 큰 순서 (화살표가 긴 순서)에 줄 지어있는 것을 알 수 있습니다. 이것은 또한 아직 잘 알지 않습니다 만, 규모가 큰 키 포인트 가량 중요한 것으로 해석 할 수있다 있을까요? 만약 전체 분이 있으면 조언하십시오.

키포인트를 점으로 그리기

여기서 조금 개조 해보십시오. 키포인트를 화살표가 아닌 점 표시하고 SIFT 파일이 한 줄에 하나의 키 포인트 정보 를 나타내도록합니다. imgfeature.c의 595 번째 줄을

/ / 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 );

로 동일한 파일의 523 번째 줄 (숫자 20 개마다 줄 바꿈을 넣는 부분)을 주석 처리합니다.

/ / if (j % 20 == 0) 
/ / fprintf (file, "\ n");

이렇게하면 아래와 같이 키 포인트가 점입니다. beaver.sift 하나의 키 포인트 정보가 한 줄로 정리합니다. 스크립트에서 처리 할 때 여기가 편하다고 생각합니다.

f : id : aidiary : 20091024181347p : plain

일부 이미지에서 SIFT 키포인트를 그려 봅니다. SIFT가 이미지의 어떤 곳을 키포인트하고 있을까 대략 상상 대해서는군요. 음양 마크처럼별로 모양이없는 이미지가 키포인트가 적게되기 십상 것 같습니다.

f : id : aidiary : 20091024205610p : plain
f : id : aidiary : 20091024210340p : plain
f : id : aidiary : 20091024210316p : plain
f : id : aidiary : 20091024210309p : plain
f : id : aidiary : 20091024210303p : plain
f : id : aidiary : 20091024211037p : plain 

SIFT에 대한 자세한

SIFT의 키포인트는 이미지의 특징을 잘 나타내고있는 위치 는 것은 알았습니다. 그럼, 어떤 근거에 따라 그 점이 선정되었는지? 128 차원 벡터가 어떤 식으로 요구 했는가? 알고리즘의 세부 사항을 자세하게 조사 할 필요가 있습니다. SIFT는 상당히 복잡한 일을하고 있고, 가우스 스무딩 필터, Difference of Gaussian (DoG), 국 값 감지, 이미지 미분 강도 기울기 등 영상 처리 이론을 알고 있지 않으면 이해가 어렵다 · · · 나는 아직 어렴풋이 이론이 밝혀졌다 정도입니다.

하나 착각하고 있었던 것은, SIFT는 색상 정보를 사용하지 않기 이라는 것일까. 실제로 그레이 스케일 이미지에서 추출하고 있습니다. 일부 참고 한 자료들이다. 이들을 추천 그중 C + + 버전의 SIFT를 만들어 보려고합니다.

3 일에 만드는 고속 특정 물체 인식 시스템 (3) SURF 추출 (2009-10-30)에 계속됩니다.

 

 

반응형