Yüz Tespit Teorisi ve OpenCV ile Yüz Tespit Çalışması

Yüz Tespit Teorisi :

Yüz tespit işleminin teorik alt yapısını inceleyeceğiz. Viola Jones algoritmasının mantığını anlayacağız. OpenCV görüntü işleme kütüphanesi ile örnek bir uygulama gerçekleştireceğiz.

Viola Jones Algoritması :

OpenCV kütüphanesinin de temeline yatan kütüphane..

Paul Viola , Michael Jones tarafından geliştirilmiştir.

Basit ve uygulanabilir olduğu için günümüzde halen kullanılmaktadır.

Viola Jones algoritması 2 adımdan oluşur.

Ilk adım Training – eğitim.

İkinci adım Recognition – Tanıma

Viola Jones algoritması yüzün net olarak karşıdan göründüğü ortamlarda sonuçlar verirken, yüzün sağa – sola dönük olması, aşağıya bakması gibi durumlarda doğru sonuçlar verememektedir.

Viola Jones algoritması için yüzün önden gözükmesi gerekiyor. Sağa ve sola dönük olması halinde algoritma algılamada sorun yaşacaktır.

Viola Jones algoritmasının ilk yaptığı şey resmi siyah-beyaza dönüştürmektir. B,G,R değerlerini grayscale’a dönüştürür. Yüzün siyah-beyaza dönüştürülmesi aslında gördüğümüz birşey değil arka planda koşmaktadır.

Resmin boyutları ve koordinatları ile oynanmamaktadır. Artık Viola Jones algoritması resmin içinde yüz aramaya başlayacak.

Kare yerleştirir ve adım adım kayarak devam eder. Resimde belli özellikler arar. Her yüzde olması gereken yüz, göz, kaş, burun , ağız vb gibi. Pencereyi, resmin içinde sürekli olarak bir miktar kaydırarak resmin içinde gezinme işlemini yapar.

Yüz de olması gereken öğeler 17.Adımda bulundu. 2 kaş, ağız, 2 göz, burun bulundu..

Farklı boyutlarda çok sayıda kare kaydırarak yüz arama işlemini yapıyor. Bizim uygulamamızda yüz tespiti esnasında kullanılan kare adımları oldukça büyük.. Gerçek dünyada bu adımlar oldukça küçük..

Yüz Tespit işlemi Viola Jones algoritması tarafından siyah-beyaz resim üzerinde yapılıyor ancak işlem sonunda biz renkli resmimiz üzerinde yüz tespit işleminin yapıldığını ve yüzün kare içine alındığını görürüz.

Haar-like Özellikler :

Haar ismi, matematikçi olan Alfred Haar’dan gelir. Viola Jones algoritmasında bu özellikler kullanılıyor.

Özelliklerin hepsi piksellerden oluşuyor. Bir resmin bir bölgesindeki pikseller karanlık, diğer bölgesindeki pikseller aydınlık olabilir. O halde şunu söyleyebiliriz. Burada kenar özellik var diyebiliriz. Ortada karanlık pikseller varsa sağı solu aydınlık ya da üstü altı aydınlık ortası karanlıksa çizgi özellikler var diyebiliriz. Bu özellikler ile 10×10 px içinde de karşılabiliriz. 250X250 px içinde de karşılaşabiliriz.

Yukarıda ele aldığımız resim içinde haar-like özellikler arayalım. Bu özellikler tüm resimlerde karşımıza çıkacak özelliklerdir.

Yine resme bakarsanız burnun bir kısmına karşılık gelen pikseller daha karanlık, diğer kısım ise daha aydınlık. Burada da çizgi özellik olduğunu görebiliyoruz.

Mevcut resmimide kenar özellik bulmuş olduğumuz göze odaklanalım. Bu göz bölümü normal şartlarda çok daha fazla pikselden oluşmasına rağmen, yatayda 8, dikeyde 3 pikselden oluştuğunu varsayalım. Beyaz tonlar bire-1 daha yakınken, siyaha yakın renkler sıfıra-0 yakındır.

3×6 piksellik alandaki tüm beyaz ve siyah piksellerin değeri kendi içlerinde toplanır ve ortalaması alınır. Sonrasında siyah piksel değerlerinden beyaz piksel değerleri çıkarılır.

Haar-like özellikler resim içinde aranıp bulunduktan sonra tamamen siyah, tamamen beyaz özellikler karşımıza çıkmayacak… Her zaman siyah ve beyaza yakın değerler bulacağız. Viola Jones algoritmasında eşik değerler bulunmaktadır, eşik değerin altında kalan kısımlar görmezden gelinir. Ignore edilir. Bu hesaplamalar resmin tüm bölgelerinde yapılacaktır.

Integral resmi :

Önceki uygulamada 3×8 px boyutunda bir alanda işlem gerçekleştirdik. Daha büyük px değerlerinde tespit edilen haar özellikler olacaktır. 640X480 piksellik bir alan için çok ciddi bir işlem yükü oluşur. Bu noktada integral resmi özelliği kullanılır.

