'sift'에 해당되는 글 1건

  1. 2010.12.08 Rob Hess의 SIFT Open Source 오류 (절대값) 2
Rob Hess의 SIFT open source를 보다가..

kdtree.c 에

함수 static struct kd_node* explore_to_leaf( struct kd_node* kd_node, struct feature* feat,
struct min_pq* min_pq )

에서 오류를 발견하였다.

이 함수에 아래와 같은 라인이 있는데..
if( minpq_insert( min_pq, unexpl, ABS( kv - feat->descr[ki] ) ) ) 

여기서 Rob Hess가 사용하고 있는 utils.h에서 ABS의 정의는 

#ifndef ABS
#define ABS(x) ( ( x < 0 )? -x : x )
#endif

사실 올바른 정의는 

#ifndef ABS
#define ABS(x) ( ( x < 0 )? -1*(x) : x )
#endif

이다.


이런식으로 정의를 안했기에..

ABS( kv - feat->descr[ki]) 에서 
kv - feat->descr[ki] 가 음수일경우

-kv + feat->descr[ki] 로 양수값으로 key가 들어가지 않고

-kv - feat->descr[ki] 로 음수의 key값이 들어간다. 

ABS의 정의를 고치던..


ABS( kv - feat->descr[ki] )를  ABS( (kv - feat->descr[ki]) )

로 고쳐야한다..

사실 BBF의 NN 탐색회수가 KDTREE_BBF_MAX_NN_CHKS = 200 으로 default 값으로 
define 되어있어서 영상에 feature points가 많지 않다면 성능에 크게 지장은 없다.

하지만 minimizing priority queue에서 key (항상 양수) 값을 기준으로 정렬하는데,

여기 음수인 key값이 들어간다면 BBF를 이용한 matching 과정에서 

실제로 가깝지 않은 node들이 가깝다고 판단되어 탐색하게 되는 비효율성이 발생하게 된다.

이 경우, KDTREE_BBF_MAX_NN_CHKS  를 낮게 설정하였거나

영상의 전체 feature points 갯수가 충분히 많다면 성능에 큰 영향을 끼칠 수도 있다.


- Rob Hess의 답장



- Update된 SIFT


- Change log
12/7일 ABS() bug 고쳤다고..


Posted by 우주여행가
,