Download as pdf
Download as pdf
You are on page 1of 6

Şekil Tanıma Dersi 1.

Ödev Raporu

m
Yazan : Şadi Evren ŞEKER
(www.sadievrenseker.com ,ses@sadievrenseker.com)
Dersin Hocası: M. Elif Karslıgil

o
(http://www.ce.yildiz.edu.tr/myindex.php?id=6,elif@ce.yildiz.edu.tr)

i.c
hazırlanmış olan bu ilave yazılımlar ve

Teşekkür izlenilen yol anlatılacaktır.

Bu projenin yapılmasında, derslerinden


faydalandığım Yrd. Doç. Elif Karslıgil’e
teşekkür edeirm.
dil 1 Ortamın belirlenmesi ve
hazırlanması
Amaç Yazılım ortamı olarak, geçmiş tecrübelere
va
Bu projenin amacı, verilen bir resim dayanarak, JAVA programlama dili

kümesi üzerinde öz vektörler (eigen seçilmiştir. Yazılımın taşıması gereken ve

vectorler ) kullanılarak verilen grup alt kütüphane olarak kullanılacak önemli

resimlerinin kullanılarak öz yüzlerini bir kısım kaynak kod, “http://darnok.com/”


ja

(eigen face) oluşturmaktır. adresinde bulunan Konrad Rzeszutek’in


sitesinden temin edilmiştir. Ayrıca resim
işleme ve resim dosyalarını açıp kaydetme
Giriş
w.

işlemleri için JMF1 (JAVA Media


Projede 50 kişiye ait 10’ar resimden oluşan
Framework) paketi yüklenmiştir. Çok
500 resimlik bir havuz verilmiş olup bu
büyük miktardaki matriksler ile uğraşıldığı
havuzun 10’arlı resimler halinde öz
ve standart JDK içerisinde bulunan matrix
yüzlerinin çıkartılması istenmiştir. Bunun
ww

yapısının sağlamış olduğu methodlar


için hazır olan bir hesaplama paketinden
faydalanılmış ve gruplama, yığın işlemleri
(batch) ve resim işlemleri bu paketin
üzerine yazılmıştır. Bu raporda,
1
JMF paketinin detayları için java’nın ana sayfası
olan http://java.sun.com/products/java-
media/jmf/index.jsp adresine bakılabilir.
yetersiz olduğu için , JAMA2 (JAVA başlamakta, sonrasında ise 2 sayı ile bu
Matrix Package) paketi de kurulmuştur. kişinin kaçıncı resmi olduğunu

m
tutmaktadır. Buna göre 7. kişinin 3. resmi
2 Yazılımın tasarımı 0703 ismine sahip olmalıdır. Toplamda
Yazılımı bir kara kutu (blackbox) olarak 500 adet resim olacağı düşünülür ve her
modelleyecek olursak, yazılımın girdileri, kişiye ait 10 adet resim olduğu

o
bir dizin içerisinde bulunan ve isimlerine hesaplanırsa, resimlerin matrix bilgilerini
göre sıralanmış, 500 adet resimden çıkaran ve resim okuyan modül için, 10ar

i.c
oluşmaktadır. Kara kutunun çıkışında ise olarak grup (bundle) oluşturmasını
50 adet öz yüzden oluşan resim dosyası söyleyebiliriz. Burada karşılaşılacak risk,
beklenmektedir. eğitim setinin içinden bir resmin ileride
test bilgisi için kullanılabilecek olması ve
İşlenecek
resimler (500
adet)
dil resim
sorunu
sayılarının
çözmek
karşılaşılması
dengesizliğidir.
için,
durumunda
test resmi
bu
Bu
ile
resmi
atlaması gerekmektedir.
Proje
Giriş değerleri ile ilgili bir sorun da bu
va
(Kara Kutu)
değerlerin “pgm” yapısında (format)
verilmiş olmasıdır. Bu dosya yapısını
Öz yüzler
JAVA ile okumanın yolu, bu proje
(her kişi için
1 adet) kapsamında ne yazık ki bulunamamıştır.
ja

Internet’te3 arama sonucu bulunan bir


Fig. 1 Sistemin kara kutu modeli sitede Fransızca olarak hazırlanmış olan bir
Yukarıdaki figürde, giriş ve çıkış bilgileri paket indirilmiş, ancak ne yazık ki
w.

gösterilmiştir. Buna göre giriş ve çıkış çalıştırmaya muvaffak olunamamıştır. Bu


bilgilerinin özel durumları ve nasıl yüzden JAVA ile uyumlu olan JPG dosya
işlendiklerini inceleyelim. yapısı proje kapsamında kodlanmış ve giriş
değeri olarak verilen dosyaların hepsi
2.1 Giriş değerleri
ww

pgm’den jpg’ye çevrilmiştir.


Giriş resim dosyalarının özelliği kişilere
göre numaralandırılmış olmasıdır. Örneğin
7. kişinin resimlerinin hepsi 07 ismi ile
2 3
JAMA paketi için Projenin detaylı tanımı (Fransızca) ve kodları
http://math.nist.gov/javanumerics/jama/ adresine http://www.enseignement.polytechnique.fr/profs/inf
başvurulabilir. ormatique/Philippe.Chassignet/PGM/pgm_java.htm
l adresinde bulunmaktadır.
2.2 Çıkış Değerleri 3 Projenin gerçeklemesi
Projenin çıkış değeri olarak, 50 ayrı kişinin (kodlanması)
öz yüzleri istenmektedir. Bu resimler, proje Bu bölüme kadar tasarımı anlatılan

m
kapsamında işlendikten sonra ekranda bir projenin kodlanması ve gerçekleştirilmesi
java frame (Java frame’ler, java bu bölümde anlatılacaktır. Projenin
programlama dilinde yazılan ve işletim kodlaması daha öncede bahsedildiği gibi

o
sisteminde bir pencere olarak gösterilen JAVA dilinde yapılmış olup, kodda
java component (bileşen)leridir. Programın bulunan kritik noktalara, bu bölümün

i.c
çıktısı olarak bu değerler ekranda içerisinde alınmıştır. Ayrıca karşılaşılan
gösterilmiştir. ) içerisinde gösterilmekte ve güçlükler ve çözümleri de bu bölümde
bir resim dosyasına kaydedilmektedir. anlatılmaktadır.

dil
ja va
w.
ww

Fig 2. Projenin kapalı UML diyagramı


Yukarıdaki figürde görülen sınıf yukarıdaki kod parçası bu durumu tespit edip,
hiyerarşisinde bulunan nesnelerin tanımları içinde bulunduğu döngüyü atlatmaktadır.

m
aşağıdaki şekildedir.
TestFaceRecognition: Bu sınıf, ana sınıfımız
olup, eigenfacecreator class’ını çağırmaktadır.
Bu sayede, verilen parametreleri işlemiş ve Fig. 3. Örnek giriş resmi

o
eigenfacecreator, class’ının işleyebileceği
şekle getirmiş olur. Giriş değerlerinden örnek bir resim yukarıdaki

i.c
EigenFaceCreator: Bu sınıfın görevi, figürde gösterilmiştir

3.2 Öz Yüz (Eigenface)


Proje tasarımına bağlı olarak, JAVA’nın da
algoritmasının gerçeklemesi
nesne yönelimli (object oriented) bir dil
olmasından faydalanarak,
hiyerarşisi (class
dil
yukarıdaki sınıf
hierarchy) modeli
Kullanılan algoritmanın
aşağıdaki şekildedir4:
pseudo kodu

çıkartılmıştır.
va
3.1 Giriş değerlerini okuyan
modlün gerçeklemesi
Giriş değerlerinin atlamasını söyleyen bir
koşul yazılmıştır.
Fig. 4. Eigen Face Algoritması
if(sadifile.equals((String)fil
ja

Buna göre, aranacak olan resim, bir eğitim seti


enames.get(j+MAGIC_SETNR*i))){
için uygun olan öz yüzlere uzaklığına
System.out.println("ayni
bakılarak tespit edilmektedir. Burada ortaya
dosyayi buldum train sete
w.

çıkan problem, uzaklık ölçümü için mümkün


koymuyorum");
olan yollardan birisinin seçilmesidir.
set[j] =
İsmi geçen makalede her ne kadar Euclidean
(String)filenames.get(j-
veya Mahalanobis uzaklıklarının kullanılması
1+MAGIC_SETNR*i);
ww

önerilse de, projenin bu kısmı için bir şart


System.out.println(" -
olmadığından basit bir vector resim farkı
"+set[j]);
continue; 4
Algoritma, Preserving Privacy by De-
}
identifying Facial Images,
Elaine Newton Latanya Sweeney Bradley Malin,
Carnegie Mellon University, 2003, makalesinden
alınmıştır.
alınarak bu modül yazılmıştır. Kodu aşağıdaki
şekildedir:
3.3 Çıkış değerlerini işleyen

m
satır 1.double[] distance = new
double[MAGIC_NR];
modül
Proje’nin hesaplama ve öz yüzleri
satır 2.double[] minDistance = new
double[MAGIC_NR]; bulmasından sonra, projenin bu sonuçlarını

o
satır 3.idx = 0; gösteren bir modül yazılması ihtiyacı
satır 4.for (image = 0; image <
doğmuştur. Ayrıca bulunan değerler, bir
nrfaces; image++) {
double dizide (array) bulunduğu için bu

i.c
satır 5.temp = 0.0;
satır 6.for (j = 0; j < MAGIC_NR; değerlerin direk olarak ekran görülmesini
j++) { sağlayan ilave bir sınıf (class) yazılmış olup
satır 7.distance[j] = bu sınıf kullanılmıştır. Kısaca, JAVA’da
Math.abs(input_wk[j] - ekrana resim basmak için kullanılan canvas
wk[image][j]);
satır 8.//System.out.print(distance[
j]+"\t");
satır 9.}
dil sınıfından nesneler kullanılmıştır. Ancak bu
canvas sınıfının içinde bulunan Image nesnesi,
dosya kaydetme işlemleri için kullanılan
satır 10.if (image == 0) BufferedImage nesnesi ile birbirine
satır 11.System.arraycopy(distance,0
va
dönüşememektedir. Bunu çözmek için geçici
,minDistance,0,MAGIC_NR);
bir graphics2d objesi yapılmış ve bunun içine
satır 12.if (sum(minDistance) >
sum(distance)) { resim çizdirilerek sonuç, dosyaya aktarılmıştır.
satır 13.this.idx = image;
satır 14.System.arraycopy(distance,0
ja

,minDistance,0,MAGIC_NR);
satır 15.}
satır 16.}
w.

Yukarıdaki figürde görüldüğü üzere, her bir


resimin kendisi için hesaplanan eigen vector
değerinden çıkarılması sonucu bulunan
değerlerin toplamı kadar uzaklıkta olmaktadır.
ww

Bu değerler daha sonra hesaplamada kolaylık


sağlaması açısından eğitim dosyalarının
bulunduğu dizinde bir .cache dosyası olarak
saklanamaktadır. Şayet program bu dosyayı
bulursa, tekrar hesaplama yapmamakta, hazır
hesaplamaları kullanmaktadır.
satır 1.memImage =
createImage(new
MemoryImageSource(width,
Fig. 5. Örnek çıkış resmi

m
height, pix, 0, width));

satır 2.BufferedImage image =


new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB) 4 Sonuç

