25 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 6

C# Kameradan Görüntü Alma

Kameradan görüntüyü almak için "webcam_capture" kütüphanesini kullanıyoruz.Referanslardan dll'i ekledikten sonra. Önce forum kısmına bir picturebox ve bir buton ekleyelim.Daha sonra "Kamera" adında bir sınıf oluşturuyoruz.Bu sınıf kod içeriği şöyle ;

using System.Data;
class Kamera

{
 private WebCamCapture kameraa;
 private Anaform p;
 PictureBox ilkresim;


public void Kamera_Etkin(Anaform form, int W, int H, PictureBox ilkres)
{
  p = form;
 ilkresim = ilkres;
 kameraa = new WebCamCapture();
 kameraa.CaptureHeight = H;
 kameraa.CaptureWidth = W;
 kameraa.TimeToCapture_milliseconds = 1;
 kameraa.ImageCaptured += new WebCamCapture.WebCamEventHandler(kamera_resim);
} 
public void Start()
{
  kameraa.Start(0);
}
public void kamera_resim(object source, WebcamEventArgs e)
{
  ilkresim.Image = e.WebCamImage;
}
}

Kamera sınıfımızı oluşturduk şimdi anaform'da bir kamera nesnesi tanımlıyoruz ;

using System.Data;
      private Kamera k;

Daha sonra buton tıklama kısmında kamera nesnemize picturbox'ın özelliklerini yollayarak kamera görüntüsünü başlatıyoruz.

using System.Data;
    k = new Kamera();

    k.Kamera_Etkin(this, KameraResim.Width, KameraResim.Height, KameraResim);
    k.Start();

13 Mart 2010 Cumartesi

Yüz Tanıma Sistemi - 5

Sayısal Resim

Sayısal resim bir matrise benzetilebilir. Resmin en küçük elemanına piksel adı verilir. Alttaki resimde görüldüğü gibi M x N boyutunda matris olarak düşünürsek her bir pikselin değeri bir dizinin i ve j' inci terimi olarak ifade edilebilir. En basit durumda pikseller 0 veya 1 değerini alırlar. Bu piksellerden oluşan resimlere binary (ikili)
resim denir.

Monokrom, yani tek renkli resimlerde ise her eleman 0 ile 255 arasında değerler alır. Böylece her pikselin parlaklık değerinin farklı olması ile gri tonda bir resim elde edilir. En parlak nokta 255 beyaz, en karanlık nokta 0 siyah bunların arasındakiler ise gri renk değerlerini alırlar. Renkli resimler ise üç ana rengin karışımı ile oluşurlar. Bunlar kırmızı (Red) ,yeşil (Green) ve mavidir (Blue). Renkli resimler hakkında daha ayrıntılı bilgileri www.goruntuisleme.org adresinde diğer makalelerde bulabilirsiniz..

Kaynak :  http://www.goruntuisleme.org/

11 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 4

Kullanılan Kütüphaneler

Yüz tanıma sistemi geliştirirken kullanabileceğimiz birçok kütüphane var. Genel olarak en yaygını OpenCV kütüphanesi. OpenCV hem açık kaynak olması hem de performans olarak da iyi olduğundan biraz daha önde. Ayrıca Aforge,EmguCv,SharperCV,OpenCVDotNet gibi seçenekler mevcut.

OpenCV ana sayfası : http://opencv.willowgarage.com/wiki/

OpenCV kütüphanesini indirmek için (2.0 Sürümü)  : http://sourceforge.net/projects/opencvlibrary/

