Bir One-Shot Learning Denemesi

One-Shot learning her 1 class için 1 veya 2 örnek olduğu halde tahmin yapılması işlemidir. Cep telefonlarımızdaki yüz tanıma sistemlerinin bazıları one-shot learning metodu ile çalışmaktadır. Gerçekten de kişiyi tek bir fotoğrafından geri çağırmak insansı bir özellik de olduğundan gerçekten ilginçtir.

One-Shot denemesini VGG-Face isimli model ile gerçekleştireceğim. Siamese Network kullanmak yerine direkt olarak classification algoritmaları ile sonuca ulaşmaya çalışacağım. Öncelikle VGG-Face kütüphanesini indirelim:

Ardından resimlerimizi seçmemiz gerekmektedir ben 5 adet ünlünün resimlerini seçtim. Ünlüler sırasıyla:

  1. Angelina Jolie
  2. Lebron “the King” James
  3. Leonardo Dicaprio
  4. Marion Cotillard
  5. Tom Hanks

Hepsinin bir adet fotoğrafını google aracılığı ile bulduktan sonra python üzerinden plt.imread() ile okumaya başladım ve ilginç bir şekilde lebron fotoğrafında 4 adet kanal olduğu gerçeği ile karşılaştım. Near Infrared midir nedir yahu derken opencv ile bir okuyayım dedim ve BGR olarak 3 kanallı bir şekilde okudu. Okuma işlemini opencv ile yaptım sonuç olarak.

Fotoğrafların linkleri şuradadır:

Evet 2 tanesi maskeymiş zaten. İlginç bir veri seti tercihi oldu.

Ardından Vgg Faces’i kullanılabilir hale getirelim Direkt olarak Github’taki kod:

k,224,224,3 şeklindeki inputları beklemekte Vgg Faces modeli. Şimdi Fotoğraflarımızın Preprocessing işlemine başlayalım. Öncelikle yüzleri kesmek (crop) için Adam Geitgey’in Face Recognition kütüphanesi kullanalım. Okumanın ardından şu kod ile kesme işlemini tamamlıyoruz:

Ardından fotoğrafların istenen boyuta 224×224'e dönüştürülmesi gerekmektedir. Şu şekilde gerçekleştirmekteyiz belirtilen işlemi:

Son olarak Modelimizin istediği (birsey, 224, 224, 3) formatına getirmek için reshape’i kullanıyoruz:

Artık Vgg Faces tarafından kullanılabilir bir hale gelmiştir. Fonksiyona çevirirsek:

Ardından modelimize bütün fotoğrafları veriyoruz:

reshape etme sebebimiz modelin çıktısının (1,512) şekilde gelmesidir. Aslında bildiğiniz tek boyutlu array olmasına rağmen böyle dönmektedir. Birden fazla şeyin predict edileceği düşünülerek yapılmıştır ki oldukça da mantıklıdır.

Ardından veri-setimizi hazırlıyoruz:

Evet veri setimizi hazırladıktan sonra artık asıl classification işlemine geçebiliriz. KNN hem algoritmasını kullandım çünkü kullanması ve geliştirmesi oldukça kolay.

Ve evet ardından denemelerimizi yaptık ve genellikle doğru tahminler ile karşılaştık direkt olarak belirtilen kişileri ve Tabi ki Türk Leonardo Arda’yı kullandığımızda. Ancak farklı kişilerin fotoğraflarında ilginç sonuçlar ile karşılaştık. Örnek vermek gerekirse her Afrikalı Amerikalı’ya Lebron James yanıtını aldık. Yanı sıra profil fotoğrafımı tahmin etmesini istediğimde:

Marion Cotillard ile yanıtını aldım ki duruş benzerliğinden kaynaklı bir durum olduğu aşikar.

Yine de ulaşılan sonuçlar hiç kötü görünmemekte ancak 1-nn yapısı gereği olasılıksal bir değer (predict_proba) üretemediği için illa bir yanıt vermek zorunda kalıyor ve bu durum sistemi güvenilmez kılıyor.

Yerine Linear Svm kullanırsak:

Svm’de kullandığımız veri yetersiz olduğu için olasılık değerlerini birbirine çok yakın verdi ancak verdiği sonuçlar arasında Knn’den farklı sonuç neredeyse yoktu.

Birde veri sayısını çok önemsemeyen Decision Tree ile deneme yaparsak:

Decision Tree ile fotoğrafımı Leonardo Di Caprio’ya benzettim. Ancak benzerlik işlemi için daha özel bir algoritmanın (Siamase Network) da kullanılması gerektiğini anladım ancak yine de ulaşılan sonuçlar hiçte yabana atılacak cinsten değildi. Daha karmaşık bir çalışma:

Nearest Celebrity Face using Deep Learning

Kaynaklar

https://github.com/rcmalli/keras-vggface https://github.com/soumik12345/Nearest-Celebrity-Face https://github.com/ageitgey/face_recognition https://en.wikipedia.org/wiki/One-shot_learning https://docs.opencv.org/master/d6/d00/tutorial_py_root.html

Originally published at http://anilkaynr.wordpress.com on March 15, 2020.

Computer Engineer,Sociologist, CSE Master Student

Computer Engineer,Sociologist, CSE Master Student