Scale Invariant Feature Transform ,
SIFT nedir?

Ihsan Can Yalabuk
5 min readJan 17, 2021

--

Önceki yazılarımızda Kenar ve Köşe belirleme üzerine olan uygulamalar hakkında konuşmuştuk. Bu yazımızda bir diğer yaklaşım olan Scale Invariant Feature Transform , SIFT kavramını inceleyeceğiz.

Önceki incelediğimiz detectorler dönüşümlerle değişmezler (roation-invariant) , yani görüntü döndürülse de aynı köşeleri bulabiliriz. Ancak ölçeklendirme işi biraz değiştirir. Döndürmede köşeler köşe olarak kalır ancak ölçeklendirmede köşe , köşe olarak kalmayabilir. Örneğin aşağıdaki resimde ölçeği arttırılmış bir görüntünün , orjinalinde sadece bir köşe tespit edilmişken ölçeği arttığında bu köşe sayısı üçe çıkmıştır.

Bu nedenle, 2004 yılında, British Columbia Üniversitesi’nden D. Lowe, yeni bir algoritma olan Scale Invariant Feature Transform (SIFT) makalesinde, anahtar noktaları (Key Points) çıkaran ve tanımlayıcılarını hesaplayan bu kavramı ortaya koydu. Ayrıca bu algoritma patentlidir, bu nedenle bu algoritma OpenCV’deki Özgür Olmayan modülüne dahil edilmiştir.

SIFT oldukça kapsamlı bir algoritmadır. SIFT algoritmasında esas olarak beş adım vardır.

  • Scale-space peak selection: Feature bulmak için olası konum.
  • Keypoint Localization: Feature Key Pointlerini doğru bir şekilde yerleştirmek.
  • Orientation Assignment: Anahtar noktalara oryantasyon atama.
  • Keypoint descriptor: Anahtar noktaları yüksek boyutlu bir vektör olarak tanımlama.
  • Keypoint Matching

Scale-space peak selection

Yukarıdaki görüntüde de görüldüğü gibi farklı ölçeklendirilmiş Key Point noktalarını tespit etmek için aynı kareyi veya pencereyi kullanmayız. Küçük köşeler sorun yaratmaz ancak daha büyük köşeler için daha büyük karelere ihtiyacımız vardır. Bunun içinse scale-space filtering kullanırız. çinde çeşitli sigma değerlerine sahip görüntü için Laplacian of Gaussian bulunur. LoG, sigma’daki değişiklikten dolayı çeşitli boyutlarda blobları algılayan bir blob algılayıcı görevi görür. Kısacası, sigma bir ölçeklendirme parametresi olarak işlev görür. Örneğin, yukarıdaki görüntüde, düşük sigma içeren guassian kernel küçük köşe için yüksek değer verirken, yüksek sigma içeren guassian kernel daha büyük köşe için uygundur. Böylece, ölçek ve uzay boyunca yerel maksimumları bulabiliriz, bu da bize (x, y, sigma) değerlerinin bir listesini verir, bu da sigma ölçeğinde (x, y) ‘de potansiyel bir Key Point olduğu anlamına gelir.

Ancak bu LoG verimli değildir. Bunun nedeni SIFT algoritmasının, LoG’nin bir yaklaşımı olan Difference of Gaussian’ı kullanmasıdır . Difference of Gaussian , iki farklı sigma ile bir görüntünün Gaussian blurring farkı olarak elde edilir, bunlara sigma ve ksigma diyelim. Bu işlem, Gaussian Piramidi’ndeki görüntünün farklı oktavları için yapılır. Aşağıdaki resimde gösterilmektedir:

Keypoint Localization

Potansiyel Key Point konumları bulunduktan sonra, daha doğru sonuçlar elde etmek için düzenlenmeleri gerekir . Ekstremanın daha doğru konumunu elde etmek içinTaylor series expansion of scale space kullanılır ve bu ekstremadaki yoğunluk bir eşik değerinden düşükse reddedilir. Bu eşik, OpenCV’de contrastThreshold (kontrast eşiği) olarak adlandırılır.

DoG kenarlar için daha hassastır, bu nedenle kenarların da kaldırılması gerekir. Bunun için Harris köşe dedektörüne benzer bir konsept kullanılmaktadır. Pricipal curvature hesaplamak için 2x2 Hessen matrisi (H) kullanılır. Harris köşe dedektöründen, kenarlar için bir öz değerin diğerinden daha büyük olduğunu biliyoruz. Burada basit bir fonksiyon kullanılır.

Eğer bu oran OpenCV’de edgeThreshold adındaki eşikten büyükse, bu anahtar nokta atılır. Böylece, herhangi bir düşük kontrastlı key point ve edge keypoints noktaları ortadan kaldırır ve geriye kalan güçlü interest point noktalarıdır.

