[OpenCV] 05-7. BRIEF (Binary Robust Independent Elementary Features)
🐍Python/OpenCV

[OpenCV] 05-7. BRIEF (Binary Robust Independent Elementary Features)

728x90
반응형

< BRIEF (Binary Robust Independent Elementary Features) >

이번 장에서는

  • BRIEF 알고리즘의 기초

에 대해 알아볼 것이다.

Theory

SIFT가 discriptor에 128차원 벡터를 사용한다는 것을 알고 있다. 이것이 부동소수점 숫자를 사용하기에, 512바이트가 소모된다. 비슷하게 SURF는 최소 256바이트(64차원에 대해)를 소모한다. 수 천개의 특징 벡터들을 생성하는 것은 매우 만흥ㄴ 메모리를 소모하기에 자원 한정적인 경우에 특히, 임베디드 시스템의 경우에 실현가능하지 않다. 메모리가 커질수록, 매칭을 위한 시간이 더 오래 걸리기 때문이다.

하지만 이 모든 차원들은 실제 매칭에서 모두 필요로 하지 않는다. 우리는 PCA,LDA와 같은 여러 방법으로 압축시킬 수 있다. LSH(Locally Sensitive Hashing)를 이용한 hashing은 부동 소수점 숫자의 SIFT discriptor를 이진 문자열로 변환시켜준다. 이 이진 문자열은 Hamming distance를 이용해서 특성을 매치하는데 사용된다. Hamming distance를 이용하는 것은 그저 XOR, 비트연산을 적용하는 것이기에 속도를 증가시킬 수 있다. 하지만 여기서, descriptor를 먼저 찾아야하고, 그리고 그 다음에 hashing을 적용할 수 있는데, 이는 메모리에 관한 초기 문제를 해결해주지 못한다.

그래서 BRIEF가 이 상황에 등장하게 된다. 이는 descriptor를 찾지 않고서도 이진 문자열을 직접 찾는 지름길같은 방법을 제공한다. 이는 매끄러운(smoothened) 이미지 패치를 사용하고 고유한 방식으로 nd(x,y) 위치 쌍 세트를 선택한다. 그러면 어느정도의 픽셀 강도 비교가 위치 쌍 내에서 이루어진다. 예를 들어서, 첫 번째 위치 쌍이 p q라고 하자. 만약에 I(p)<I(q)라면, 결과는 1일 것이고, 반대의 경우 0일 것이다. 이 과정은 모든 nd 위치 쌍에 대해 적용되어서 nd-차원의 bitstring(0과1로 이루어진 이진 값의 문자열)을 얻는다.

nd는 128, 256 또는 512가 될 수 있다. OpenCV는 이 모든 것을 지원하지만, 디폴트값은 256이다.(OpenCV는 바이트로 나타내기에 16,32,64의 값이 된다.) 이것을 얻으면, Hamming distance를 사용하여 이 descriptors와 매칭할 수 있다.

한 가지 중요한 점은 BRIEF는 특성 descriptor이지만 특성을 찾는 방법을 제공하지는 않는다. 따라서 SIFT,SURF와 같은 다른 특성 탐지법을 사용해야 한다. 그리고 논문에서는 고속 검출기인 CenSurE을 사용할 것을 권장하는데, 이는 BRIEF가 SURF 포인트보다 CenSurE 포인트에 더 효과적이기 때문이다.

요약하자면, BRIEF는 특징 descriptor 계산과 매칭에 더
빠른 방법이다. 또한 큰 평면 회전이 없는 한 높은 인식률을 제공한다.

BRIEF in OpenCV

아래의 코드는 CenSurE 탐지기 사용을 곁들인 BRIEF description 연산을 보여준다. (CenSurE 탐지기는 OpenCV에서 STAR 탐지기라고 불린다.)

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./images/irene.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = None

# STAR 탐지기 먼저 개시
star = cv2.xfeatures2d.StarDetector_create()

# BRIEF 추출기 개시
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()

# STAR로 키포인트를 검출하고 BRIEF로 디스크립터 계산
kp1 = star.detect(img,None)
kp2,des = brief.compute(img,kp1)

img2 = cv2.drawKeypoints(img,kp1,img2,(255,0,0))

cv2.imshow('Result',img2)
cv2.waitKey()
cv2.destroyAllWindows()
  1. STAR 객체를 이용해 키포인트를 찾고
  2. 키포인트들을 이용해서 BRIEF로 디스크립터를 계산한 것이다.

아래 사진은 코드의 결과이다.


728x90
반응형