Göz Bulma 2

0
113
eyefinder
eyefinder

Bir önceki yazıda programı ve kodu vermiştik, sıra geldi açıklamaya.

İlk iş Görüntü dosyalarını açıp içlerindeki yüzleri tespit edip 64×64 ebatına getirip kaydetmektir. Bu iş için Yüz tanıma programımızı da kullanabilirsiniz. bu şekilde bir yüz veritabanına sahip oluruz.

Bu yüzlerin dosya isimleri ve göz koordinatlarını bir text dosyaya attım. Göz koordinatlarını inceleyerek gözlerin muhtemelen bulunduğu bir alan belirledim. bizim programımızda bu alan her iki göz için ayrı ayrı olmak üzere 16×16 lık bir kare . Yüz görüntüsüne kenar bulma işlemi uyguladım ( cvCanny ) Gözün bulunduğu alanlarında yatay ve dikey histogram aldım. Bizim uygulamamızda 16 elemanlı bir dizi oluşur

0.063 0.063 0.125 0.188 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.188 0.188

bunu YSA için giriş değeri olarak kullandım
Çıkış değeri ise Gözün o alan için konumunu aldım. Yani gözün bulunduğu konum 1 diğerleri 0 olacak şekilde 16 elemanlı bir dizi mesela konum 9 için

0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000

 

eyefinder
Bu işlemleri elimizdeki yüz -veri tabınına uygulayıp Yapay Sinir Ağları için eğitim verisi oluşturacak basit bir program yazdım. sonuçta

SagX.dat // Sağ Göz X Konumu için Eğitim verisi
SagY.dat // Sağ Göz Y Konumu için Eğitim verisi
SolX.dat // Sol Göz X Konumu için Eğitim verisi
SolY.dat // Sol Göz X Konumu için Eğitim verisi

dosyalarını oluşturdum.
YSA ‘nın eğitim işlerini FannTool ile yaptım. Eeee biz bu günler için yaptık bu programı.
Eğitim sonunda Eğitilmiş YSA lar

SagX.net // Sağ Göz X Konumu için Eğitilmiş YSA
SagY.net // Sağ Göz Y Konumu için Eğitilmiş YSA
SolX.net // Sol Göz X Konumu için Eğitilmiş YSA
SolY.net // Sol Göz Y Konumu için Eğitilmiş YSA

adlarıyla kaydedildi.

Programımızda eğitilmiş YSA ları çağırıp istediği verileri girip göz konumlarını almak
için kolaylık olsun diye bir de Sınıf oluşturdum.
EyeFinder
Kullanımı gayet basit

EyeFinder *Eyes;
Eyes=new EyeFinder();

diyerek nesnemizi tanımlıyoruz

Eyes->SetImage(img);

diyerek işlem yapacağımız görüntüyü bildiriyoruz

Eyes->SetFaceRect(leftup.x,leftup.y,rightdown.x,rightdown.y);

diyerek yüzün konumunu bildiriyoruz – OpenCv haarcascade ile etspit ettiğimiz –

Eyes->Find();

diyerek YSAları çağırıp Göz konumlarını bulduruyoruz.
artık Göz konumlarına

Eyes->rightX; // Sağ Göz X Konumu
Eyes->rightY; // Sağ Göz Y Konumu
Eyes->leftX; // Sol Göz X Konumu
Eyes->leftY; // Sol Göz Y Konumu

şeklinde ulaşabiliriz…

Göz bulma programı bu haliyle bitmiş bir proje değil, başlanmış bir projedir performansını düzenlemek için pek çok şey yapılması gerekecektir. mesela YSA larının eğitimi için sadece 79 veri kullanılmıştır. Bu kadar az veriyle gösterdiği performansada şaşormadım desem yalan olur.
Bence yapılması gerekenlerlerden bazıları

  • Veri sayısı artırılmalı
  • Kenar bulmanın değişik metodları denenip performansları karşılaştırlılmalı
  • Gözlerin muhtemelen bulunduğu bir alan konum ve ebatlarında değişik alternatifler uygulanıp performansları karşılaştırlılmalı

Tahmin edebileceğiniz üzere benim bu konuda çalışmaya devam etmeye zamanım yok. Uğraşmak isteyen arkadaşlara yardıma da hazırım.
Okuyucu sana söylüyorum Volkan sen işit !

 

Kaynak: http://derindelimavi.blogspot.com.tr/2008/06/gz-bulma-ii.html / 2008
Birol Kuyumcu

Facebook Yorumları