Matlab ile Yüz Tanıma Uygulaması - 2 ( PCA Yöntemi ile Yüz Tanıma )


Ex Machina (2014)


PCA ile Yüz Tanıma

   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.
   Kodlar üzerinde bunu adım adım anlatacak olursak;
   1. Kovaryans matrisinin oluşturulması




m = mean(X,2); % Ortalama yüz görüntüsü bulunuyor.  m = (1/P)*sum(Xj's)    (j = 1 : P)
imgcount = size(X,2); %Sütun sayısından veritabanındaki resim sayısı saydırılıyor.
%%%%%%%% Ortalama Görüntü vektörü tüm görüntü vektörlerinden oluşturulduktan sonra  %%%%%%
A = [];
for i=1 : imgcount
    temp = double(X(:,i)) - m;
    A = [A temp];
end
L= A' * A; %L burada fi anlamına geliyor.

2. ϕ nin (λi, ųi) i=1,2, ...,n çifti bulunur. Burada λi i. özdeğer ųi ise λi ye karşılık gelen özvektördür.  
   
   det(λI-ϕ)=0 denklemi kullanılarak λ lar bulunur.
[V,D]=eig(L); % V : Özvektör matrisi  D : Özdeğerlerin matrisi 
3. En büyük r tane özdeğere karşılık gelen özvektörler bulunur.
4. En büyük özdeğere karşılık gelen özvektörler kullanılarak w izdüşüm matrisi bulunur.



L_eig_vec = []; %w izdüşüm matrisi bulunması 
for i = 1 : size(V,2) 
    if( D(i,i) > 1 )
        L_eig_vec = [L_eig_vec V(:,i)];
    end
end
5. w matrisi kullanılarak eğitim kümesindeki öznitelik vektörleri daha düşük boyutlu bir alt uzaya indirgenir.



eigenfaces = A * L_eig_vec; 
 
projectimg = [ ]; 
for i = 1 : size(eigenfaces,2) 
    temp = eigenfaces' * A(:,i); 
    projectimg = [projectimg temp];
end
6. Test Aşaması;
a) Xtest vektörü w izdüşüm matris kullanılarak hesaplanır.




b) Sınıflandırma aşağıdaki karar kuralına göre yapılr.




