layout | title | slug | author | categories | references | thumbnail | ||
---|---|---|---|---|---|---|---|---|
post |
Öznitelik Çıkarma |
feature-extraction |
Bahri ABACI |
|
/assets/post_resources/feature_extraction/thumbnail.png |
Bilgisayarlı görü uygulamaları yaygın olarak iki temel aşamadan oluşmaktadır. Bunlardan ilki olan Öznitelik Çıkarımı (Feature Extraction) aşamasında verilen girdi imgesinden; parlaklık, zıtlık, dönme gibi kamera ve ışık koşullarından bağımsız olarak girdi imgesini betimleyen tanımlayıcıların (özniteliklerin) çıkarılması hedeflenmektedir. İkinci aşama olan Makine Öğrenmesi (Machine Learning) aşamasında ise girdi imgesinden elde edilen öznitelikler kullanılarak verinin sınıflandırılması hedeflenmektedir. Blogda paylaştığımız [K-Means]({% post_url 2015-08-28-k-means-kumeleme-algoritmasi %}), [Temel Bileşen Analizi]({% post_url 2019-09-01-temel-bilesen-analizi %}), [Lojistik Regresyon Analizi]({% post_url 2015-07-23-lojistik-regresyon-analizi %}) ve [Karar Ağaçları]({% post_url 2015-11-01-karar-agaclari %}) gibi eski yazılarımızda Makine Öğrenmesi aşaması ile ilgili pek çok yöntemi incelemiştik. Bu yazımızda ise IMLAB görüntü işleme kütüphanesi içerisinde yer alan ve Öznitelik Çıkarımı için kullanılan yöntemleri inceleyeceğiz.
Yazıda incelenecek yöntemlere geçmeden önce öznitelik kavramına ve bilgisayarlı görüdeki önemini anlamaya çalışalım. Aşağıda ilk sütunda verilen iki imge insan gözü için aynı aynı sahneyi gösterse de bilgisayarlar açısından görüntü pikseller ve bunun değerlerinden ibaret olduğundan birbirinden tamamen farklı iki imge olarak algılanacaktır. Öznitelik çıkarma işlemi; piksel değerlerini doğrudan kullanmak yerine, insan gözününde yaptığı gibi, pikseller arasındaki komşuluk ilişkisini kodlamayı amaçlamaktadır. Böylece piksel değerleri ne olursa olsun, pikseller arasındaki ilişki korunduğu müddetçe iki imge için de üretilen kod sözcükleri aynı olacak ve makine öğrenmesi için uygun bir veri hazırlanacaktır.
Örnek İmge | Gri Seviye Kodlama | Normalize Piksel Farkları | Yerel İkili Örüntüler | Yönlü Gradyanlar Histogramı |
---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Yukarıda verilen tabloda (2. sütundan itibaren) IMLAB görüntü işleme kütüphanesi kullanılarak çıkarılabilecek öznitelikler görselleştirilmiştir. Tablodan da görüldüğü üzere, girdi görüntüsünde yüksek bir ışık değişimi dahi meydana gelse, iki imge için de çıkarılan öznitelikler büyük derecede ortaklık göstermektedir.
Aşağıda tabloda verilen ve IMLAB görüntü işleme kütüphanesinde yer alan öznitelik çıkarıcı yöntemler basitten karmaşığa doğru sıralanarak açıklanmıştır.
Gri seviye kodlama imge işlemede kullanılan en basit özniteliktir. Bu kodlama öznitelik çıkarımının amacına her ne kadar aykırı olsa da pikseller arasındaki ilişkiyi öğrenme potansiyeli olan karmaşık makine öğrenme algoritmalarının (Yapay Sinir Ağları, Evrişimsel Sinir Ağları gibi) kullanılması durumunda hala tercih edilebilmektedir. Kırmızı (R), Yeşil (G) ve Mavi (B) gibi üç kanaldan oluşan
IMLAB görüntü işleme kütüphanesinde gri seviye özniteliğinin çıkarılmasını sağlayacak öznitelik sınıfının oluşturulması için aşağıdaki fonksiyon çağrılmalıdır.
struct feature_t *fe = feature_create(CV_ENCODER, N, M, C, "");
Verilen fonksiyonda ilk parametre CV_ENCODER
çıkarılacak özniteliği, sonraki üç paramtre N, M, C
ise sırasıyla görüntü genişliği, görüntü yüksekliği ve kanal sayısını belirtmektedir. Metin olarak verilen argüman ise öznitelik çıkarma algoritmasına özel parametrelerin fonksiyona geçirilmesi için eklenmiştir. CV_ENCODER
kodlayıcısı herhangi bir paarametreye ihtiyaç duymadığından boş olarak bırakılmıştır.
Normalize piksel farkları; gri seviye görüntülerde öznitelik çıkarımı için Shengcai Liao vd. tarafından 2015 yılında önerilen özniteliklerdir. NPF özniteliğinde iki piksel arasındaki göreceli fark ölçülmektedir.
Burada denklemin pay kısmında yazılı olan terim ile iki piksel arasındaki büyüklük küçüklük ilişkisi kodlanırken, bölme işlemi ile de işlemin görüntünün parlaklığa olan duyarlılığı azaltılmaktadır. Payda teriminin sıfır olması durumunda ise iki piksel arasında herhangi bir fark bulunmadığından
Shengcai Liao vd. tarafından önerilen makalede, NPF özniteliklerinin,
IMLAB görüntü işleme kütüphanesinde NPF özniteliğinin çıkarılmasını sağlayacak öznitelik sınıfının oluşturulması için aşağıdaki fonksiyon çağrılmalıdır.
struct feature_t *fe = feature_create(CV_NPD, N, M, C, "-n_sample:4000 -min_distance:5 -max_distance:20");
Verilen fonksiyonda ilk parametre CV_NPD
çıkarılacak özniteliği, sonraki üç paramtre N, M, C
ise sırasıyla görüntü genişliği, görüntü yüksekliği ve kanal sayısını belirtmektedir. Metin olarak verilen argümanlarda ise örnek sayısı min_distance
ve max_distance
parametreleri ise piksel farkı hesaplamasında kullanılacak
Yerel ikili örüntüler; gri seviyeli resimler üzerinde doku ölçümü yapmak için Timo Ojala vd. tarafından 1996 yılında önerilen örüntü tanımlayıcılarıdır. Temelde, bir YİÖ işleminde merkez seçilen bir piksel kerteriz alınarak, komşu piksellerin bu referansa göre durumları sayılara dönüştürülür. Böylelikle yerel bir örüntünün karaktersitik yapısı tek bir piksel içerisinde saklanabilir. Bir YİÖ işleminin matematiksel ifadesi aşağıdaki gibidir.
Burada
Aşağıdaki görselde,
Verilen görselde (a) bir imgeden seçilen
Verilen bir imgenin
Yerel ikili örüntüler özniteliğinin en önemli özelliği görüntünün parlaklık seviyesinden etkilenmemesidir. İşlem her bir öznitelik değerini belirli bir komşulukta yer alan diğer piksellerin değerine göre oluşturduğundan görüntünün parlaklık seviyesinden bağımsızdır. Ancak hesaplamalar piksel tabanlı yapıldığından girdi görüntüsünün bir piksel dahi kayması (sağa,sola,yukarı,aşağı) durumunda aynı piksele karşı gelen öznitelik çok farklı olacaktır. Bunun önüne geçmek için YİÖ öznitelikleri genellikle, literatürde sıklıkla kullanılan, hücre histogramları ile birlikte kullanılır.
Bu yöntemde YİÖ özniteliği hesaplandıktan sonra YİÖ imgesi
2000 yılında Ojala vd. tarafından ilk makaleye ek olarak önemli bir katkı daha yapılmıştır. Yayınlanan makalede YİÖ özniteliklerinin rotasyon (dönme) işlemine de bağımsız olmasını sağlamak amacıyla hesaplanan değerlerin 'tekdüze' (uinform) veya 'düzensiz' (non-uniform) olarak gruplandırılması önerilmiştir. Bu gruplama hesaplanan (b) imgesindeki sıfır-bir ve bir-sıfır geçişlerinin sayısına bakılarak yapılmıştır. Ojala vd. tarafından geçiş sayısı üçten küçük olan tüm yerel ikili örüntüler tekdüze olarak kabul edilmiştir. Seçilen eşik değeri için 256 farklı ikili örüntüden sadece 36 tanesi 'tekdüze' olarak sınıflandırılmıştır.
Bu gruplandırma sonucunda histogram vektörü; tekdüze değerler ayrık histogram adımlarında, düzensiz tüm örüntülerse tek bir histogram adımına dahil edilerek oluşturulur.
IMLAB görüntü işleme kütüphanesinde YİÖ özniteliğinin çıkarılmasını sağlayacak öznitelik sınıfının oluşturulması için aşağıdaki fonksiyon çağrılmalıdır.
struct feature_t *fe = feature_create(CV_LBP, N, M, C, "-block:4x4 -uniform:3");
Verilen fonksiyonda ilk parametre CV_LBP
çıkarılacak özniteliği, sonraki üç paramtre N, M, C
ise sırasıyla görüntü genişliği, görüntü yüksekliği ve kanal sayısını belirtmektedir. Metin olarak verilen argümanlarda ise hücre boyutu uniform
değeri hesaplamalarda kullanılacak 'tekdüze' lik kriterini sağlamak için kullanılmaktadır.
Yönlü gradyanlar histogramı; Navneet Dalal vd. tarafından 2005 yılında önerilen, nesne tanımada sıklıkla kullanılan ve bir nesneyi içerdiği açılar ile betimleyen bir tanımlayıcıdır. Özniteliğin hesaplanabilmesi için öncelikle yönlü gradyan hesaplaması yapılmalıdır.
Bulunan gradyanlar kullanılarak,
Elde edilen bu öznitelik her ne kadar önemli bir bilgi olsa da bir pikselin açısı imge gürültüsüne aşırı bağlı olduğundan doğrudan öznitelik olarak kullanılmaya uygun değildir. Navneet Dalal vd. tarafından yapılan en önemli katkı, Denklem
Denklem
Ancak
Yukarıda verile işlem adımları kullanılarak YGH hesaplaması şu şekilde yapılmaktadır.
-
$I_{M\times N}$ imgesini$K \times L$ boyutundaki hücrelere böl - Her hücre için
$B_{ij}$ uzunluklu$v_{ij}$ yönlü gradyan histogramını hesapla -
$P \times R$ hücre için hesaplanan histogram vektörlerini uç uca ekleyerek$V_{ij}$ blok histogramını bul - Blok histogramını normalize ederek özniteliği bul
$f_{ij}=\frac{V_{ij}}{\sqrt {|V_{ij}|_{2}^{2}+e^{2}}}$
IMLAB görüntü işleme kütüphanesinde YGH özniteliğinin çıkarılmasını sağlayacak öznitelik sınıfının oluşturulması için aşağıdaki fonksiyon çağrılmalıdır.
struct feature_t *fe = feature_create(CV_HOG, N, M, C, "-cell:5x5 -block:2x2 -stride:1x1 -bins:9");
Verilen fonksiyonda ilk parametre CV_HOG
çıkarılacak özniteliği, sonraki üç paramtre N, M, C
ise sırasıyla görüntü genişliği, görüntü yüksekliği ve kanal sayısını belirtmektedir. Metin olarak verilen argümanlarda ise hücre boyutu stride
değeri hesaplamalarda kullanılacak bloklamanın hangi sıklıkta yapılacağını göstermektedir. Verilen bins
parametresi ise histogram hesaplamasında kullanılacak adım sayısını belirtmek içim kullanılmaktadır.
Yukarıda detaylı anlatımları yapılan öznitelik çıkarıcılarının örnek bir imgeye uygulanması için aşağıdaki kod parçasının yazılması gerekmektedir.
// read the input image
matrix_t *img = imread("../data/example.bmp");
matrix_t *gray = matrix_create(uint8_t, rows(img), cols(img), 1);
// convert the input into grayscale
rgb2gray(img, gray);
// create feature extractor
struct feature_t *fe = feature_create(CV_HOG, N, M, C, "-cell:5x5 -block:2x2 -stride:1x1 -bins:9");
// allocate space for the feature vector
float *feature = (float *)calloc(feature_size(fe), sizeof(float));
// display information about the feature (optional)
feature_view(fe);
// print the class names and files under them
feature_extract(gray, fe, feature);
Burada bellekten okunan renkli bir imge öncelikle gri seviyeye dönüştürülmüştür. Ardından çıkarılma istenen öznitelik sınıfından (CV_HOG
) bir eleman oluşturulmuştur. Çıkarılmak istenen öznitelik için gerekli boyut bilgisi feature_size
fonksiyonu yardımı ile öğrenilerek gerekli alan ayrınmıştır. Ardından feature_extract
fonksiyonu ile verilen gri imgeden fe
öznitelik çıkarıcı sınıfı kullanılarak öznitelikler çıkarılmış ve feature
alanına yazılmıştır.
Yazıda yer alan analizlerin yapıldığı kod parçaları, görseller ve kullanılan veri setlerine imlab_feature_extraction GitHub sayfası üzerinden erişilebilir.
Referanslar
-
Liao, Shengcai, Anil K. Jain, and Stan Z. Li. "A fast and accurate unconstrained face detector." IEEE transactions on pattern analysis and machine intelligence 38.2 (2015): 211-223.
-
Ojala, Timo, Matti Pietikäinen, and David Harwood. "A comparative study of texture measures with classification based on featured distributions." Pattern recognition 29.1 (1996): 51-59.
-
Ojala, Timo, Matti Pietikäinen, and Topi Mäenpää. "Gray scale and rotation invariant texture classification with local binary patterns." European Conference on Computer Vision. Springer, Berlin, Heidelberg, 2000.
-
Dalal, Navneet, and Bill Triggs. "Histograms of oriented gradients for human detection." 2005 IEEE computer society conference on computer vision and pattern recognition (CVPR'05). Vol. 1. IEEE, 2005.