SURF - Speeded-up Robust Features

Kategori: Computer Vision , 21 Şubat 2020 , JanFranco


Feature extraction algoritmaları ile devam ediyoruz. SIFT algoritmasını görmüştük. Bu yazımızda SURF algoritmasını inceleyeceğiz. SURF algoritması SIFT algoritmasından 2 sene sonra yani 2006 yılında çıkmıştır ve daha hızlı çalışmaktadır.

Ana problemlerden biri olan scaling için SIFT algoritmsaında, Image Pyramid tekniği ile resmin farklı boyutlarını ele alıyor, yeni boyutlu resimleri Gaussian Blurring ile blurluyorduk. Blurlanan yeni boyutlu resimlerin Laplace'ları (ikinci dereceden türevleri) alınıyordu. David Lowe bu yavaş işlemi hızlandırmak için Laplace'ları direk almak yerine blurlanmış resimleri birbirinden çıkarmıştı. SURF algoritmasında ise resimleri birbirinden çıkarmak yerine, Convolution tekniği ile resimler üzerinde kernel dolaştırıyoruz. Burada işlemi hızlandıran büyük etmenlerden birisi Integral Image tekniğidir. Integral Image tekniğini anlatmıştım fakat hızlıca tekrar anlatayım. Resmin sol üst köşesinden başlanarak, pikselleri toplayarak sağ alt köşeye iniyoruz. Bir örnek:

15 12

23 5

Bu 2x2'lik resmi integral image ile şu şekilde ifade edebiliriz:

15 (15 + 12)

(15 + 23) (15 + 12 + 15 + 23 - 15)

İşlemler sonucunda:

15 27

38 50

Bu teknik sayesinde işlem yükü yüksek oranda düşüyor. Convolution işlemi için bir görsel bırakayım ve SURF algoritmasının başka bir farkına geçeyim:

SURF in OpenCV

SIFT algoritmasında Orientation Assignment adımında tek tek gradyan hesabı yapılıyordu. 360 dereceyi / 10 dereceye bölerek 16 parçalık bir histogram elde ediyorduk. SURF algoritmasında ise bu adımda Wavelet tekniği kullanılıyor. Aşağıdaki resimde görselleştirilmiş hali mevcut:

SURF in OpenCV

Orientation hesabı 60 derecelik bir pencerenin slide edilmesi ile yapılıyor. Her bir iterationda toplam değişim bulunuyor. Integral Image tekniği burada oldukça hızlı sonuç veriyor. Bir çok Computer Vision algoritmasında rotational invariance özelliğine yani döndürülmeden bağımsızlığa gerek yoktur. Bu nedenle OpenCV implementasyonunda orientation ayarını açıp kapayabiliriz. Son olarak feature description adımında, 16x16 boyutlu pencereleri kullanmak yerine (SIFT algoritmasında böyleydi) 20x20 boyutlu pencereler 4x4 boyutlu alt pencerelere bölünüyor.

SURF algoritması sonuçlara göre SIFT algoritmasından 3 kat daha hızlı çalışıyor. Fakat aydınlanma ve bakış açısının değişmesi gibi problemlerde kötü sonuç veriyor. SIFT gibi SURF de patentli bir algoritmadır. OpenCV ile Python üzerinde örnek yapacağız fakat kurumsal projelerde vs. kullanmak için para ödemelisiniz. Resmi ve kütüphaneyi alalım:


import cv2

img = cv2.imread('../data/pisa.jpg')
copyImg = img.copy()
richImg = img.copy()
cv2.imshow('IMG', img)
cv2.waitKey(0)
>>

SURF in OpenCV

Aynı adımları yapıyoruz yine resmin iki kopyasını aldık. Resmi grayscale hale çevirelim:


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Yine SURF_create sınıfından bir obje üretelim. SIFT kullanırken threshold değer vermemiştik ancak SURF algoritması çok sayıda keypoint belirliyor. Bir threshold değeri vererek görselleri daha anlamlı hale getirebiliriz:


surf = cv2.xfeatures2d.SURF_create(2000)
kp = surf.detect(gray, None)
Keypointleri görelim:


cv2.drawKeypoints(gray, kp, outImage=copyImg)
cv2.imshow('SURF Keypoints', copyImg)
cv2.waitKey(0)

cv2.drawKeypoints(gray, kp, outImage=richImg, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SURF Keypoints with Orientation', richImg)
cv2.waitKey(0)
>>

SURF in OpenCV

SURF in OpenCV

Orientation kullanılmamasını sağlayan bir ayar olduğundan bahsetmiştik. Görelim:


richImg = img.copy()
surf.setUpright(True)
kp = surf.detect(gray, None)

cv2.drawKeypoints(gray, kp, outImage=richImg, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SURF Keypoints without Orientation', richImg)
cv2.waitKey(0)
>>

SURF in OpenCV


Sonraki Yazı: Binary Robust Independent Elementary Featutures
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın