Anasayfa » Mühendis Çantam

Image Colorization by using LBP

27 Aralık 2012 3.021 views Yorum Yok Kii

 “Introduction to Pattern Recognition” dersinde bir arkadaşımla beraber yaptığım küçük bir projeydi. Ancak geliştirilebilir bir proje olduğu için ilgilenenlerle paylaşmak istedim: Projenin amacı machine learning algoritmaları kullanarak renkli training data?ları kullanarak elde edilen kriterleri, renksiz datalar da kullanarak sonuçları görmek. Training datalarım renkli resimler, testing datalarımise renksiz resimler. Sonuçta görmek istediğim ise renksiz olarak verdiğim test datasının renkli versiyonu. Projeye dataları belirleyerek başladım. vision.caltech.edu ve SUN Database linkleri data bulmak için güzel kaynaklar. Buradan 4 tane uçak resmini indirdim. Bunlar jpg uzantılı resimler. Training olarak kullanacağım 3 uçak resmi şunlar:

   
 

DİPNOT: Az sayıda training data’m olduğundan dolayı düzgün bir sonuç elde edebilmek için benzer resimler kullandım. (Düze yakın bir arkaplan üzerinde uçan uçaklar)

Bu resimleri İrfan View kullanarak pgm formatına getirdim. İrfan View, resimle ilgili herhangi bir proje yaparken elinize yapışacak önemli programlardan biri, bununla ilgili işinize yarayacak bir kaç özelliği de şu yazımda anlattım.

Datalarımı pgm formatına getirdikten sonra işime yarayacak özellikleri(attribute/feature) belirleme kısmı var. Benim feature?larım resmin her bir pikseline uygulanacak. Datalarımın hepsini yine İrfanView kullanarak 160×240 piksel boyutlarına getirdim. Feature olarak da pikselin x ve y koordinatları, resmin R-G-B değerleri(output), resmin grayscale değeri ve pikselin LBP değeri olarak belirledim. Diğer özellikler açık, ancak LBP?den biraz bahsetmek istiyorum. LBP (Local Binary Pattern) ilk 1994 yılında bulunmuş, çok eski değil. Bazı alanlarda güçlü bir özellik olarak kullanılır. Yaptığı iş şudur. Diyelim ki 5.row 5.column?daki pikselin LBP değerini hesaplıyoruz. Mask?ımızı da 3×3?lük alalım. O zaman değerlerimiz şu şekilde oluyor:

|                4.col   5.col  6.col

4.row        100    80     120

5.row        130   110     200

6.row        20      250    252

 

Piksel değerlerimizi bu şekilde varsayalım. Yaptığımız işlem, hesapladığımız piksel değeri 5.row 5.col’daki değer, yani 110. Komşularına bakıyoruz. İstediğimiz yerden başlayıp, istediğimiz tarafa dönebiliriz. Mesela 4.row 4.col’daki komşudan başlayıp saat yönünde dönelim. 110>100, o zaman elde var 1. 80<110 elde var 10. 120>110 elde var 101.. Böyle gider ve en son elde var 10111101. Bunu da binary’den decimal’a çevirirsek 128 + 32 + 16 + 8 + 4 + 1 = 189 eder. Demek ki 5.row 5.col’daki pikselin LBP değeri 189’muş.

Bu LBP olayını anlatmaya çalıştım, umarım anlatabilmişimdir. LBP kullanımı konusunda fikir vermesi açısından Matlab’da kullanabileceğiniz basit bir LBP fonksiyonunu da paylaşıp bu konuyu burada kapatıyorum:

function LBP_Im = LBP(Input_Im, R)

if size(Input_Im, 3) == 3
Input_Im = rgb2gray(Input_Im);
end;
L = 2*R + 1; %size of the LBP label
C = round(L/2);
Input_Im = uint8(Input_Im);
row_max = size(Input_Im,1)-L+1;
col_max = size(Input_Im,2)-L+1;
LBP_Im = zeros(row_max, col_max);
for i = 1:row_max
for j = 1:col_max
A = Input_Im(i:i+L-1, j:j+L-1);
A = A+1-A(C,C);
A(A>0) = 1;
LBP_Im(i,j) = A(C,L) + A(L,L)*2 + A(L,C)*4 + A(L,1)*8 + A(C,1)*16 + A(1,1)*32 + A(1,C)*64 +                                  A(1,L)*128;
end;
end;

Ne demiştim. İnput feature’larım pikselin x ve y koordinatları, resmin grayscale değeri ve pikselin LBP değeri olarak belirledim, ancak sadece kendi LBP değerini değil, komşularının LBP’lerini de input olarak tuttum. Yani 2 koordinatlar için, 1 grayscale değeri, 9 tane de LBP değerleri, toplamda 12 input feature’ım var. Output feature’larım da pikselin R-G-B değerleri, yani 3 tane. Sanırım Bazı machine learning algorithmalarında birden fazla output yapılabiliyor, ancak bildiğim yöntemi kullandım, o yüzden 3 tane ayrı file’da tuttum ve R-G-B değerlerini ayrı ayrı output olarak ele aldım.

Benim yaptığım iş input ve output vererek machine learning uygulamak olduğu için supervised learning oluyor, bu kısmın detaylarına girmeyeceğim, belki ilerde bununla ilgili konu açarım. Şimdilik bilmemiz gereken supervised learning’te input’lara Machine learning uygulayabilmem için arff veya csv uzantılı file oluşturmak gerekir. Ayrıca output’lar bir class’a ait olmak zorunda. Benim output değerlerim 0-255 aralığını da kapsayan numeric değerler. O yüzden 256 tane class’ım varmış gibi düşünebiliriz.

Ben arff uzantılı file oluşturdum ve kullandığım format şu şekilde:

@relation colorization

@attribute xCoord numeric
@attribute yCoord numeric
@attribute grayscale numeric
@attribute lbp1 numeric
@attribute lbp2 numeric
@attribute lbp3 numeric
@attribute lbp4 numeric
@attribute lbp5 numeric
@attribute lbp6 numeric
@attribute lbp7 numeric
@attribute lbp8 numeric
@attribute lbp9 numeric
@attribute class numeric

@data

2,2,211,208,208,208,208,208,208,208,208,208,176

(datalar devam ediyor…)

Buradaki @relation yapcağınız işin adı. attribute’lar verileriniz. Sondaki output olan class’ınız. Tüm attribute’ları belirledikten sonra da @data deyip, dataları yazıyoruz. Datalarımız her bir piksel için olacak. En dıştaki border’ı atladığımız zaman, 2.row 2.col’dan başlayıp 158×238 tane pikselin datasını yazacağız. Ben training data olarak 3 resim kullanacağım için, ve bir tane de resmi testing data olarak kullanacağım için 4 resim için bu data kısmını yazdırdım. Yani 158x238x4 tane datamız mevcut.

12 tane input’umuz olduğu için herbir datanın 12’şer tane değeri olacak ve değerler virgülle ayrılacak. Yukarıda sadece 2.row 2.col’daki pikselin datasını yazdım. Bu yazma işlemini tabii ki elle yapmadım. Matlab’da kodunu yazdım, bir de lbp fonksiyonu yazdım. Ve sonucunda 3 tane arff uzantılı dosyaya ulaştım. Sonra da bu arff uzantılı dosyaları WEKA yardımı ile açtım.

WEKA, machine learning için elimize yapışacak bir program. Arkaplanda ne yaptığını bilmemek sinirlerimi bozsa da programı yazanlara saygımız sonsuz:) WEKA bu dosyayı açtığımız zaman, istediğimiz algoritmayı seçip oluşacak değerleri bize gösteriyor.

ARFF file oluştururken Testing datasını da arff file’a neden yazdığımı soracak olursanız eğer.. Test image’ın da gerçek değerlerini  yazdırıyorum. Böylece kendi bulduğum değerlerle gerçek değerleri karşılaştırıp hata payımı da görmüş olurum. Ayrıca WEKA’nın options kısmından dataların %75’ini training olarak kullan ve dataların sıralamasını koru özelliklerini de seçerek, training datamın değerlerinin training’te kullanılmamasını sağlayıp yaptığım işi daha doğru test etme imkanını da ayarladım.

3 arff dosyasına da machine learning uyguladıktan sonra 3 tane output elde ettim. Sonra da algoritma sonucu oluşan RGB değerlerini sırasıyla 3 arff dosyasından teker teker alarak her bir pikseli elde edip ppm formatında resim oluşturdum. (Image processing’le ilgilenmiyorsanız bunlar biraz yabancı geliyor olabilir, ama biraz ilgilenenler beni anlıyordur) Sonra bu ppm uzantılı resmi jpg formatına da çevirdim, herkesin (İrfanView’i olmayanların da) açabilmesi açısından. Renklendirmek istediğim testing data’m şu:

Elde ettiğim renkli resimler ise aşağıdakiler(uygulanan Machine Learning algoritmaları soldan sağa sırasıyla: Simple Linear Regression- Neural Network -Linear Regression):

   
 

 

3 tane training’le bu kadar bile çok iyi bence. Feature’lar geliştirilirse ve training datalar arttırılırsa çok güzel colorization projeleri ortaya çıkar diye düşünüyorum.

Yorumu size bıraktım ve kaçtım;)

Hoşçakalın.

Ziynet Nesibe

Yoruma Açığız! :)

Be nice. İçeriği çirkin olmadığı sürece her yoruma, öneriye ve soruya "evet" :)

Etiketler: , , , , , ,