Kimsenin Size Söylemeyeceği Yüz Tanıma İpuçları

Sefik Ilkin Serengil
Yapı Kredi Teknoloji
8 min readJul 16, 2021

Doğru ve efektif mimarinin tercihi üretim ortamı odaklı uygulamalar için oldukça önemli bir adımdır. Bu noktada yapay öğrenme ve derin öğrenme uygulamaları için ürün yelpazesi oldukça geniştir. Bu yazıda yüz tanıma özelinde çeşitli senaryolar için teknoloji yığını önerilerini tartışacağız. Benzer mimariler görüntü işleme / bilgisayarlı görü, doğal dil işleme, ses tanıma gibi kompleks derin öğrenme temelli uygulamalarda da kolaylıkla adapte edilebilir.

Yüz Tanıma (Kaynak: Pexels)

Büyük Resim

Derin öğrenme tabanlı bir çok uygulamada olduğu gibi yüz tanımada da vektörel kalıp gösterimlerini (embedding) sıklıkla kullanmaktayız. Basitçe yüzsel resimleri evrişimsel sinir ağına besleyerek çıktı katmanından aldığımız sinyali vektör kalıbı olarak ifade ediyoruz. VGG-Face, FaceNet veya ArcFace gibi sanat seviyesi modeller bu yaklaşımla hali hazırda insanın başarısını yakalamış ve epeyce de geçmiş durumdalar.

Basitçe, bir python kütüphanesi olan DeepFace ile bir kaç satır kod yazarak yüz tanıma, yüz özelliklerinin analizi (yaş, cinsiyet, duygu durumu ve ırk / etnisite) gibi fonksiyonelitelerin yanı sıra yüz resimlerinden vektör kalıplarını da çıkarmamız da mümkün. Aşağıdaki kod parçacığı bir resimden nasıl yüz kalıbının çıkarıldığını göstermekte.

DeepFace ile Bir Yüz Resminden Vektör Kalıbı Çıkarımı
Yüz resminden vektör kalıbının çıkarılması

Görüldüğü üzere yüz resmi bir konvolüsyonel nöral ağ modeli aracılığıyla çok boyutlu bir vektör olarak ifade edildi. Örneğin FaceNet 128 boyutlu, ArcFace 512 boyutlu, VGG-Face ise 2622 boyutlu vektör kalıpları üretmektedir.

Yüz tanıma işlemindeki temel prensip aynı kişiye ait vektör kalıplarının farklı kişilere ait vektör kalıplarından daha çok benzemesidir. Bu benzerliği öklid uzaklığı, kosinüs benzerliği gibi yöntemlerle hesaplayabilmekteyiz. Yani özetle yüz tanıma, yüz resminin kendisi yerine onu ifade eden bu vektör kalıpları üzerinde hesaplamalar yapmaya dayanmakta.

Peki bu vektör kalıplarını büyük ölçekli uygulamalarımız için nerede ve nasıl saklayacağız? Bu soruya cevap aramadan önce yüz tanıma özelinde temel bir konsepte odaklanalım.

Yüz Doğrulama

Yüz doğrulama bir resim çiftinin aynı kişi olup olmadığının kararının verilmesi işlemidir. Akademik çalışmalarda bu yönteme yüz tanıma denilse de biz yüz doğrulama olarak ifade edeceğiz. Basitçe “bu kişi Mark mı?” sorusuna aradığınız cevabı yüz doğrulama olarak düşünebilirsiniz. Tabi Mark’a ait daha önceden çekilmiş bir resmin sizde bulunduğunu varsayıyoruz.

iPhone’unuzda ki FaceID uygulaması yüz doğrulamanın güzel bir örneğidir. Daha önceden size ait çekilmiş bir resim hali hazırda iPhone’unuzda saklanırken, telefona giriş yapmaya çalıştığınız andaki görüntünüz ile karşılaştırarak uygulama sizin sisteme girmenize izin verecektir.

iPhone FaceID (Kaynak: Pexels)

Yüz doğrulama işleminin zaman karmaşıklığı büyük o gösteriminde O(1)’dir.

Yüz Tanıma

Yüz tanıma işleminde ise “bu kim?” sorusuna cevap arayacağız. Tanıdığımız kişilerin yüz resimlerinin bulunduğu bir veri tabanı içerisinde bu arama gerçekleştirilecektir.

Yüz tanıma (Kaynak: Pexels)