o
;

satır 3.Graphics2D g2 = Proje kapsamında, resim işleme işlemleri için


image.createGraphics();
bir yazılım geliştirilmiş, öz resimlerin nasıl

i.c
satır 4.paint(g2); hesaplanacağı, ve mesafe hesapla yöntemleri
satır 5.g2.dispose(); incelenmiş ve yapılan araştırmalar sonucunda
elde edilen bilgiler ile bir yazılım
satır 6.try{
geliştirilmiştir. Yazılımın çıktısının renkli bir
satır 7.ImageIO.write(image,
"png", new
File(""+id+".png"));

satır 8.}catch(IOException
dil resim olması, beklenmeyen bir durumdur
ancak bunun resimleri pgm formatından jpg
formatına çevirmekten kaynaklandığı tahmin
e){} edilmektedir. Ayrıca her ne kadar projenin
va
Yukarıdaki kod parçasında, 1. satırda, canvas
amacı yüz tanıma işlemi olmasa da, one-
içerisine yüklü olan resim parçası, hafıza
against-all metodu kullanılarak basit bir
görüntüsü olarak saklanıyor. 2. satırda
tanıma işlemi yazılmış ancak mesafe
BufferedImage tipindeki class’tan yapılmış
hesaplama fonksiyonlarının tam
olan bir nesne içerinse bu hafız resmi
ja

olmamasından dolayı başarı elde


büyüklüğünde bir yer açılıyor. Daha sonra 3.
edilememiştir.
ve 4. satırlarda bu resimden oluşturulan
Sonuç olarak bu proje sayesinde resim işleme
graphics2D nesnesinin içerisine hafızada
w.

ve biometrik konusuna bir giriş yapılmış


bulunan resim çiziliyor. Daha sonra
olunup burada öğrenilen bilgiler ile konunun
oluşturulan bu resim dosyaya basılıyor.
daha da detaylı öğrenilmesinin yolu açılmış
Dikkat edilecek bir diğer nokta ise,
oluyor.
oluşturulan bu resimlerin dosya isimlerinin
ww

verilmesidir. Dosya isimleri öz yüzü


oluşturulan kişinin numarasıyla atanmaktadır
ve bu bilgi, sisteme dosya okuyan modülden
buraya kadar taşınmaktadır.

You might also like