Sayfalar

Cumartesi, Haziran 14, 2008

Göz Bulma II

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 64x64 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 16x16 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


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 !

2 yorum:

ExpLoiT dedi ki...

Bu konuyu araştırıyordum, verdiğiniz bilgiler beni 1 hafta ileriye götürdü :) çok teşekkürler.

çalışmaya devam...

Unknown dedi ki...

Sitenizi daha yeni keşfettim çok güzel konular var başaraılarınız çalışmalarınızın ve paylaşımlarınızın :) devamını dilerim