Yüz tanıma aslında arka planda çok kere yüz doğrulama işlemini çalıştırmayı gerektirir. Dolayısıyla yüz veri tabanımızın boyutu n ise zaman karmaşıklığı büyük o gösteriminde O(n) olacaktır. Bu sebeple yüz tanıma konusundaki akademik çalışmalar aslında temeli olan yüz doğrulama işlemine odaklanmaktadır.

Çin’in hali hazırda kullandığı yüz milyonlarca mobese ve arkasındaki yapay zeka teknolojisi ile bir BBC muhabirinin yerini belirlenmesi ve yakalanması sadece 7 dakika sürmüştü. 1,4 milyar nüfusa sahip ülkede yüz milyonlarca kameradan alınan görüntünün işlendiği göz önüne alınırsa süre oldukça iddialı görünüyor.

İlişkisel Veri Tabanları

Yüz doğrulama işlemi için Mark’a ait bir resme zaten sahibiz. Dolayısıyla bu resme ait vektör kalıbını önceden hesaplamış olacağız.

İlişkisel veri tabanları veri saklama konusunda akla ilk gelen yöntem oluyor. Mark’ın kimliğinini indeks olarak saklayıp yüz resmine ait vektör kalıbını ilişkisel veri tabanında saklamamız gerekiyor. Dolayısıyla veri tabanında Mark anahtarı ile yapacağımız sorgularda onun vektör kalıbına çok hızlı erişebileceğiz.

Bal peteği ve arılar (Kaynak: Pexels)

Burada d boyutlu vektör kalıbı denilen şey aslında programlama dilinde d elemanlı bir dizidir.

İlişkisel veri tabanlarında vektörleri doğrudan saklayabileceğimiz bir veri tipi maalesef bulunmamaktadır.

Diziyi base64, blob gibi veri tiplerine dönüştürüp saklayabiliriz. Bir yüz doğrulama işleminde aslında basitçe iki vektörün arasındaki benzerliği buluyor olacağız. Dolayısıyla vektör kalıbı base64, blob gibi bir veri tipine dönüştürülüp saklanırsa hesaplamayı yapmak için kodlanmış veriyi istemci tarafına çektikten sonra açtıktan sonra hesaplamayı yapabileceğiz. Bu da hesaplama gücünün her zaman istemci tarafında olmasını gerektirecek. Sqlite gibi hafif siklet bir veri tabanı çözümü kullanıyorsak bu uygulanabilir ancak çok kuvvetli bir veri tabanımız varsa bu yöntem çok efektif olmayacaktır.

Alternatif olarak d boyutlu bir vektörü ilişkisel veri tabanında kolonlar (ya da ilişkili bir tabloda satırlar) halinde saklayabiliriz. Bu yöntem ile Mark’ın resmine ait vektör kalıbı veri tabanımızda dururken mukayese edeceğimiz resmin vektör kalıbını veri tabanımıza göndererek bu iki vektör arasındaki uzaklığın sunucu tarafında yapılmasını bekleyebiliriz. Oracle (özellikle Exadata), IBM DB2, Microsoft SQL Server gibi çözümler kullanacaksak bu daha efektif bir çözüm olacaktır.

Anahtar-Değer Depoları

İlişkisel veri tabanları ilişkisel veriyi saklanması ve sorgulanması konusunda optimize çözümlerken sözlük yapıları sorgulandığında doğru bir indeksleme kurgulanmış olsa bile O(1) karmaşıklığına ulaşamazlar. Anahtar-değer veri tabanı (key-value store veya key-value database) bu tür sorgular için bize O(1) zaman karmaşıklığında hizmet sunabildikleri için çok daha hızlıdırlar.

Anahtarlar (Kaynak: Pexels)

Bundan sonra değineceğimiz teknolojilerde vektörler veri tipi olarak saklanabilmekte ve sunucu tarafında bu vektörler üzerinde hesaplamalar yapabilmekteyiz.

Milyonlarca kullanıcısı olan bir uygulamaya yüz doğrulama yöntemi ile giriş yapılması ihtiyacını göz önünde bulunduralım. Anahtar-değer depoları, ilişkisel veri tabanlarından çok daha efektif bir çözüm olacaktır.

Redis çok basit ve çok hızlı bir anahtar değer deposudur. Bir anahtar için sadece bir değer saklayabilmektedir. Anahtar içeriğini Mark, değeri de Mark’a ait vektör kalıbı olarak düşünebilirsiniz.

