ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SURF
    Robotics/Open CV python 2019. 7. 22. 18:21

    Introduction to SURF (Speeded-Up Robust Features)

    Goal

    • 이 단원에서는 SURF 의 기초에 대해서 알아볼 것이다.
    • OpenCV 에서 SURF 의 기능 들에 대해서 살펴 볼 것이다.

    Theory

    마지막 장에서는 키 포인트 탐지 및 설명을 위해 SIFT를 보았습니다. 그러나 SIFT 가 상대적으로 느린 편이어서, 사람들은 더 빠른 버전이 필요했습니다. 2006 년 Bay, H., Tuytelaars, T. 및 Van Gool, L의 세 사람이 SURF라는 새로운 알고리즘을 도입 한 또 다른 논문 "SURF : Speeded Up Robust Features"를 발표했습니다. 이름에서 알 수 있듯이, 그것은 SIFT의 빠른 버전입니다.

    SIFT에서 Lowe는 scale-space를 찾기 위해 Difference of Gaussian 으로 Laplacian of Gaussian을 근사화했습니다. SURF는 조금 더 나아가 박스 필터로 LoG를 근사합니다. 아래 이미지는 그러한 근사값의 데모를 보여줍니다. 이 근사법의 한 가지 큰 장점은 적분 이미지를 사용하여 상자 필터를 사용한 컨볼 루션을 쉽게 계산할 수 있다는 것입니다. 그리고 그것은 다른 scale에 대해 병렬로 수행 될 수 있습니다. 또한 SURF는 scale 과 위치 모두에 대해 Hessian matrix의 행렬의 determinant 에 의존 합니다.

    방향 할당의 경우, SURF는 크기가 6 인 인접영역에 대해 수평 및 수직 방향으로 웨이블릿 응답을 사용합니다. 적절한 guassian weights도 적용됩니다. 그러면 아래 그림과 같이 공간에 그려집니다. 지배적 인 방향은 sliding orientation window 각도 60 도 내의 모든 응답의 합을 계산하여 추정됩니다. 흥미로운 것은 웨이블릿 응답은 어떤 스케일에서도 매우 쉽게 적분 영상을 사용하여 찾을 수 있다는 것입니다. 많은 응용 프로그램에서 회전 불변 값이 필요하지 않으므로 이 방향을 찾을 필요가 없어 프로세스가 빨라집니다. SURF는 Upright-SURF 또는 U-SURF와 같은 기능을 제공합니다. 그것은 속도를 개선하고 최대

    까지 허용 가능합니다. OpenCV는 플래그에 따라 두 가지를 모두 지원합니다. 값이 0이면 방향이 계산됩니다. 1 인 경우 방향이 계산되지 않고 더 빠릅니다.

    feature description을 위해 SURF는 수평 및 수직 방향으로 Wavelet 응답을 사용합니다 (다시 말하면, integral images를 사용하면 더 쉽게 작업 할 수 있습니다). 20sX20s 크기의 이웃은 s가 크기 인 키포인트를 중심으로 촬영됩니다. 그것은 4x4 소구역으로 나뉩니다. 각 하위 영역에 대해 수평 및 수직 웨이브 렛 응답이 취해지고 벡터가 아래와 같이 형성된다.

    이 벡터로 표현 될 때 총 64 차원의 SURF feature descriptor를 제공합니다. 차원을 낮추고, 계산 속도와 matching 속도는 높아지지만 feature의 차별성을 향상시킵니다.

    더 많은 특징을 위해 SURF feature descriptor는 확장 된 128 dimension 버전을 가집니다.

    $d_x$ , $|d_x|$ 각각의 의 합이 아래 두 범위에 대해서 따로계산되어 집니다다.

    . 비슷하게 $d_x$ , $|d_x|$ 두개의 합에 대해서 $d_x$ 의 부호에 따라서 나뉘어 지게 된다.

    이로써 피처의 수가 두 배가되었습니다. 그것은 많은 계산 복잡성을 추가하지 않습니다. OpenCV는 각각 64-dim과 128-dimm에 대해 0과 1로 확장 된 플래그 값을 설정하여 둘 다 지원합니다 (기본값은 128-dim입니다)

    또 다른 중요한 개선점은 관심 영역에 sign of Laplacian (trace of Hessian Matrix) 을 사용하는 것입니다. 탐지 중에 이미 계산되므로 계산 비용이 들지 않습니다. The sign of the Laplacian은 어두운 배경의 밝은 얼룩을 반대의 상황과 구별합니다. 매칭 단계에서, 우리는 같은 유형의 contrast (아래 그림 참조) 가있는 경우에만 피쳐를 비교합니다. 이 최소한의 정보만으로도 the descriptor 의 성능을 저하시키지 않고도 더 빨리 일치시킬 수 있습니다.

    즉, SURF는 모든 단계에서 속도를 향상시키는 많은 features을 추가합니다. 분석 결과 SIFT보다 3 배 빠르지 만 성능은 SIFT와 비슷합니다. SURF는 blurring 및 회전으로 이미지를 처리 할 때 좋지만 뷰 포인트 변경 및 조명 변경을 처리하지는 않습니다.

    SURF in OpenCV

    OpenCV는 SIFT와 마찬가지로 SURF 기능을 제공합니다. 64 / 128-dim descriptors, Upright / Normal SURF 등의 선택적 조건을 사용하여 SURF 객체를 시작합니다. 모든 세부 사항은 docs에서 자세히 설명합니다. SIFT에서했던 것처럼, 우리는 키포인트와 descriptors를 찾기 위해 SURF.detect (), SURF.compute () 등을 사용할 수 있습니다.

    먼저 SURF keypoints와 descriptors를 찾고 그려 보는 방법에 대한 간단한 데모를 볼 것입니다. 모든 예제는 SIFT와 동일하므로 파이썬 터미널에 표시됩니다.

    >>> img = cv2.imread('fly.png',0)
    
    # Create SURF object. You can specify params here or later.
    # Here I set Hessian Threshold to 400
    >>> surf = cv2.SURF(400)
    
    # Find keypoints and descriptors directly
    >>> kp, des = surf.detectAndCompute(img,None)
    
    >>> len(kp)
     699

    1199 키포인트가 너무 많아서 그림에 표시 할 수 없습니다. 그것을 이미지 위에 그리기 위해 50으로 줄입니다. matching하는 동안 우리는 모든 features을 필요로하지만 지금은 필요하지 않습니다. 그래서 우리는 Hessian Threshold 값을 증가시킵니다.

    # Check present Hessian threshold
    >>> print surf.hessianThreshold
    400.0
    
    # We set it to some 50000. Remember, it is just for representing in picture.
    # In actual cases, it is better to have a value 300-500
    >>> surf.hessianThreshold = 50000
    
    # Again compute keypoints and check its number.
    >>> kp, des = surf.detectAndCompute(img,None)
    
    >>> print len(kp)
    47

    50 이하로 설정하였습니다. 이미지 위에 그려 보겠습니다.

    >>> img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
    
    >>> plt.imshow(img2),plt.show()

    아래 결과를 참조하십시오. SURF가 얼룩 검출기와 더 흡사하다는 것을 알 수 있습니다. 그것은 나비의 날개에 흰 얼룩을 감지합니다. 다른 이미지로 테스트 할 수 있습니다.

    이제 U-SURF를 적용할 것인데 이는 방향을 찾지 못합니다.

    # Check upright flag, if it False, set it to True
    >>> print surf.upright
    False
    
    >>> surf.upright = True
    
    # Recompute the feature points and draw it
    >>> kp = surf.detect(img,None)
    >>> img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
    
    >>> plt.imshow(img2),plt.show()

    아래 결과를보십시오. 모든 방향은 같은 방향으로 표시됩니다. 그것은 이전보다 더 빠릅니다. 방향이 문제가되지 않는 경우 (예 : 파노라마 스티칭 panorama stitching) 등의 작업을 수행하는 경우이 방법이 더 좋습니다.

    마지막으로 우리는 descriptor 크기를 확인하고 그것이 단지 64- dim인 경우 128로 변경한다.

    # Find size of descriptor
    >>> print surf.descriptorSize()
    64
    
    # That means flag, "extended" is False.
    >>> surf.extended
     False
    
    # So we make it to True to get 128-dim descriptors.
    >>> surf.extended = True
    >>> kp, des = surf.detectAndCompute(img,None)
    >>> print surf.descriptorSize()
    128
    >>> print des.shape
    (47, 128)

    다른 장에서 남은 부분은 matching입니다.

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

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

    BRIEF (Binary Robust Independent Elementary Features)  (0) 2019.07.24
    FAST Algorithm for Corner Detection  (0) 2019.07.23
    SIFT  (0) 2019.07.19
    Shi-Tomasi Corner Detector & Good Features to Track  (0) 2019.07.19
    Harris Corner Detection  (0) 2019.07.19

    댓글

Designed by Tistory.