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ı
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.
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.
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ç: 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.
merhaba
YanıtlaSilRead me kısmındaki dediğiniz kısımları değiştirdim.
ama programı yazdığımda surekli hata veriyor:(
Nasıl bir hata verdiğini söylerseniz belki yardımcı olabilirim.
Silmerhaba
Silbu 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ı?
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ıtlaSilEvet 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.
SilBu yorum yazar tarafından silindi.
YanıtlaSilmerhaba
YanıtlaSilkodunuzu ç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
Error in Untitled3 (line 15)
YanıtlaSil[taninma, dbadi, recog_img] = pcayontemi(datapath,I2);
sürekli bu blokta hata veriyor sebebi nedir acaba
veritabanında 30 resim 6 ayrı kişi olmak zorunda mı sadece 2 resim ile veritabanı oluşturup düzenledim hata verdi
YanıtlaSilError in Untitled3 (line 15)
YanıtlaSil[taninma, dbadi, recog_img] = pcayontemi(datapath,I2);
hata bu blokta
Örnek koyduğunuz test resimlerinden başka bir resimle çalıştırdığım zaman hata veriyor neden acaba ?
YanıtlaSilHata vermedi bende ama tanınmadı uyarısı geliyor
SilMerhaba 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