Xtest vektörü en küçük uzaklığı veren eğitim vektörünün ait olduğu sınıfa atanır.
test_image = test_image(:,:,1);
[r c] = size(test_image); 
temp = reshape(test_image',r*c,1); 
temp = double(temp)-m; 
projtestimg = eigenfaces'*temp;
euclide_dist = [ ];
for i=1 : size(eigenfaces,2)
    temp = (norm(projtestimg-projectimg(:,i)))^2;
    euclide_dist = [euclide_dist temp];
end
euclide_dist;
[euclide_dist_min recognized_index] = min(euclide_dist);
taninma = euclide_dist_min/1.0e+17
dbadi = recognized_index;
 
recognized_img = strcat(int2str(recognized_index),'.jpg')

Veri Tabanı Oluşturulması

Veri tabanımızda kullanılacak olan her bir kişinin 5 farklı resimleri alınıp, 5 kişinin toplam 25 adet resmi bulunmaktadır. Bu resimlerin PCA yöntemiyle test edilen resimleri bulmada kullanmaktadır.

Son Adım

    Test edilen resimde bulunan yüzlerin koordinatları alındıktan sonra bulunan resim sayısı kadar bir döngü olşturulur ve oluşturulan bu döngü içerisinde her bir resme aşağıdakiler işlemler uygulanır

  • Öncelikle koordinatları alınan yüz imcrop() fonksiyonu ile kesilir.
  • Daha sonra kesilen yüz veritabanımızdaki resimlerle aynı boyuta getirilir. Bu işlem için ise imresize() fonksiyonu uygulanır.
  • Daha sonra kesilip boyutlandırılan resim PCA uygulanıp en yakın benzerliğe sahip veritabanındaki resmin numarası alınır
  • Aynı zamanda Test resmimize en küçük uzaklığı veren değer alınır ve bu değer deneme yanılma yöntemiyle bulunan eşik değerinin üzerinde ise Taninamadi değeri word hücresine atanır
  • Alınan bu numaradaki kişiyle eşleşen word hücresine sırayla atanır.
  • Daha sonra test resmi üzerinde bulunan bütün yüzler insertObjectAnnotation() fonksiyonu ile çizdirilir ve resim imshow() fonksiyonu ile gösterilir.

Uygulanan Test Resimlerinden Elde Edilen Sonuçlar ve Yorumlar

1. Deneme

Sonuç: Veritabanında kayıtlı olan Hasan Coşkunu bulurken, kayıtlı olmayan 1. sıradaki arkadaşa tanınmadı değeri atandı.

2. Deneme

Sonuç: Veritabanında kayıtlı olan üç kişiyi doğru bir şekilde buldu.

3. Deneme

Sonuç: Veritabanında kayıtlı olan kişiyi doğru bir şekilde buldu.

Sonuç

Projede tanınamadı kısmı tam olarak verimli bir şekilde çalışmasa da veritabanındaki kişileri tanımada yüksek bir orana sahip bir proje oldu.

Kodlar ve Hazır Veritabanı Resimleri

  • Projenin kodlarına buradan ulaşabilirsiniz. 
  • Projedeki hazır Veritabanı ve Test resimlerine buradan ulaşabilirsiniz.
NOT: Yazının 1. bölümüne buradan ulaşabilirsiniz.

Yorumlar

  1. merhaba
    Read me kısmındaki dediğiniz kısımları değiştirdim.
    ama programı yazdığımda surekli hata veriyor:(

    YanıtlaSil
    Yanıtlar
    1. Nasıl bir hata verdiğini söylerseniz belki yardımcı olabilirim.

      Sil
    2. merhaba
      bu projeyi hog ile yaptık biz. teşekkürler yine de.
      bunun dışında bir resimde arabaların sınıfını ve markasını detekt edebilen bir programı hangi yolları izleyerek yazabilirim? konu hakkında bilginiz var mı?

      Sil
  2. matlabta yaptığınız bu projeyi pythonda yapabilir misiniz? içinde yüz bulunan bir resmi kesip sonra bu resmi veritanındaki yüzlerle karşılaştırıp yüzün kime ait olduğunu bulan bir proje yapabilir misiniz?

    YanıtlaSil
    Yanıtlar
    1. Evet Python'la OpenCV vb kütüphaneleri kullanarak rahatlıkla yapılabilir ki bir ara kodları Python ortamına aktarmak aklımda vardı ama şu an için buna malesef vaktim yok.

      Sil
  3. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  4. merhaba

    kodunuzu çalıştırdım ancak eşleştir kısmında ilk if de ne varsa onu yazıyor. nedeni ne olabilir acaba
    teşekkürler

    YanıtlaSil
  5. Error in Untitled3 (line 15)
    [taninma, dbadi, recog_img] = pcayontemi(datapath,I2);
    sürekli bu blokta hata veriyor sebebi nedir acaba

    YanıtlaSil
  6. veritabanında 30 resim 6 ayrı kişi olmak zorunda mı sadece 2 resim ile veritabanı oluşturup düzenledim hata verdi

    YanıtlaSil
  7. Error in Untitled3 (line 15)
    [taninma, dbadi, recog_img] = pcayontemi(datapath,I2);
    hata bu blokta

    YanıtlaSil
  8. Örnek koyduğunuz test resimlerinden başka bir resimle çalıştırdığım zaman hata veriyor neden acaba ?

    YanıtlaSil
    Yanıtlar
    1. Hata vermedi bende ama tanınmadı uyarısı geliyor

      Sil
  9. Merhaba aynı resimden kropladıgım parçaları tanınmadı olarak gösteriyor. "tanim < 0.0326 " bu değeri hangi yönde değiştirmeliyim? Bulunamamasının nedeni bu aralık olabilir mi?

    YanıtlaSil

Yorum Gönder

Popüler Yayınlar