Cassandra ise bir geniş kolon deposudur (wide-column store). Redis’te bir anahtar için tek bir değer depolanabilirken, Cassandra’da bir anahtar için çoklu değer depolanabilir. Örneğin anahtar içeriği Mark için yüz resmine ait vektör kalıbı, yaşını ve cinsiyetini değerler olarak saklayabilmekteyiz. Redis’te anahtar’a ön ek ekleyerek bu şekilde çoklu değer saklayabiliyorken (embedding:mark, age:mark, gender:mark), çoklu sorgu gerektirmesi sebebiyle bu tür bir ihtiyacınız varsa Cassandra daha doğru bir çözüm olacaktır.

Bundan sonrasında değineceğimiz araçlarda yüz doğrulama yerine yüz tanıma için alternatif araçları değerlendireceğiz.

Büyük Veri

Yüz tanımanın çok kere yüz doğrulama işleminden ibaret olduğundan bahsetmiştik. Dolayısıyla yüz doğrulama, yüz tanımanın bir alt kümesidir. Teorik olarak yüz doğrulama için kullandığımız araçları yüz tanıma için de kullanabiliriz. Pratikte ise yüz veri tabanımızın boyutu büyüdükçe bu yüz doğrulama çözümleri yüz tanıma için çalışmayacaktır. Örnek senaryo olarak tek bir resmin bir ülke / ülkeler vatandaş veri tabanı içerisinde aranmasını düşünebilirsiniz. Her ne kadar Lua kodu yazarak redis’de, java kodu yazarak da cassandra’da bir arama işlemi gerçekleştirebilsek de ne redis ne de cassandra bu ölçekte bir arama için geliştirilmiş araçlar değiller. Bu durumda yüz tanıma için bazı büyük veri çözümlerini göz önünde bulundurmalıyız.

Hadoop’un ikonik maskotu Fil’dir (Kaynak: Pexels)

Bu noktada da Hadoop akla gelen ilk çözüm olmakta. Veriyi dağıtık olarak saklayabilirken Hive ile sql benzeri sorgular yapabilmekteyiz. Bununla birlikte Spark çerçevesini kullanarak Java veya Python programlama dilleri üzerinden sorgulamalar da gerçekleştirebiliyoruz.

Bir döküman veri tabanı olan mongoDB de büyük veri çözümleri arasında yer almaktadır. Bu araç yüksek ölçeklendirilebilirlik ile birlikte gelirken, minimal bir şekilde dağıtık olarak (hatta bulut üzerinde) çalışabilmektedir.

Hadoop ve mongoDB’de de dizi veri tiplerini kolon olarak saklayabilmekte ve vektör uzaklık hesabını sunucu tarafında gerçekleştirebilmekteyiz.

En Yakın Komşu

Büyük veri çözümleri kuvvetli donanımlara sahip olunduğunda çok efektif çalışmaktadır. Hadoop’ta yüzlerce datanode veya mongoDB’de onlarca kümeniz varsa milyonlarca hatta milyarca veri üzerinde yüz tanıma işlemini gerçekleştirebilirsiniz. Ancak bunlar maliyetli çözümlerdir.

Painted Ladies, San Francisco (Kaynak: Pexels)

Google’ın resim ile görsellerde arama ve Facebook’un resim etiketleme işlemlerini göz önünde bulunduralım. Google yüz milyarlarca resmi indekslemişken aradığınız görsele benzer görselleri size milisaniyeler içerisinde bulabilmekte. Benzer şekide Facebook’ta milyarlarca kullanıcının yüz milyarlarca resmi yüklenmiş durumda ancak yeni bir resim eklenildiğinde resimdeki kişileri arkadaşınız olmasa bile saniyeler içerisinde tespit edebilmekte. Sizce bunlar Google ve Facebook’un sahip oldukları donanımlar sayesinde midir? Ara Güler’in de dediği gibi:

En iyi fotoğraf makinesine sahip olan en iyi resmi çekseydi, en iyi daktilosu olan en iyi romanı yazardı

Evet, Google ve Facebook çok güçlü donanımlara sahipler ancak bu sürelerde hizmet veriyor olmalarının öncelikli nedeni kullandıkları algoritmalar.

Yüz tanıma işleminde n kere yüz doğrulama işlemini uyguluyoruz. Aslında yaptığımız k-NN (k-nearest neighbor) algoritmasını uygulamak ve bu algoritmanın da karmaşıklığı O(n). Buna karşın yakınsayan en yakın komşu algoritması (approxmimate nearest neighbor veya a-NN) bu karmaşıklığı radikal ölçüde O(log(n))’e düşürmekte. Ancak sezgisel yaklaşması sebebiyle k-NN’de olduğu gibi her zaman en yakınları bulmayı taahhüt etmemekte. Dolayısıyla hızın güvenlikten önemli olduğu senaryolarda k-nn yerine a-nn uygulamak düşünülebilir. Örnek verdiğimiz Google ve Facebook uygulamalarının arkasında bu algoritma çalışmakta.

Yakınsayan en yakın komşu algoritması (Kaynak: Erik Bernhardsson)

Spotify Annoy, Facebook Faiss, NMSLIB popüler yakınsayan en yakın komşu algoritmasının uygulandığı kütüphaneler. Spotify müzik listesi önerilerinde annoy’u kullanırken; Faiss, Facebook’un yüz resmi etiketleme uygulamasının arkasında kullandığı kütüphane. NMSLIB ise 4 doktora öğrencisi tarafından geliştirilmiş daha eski bit kütüphane. Bu üç kütüphanede çok temelde hizmet sunarken Elasticsearch bu algoritmaları kullanarak ölçeklendirilebilir bir çözüm sunmakta.

Graf Veri Tabanları

Graf veri tabanları tespit edilmesi zor ilişkilerin ortaya çıkarılması konusunda çok kuvvetli araçlardır. Neo4j en popüler graf çözümlerinden birisidir. k-NN ve a-NN algoritmalarının ikisini de kapsar.

Örneğin aşağıdaki görselde Jennifer Aniston’un iki resmi (img12 ve img55) doğrudan bağlantılı olmadığı için bir büyük veri aracı kullanıldığında bu çift için farklı kişiler yorumu yorumu yapılacakken, graf veri tabanı ile aynı kişi olduğu tespit edilebilir.

Graf ile yüz tanıma (Kaynak: sefiks.com)

Bu noktaya kadar hep harici şekilde elde edilmiş vektör kalıplarını saklamaya odaklanmışken neo4j graf veri tabanı graf içerisindeki düğümler ve ilişkileri göz önünde bulundurarak FastRP, Node2vec, GraphSAGE gibi algoritmalar ile vektör kalıbını kendisi hesaplayabilmektedir.

Teknoloji Yığını Özeti

Şu ana kadar değindiğimiz teknolojileri görev türlerine göre kümelersek aşağıdaki gibi sevimli bir görsel elde etmiş oluyoruz. Görüldüğü üzere yüz doğrulama, yüz tanımanın bir alt kümesi iken veri boyutu büyüdükçe yüz doğrulama araçlarından yüz tanıma çözümlerine gitmek gerekmekte. Son olarak ilişkisel veri tabanı haricindeki tüm kategorilerde vektörlerin saklanabileceği kompleks veri tipleri bulunmaktadır.

Yüz tanıma için teknoloji yığını (Kaynak: DeepFace)

Bitirirken

Bu yazımızda bir yüz tanıma uygulaması için teknoloji yığını tavsiyelerini gerekçeleriyle birlikte açıklamaya çalıştık. Konuştuğumuz çözümler arasında ilişkisel veri tabanları hariç tümü vektör gibi kompleks veri tiplerini saklayabilmekte ve sunucu tarafında bu vektörler üzerinde hesaplamalar yapabilmektedir. Benzer mimarileri görüntü işleme, doğal dil işleme, ses tanıma gibi kompleks derin öğrenme temelli uygulamalarda da kurgulayabiliriz. Yüz tanıma özelinde de hali hazırda insan başarısını geçmiş modellere sahip olduğumuzdan, yeni inovasyonları ancak bu tür mimari tasarımlarıyla mümkün kılabiliriz.

Yazının bu kısmına kadar geldiyseniz alkışlayarak ve yorumlayarak destek olabilirsiniz. Teşekkürler!

--

--

Sefik Ilkin Serengil
Yapı Kredi Teknoloji

🧑‍💻 Software Engineer @ Vorboss, 🎓Galatasaray University alumni 🤖 Creator of DeepFace 🏙 Istanbulite&Londoner 💬 Code Wins Arguments 🔗 https://sefiks.com/