RetinaFace: Python İçin Bir Yüz Algılama Kütüphanesi
InsightFace projesi yüz tanıma konusunda literatüre 2 önemli katkıda bulundu: yüz tanıma modeli olarak sundukları ArcFace ve yüz algılama modeli olarak sundukları RetinaFace. Derin öğrenme tekniği ile dizayn edilmiş bu iki model de günümüz için en ileriyi ifade etmek için kullandığımız sanat seviyesinde modeller. Bu yazımızda python için tensorflow kütüphanesi üzerine dizayn edilmiş RetinaFace yazılım çerçevesini inceleyeceğiz.
Yüz tanıma üretim hattı
Modern bir yüz tanıma üretim hattı 4 ortak adımdan oluşmaktadır: yüzün algılanması, hizalanması, vektörel gösteriminin yapılması ve doğrulanması. Burada algılama ve hizalamayı önemli ön işleme adımları olarak değerlendirebiliriz. Zira Google FaceNet modelinde hizalama işleminin %1 oranında iyileştirme sağladığını duyurmuştu. Bu noktada RetinaFace algılama ve hizalama işlemlerini yüksek başarı oranları ile gerçekleştirebilmekte.
Tensorflow ile yeniden implementasyon
Orjinal çalışma mxnet ile geliştirilmiş olsa da tensorflow ile yeniden implemente edilmiş bir çalışmaya rastladım. Görünen o ki bu yeniden implemente edilmiş çalışma orjinal çalışmaya yakın bir başarı oranına sahip.
Bu yeniden implementasyonun eksik noktalarından birincisi pip uyumlu dizayn edilmemiş. Kaynak kodunu elle indirmenizi beklemekte. Bununla birlikte c diline bağımlı bazı gereksinimlere ihtiyaç duyuyor. Ana dizindeki makefile dosyasını make komutu ile çalıştırıp c kodlarını derlemeniz sizden beklenmekte. Son olarak eğitilmiş ağırlık dosyası 100MB’dan daha büyük olduğu için kaynak kodu içerisinde yer verilmemiş. Bunu da dropbox linkinden elle indirmeniz bekleniliyor.
Bu noktada çalışmayı pip uyumlu hale getirip, kaynak kodunu yalınlaştırıp c dili bağımlılıklarından kurtaran, kaynak kodunu google drive kaynağından arka planda otomatik indiren ve bir kaç satır kod ile yüz algılama işlemini gerçekleştirebileceğiniz bir yeniden implementasyon çalışması gerçekleştirdim: retina-face.
Kurulum
RetinaFace projesi tamamen açık kaynak kodlu ve pip üzerinden indirilebilir durumdadır. Tek yapmanız gereken aşağıdaki komutu komut penceresinde çalıştırmak. Böylelikle kütüphaneyi ve bağımlılıklarını indirmiş olacaksınız.
1 2 3 4 5 |
#!pip install retina-face |
Yüz algılama
Kurulum sonrası kütüphaneyi import edecek hale geleceksiniz. Arayüzünde yer alan detect_faces fonksiyonu ile yüz algılama işlemi gerçekleştirebilmektedir. Fonksiyon girdi olarak resmin diziniyle birlikte tam ismini beklemektedir.
1 2 3 4 5 6 7 |
from retinaface import RetinaFace img_path = "img1.jpg" faces = RetinaFace.detect_faces(img_path) |
Fonksiyon cevap olarak güvenilirlik skoru ile birlikte yüz bölgesinin koordinatlarını ve gözler, burun ve ağızın da bulunda bazı noktaların koordinatlarını dönmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "face_1": { "score": 0.9993440508842468, "facial_area": [155, 81, 434, 443], "landmarks": { "right_eye": [257.82974, 209.64787], "left_eye": [374.93427, 251.78687], "nose": [303.4773, 299.91144], "mouth_right": [228.37329, 338.73193], "mouth_left": [320.21982, 374.58798] } } } |
Fonksiyonun cevabını aldıktan sonra yüz bölgesini ve yüzsel noktaları vurgulayabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
identity = faces[0] facial_area = identity["facial_area"] landmarks = identity["landmarks"] #highlight facial area cv2.rectangle(img, (facial_area[2], facial_area[3]) , (facial_area[0], facial_area[1]), (255, 255, 255), 1) #extract facial area #img = cv2.imread(img_path) #facial_img = img[facial_area[1]: facial_area[3], facial_area[0]: facial_area[2]] #highlight the landmarks cv2.circle(img, tuple(landmarks["left_eye"]), 1, (0, 0, 255), -1) cv2.circle(img, tuple(landmarks["right_eye"]), 1, (0, 0, 255), -1) cv2.circle(img, tuple(landmarks["nose"]), 1, (0, 0, 255), -1) cv2.circle(img, tuple(landmarks["mouth_left"]), 1, (0, 0, 255), -1) cv2.circle(img, tuple(landmarks["mouth_right"]), 1, (0, 0, 255), -1) |
Sonuçlar ise oldukça tatmin edici! Lütfen resme tıklayarak genişletin ve sonuçları inceleyin.
Güvenilirlik skoru fonksiyonun girdileri arasında opsiyonel bir argumandır ve varsayılan değeri %90’dır. Bu değeri düşürerek topluluklar için de retinaface’i çalıştırabiliriz.
1 2 3 4 5 |
resp = RetinaFace.detect_faces(img_path, threshold = 0.5) |
Gördüğünüz gibi retinaface tribündeki taraftarların bile yüzlerini algılayabilmekte.
Yüzün hizalanması
Hatırlayacağınız üzere gözün koordinatlarını da içeren yüzsel noktları da retinaface bize söylemekteydi. Gözler yatayda aynı konuma gelene kadar resmi döndürmemiz halinde hizalanmış resimler elde edebiliriz. Google FaceNet çalışmasında bu yöntem uygulandığı durumda yüz tanıma başarısının %1’in üzerinde arttığını belirtmişti.
RetinaFace hizalama işlemini de kapsayan extract_faces fonksiyonunu kendi arayüzü altında sunmaktadır. Yüz algılama fonksiyonunda olduğu gibi diziniyle birlikte resmin tam adını girdi olarak beklemektedir. Fonksiyon cevap olarak ise algılanmış ve hizalanmış resmin kendisini numpy formatında dönmektedir. Hizalama işleminin yapılmasını istemiyorsanız girdi argumanları arasında align değerini yanlış olarak atamanız gerekiyor.
1 2 3 4 5 6 7 8 9 |
import matplotlib.pyplot as plt faces = RetinaFace.extract_faces(img_path = "img.jpg", align = True) for face in faces: plt.imshow(face) plt.show() |
Sonuçlar oldukça net görünüyor!
Yüz tanıma
RetinaFace, insightface projesinin yüz algılama modülüyken, yüz tanıma modeli de ArcFace‘dir. DeepFace kullanarak RetinaFace yüz algılayıcısı ve ArcFace yüz tanıma modelini uçtan uca kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 |
#!pip install deepface from deepface import DeepFace DeepFace.verify("img1.jpg", "img2.jpg" , model_name = "ArcFace" , detector_backend = "retinaface") |
Doğrulama fonksiyonu cevaben resim çiftinin aynı kişi olup olmadığını dönmekte.
DeepFace kullanımına dair kısa bir bilgilendirici video ilginizi çekebilir.
Fark etmişsinizdir yüz tanıma dediğimiz konu aslında bir resim çiftinin aynı kişi olup olmadığını anlama üzerine kurulu. Ancak biz yüz tanımadan bahsederken bir resmi bir topluluk içerisinden bulmayı anlıyoruz. DeepFace kütüphanesi ile ArcFace kullanarak bir resmi bir topluluk veri tabanı içerisinde de bulabilmekteyiz.
1 2 3 4 5 6 7 8 |
from deepface import DeepFace import pandas as pd df = DeepFace.find(img_path = "img1.jpg", db_path = "C:/workspace/my_db" , model_name = "ArcFace", detector_backend = "retinaface") |
Bu fonksiyon cevaben bir pandas data frame dönecektir.
Gerçek anlamda yüz tanımanın anlatıldığı aşağıdaki videoyu izleyebilirsiniz.
Gerçek zamanlı test etme şansınız da bulunuyor.
ArcFace, deepface içerisinde desteklenen tek yüz tanıma modeli değil. Beraberinde VGG-Face, Google FaceNet, OpenFace, Facebook DeepFace, DeepID ve Dlib gibi modeller de kütüphane içerisinde desteklenmekte.
Yüz algılama için de retinaface dışında opencv, ssd, dlib ve mtcnn algılayıcıları desteklenmekte. Hızdan bağımsız algılayıcıların performansını aşağıdaki videodan izleyebilirsiniz. RetinaFace hepsinden daha başarılı algılama ve hizalama olanağı sunarken hız olarak diğerlerinden daha yavaş kalmakta.
Peki bir yüz tanıma uygulaması nasıl çalışır?
Kavramları hızlıca geçip kafanızı karıştırdıysak bir yüz tanıma uygulamasının uçtan uca nasıl çalıştığını özetleyen aşağıdaki videoyu izlemenizi tavsiye ederim.
Sonuç
Bu yazıda birbirini mükemmel şekilde tamamlayan RetinaFace ve ArcFace modellerini bir kaç satır kod ile nasıl kullanabileceğimizi irdeledik.
RetinaFace kaynak kodu: https://github.com/serengil/retinaface
DeepFace kaynak kodu: https://github.com/serengil/deepface
GitHub repo’larını yıldızlayarak⭐️ çalışmalara destek olabilirsiniz🙏.