OpenCV ile Yüz Tanımaya Giriş

Yüz tanımaya girmeden önce değinmemiz gereken bir konu var. Görüntü işlemede yüz tespiti için bir çok yöntem mevcut bu yöntemlere daha önce gerek video eğitimlerimde gerekse yazılarımda değinmiştim. Yüz tanıma içinde farklı yöntemler mevcut, burada dikkat edilmesi gereken konu yüz tanıma işlemi ile yüz tespit işleminin farklı olmalı. Bazı yöntemler ile  görüntülerdeki insan yüzlerini diğer nesnelerden ayırt ederek tespit edebiliriz çünkü insan yüzü geometrik olarak çok fazla farklılık göstermez bu farklılığın az oluşuda yüzü tespit etmeyi kolaylaştırır. Yüz tanıma ise daha önceden tespit edilen bir kaynak yüzün, yeni alınacak yüz ile karşılaştırılıp aradaki benzerliği tespit edebilmekir. Bu bağlamda yüz tanıma tespit etme işlemine göre daha zordur. Ortamdaki ışık veya yüzde meydana gelecek küçük değişiklikler algoritmanızın hatalı sonuç vermesine yol açabilir. Bu durumlardan dolayı tespit ile tanıma işlemini bir birinden iyi ayırt etmek gerekir.

Yüz tanıma insanlar için oldukça kolay bir iştir. Bazı deneyler göstermiştir ki üç günlük bir bebek bile gördüğü yüzü daha sonra ayırt edebilmektedir. Peki, bilgisayarlar için bu durum ne kadar zor olabilir? Bizler bu güne kadar yüz tanıma konusunda çok az şey biliyorduk. Yüz tanıma esnasında gözleri, burnu, ağzı veya kafa şeklini, saçlarımızı kullanıyor muyduk? Beynimiz bunları nasıl analiz ediyor, nasıl kodlanmış olabilir ki? David Hubel ve Torsten Wiesel bize göstermiştir ki beynimiz çizgileri, kenarları, hareketleri, görüntünün belirli özelliklerini belirli sinir hücreleri ile anlayabiliyoruz. Bütün bir görseli parçalayarak veya parçalanmış bir görseli kullanarak oluşturulabilecek bir bütünden anlamlı sonuçlar çıkartabiliyoruz. Yüz tanıma ise bütün bir görüntüden anlamlı özelliklerin ayıklanması ve onların sınıflandırılarak karşılaştırılması ile oluyor.

Bir yüzün geometrik özelliklerine göre yapılacak yüz tanıma işlemi, muhtemelen yüz tanıma için en kolay yaklaşımdır. İlk otomatik yüz tanıma sistemlerinden biri Kanade73: işaretleyici noktaları (gözler, kulaklar ve burun pozisyonu) özellik vektörü (noktaları arasındaki mesafe, bunlar arasındaki açı) oluşturmak için kullanıldı. Özellik vektörünü kullanarak yapılan tanımada kaynak ve referans görüntünün özellik vektörleri arasındaki Öklid mesafe hesaplanarak yaptı. Bu gibi bir yöntem başarılı oldu, doğası gereği parlaklık gibi değişikliklere karşı dayanıklıydı, ancak çok büyük bir dezavantajları davardı. Geometrik yüz tanıma yöntemi ile yapılan bir başka çalışma [Bru92]. A 22 boyutlu özellik vektörü kullandı ve büyük veri setleri üzerinde deneyler yaptı. Tek başına geometrik özelliklerin yüz tanıma için yeterli olmayacağı bu çalışma ile fark edilmiştir.

[TP91], Eigenfaces yöntemi, yüz tanıma için bütünsel bir yaklaşım aldı. Yüz görüntüsünün bir noktasından yüksek boyutlu görüntü alanı ve küçük boyutlu bir temsil alındı ve sınıflandırma kolay hale getirildi. Doğrusal diskriminant analizi ile bir sınıfa özel projeksiyon [BHK97] yöntemi olarak yüz tanımada uygulandı. Temel fikri, sınıflar arasında varyansı maksimize ederken, bir sınıf içinde varyansı en aza indirmekti.

yüz tanıma yüz veritabanı
Şekil 1: Genişletilmiş Yale Yüz Veritabanı Örnek Veri Kümesi

OpenCV 2.4 sürümü ile birlikte bazı yüz tanıma algoritmaları geldi. Mevcut algoritmalar şunlardır:

  • Eigenfaces (createEigenFaceRecognizer())
  • Fisherfaces (createFisherFaceRecognizer())
  • Local Binary Patterns Histograms LBPH (createLBPHFaceRecognizer())

Yüz tanıma için bazı örnek yüz verilerine ihtiyacımız olacaktır. Kendi veri kümenizi oluşturabilir veya hazır olarak oluşturulmuş veri kümesini indirerek kullanabilirsiniz.