Ayrıca OpenCV konusunda BlueKid hocamızın sitesinden çok ayrıntılı bilgi edinebilir ve birçok örnek bulabilirsiniz.(http://derindelimavi.blogspot.com/)

OpenCvSharp C# ile kullanımı gayet kolay olan ve başarımı yüksek bir diğer kütüphane.

Başlangıç olarak kamera görüntüsünde yüz bulma işleminde ben Aforge framework'unu kullandım.Aforge framework'u de gayet kullanışlı ve birçok kütüphaneye sahip. Daha çok bilgi almak ve indirmek için sitesine bir göz atabilirsiniz : http://code.google.com/p/aforge/ .

Diğer kütüphanelere ulaşmak için;

SharperCV : http://www.cs.ru.ac.za/research/groups/SharperCV/

OpenCVDotNet : http://code.google.com/p/opencvdotnet/

The OpenCV Wrapper Project Page  :  http://www.iib-chemnitz.de/cvwrapper/index.php

EmguCV : http://www.emgu.com/wiki/index.php/Main_Page

7 Mart 2010 Pazar

Java Dilinde Küçük Bir Alıştırma

Yüz tanıma sistemine kısa bir ara.Bu aralar yeni yeni uğraşmaya başladığım java dilinde küçük bir örnek program.

Örneğimiz şöyle ;

1'den 100'e kadar sayıları ekrana yazacak bir program yazıyorsunuz. Fakat 3'ün katları için "Noqo", 5'in katları için "Nisqo" ve 3'e ve 5'e tam bölünen sayılar için de "NoqoNisqo" yazacaksınız. Örnek ekran çıktısı:

1
2
Noqo
4
Nisqo
Noqo
7
8
Noqo
Nisqo
11
Noqo
13
14
NoqoNisqo
16
……..
98
Noqo
Nisqo

Kodlarımız da şöyle ;


  public class NoqoNisqo {
    public static void main(String args[]) {

        for (int i = 1; i <= 100; i++)
        {
         if(i%15==0) System.out.print("NoqoNisqo\n");
         else
         if(i%3==0) System.out.print("Noqo\n");
         else
         if(i%5==0) System.out.print("Nisqo\n");
         else
         System.out.print(i+"\n");
        }
        
        System.out.println("Program Kapatiliyor...");
    }
}

Zamanla yine bu tür küçük java alıştırmalarına devam edeceğim. Belki yeni başlayan birilerine daha sonra yardımı olur...

5 Mart 2010 Cuma

Yüz Tanıma Sistemi - 3

Yüz Bulma ( Face Detection)

Yüz tanımaya geçmeden önce en önemli husus bir kamera görüntüsünde yada resim içinde yüz kısmının ayrıştırılması gerekmektedir.

İnsan yüzü kendine özgü rengi ile renk uzayında belli bir aralıkta temsil edilebilmektedir. Bu durum imgeler üzerinde de sadece ışıktan kaynaklanan bir yoğunluk değişimi göstermektedir. Ayrıca, insan teni ayırt edilebilir bir dokusal doygunluğa sahiptir.


Yüz bulma işlemi, öncelikle renk tonu ve doygunluk değerlerinden faydalanılarak ten süzgeci gerçeklenmesi ile başlamaktadır. Özgün imgeden elde edilen değerler bu konuda yetersiz kalmasına karşın negatif imgeden de elde edilen renk tonu ve doygunluk değerleri ile daha kararlı bir süzgeç yapısı oluşturmak gerekir
.
 0 ≤ H ≤ 0.942 , 0.1 ≤ S ≤ 0.69 , 0.25 ≤ Sn

Sn : Negatif imgeye ait doygunluk değeri

Ten süzgeci sonucunda elde edilen siyah-beyaz imge üzerinde iyileştirme amaçlı olarak önce morfolojik işlemler, daha sonra da bağlantısallığa bağlı olarak düzeltme işlemleri uygulanmaktadır. Bu işlemler sonucunda elde edilen imge üzerinde bağlı bileşenler etiketleme metodu uygulanmaktadır. Böylece imge içerisinde olası tüm ten bölgeleri birbirinden ayrıştırılmaktadır. Bu aşamada elde edilmiş imgelerin bir kısmında yüzde yoğunlaşmış ışık ve yansımalardan dolayı bir takım boşluklar oluşabilmektedir. Bunların giderilmesi amacı ile yüz olmaya aday ten bölgelerinin her biri için geliştirilen bir boşluk doldurma algoritması kullanılmaktadır. Bu algoritma basitçe örtülü bir ten bölgesi içerisinde kalan boşlukların ten bölgesine dahil edilmesi işlemidir. Bütün bu işlemlerden sonra ten bölgeleri içerisinden yüze ait olanları ayrıştırmak amacı ile bu bölgelerin her birinde yüz öğeleri aranmaktadır. Bu işlem için imgeye ait şiddet değerlerinden faydalanılmaktadır. Bu gri düzeyi imge üzerinde yatay ve dikey yönde kabartma metodundan faydalanılarak her bir yüz nesnesi tesbit edilebilmektedir. Kabartma metodu uygulanırken gürültüden meydana gelebilecek küçük değişimlerden etkilenmemek için imge üzerinde bazı iyileştirme teknikleri kullanılmaktadır.

İşin mantığını ODTÜ'den Kaan ÖZTEKİN,Mehmet BULUT ve Volkan ATALAY böyle açık ve güzel bir şekilde anlatmışlar.

Bu konuda elimde C# kodu mevcuttur kendi yazdığım isteyenlere yollayabilirim...

4 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 2

PCA Algoritması ve Özyüzler Metodu

PCA algoritması ve Özyüzler metodunun kısaca bir tarihçesine bakalım;

Öz yüzler yaklaşımı ilk olarak Sirovich ve Kirby (Eigenfaces, Principal Component Analysis, PCA, 1987) tarafından kullanılarak yüzü etkin bir şekilde göstermek için uygulanmıştır. Temel bileşen analizi olarak da bilinen Karhunen-Louve genişlemesine dayanmaktadır. Bu, bilgi teorisinde veriyi kodlama ve kodunu çözmede iyi bilinen bir tekniktir. Bu kişiler yüz resimleri gruplarından başlayarak bu resimlerin temel bileşenlerini hesaplamışlardır. Daha sonra da öz vektörün sadece küçük parçalarının ağırlıklı birleşimini kullanılarak yüz resmini yeniden oluşturmuşlardır. (Kirby ve Sirovich, 1990) bu metotlarını 115 yüz resmi veri tabanında test ettiler ve yaklaşık olarak %3 yanılma (hata) payıyla bir yüzü yeniden oluşturmak için sadece 40 öz vektörün yeterli olduğunu göstermişlerdir. Bundan kısa bir süre sonra yüzün simetrisini dikkate alarak (örneğin bütün yüzlerde gözler, burun v.s. aynı bölgede) orijinal metotlarını geliştirdiler. Algoritmayı 87 kişilik bir veritabanında test etmişlerdir.
(Turk ve Pentland, 1991) bu fikri daha da geliştirdi ve ilk tam otomatik sistemlerden birini üretmişlerdir. Kendi sistemlerini 16 kişinin 2500 resmi bulunan bir veri tabanında denemişlerdir. Resimler farklı bas uyumlarını, boyutları, ışıklandırma koşullarından seçilmiştir. Sistemleri, farklı ışıklandırmaya sahip resimler üzerinde %96, farklı bas uyumlarının da %85, farklı görüntü ölçeklerinde %64 doğru sınıflandırma sonuçları elde edilmiştir.

Geçmişte yapılan çalışmalar böyle.Şimdi bu metodu biraz açıklamaya çalışayım.

Görüntü tanıma uygulamalarında kullanılan klasik yöntemlerden temel bilesen analizi (PCA) yöntemini temel alan yöntemlerde yüksek dereceden özniteliklerle ilgilenilmez. PCA, veriyi düşük bir boyuta, verideki değişmeyi koruyacak şekilde eşleyen dikgen bir doğrusal dönüşümdür. İlk temel bilesen verideki en büyük değişme yönündedir ve ikinci bilesen bir sonraki en buyuk değişme yönündedir. PCA ile boyut indirme işleminde, ilk bir kaç temel bilesen kullanılarak verinin değişmesini en çok etkiyen özellikler alınır. Böylelikle daha az miktarda veri kullanılarak, taşınan bilginin büyük kısmı korunur. Sağladığı avantajlar, hızlı ve hesaplama acısından kolay olması. Fakat sınıf bilgisini kullanmadığını göz önüne alırsak, en fazla değişmenin olduğu bileşenlerin sınıflandırma problemi için doğru öznitelikleri içerdiğini garanti edemeyiz.
PCA algoritmasının 3 temel amacı vardır;
  • Verilerin boyutunu azaltmak
  • Tahminlerde bulunmak
  • Veri setini, bazı analizlerde görüntülemek
Özyüz elde ederken ise , öncelikle veritabanı içerisindeki n x m boyutundaki yüz resimleri tek boyutlu bir satır vektörüne çevrilir. n xm= N olduğunu düşünürsek, elimizde m tane n boyutlu yüz vektörü olur.Özyüzler elde etmenin matematiği ve pca algoritmasının matematiği hakkında elimde türkçeye çevirdiğim kaynak bulumaktadır. İsteyen olursa maille yollayabilirim. 

İşin algoritması ise şöyle ; 
Yüz tanımada özyüz yönteminin kullanım algoritması Şekil-1’de gösterilmiştir. İlk olarak orijinal resim eğitilecek resimler arasına eklenir ve bu E dizisi içinde tanımlanır. Daha sonra eğitim setindeki her resim için ağırlık hesabı yapılır ve W dizisine eklenir. X bilinmeyen resmi gözlemlenir, belirlenen görüntü için ağırlık hesabı yapılır ve Wx vektörü bulunur. Daha sonra Wx vektörü ağırlıkları bilinen diğer görüntülerle karşılaştırılır. Son olarak da doğru yüz görüntüsü olup olmadığının cevabının verilmesiyle algoritma sonlanır.


 
Şekil 1. PCA ve Özyüzler Yönteminin Algoritması

  Daha önce de söylediğim gibi PCA ve özyüzler metodunun matematiği ile ilgili elimde daha geniş türkçe kaynak bulunmaktadır. Formülleri yazmak biraz işkenceli olduğu için buraya yazamadım fakat isteyen olursa yollayabilirim...

Yüz Tanıma Sistemi - 1

Türkçe kaynağın bulunmasının oldukça zor olduğu bir konu. Bitirme tezi konum olduğu için bu konuda araştırmalarımı sürdürmekteyim. Elimden geldiğince çalışmalarımı ve araştırma sonuçlarını burada paylaşacağım.
Yüz tanıma sistemine geçmeden önce temel olması açısından biyometriyi açıklamak gerekir.Aslında Ahmet Kakıcı bu konuyu çok iyi açıklamış ve başlangıç olarak bana rehber olan bir yazı yazmış.
Peki yüz tanıma sistemi nedir? 

Yüz tanıma sistemi, yüzün karakteristik özelliklerini analiz ederek, farklı noktalar ve bölgeler arası biyometrik ölçümler yaparak veritabanı ile karşılaştırma yapar ve kişiyi tanımlar. Yüzün bu karakteristik özelliklerine düğüm noktaları da denir. Bu düğüm noktalarından bazıları şöyledir;
  • Burunun genişliği,
  • Göz çukurunun derinliği,
  • Elmacık kemiğinin şekli,
  • Çene kemiğinin uzunluğu
Bu düğüm noktaları rakamsal bir değerle kodlanır ve bu kodlara faceprint adı denir.

Tabiki bu sadece genel bir probleme bakış. Bu problemin birçok çözüm yolu var ve çıkacak da zamanla. Şimdi biz bugüne kadar gelen bazı yüz tanıma sistemi yöntemlerine kısaca bakalım.
Yüz Tanıma Sistemi Yöntemleri

Yüz tanıma yönteminde kişilerden örnek almak diğer yöntemlere göre çok daha zordur. Sıradan bir kamera ile çevreden birçok yüz görüntüsü alınabilir. Ancak burada başka bir sorun ortaya çıkmaktadır. Kamera tarafından alınan görüntüde tamamen yüze ait bölge bulunmalıdır. Bunun için yüz bulma algoritmaları kullanılmaktadır. Yüz bölgesi bulunduktan sonra işlemeler burada devam etmektedir.

Bu adımdan sonra değişik yollar izlenerek yüz tanıma işlemi yapılabilir. Bazı yöntemler yüzde bulunan oranları karşılaştırırken bazıları yapay sinir ağları(YSA) ile öğreterek tanıma yapmaktadır.
 Bu yöntemlerden bazıları ;
  • Doğrusal Diskriminant Analizi (LDA)
  • Evrimsel Arama Modeli (EP)
  • Bağımsız Bileşen Analizi (ICA) 

 ve daha birçok yöntem bulunmaktadır. Bunlar hakkında ayrıntılı bilgiyi zamanla ayrı ayrı paylaşacağım. Fakat genel bir bilgi edinilmek istenirse  yine Ahmet Kakıcı'nın bloguna bakılabilir.
    Genel Algoritma