Binary Robust Independent Elementary Featutures

Kategori: Computer Vision , 22 Şubat 2020 , JanFranco


SIFT algoritmasında feature descriptorlar için 128 boyutlu bir vektör kullanıyorduk. SURF algoritması da 64 boyutlu vektör kullanıyordu. Bu vektörlerin boyutları 512 byte ve 256 byte. Düşük görünebilir fakat genellikle bir resim için binlerce vektör oluşmakta. Bu da yüksek bir hesaplama maliyetidir ve ayrıca düşük kaynaklı sistemler için oldukça büyük bir yer kaybıdır. BRIEF algoritması bu problemlerin önüne farklı yöntemler ile geçebilmiştir. Bu yazımızda bu yöntemleri inceleyeceğiz.

BRIEF algoritması hesapladığı feature descriptorları floating point olarak saklamak yerine bir binary stringe dönüştürmekte. Bu dönüşüm sayesinde yerden tasarruf edebiliyoruz.



Feature matchingde de Hamming distance kullanılıyor. Bu da gayet hızlı bir yol olduğundan işlem yükünden de biraz tasarruf etmiş oluyoruz. Hamming distance için basit üç örnek vereyim:

100 - 011 -> 3
010 - 111 -> 2
1011101 - 1001001 -> 2

Örnekleri direk wikipedia sayfasından aldım, göz atabilirsiniz. Gayet basit ve anlaşılır bir uzaklık metriğidir. Buraya kadar tamamız fakat bu binary string nasıl üretiliyor? Yani feature descriptorlar nasıl elde ediliyor? Feature descriptorları elde edebilmek için aşağıdaki basit formül kullanılıyor:



Oldukça basit bir mantığa dayanıyor. Resimden bir parça seçiyoruz. Bu parçanın içinde bir piksel yoğunluğu karşılaştırması yapıyoruz. Ve yukarıdaki duruma göre yani büyüklüğe küçüklüğe göre 1 ve 0 değerlerini vektöre atıyoruz. Bu parçaları nasıl seçiyoruz? Algoritmanın bu seçim için ilginç bir yaklaşımı var. Bize 5 farklı dağılım sunuyor. Bu 5 dağılımdan birini seçmemiz gerekiyor:



Bu dağılımlara göre seçeceğimiz parça, patch'in lokasyonları değişmiş oluyor. Son olarak BRIEF bir feature bulucu değil, feature descriptordur. Yani SIFT, SURF, FAST gibi algoritmalar ile önce keypointleri tespit etmemiz daha sonra BRIEF ile bu keypointlerden feature descriptorlar çıkarmamız gerekir. OpenCV kütüphanesi ile Python üzerinden örnek yapalım. Kütüphaneyi ve resmi alalım:


import cv2

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



Resmi grayscale hale getirelim:


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Yukarıda da bahsettiğim gibi BRIEF bir feature descriptor algoritmasıdır. Yani keypointleri tespit edebilmek için ilk olarak FAST algoritmasını kullanacağız. FastFeatureDetector_create() sınıfını kulanarak bir obje üretelim. BriefDescriptorExtractor_create() kullanarak da bir obje üretelim:


fast = cv2.FastFeatureDetector_create()
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
Fast ile keypointleri fast objesinin detect methodu ile tespit edelim. Elde ettiğimiz keypointleri, brief objesinin computer methoduna gönderelim ve descriptorları elde edelim. Daha sonra elde ettiğimiz keypointleri görelim. Fast algoritması nasıl çalışıyor görelim:


kp = fast.detect(gray, None)
kp, descriptors = brief.compute(gray, kp)
cv2.drawKeypoints(gray, kp, copyImg, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('FAST and BRIEF', copyImg)
cv2.waitKey(0)
>>



FAST algoritması için ayrı bir yazı yazacağım. Feature extraction için yazdığım üçüncü yazıyı da sonlandırıyorum fakat keypointleri elde ediyoruz, descriptorları elde ediyoruz ancak bir şey yapmıyoruz diyebilirsiniz. Şu anda algoritmaların üzerinden geçiyoruz. Bir kaç yazı sonra elde ettiğimiz bu descriptorları eşleştireceğiz.


Sonraki Yazı: Oriented FAST and Rotated BRIEF
Yorumlar

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