DeepFace: Python için Yüz Tanıma ve Demografi Analizi İskeleti
deepface, python için geliştirilmiş basit bir yüz tanıma ve demografi analizi (yaş, cinsiyet, duygu durumu ve ırk/etnisite) yazılım iskeletidir. Bir kaç satır kod yazarak yüzsel analizleri gerçekleştirmenizi sağlamaktadır. Bu sayede yazılım mühendisliği ve makine öğrenimi çalışmaları arasındaki boşluğun doldurulması amaçlanmıştır.
Kurulum
İskeletin kurulumu için en kolay yöntem PyPI üzerinden indirilmesidir.
1 2 3 4 5 |
!pip install deepface |
Alternatif olarak kaynak kodu doğrudan GitHub reposundan indirerek kurulumu gerçekleştirebilirsiniz.
Yüz Tanıma
Yüz tanıma işlemi için deepface arayüzünün sağladığı doğrulama (verify) fonksiyonunu kullanacağız.
1 2 3 4 5 6 7 |
from deepface import DeepFace result = DeepFace.verify("img1.jpg", "img2.jpg") print("Is verified: ", result["verified"]) |
Modern yüz tanıma sistemleri 4 adımdan oluşmaktadır: yüzü algıla, yüzün hizalaması, yüz resminin vektör olarak ifade edilmesi ve doğrulama. deepface tüm bu ortak adımları arkaplanda halletmektedir.
Doğrulama fonksiyonunun her çağırılması arkaplanda maliyetli bir işlem olan bir yüz tanıma modelini ayağa kaldırmaktadır. Sıralı şekilde çok sayıda yüzü doğrulama ihtiyacınız varsa yüzleri dizi olarak beslemeniz halinde operasyon ciddi şekilde hızlanacaktır. Bu şekilde kompleks yüz tanıma modelleri tek bir kez kurulacaktır.
1 2 3 4 5 6 7 8 9 |
dataset = [ ['dataset/img1.jpg', 'dataset/img2.jpg'], ['dataset/img1.jpg', 'dataset/img3.jpg'] ] result = DeepFace.verify(dataset) |
Yüz tanıma modelleri
İskelet bugün için en güçlü yüz tanıma modelleri olan VGG-Face, Google FaceNet, OpenFace ve Facebook DeepFace modellerini içermektedir. Varsayılan konfigürasyon model belirtilmemesi halinde VGG-Face ile çalışmaktadır. Kullanmak istediğiniz baz modeli doğrulama fonksiyonunda parametre olarak belirtebilirsiniz.
1 2 3 4 5 6 7 8 9 |
vggface_result = DeepFace.verify("img1.jpg", "img2.jpg") #varsayılan VGG-Face #vggface_result = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "VGG-Face") facenet_result = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "Facenet") openface_result = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "OpenFace") deepface_result = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "DeepFace") |
Başarı ve hız çalışan modele göre değişiklik gösterecektir. Örneğin OpenFace diğer modellere göre daha düşük başarı gösterirken (%1 – %2 aralığında) model kompleksitesinin düşüklüğü (VGG-Face’e göre 38 kat daha ufak) sebebiyle çok hızlı çalışmaktadır. Bu sebeple gerçek zamanlı çalışmalarınızda OpenFace kullanılabilecekken batch işlemlerinizde diğer modelleri tercih edebilirsiniz.
Benzerlik metriği
Yüz tanıma modelleri yüz resimlerini vektör olarak ifade etmekten sorumludur. İki farklı yüz resminin aynı kişiye ait olup olmadığı ise bu vektörlerin arasındaki benzerliğine göre karar verilmektedir. Vektörlerin benzerliğine kösinüs benzerliği, öklid uzaklığı, l2 normu gibi farklı metrikler ile karar verilebilir. Varsayılan konfigürasyon metriğin belirtilmemesi halinde kosinüs benzerliği karar vermektedir. Alternatif olarak benzerlik metriğini doğrulama fonksiyonunda parametre olarak belirtebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 |
result_cosine = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "VGG-Face" , distance_metric = "cosine") result_euclidean = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "VGG-Face" , distance_metric = "euclidean") result_euclidean_l2 = DeepFace.verify("img1.jpg", "img2.jpg", model_name = "VGG-Face" , distance_metric = "euclidean_l2") |
Yüz özelliği analizi
deepface ayrıca yaş, cinsiyet, duygu durumu (kızgın, korkmuş, doğal, üzgün, tiksinmiş, mutlu ve şaşırmış) ve ırk / etnisite (asya, siyah, beyaz, orta doğulu, hintli, latin) gibi yüz özelliklerinin analizini de sunmaktadır. deepface arayüzünün sunduğu analiz (analyze) fonksiyonu ile bu işlemi gerçekleştireceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from deepface import DeepFace #varsayılan kullanım tüm özelliklerin bulunmasını sağlayacaktır demography = DeepFace.analyze("img4.jpg") #üst satır ile aynı şekilde çalışacaktır #demography = DeepFace.analyze("img4.jpg", ['age', 'gender', 'race', 'emotion']) #çoklu yüzün aynı anda analizi #demographies = DeepFace.analyze(["img1.jpg", "img2.jpg", "img3.jpg"]) print("Yaş: ", demography["age"]) print("Cinsiyet: ", demography["gender"]) print("Duygu: ", demography["dominant_emotion"]) print("Irk/etnisite: ", demography["dominant_race"]) |
Gerçek Zamanlı Analiz
deepface’i gerçek zamanlı videolar için de kullanabilirsiniz. DeepFace arayüzü altındaki stream fonksiyonunu çağırdığınız zaman uygulama webcam’inize erişerek yüz tanıma ve yüz analizini beraber uygulayacaktır. Stream fonksiyonu, yüz resimlerinden oluşan klasörü girdi olarak göndermenizi beklemektedir. Doğrulama adımında da olduğu gibi VGG-Face varsayılan yüz tanıma modeli olarak kullanılmaktadır. Videoda ardı ardına 5 pencerede yüz algılandığı takdirde 5 sn süreli analiz donarak ekranda gösterilecektir.
1 2 3 4 5 6 |
from deepface import DeepFace DeepFace.stream("/user/database") |
Yüz tanıma her ne kadar tek seferde öğrenmeye (one-shot learning) dayansa da bir kişiye ait birden fazla resmi veri tabanınızda bulundurabilirsiniz. Klasör yapısını aşağıdaki şekilde düzenlemeniz gerekmetkedir.
1 2 3 4 5 6 7 8 9 10 11 |
user ├── database │ ├── Ahmet │ │ ├── Ahmet1.jpg │ │ ├── Ahmet2.jpg │ ├── Baris │ │ ├── Baris.jpg |
Bu arada stream fonksiyonunu çağırırken windows işletim sisteminde de ters slash ( \ ) yerine düz slash ( / ) karakterini göndermeniz gerekmektedir.
1 2 3 4 5 |
DeepFace.stream("C:/User/Sefik/Desktop/database") |
Workshop
Her ne kadar deepface bir yüz tanıma üretim hattındaki tüm istasyonları kapsasa da arkaplanda neyin nasıl olduğunu merak ederseniz aşağıdaki workshop’ta bu konulara değindik.
Büyük Ölçekli Yüz Tanıma
Yüz tanıma işlemi çoklu sayıda yüz doğrulama işleminin uygulanmasına dayanmaktadır ve her bir yüz doğrulama işlemi bir CNN’in çağırılması anlamına gelmektedir ki bu da maliyetli bir işlemdir. Yine de bazı hacking yetenekleri uygulayarak bir resmi büyük bir veri tabanı içerisinde hızlıca bulabiliriz.
Webinar: Yazılım Mühendisliği ile Makine Öğrenimi Arasındaki Boşluğu Doldurmak
Lisans
Yazılım iskeleti MIT ile lisanslansa da kullanılacak referans modeller farklı tiplerde lisanslanmıştır. Dolayısıyla referans modelin lisansı iskelete miras olarak geçmektedir.
Örneğin VGG-Face ticari olmayan creative commons ile lisanslanmıştır. Öte yandan OpenFace Apache License 2.0 ile, Facebook DeepFace ve Google FaceNet ise MIT ile lisanslanmıştır. Dolayısıyla VGG-Face hariç diğer yüz tanıma modelleri ticari kullanıma izin vermektedir.
Bitirirken…
Yazılım iskeleti tamamen açık kaynaklı olup kaynak koduna GitHub üzerinden ulaşabilirsiniz. Çalışmayı yıldızlayarak destek verebileceğinizi lütfen unutmayın.
merhabalar kolay gelsin size.
Gerçek zamanlı da gösterdiğiniz şekilde diğer resimlerde de aynı çıktıyı nasıl alabilirrim. yani resmin özerin de nasıl gösterebilirrim.
Benim çıktım Şu şekilde çıkıyor:
{‘age’: 32.26633552210522,
‘dominant_emotion’: ‘neutral’,
‘dominant_race’: ‘middle eastern’,
’emotion’: {‘angry’: 4.419447109103203,
‘disgust’: 0.00012736104508803692,
‘fear’: 5.354632064700127,
‘happy’: 0.3518438432365656,
‘neutral’: 73.14058542251587,
‘sad’: 16.620807349681854,
‘surprise’: 0.11255834251642227},
‘gender’: ‘Man’,
‘race’: {‘asian’: 0.014853122411295772,
‘black’: 0.07524138782173395,
‘indian’: 22.850976884365082,
‘latino hispanic’: 10.078267008066177,
‘middle eastern’: 60.04456877708435,
‘white’: 6.936091929674149}}
bunun yerine sizin yaptıgınız gibi resmin özerinde daha derli topu çıktı yı nasıl alabilirrim.
yalnız stream fonksiyonu çağırırsanız görebilirsiniz bunu. verify ve analyze fonksiyonları json objeleri döner.