Orientation Assignment

Artık Key Pointlerimizi biliyoruz. Aynı zamanda hangi key pointin hangi ölçekte belirlendiğini de biliyoruz. Bu nedenle artık scale-invariance key pointlerimiz var. Şimdiyse rotation invariance sağlamak için , her key point için bir oryantasyon atayacağız.

Ölçeğe bağlı olarak Key Point konumu etrafında bir alan alınır ve o bölgede gradyan büyüklüğü ve yönü hesaplanır. 360 dereceyi kapsayan 36 bölmeli bir oryantasyon histogramı oluşturulur. Gradyan büyüklüğü ve gaussian ağırlıklı dairesel pencere ile ağırlıklandırılır ve sigma anahtar nokta ölçeğinin 1,5 katına eşittir. Histogramdaki en yüksek tepe alınır ve % 80'in üzerindeki herhangi bir tepe de oryantasyonu hesaplamak için kabul edilir. Aynı konum ve ölçekte, ancak farklı yönlere sahip key pointler oluşturur. Bu da eşleşmenin kararlılığına katkıda bulunur.

Özetle bir oryantasyon atamak için bir histogram ve etrafında küçük bir bölge kullanılır. Histogram kullanılarak, en göze çarpan gradyan oryantasyonları tanımlanır. Yalnızca bir tepe varsa, Key Point atanır. % 80 işaretinin üzerinde birden fazla zirve varsa, bunların tümü yeni bir Key Point olarak dönüştürülür (ilgili oryantasyonlarıyla).

Keypoint Descriptor

Burada keypoint descriptor oluşturulur. keypoint etrafında 16x16 bir alan alınır. 4x4 boyutunda 16 alt bloğa bölünmüştür. Her alt blok için 8 bölmeli oryantasyon histogramı oluşturulur. Yani toplam 128 parça değer mevcuttur. Keypoint descriptor oluşturmak için bir vektör olarak temsil edilir. Buna ek olarak, aydınlatma değişikliklerine, rotasyona vb. Karşı sağlamlık sağlamak için çeşitli önlemler alınır.

Keypoint Matching

İki görüntü arasındaki keypointler, en yakın komşuları(nearest neighbors) belirlenerek eşleştirilir. Ancak bazı durumlarda, ikinci en yakın eşleşme birinciye çok yakın olabilir. Bozukluk veya başka nedenlerden dolayı olabilir. Bu durumda en yakın mesafenin ikinci en yakın mesafeye oranı alınır. 0,8'den büyükse reddedilirler. Yanlış eşleşmelerin yaklaşık% 90'ını ortadan kaldırırken, yalnızca % 5 doğru eşleşmeyi atar.

Burada SIFT Algoritmasının bir özetini gördük. Daha fazla detay için OpenCV dökümanlarını incelemeniz önerilir.

OpenCV üzerinde SIFT

Şimdi OpenCV’de bulunan SIFT fonksiyonlarını görelim. Keypoint tespiti ile başlayalım ve bunları çizelim. İlk önce bir SIFT nesnesi oluşturmalıyız. Buna isteğe bağlı ve belgelerde iyi açıklanan farklı parametreler iletebiliriz.

import cv2
import numpy as np

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp)

cv2.imwrite('sift_keypoints.jpg',img)

sift.detect() fonksiyonu, görüntülerde keypoint bulur. Görüntünün yalnızca bir bölümünü aramak istiyorsanız, bir maske girebilirsiniz.

OpenCV cv2.drawKeyPoints(), adında bir fonksiyon sağlar ve bu , keypoint noktalarında küçük daireler çizer. Eğer flag girmek isterseniz cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS kullanarak keypointler boyutunda daireleri ve oryantasyonlarını görebilirsiniz.

img=cv2.drawKeypoints(gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('sift_keypoints.jpg',img)

Çıktısı ise şu şekilde olacaktır :

Descriptor hesaplamak için OpenCV iki yöntem sağlar.

  • 1- Keypointleri zaten bulduğumuz için sift.compute() kullanbılabilir.
  • 2- Keypointler bulunmadıysa sift.detectAndCompute() fonksiyonu tek bir adımda direk olarak keypointleri ve descriptorleri bulur.
sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray,None)

Bu yazımızda Scale Invariant Feature Transform , SIFT algoritması üzerine konuştuk. Sıradaki yazımızda BRIEF ve ORB konseptleri üzerine konuşacağız.

Referanslar

--

--

Ihsan Can Yalabuk
Ihsan Can Yalabuk

Written by Ihsan Can Yalabuk

Computer Engineering student based on Turkey , works for a better future.

No responses yet