TensorFlow ile Yüz Tanıma Sistemleri Nasıl Geliştirilir

0 144

Derin öğrenme ile duygu, yaş ve cinsiyet, etnisite gibi konuların analizi hali hazırda yapabiliyoruz. Bu gibi çalışmaları genellikle konvolüsyonel nöral ağlar ile gerçekleştiriyoruz. Temel ihtiyacımız tespit etmek istediğimiz sınıfa ait örneklerin beslenmesine dayanıyor. Örneğin yüz resimlerinden duygu analizi yacaksak yüz resimleri girdimiz iken mutlu, mutsuz ya da sinirli olmak çıktımızı belirtiyor ve nöral ağ bu girdi ve çıktı arasındaki ilişkiyi öğreniyor. Yüz tanıma teknolojilerinde ise işleyiş biraz daha farklı. Bu yazıda ana hatlarıyla TensorFlow ve Keras kullanarak nasıl bir yüz tanıma sistemi geliştireceğimize odaklanacağız.

Jason Bourne
Jason Bourne

Yüz tanıma ile gelen zorluk

100 kişiden oluşan bir topluluk için bir yüz tanıma sistemi geliştireceğinizi varsayalım. Her bir personaya ait de 10 resimden öğrenmesini bekleyelim. Nöral ağın girdisi yüz resimleri çıktısı ise 100 kişiden hangisinin olduğu olabilirdi. Ancak topluluğa eklenecek 101. kişinin olması durumunda sinir ağının çıktısının da 101 değerden oluşması gerekecek. Dolayısıyla ağ yapımızı topluluğa eklenecek her bir kişi için değiştirmemiz ve yeniden eğitmemiz gerekecektir. Benzer şekilde zaman geçtikçe eğitimi yaptığımız veri setindeki resimler eskiyecek, ağ belki de genç halinizin fotoğrafından yaşlı halinizi tanıyamayacaktır. Ya da saçını boyatan, kısaltan ya da uzatan kişiler olması durumunda neyle karşılaşacağımızı bilemiyoruz.

Tek seferde öğrenme

Yüz tanıma teknolojilerinde genel kabul tek seferde öğrenmeye (one shot learning) dayanmaktadır. Bazı kaynaklar bu yaklaşıma yüz tanıma (face recognition) yerine yüz doğrulama (face verification) da demektedir.

Size ait bir fotoğrafın bir konvolüsyonel nöral ağ ile özeti (embedding) çıkarılacak, güncel halinizin özeti ile karşılaştırılacak, benzerlikleri bir eşik değerden daha düşükse sizin kimliğiniz ile eşleştirilecektir.

Bu şekilde 100 kişilik bir topluluk için yüz tanıması yapmak istiyorsanız bu 100 kişinin yüz resimlerinin özeti nöral ağımız ile çıkarılacak ve bir veri tabanına kaydedilecek, topluluğa eklenecek 101. kişinin olması halinde sadece bu yeni kişinin yüzünün özeti veri tabanına eklenecek ama nöral ağımız aynı kalacaktır.

Benzerlik kontrolü

Sinir ağımızın çıktısını çıktı boyutunda bir vektör olarak ifade edebiliriz. Örneğin ağ modelimize 224x224x3 boyutunda resimler beslerken 2622 boyutunda çıktılar alıyorsak özet aslında 2622 boyutunda bir vektördür. Dolayısıyla iki yüz fotoğrafını bizler aslında iki vektör olarak ifade ettik.

Vektörler hatırlayacağınız gibi yönü ve uzunluğu olan niceliklerdir. İki vektörün ne kadar benzer olduğunu aralarında açı yani kosinüs benzerliği (cosine similarity) veya aralarındaki uzaklık yani Öklid uzaklığı (Euclidean distance) ile ifade edebiliriz.

Benzerlik kavramları

İki boyutlu uzayda 2 noktanın arasındaki uzaklığı aşağıdaki şekilde hesaplayabiliyoruz.

Öklid uzaklığı

