ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BRIEF (Binary Robust Independent Elementary Features)
    Robotics/Open CV python 2019. 7. 24. 13:49

    BRIEF (Binary Robust Independent Elementary Features)

    Goal

    • BRIEF algorithm 의 기초에 대해서 알아볼 것이다.

    Theory

    우리는 SIFT가 descriptors에 128-dim vector를 사용한다는 것을 배웠다. 부동 소수점 숫자를 사용하기 때문에 기본적으로 512 바이트를 사용합니다. 유사하게 SURF는 최소 256 바이트 (64-dim)를 취합니다. 수천 개의 피쳐를위한 그러한 벡터를 생성하는 것은 많은 메모리를 필요로하는데, 이는 특히 임베디드 시스템을위한 resouce - 제약 애플리케이션에 적합하지 않습니다. 메모리가 클수록 matching하는 데 걸리는 시간이 길어집니다.

    그러나 이러한 모든 dimensions은 실제 matching에 필요하지 않을 수 있습니다. PCA, LDA 등과 같은 여러 가지 방법을 사용하여 압축 할 수 있습니다. LSH (Locality Sensitive Hashing)를 사용하는 해싱과 같은 다른 방법도 부동 소수점 숫자의 SIFT descriptors를 이진 문자열로 변환하는 데 사용됩니다. 이진 문자열은 Hamming distance를 사용하여 지형지 물을 match시키는 데 사용됩니다. hamming distance를 찾는 것은 XOR과 비트 수를 적용하는 것 뿐이므로 SSE instructions을 사용하는 최신 CPU에서는 더 빠른 속도 향상을 할 수 있습니다. 그러나 여기서 우리는 메모리 상에있는 초기 문제를 해결하지 못하기 때문에 descriptors를 먼저 찾아야, hashing을 적용 할 수 있습니다.

    반면, BRIEF은 현재 이 순간에 그림이 됩니다. descriptors 를 먼저 찾지 않고 바로 이진 문자열을 찾을 수있는 shortcut를 제공합니다. 그것은 smoothened image patch를 취하여 일련의 $n_d(x,y)$위치 쌍을 고유 한 방식으로 사용합니다 (종이에서 설명 함). 그런 다음 일부 픽셀 강도 비교가 이러한 위치 쌍에서 수행됩니다. 예를 들어, 첫 번째 위치 쌍을 $p$ 와 $q$ 라고 할때, $I(p) < I(q)$ 라면 이는 결과가 1 이고, 아니면 0 입니다. 모든 $n_d$-차원 비트 스트링을 얻기 위해서 이과정이 $n_d$ 위치쌍에 적용됩니다. 이 $n_d$ 는 128, 256 또는 512 일 수 있습니다. OpenCV는이 모든 것을 지원하지만 기본적으로 256입니다 (OpenCV는 바이트 단위로 표시하므로 값은 16, 32 및 64가됩니다). 그래서 일단 이것을 얻으면 Hamming Distance를 사용하여 이 디스크립터와 일치시킬 수 있습니다.

    한 가지 중요한 점은 feature descriptor인 BRIEF가 features을 찾을 수있는 방법을 제공하지 않는다는 점입니다. 따라서 SIFT, SURF 등과 같은 다른 feature detectors를 사용해야합니다. 빠른 감지기 인 CenSurE를 사용하는 것이 좋습니다. Brief는 SURF 포인트보다 CenSurE 포인트가 약간 더 좋게 작동합니다.

    간단히 말해서, BRIEF는 더 빠른 방법 feature descriptor 계산 및 매칭입니다. 또한 평면 회전이 큰 경우가 아니면 높은 인식률을 제공합니다.

    BRIEF in OpenCV

    아래 코드는 CenSurE detector를 사용하여 BRIEF descriptors를 계산하는 방법을 보여줍니다. (CenSurE 검출기는 OpenCV에서 STAR 검출기라고 부름)

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    img = cv2.imread('simple.jpg',0)
    
    # Initiate STAR detector
    star = cv2.FeatureDetector_create("STAR")
    
    # Initiate BRIEF extractor
    brief = cv2.DescriptorExtractor_create("BRIEF")
    
    # find the keypoints with STAR
    kp = star.detect(img,None)
    
    # compute the descriptors with BRIEF
    kp, des = brief.compute(img, kp)
    
    print brief.getInt('bytes')
    print des.shape

    함수brief.getInt('bytes') 는 $n_d$ 바이트로 된 사이즈 를 줍니다.
    기본적으로 32입니다. 다른장에서는 matching에 대해서 알아봅니다.

    Additional Resources

    1. Michael Calonder, Vincent Lepetit, Christoph Strecha, and Pascal Fua, “BRIEF: Binary Robust Independent Elementary Features”, 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.
    2. LSH (Locality Sensitive Hasing) at wikipedia.

    https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_brief/py_brief.html

    'Robotics > Open CV python' 카테고리의 다른 글

    Feature Matching  (0) 2019.07.24
    ORB (Oriented FAST and Rotated BRIEF)  (0) 2019.07.24
    FAST Algorithm for Corner Detection  (0) 2019.07.23
    SURF  (0) 2019.07.22
    SIFT  (0) 2019.07.19

    댓글

Designed by Tistory.