İntegral resmi ile 4 adımda hesaplama gerçeleştirilir. Aksi takdirde işlem adımı oldukça fazla olur ve ciddi işlem gücü gerektirir. Viola Jones algoritmasını güçlü kılan özelliklerden birisi de Integral resmidir.

Normal şartlarda kırmızı alan için hesaplama yapacak olsaydık 12 adımlık bir işlem gerekiyordu. Integral resmi özelliği ile 4 işlem ile tamamlamış oluyoruz. Integral resim özelliği ile yüz tespit (face detection) lightweight hale geliyor.

Training – Sınıflandırıcının Eğitimi :

Elimizdeki bir resmi bilgisayara verdiğimiz zaman aslında bu resim bilgisayar için sayısal ifadeden başka bir şey değildir. Bilgisayarın yüzü tespit edebilmesi için yüz özelliklerinin öğretilmiş olması gerekmektedir.

Algoritma öncelikle elimizdeki resmi 24x24px boyutuna küçültür, daha sonra haar-like özellikleri aramaya başlar. Neden resmi küçültüyoruz diye düşünüyorsanız bunun sebebi büyük resimde çok sayıda özellik ortaya çıkabilir. Resim büyüdükçe birçok farklı kombinasyon ortaya çıkar. Resmi küçültüp sınırlı sayıda özellik uygulamak daha kolay. Eğitim sonrası gerçek uygulamada resmi küçültmeyip, özellikler büyütülerek yüz aranacak. Küçültme işlemi yalnızca training esnasındadır.

Az sayıda resim ile öğretme işlemi yapılamaz. Öğretilebilir ancak yanlış çok sayıda sonuç ortaya çıkabilir. Ne kadar çok yüz resminden algoritma eğitilirse, özellikleri o kadar iyi öğrenmiş olur. Viola Jones algoritması yaklaşık 5000 yüz resmi ile eğitilmişti. Ayrıca data augmentation yöntemi ile mevcut resimler üzerinde çevirme gibi işlemler yapılarak sayı 10.000’lere kadar çıkartılmıştır. Aslında data augmentation esnasında aynı yüzler içinde işlem yapılmaktadır. Bizim için aynı kişiler ancak bilgisayar için aynı kişiler değildir. Yeni sayısal değerlerdir.

Algoritmayı gerçek yüz resimlerindeki özellikleri öğrenmesi için öğretirken aynı zamanda yüz olmayan resimler ile de öğretilmesi gerekmektedir. Viola Jones algoritmasında yaklaşık 10.000 tane yüz olmayan resim ile eğitim de yapılmıştır.

Böylelikle algoritma hangi özellikler yalnızca yüze ait özellikler olduğunu öğrenmiş oluyor. Algoritmaya verilen tüm resimler etiketlidir.

Adaptive Boosting / Adaboost :

Özellikleri alarak bir sınıflandırıcı içine yerleştirilir.

f(x) = a1f1(x) + a2f2(x) + a3f3(x) + …….

f(x) sınıflandırcı

f1, f2, f3 özellikler

a1,a2,a3 ağırlıklar ya da katsayılar…

Tek başına a1f1(x) zayıf bir sınıflandırıcıdır. f(x) güçlü sınıflandırıcıdır. Tek başına zayıf sınıflandırıcı anlamlı değildir. Binlerce özellik ile güçlü bir sınıflandırıcı oluşturulabilir.

Peki en önemli özellikleri bulup, nasıl güçlü sınıflandırıcı içine ekleriz ?

Örneğin kaşları tespit eden zayıf sınıflandırıcı olsun, mevcut resimlerimizde tespit oranı eğer düşükse bu özelliğin, ilave olarak gözleri iyi tespit eden başka bir zayıf sınıflandırıcı ile güçlendirilir. Eğer daha önce yanlış tespit olmuş ya da tespit edilememiş resimleri yeni zayıf güçlendirici eklendiğinde tespit edebiliyorsak aslında 2 zayıf güçlendirici biraraya gelerek daha güçlü bir sınıflandırıcı oluşturmuş oluyor ve başarı oranı artıyor.

Adaboost ile sınırlı bir sayıda özellik ile başarılı yüz tespit çalışmaları yapılır ve computational cost yani işlem güçleri ciddi şekilde azaltılır.

Cascading :

En önemli özelliği resim içinde kare kare tara ve ara varsa alt pencereye geç, yoksa alt pencereyi reddet lojiğinde çalışır. Böylelikle gereksiz işlem oluşmayacaktır. Tabiki gerçek hayatta tek bir özelliğe bağlı çalışmıyoruz. Gerçek hayatta en önemli 5-10 özelliğe tara ve ara. Eğer yoksa alt pencereyi reddet. Böylelikle işlem yükü ciddi oranda düşüyor.

OpenCV ile kodlama kısmına geçelim…