Bunu n boyutlu uzaya yansıtırsak da bu formüle sadık kalmış oluruz. İşlemi numpy kütüphanesi ile gerçekleştirirsek radikal şekilde hızlanacaktır. Burada source_representation ve test_representation girdilerinin n boyutlu birer vektör olduklarını göz önünde bulundurun.

Kosinüs benzerliğinin formülü ise aşağıdaki şekilde ifade edilmektedir.

Kosinüs benzerliği

Bunu da numpy ile aşağıdaki şekilde kodlayabiliyoruz.

Yüz tanıma modelleri

Yüzün özetini çıkarmak için kendi modelinizi eğitebileceğiniz gibi Oxford Üniversitesi Visual Geometry Group (VGG) tarafından VGG-Face, Google tarafından Facenet ve Carnegie Mellon Üniversitesi tarafından OpenFace modelleri en doğru yüz özetlerini çıkaracak şekilde optimize edilmiştir. Aralarında en başarılı model VGG-Face iken çok kompleks yapısı sebebiyle gerçek zamanlı çalışmalarda doğruluktan feragat edilip OpenFace tercih edilebilir.

VGG-Face mimarisi
VGG-Face mimarisi

VGG-Face mimarisiVGG-Face 224x224x3 boyutunda girdi beklerken (burada 3 renkli resim olması sebebiyle RGB kodlarını ayrı ayrı ifade etmektedir), 2622 boyutlu bir çıktı vektör üretmektedir. Modeli Keras kullanarak aşağıdaki şekilde dizayn edebiliriz.

Önceden eğitilmiş ağırlıklar Oxford VGG tarafından matlab formatında paylaşılmıştır. Ağırlıkları Keras formatında (.h5) dönüştürerek kendi Drive hesabımda paylaştım. Aşağıdaki şekilde model ağırlıklarını yükleyebilirsiniz. Son ağırlıklar siamese network kullanılarak eğitilmiştir.

Sonrasında iki ayrı resmin özetini çıkarmamız gerekecek.

Yüz doğrulama

Özetlediğimiz iki resmin uzaklığı bir eşik değerinden düşükse bunlar aynı kişilerdir diyebileceğiz. Testlerimde cosinüs benzerliğinin daha doğru sonuçlar ürettiğini görmem sebebiyle burada bunu kullandım. Sizler öklid uzaklığını tercih edebilirsiniz.

Testler

Test sonuçları oldukça tatminkar görünüyor.

Angelina Jolie – Jennifer Aniston

Gerçek zamanlı uygulamalar

Şu ana kadar anlattığımız kısmı gerçek zamanlı olarak da çalıştırabiliriz. Bundan önce kesilmiş yüz resimlerini modele beslerken gerçek zamanlı uygulamalarda OpenCV’nin yüz algılama (face detection) için geliştirdiği haar cascade modülünü kullanıyoruz.

Öte yandan VGG-Face yerine Facenet kullanmamız durumunda programın daha hızlı çalıştığını görebilirsiniz.

OpenFace de Facenet gibi gerçek zamanlı uygulamalar için daha uygundur.

Öte yandan VGG-Face kullanılmaması halinde başarıdan feragat edileceğini unutmamakta fayda var.

Son bir kaç söz

Bu yazıda yüz tanıma teknolojisinin arkasındaki yapıyı koda dökmeye çalıştık. Yüz tanıma teknolojisi geleneksel derin öğrenme uygulamalarındaki yaklaşımlardan farklı bir yoğurt yiyişi gerektirmekte.

Bu yazı boyunca yaptığımız uygulamanın koduna buradan erişebilirsiniz. Bunun dışında uygulamayı VGG-Face için yapmış olsak da Facenet ve OpenFace alternatiflerini de incelemenizi şiddetle tavsiye ederim.

Referanslar

[1] VGG-Face ile Yüz Tanıma

[2] Facenet ile Yüz Tanıma

[3] OpenFace ile Yüz Tanıma

Yorum yaz

Email adresiniz yayınlanmayacaktır.