İ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 verisidosyalarını oluşturdum.
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
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ş YSAadlarıyla kaydedildi.
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
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;diyerek nesnemizi tanımlıyoruz
Eyes=new EyeFinder();
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şeklinde ulaşabiliriz...
Eyes->rightY; // Sağ Göz Y Konumu
Eyes->leftX; // Sol Göz X Konumu
Eyes->leftY; // Sol Göz Y Konumu
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ı
Okuyucu sana söylüyorum Volkan sen işit !
2 yorum:
Bu konuyu araştırıyordum, verdiğiniz bilgiler beni 1 hafta ileriye götürdü :) çok teşekkürler.
çalışmaya devam...
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
Yorum Gönder