Hem yüz tespit hem de göz tespit uygulaması yapacağız.

Viola Jones algoritması gerçek zamanlı olarak çalışabiliyor. Kameradan aldığımız bir live stream üzerinde ya da webcam üzerinden ya da elimizdeki offline videodan veya resimden yüz tespit çalışmaları yapacağız.

Cascade xml dosyalarını indirmek gerekiyor hazır eğitilmiş modeller bulunmaktadır.

haarcascade_frontalface_default.xml ; yüz tespit için, haarcascade_eye.xml ise göz tespit için kullanılacak olan model xml’leridir.

https://github.com/opencv/opencv/tree/master/data/haarcascades

Opencv github sayfasında çok farklı amaçlar için haarcascade’ler bulunmaktadır. Gülümseme tespiti, yüz tespit, göz tespit, insan vücudu tespit vb…

İndirilen opencv-master dosyası içinden , data klasörü altında haarcascades klasöründen ilgili eğitilmiş olan modeli alabiliriz.

Haarcascade modellerinin geliştirilmesi artık yapılmıyor. Derin öğrenmenin popülerleşmesiyle daha güçlü modeller geliştirilmektedir.

Opencv’nin haarcascade modelleri yüzü doğrudan görmeyi bekler. Yukarıdan, sağdan – soldan az açı ile bile olsa tespit edememe durumu söz konusudur. Yüz tespit yapılacak olan videoda ses olmaması gerekmektedir. Elinizdeki sesli videolardan sesi çıkarmak için internette birçok online site bulunmaktadır.

import cv2 #opencv kütüphanesini içeri aktardık


#cascade dosyalarını alıyoruz. yüz ve göz cascade'leri
yuz_cas=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
goz_cas=cv2.CascadeClassifier('haarcascade_eye.xml')

def tespit(frame):
    #cascade'ler siyah-beyaz resimde uygulanıyor.
    #siyah beyaza dönüştürelim.
    gri=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    yuzler=yuz_cas.detectMultiScale(gri,1.2,5) 
    """
    3 argüman alır. 
    siyah beyaz resim, ölçek faktörü 
    (resmin boyutu ne kadar küçültülecek), 
    min komşu sayısı en az 5 pencere 
    yüz tespit etmiş olsun ki yüz var diyelim.
    """
    for (x,y,w,h) in yuzler: #bulunan yüzün x,y koordinatı , genişliği ve yüksekliği..
        #genişliği yüksekliği bildiğimiz için mevcut x,y koordinatlarını w,h değerlerini ekleyip dikdörtgen içine yüzleri alacağız.
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
        gri_yuz=gri[y:y+h,x:x+w]
        renkli_yuz=frame[y:y+h,x:x+w]
        gozler=goz_cas.detectMultiScale(gri_yuz,1.1,3)
        for (ex,ey,ew,eh) in gozler:
            cv2.rectangle(renkli_yuz,(ex,ey),(ex+ew,ey+eh),(255,0,0),1)
    return frame

#VideoCapture objesi oluştur, webcam'den stream al
cap = cv2.VideoCapture(0)

# webcam başarılı bir şekilde açıldı mı ? 
if (cap.isOpened() == False):
  print("webcam'den stream alınamadı")

#genişlik ve yükseklik bilgisini al, float'tan int veri tipine dönüştür
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# codec tanımı, çıktı olacak dosya
out = cv2.VideoWriter('outpy.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 20, (frame_width,frame_height))

while(True):
  ret, frame = cap.read()
  frame=tespit(frame)

  if ret == True: 
    
    # video kaydet
    out.write(frame)

    # sonuc goster  
    cv2.imshow('frame',frame)

    # kaydı durdur ve çık, çıkış için q tuşuna bas
    if cv2.waitKey(25) & 0xFF == ord('q'):
      break

  # döngüyü durdur
  else:
    break  

# Herşey tamamlandığında video capture ve  video write objelerini serbest bırak
cap.release()
out.release()

# tüm pencereleri kapat
cv2.destroyAllWindows()

Webcam’den live video stream çekmek yerine offline video üzerinden de bu işlemi yapabilirsiniz.

cv2.VideoCapture(0) 0 yerine video dosyasının adını yazmak gerekmektedir.

Sonuç :

OpenCV kütüphanesi ile yüz özellikleri tanımlanmış olan cascade’ler kullanıldığında çok yüksek başarı oranları elde etmek kolay değil. Yazının başında da belirttiğimiz üzere Viola Jones algoritması doğrudan bakan yüz resimlerinde başarı elde edebilmektedir. Sağa sola ya da yukarı aşağı çok az açı ile dahi olsa bakan bir yüz için tespit işlemi kolay olmamaktadır. Artık günümüzde Deep learning yapay sinir ağları ile yüz tespit, yüz yakalama, yüz tanıma konularında ciddi başarılar elde edilmektedir.

One Comment

Add a Comment

error: Icerik Korumalıdır. Tüm hakları Turk-IoT\'ye aittir !!