FaceNet ile Sherlock ve John’u tanıyalım !
Son zamanlarda derin öğrenmenin görüntü problemleri üzerinde elde ettiği başarılar, yüz tanıma konusuna da yansıdı. Günümüzde yüz tanıma, kişiselleştirilmiş hizmetlerden tutun da kolluk kuvvetlerinin toplu mekanlarda belirli kişileri aramasına kadar birçok alanda insan hayatına girdi bile. Önümüzdeki dönemde de birçok sektör, yüz tanıma teknolojisinin getirdiği değişimlerden payına düşeni alacağa benziyor. [1] Gelişmelerin yanı sıra, bir yandan da bu teknoloji hakkında kişisel hakların korunması ve etik açısından tartışmalar devam ediyor. Bazı haber kanallarından yüz tanıma teknolojisinin yasaklandığını ya da kısıtlandığını duymuşsunuzdur bile. [2] Tüm bu gelişmeler ve tartışmalar devam ederken, gelin biz bu yazıda yüz tanıma probleminin çözümü için Florian Schroff, Dmitry Kalenichenko ve James Philbin tarafından geliştirilmiş FaceNet derin öğrenme mimarisinin nasıl çalıştığını anladıktan sonra, onu kullanarak en sevdiğim dizinin karakterleri olan Sherlock Holmes ve John Watson’ı tanıyan bir uygulama yapalım.
FaceNet
FaceNet, yüz tanıma, doğrulama ve kümeleme gibi görevleri gerçekleştirmek için başarılı bir mimari sağlar. [3] 140 milyon parametreden oluşan FaceNet, girdi olarak aldığı yüz resmini en iyi şekilde ifade etmeye çalışan 128 boyutlu bir özellik vektörü üretir.
Şekil 1'de resimlerden elde edilen vektörlerin benzerliği gösterilmektedir. Görüldüğü üzere benzer resimlerin özellik vektörlerinin benzerliği yüksek iken farklı resimlerin özellik vektörlerinin benzerliği düşüktür. FaceNet, en iyi özellik vektörünü üretebilmek için üçlü kayıp (triplet loss) ile birlikte evrişimli sinir ağlarını (CNN) kullanır. [4]
Bilindiği gibi bir derin öğrenme modeli eğitilirken öğrenmenin sağlanabilmesi için ileri yayılım sonucunda bir yitim (loss) değeri hesaplanır. Bu yitim değeri kullanılarak geri yayılım algoritması ile ağırlıklar güncellenir. Dolayısıyla Ağ’ın başarılı bir şekilde eğitilebilmesi için yitim fonksiyonu kritik bir öneme sahiptir. FaceNet mimarisinde kullanılan üçlü kayıp yitim fonksiyonu hesaplanırken veri kümesinden faklı üçlü gruplar seçilir ve üçlü kayıp değeri bu 3 resim üzerinden hesaplanır. Belirlenen bu üç resmin biri referans resim (anchor) iken, diğer ikisi referans resme benzeyen (pozitif) ve benzemeyen (negatif) resimlerdir. [4]
Yitim değeri referans resim ile pozitif olarak belirlenmiş resim arasındaki benzerlik arttıkça küçülürken, negatif olarak belirlenmiş resim ile arasındaki benzerlik arttıkça büyür. Bu sayede Şekil 2'de de gösterildiği üzere öğrenme sonucunda referans resim vektörü pozitif resim vektörü ile birbirlerine benzerken negatif resim vektöründen farklılaşmaktadır. Böylece eğitimi tamamlandıktan sonra FaceNet, girdi olarak aldığı resmi en iyi temsil eden özellik vektörünü çıkarmayı öğrenmiş olur.
Bu bilgiler ışığında, iki yüzün aynı kişiye ait olup olmadığını tespit edeceğimizi varsayalım. Bu durumda Şekil 4'te verildiği gibi girdi olarak aldığınız yüz ile veri tabanınızdaki yüz resminin FaceNet ile özellik vektörlerini elde etmemiz gerekir. Daha sonra bu iki vektörün benzerliğini bir metrik kullanarak ölçeriz. Benzerlik değeri daha önceden belirlediğimiz eşik değerinin altında ise bu durum kişilerin aynı kişi olduğu, üzerinde ise farklı kişi olduğu anlamına gelir. [6]
Gelin şimdi bu bilgileri kullanarak bir uygulama yapalım 👇
⚡️Uygulama
Belirtildiği üzere Sherlock Holmes dizisinden alınmış bir video üzerinde Sherlock ve John’u tanımaya çalışacağız. Uygulamanın temel adımları ve kullanılan araçlar Şekil 4'te gösterilmiştir.
Şekil 4'te görüldüğü üzere girdi olarak alınan görüntüde OpenCv kütüphanesi yardımıyla yüz tespiti ve gerekli ön işlemeler yapılır. Bu ön işlemeler bu yazının konusu olan uygulama için sadece ilgili yüzün fotoğraftan kesilerek FaceNet modele uygun boyutlara getirilmesidir.
Gerekli ön işlemeler ilk olarak veri tabanındaki Sherlock ve John’un resimleri üzerinde yapılır. Elde edilen uygun girdiler FaceNet modele verilerek özellik vektörleri elde edilir. Bu sayede videodan yüzleri elde edilecek kişilerin karşılaştırılacağı uygun veri tabanı hazırlanmış olur.
Daha sonra video üzerinde her bir frame’deki yüzler belirlenir ve gerekli ön işlemler yapılarak FaceNet modele girdi olarak verilirler. Elde edilen vektörlerin veri tabanındaki vektörler ile benzerliği, öklid metriği kullanılarak ölçülür. En yakın benzerliğe sahip olan vektör belirlenir. Bu benzerlik önceden belirlediğimiz 12.65'in altında ise veri tabanındaki vektörün ait olduğu kişinin, videoda gördüğümüz kişi olduğu kabul edilir. Ve hemen yüz bölgesi bir kare içerisine alınarak üzerine kişinin ismi yazılır.😃 Değil ise kişiyi tanımadığınızı söyleyebilirsiniz.
Projenin çıktısı aşağıda gösterilmektedir. 👇
İlgili projenin kodlarını buradan inceleyebilirsiniz.
Önceden eğitilmiş FaceNet modeli buradan indirebilirsiniz. [5]
Uygulama Nasıl Çalıştırılır ❔
Uygulamayı çalıştırabilmek için, ilgili linkten projeyi indirdikten sonra arşivden çıkarınız. Daha sonra indirdiğiniz modeli Şekil 4'te gösterilen Model dizinin içerisine yerleştiriniz.
Herhangi bir ide (Spider, Pycharm, vb.) yardımıyla main.py dosyasını çalıştırarak uygulamayı başlatabilirsiniz.
İsterseniz arama çubuğundan cmd yazarak komut satırını açınız. Ardından python boşluk main.py dosyasının yolunu yazıp enter’a basarak uygulamayı çalıştırabilirsiniz.
Örnek : python C:\Users\Desktop\FaceNet-Face-Recognition\main.py
Kendi istediğim kişileri bu uygulama ile tanıyabilir miyim ❔
Dilerseniz veri tabanına yeni klasörler ekleyip, uygulamanızda yeni kişileri tanıyabilir ya da yüz tespiti hassaslığı ile oynamak için eşik değerini değiştirebilirsiniz.
Yeni kişileri tanıyabilmek için Database klasörü içerisine kişilerin isimleriyle klasörler açmalı ve yüzleri belirgin olan fotoğraflarını eklemelisiniz. Daha sonra bu klasörlerin isimlerini config.py dosyası içindeki Person listesine ekledikten sonra ilgili test videonuzu da test.mp4 adıyla Test_Video dizinine koymanız yeterli.
Eşik değerini değiştirmek için config.py dosyası içindeki Thresold değerini değiştirebilirsiniz.
Soru ve görüşleriniz için benimle Twitter ve Linkedin üzerinden iletişime geçebilirsiniz.
İyi çalışmalar.
Kaynaklar
- [1] Yapay Zekâ İle Yüz Tanıma 16 Sektörü Kökten Değiştiriyor — Melike Beykoz
- [2] San Francisco yüz tanıma teknolojisini yasaklıyor — BBC Türkçe
- [3] Introduction to FaceNet: A Unified Embedding for Face Recognition and Clustering — Analytics Vidya
- [4] FaceNet FaceNet: A Unified Embedding for Face Recognition and Clustering
- [5] How to Develop a Face Recognition System Using FaceNet in Keras
- [6] Face recognizer application using a deep learning model (Python and Keras)