Algoritmalar için Veri Setinin Hazırlanması

Elde ettiğimiz verileri programımız tarafından okuyabiliyor olmamız gerekir. Bunun için basit bir yöntem olan CSV dosyasını tercih edeceğiz. Neden CSV? Çünkü CSV platform bağımsız bir dosya formatı. Daha farklı çözümlerde kullanılabilir.

/path/to/image.ext;0

Buradaki adres görüntünün dosya yoludur. Windows kullanıyor iseniz dosya yolunuz muhtemelen C:/faces/person0/image0.jpg şeklinde olacaktır. Dosya adresinden sonra “;” ayracı vardır ve bundan sonra görüntü etiketi 0 olarak atanır. Bu etiket görüntüye eklenen bir veri olarak düşünülebilir örneğin kaydını aldığınız kişinin id bilgisi olabilir.

AT&T Facedatabase’den (http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html) at.txt ye karşılık gelen CSV dosyasını indirin.

./at/s1/1.pgm;0
./at/s1/2.pgm;0
...
./at/s2/1.pgm;1
./at/s2/2.pgm;1
...
./at/s40/1.pgm;39
./at/s40/2.pgm;39

Dosyaları D:/data/at altına çıkarttım. CSV dosyam artık D:/data/at.txt dizinde.  Şimdi tüm dosyada bir arama yaparak ./ olan yerleri D:/data/ şekline getiriyorum böylelikle dizini göstermiş oluyorum. Herhangi bir metin editörü (notepad, notepad++ vb.) ile bu işlemi yapabilirsiniz.

Artık demo uygulamaya dosya dizinini vererek çalıştırabilirsiniz. Örneğin:

facerec_demo.exe D:/data/at.txt

CSV Dosyası Oluşturma

Elle manuel olarak CSV dosyası oluşturmak sıkıcı bir iş. Bunu yapması için create_csv.py adında bir Python scriptimiz var. Bu script  src / create_csv.py dizininde mevcuttur, otomatik olarak bizim için CSV dosyası oluşturacaktır.

(/basepath/<subject>/<image.ext>) bu şekilde hiyrerarşik görüntülere sahipseniz:

philipp@mango:~/facerec/data/at$ tree
.
|-- s1
|   |-- 1.pgm
|   |-- ...
|   |-- 10.pgm
|-- s2
|   |-- 1.pgm
|   |-- ...
|   |-- 10.pgm
...
|-- s40
|   |-- 1.pgm
|   |-- ...
|   |-- 10.pgm

Sadece klasör yolunu vererek create_csv.py scriptini çalıştıralım:

philipp@mango:~/facerec/data$ python create_csv.py
at/s13/2.pgm;0
at/s13/7.pgm;0
at/s13/6.pgm;0
at/s13/9.pgm;0
at/s13/5.pgm;0
at/s13/3.pgm;0
at/s13/4.pgm;0
at/s13/10.pgm;0
at/s13/8.pgm;0
at/s13/1.pgm;0
at/s17/2.pgm;1
at/s17/7.pgm;1
at/s17/6.pgm;1
at/s17/9.pgm;1
at/s17/5.pgm;1
at/s17/3.pgm;1
[...]

Şekil 2: Geliştirilen Bazı Y&uuml;z Tanıma Algoritmaların Karşılaştırılması


AYRICA BAKINIZ

EmguCV ile Yüz Tanıma Uygulaması

KAYNAKLAR
  • http://docs.opencv.org/2.4/modules/contrib/doc/facerec/facerec_tutorial.html
  • Kanade73. Kanade, T. Picture processing system by computer complex and recognition of human faces. PhD thesis, Kyoto University, November 1973
  • Bru92 Brunelli, R., Poggio, T. Face Recognition through Geometrical Features. European Conference on Computer Vision (ECCV) 1992, S. 792–800.
NOTLAR
  • Bu yazının bazı bölümleri, yukarıda kaynağı belirtilen (Opencv facerec tutorial) dökümanın çevirisi niteliğindedir. Yazmayı planladığım “Java ile  yüz tanıma yöntemleri” yazısı için giriş niteliğindedir. İsterseniz orjinal içeriğe ve C++ ile geliştirilmiş örnek kodlarına yer alan bağlantıdan ulaşabilirsiniz.
TAVSİYE EDİLER İLGİLİ BAĞLANTILAR
  • http://luchaochao.me/papers/GaussianFace.pdf
  • http://eyalarubas.com/face-detection-and-recognition.html
  • https://www.quora.com/Which-is-the-best-face-recognition-algorithm-in-OpenCV-Python
  • https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf
  • http://cmusatyalab.github.io/openface/