FaceNet ile Sherlock ve John’u tanıyalım !

Muhammed Pektaş
Deep Learning Türkiye
5 min readOct 21, 2019
Kaynak: BBC

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 — Yüz vektörlerinin öklid benzerliği [4]

Ş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]

Şekil 2 — FaceNet Mimarisi

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]

Şekil 3 — Üçlü Kayıp (Triplet Loss) [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]

Şekil 4 — Tek atış öğrenmesi (One Shot Learning)

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 — Uygulamanın Temel Aşamaları ve Kullanılan Araçlar

Ş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. 👇

Şekil 5 — Uygulama Çıktısı

İ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.

Şekil 4 — Ana Dizin

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

--

--

Muhammed Pektaş
Deep Learning Türkiye

Computer Vision Engineer, Interested in Machine Learning and Deep Learning