Face Detection with Haar Cascades

Kategori: Computer Vision , 08 Şubat 2020 , JanFranco


Bu yazımda Haar Cascade'leri kullanarak bir yüz tespiti uygulaması yapacağız. Algoritma aşağıda görmüş olduğumuz feature denilen matrisleri kullanır:

Haar Cascades

Bu objeler basit birer binary matristir. Ne işe yaradığını anlamak için aşağıdaki resmi de inceleyelim:

Haar Cascades
br> Örneğin featureların olduğu resimde, ilk feature'ı ele alalım. Aşağıdaki gibi bir yapısı vardır:

0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1

Boyutlar tabi ki değişecektir ancak mantık olarak bir kısım beyaz bir kısım siyahtır. Eğer resmin aranan bölgesine bu matris konulursa, altta kalan bölge ikiye ayrılır, karanlık ve aydınlık olarak. Karanlık bölgedeki piksel değerlerinin ortalaması alınır, aydınlık bölgedeki piksel değerlerinin ortalaması alınır ve elde edilen iki değer birbirinden çıkartılır. Örneğin 0.7 gibi bir değer elde edelim. Bu değer 1'e yakınlaştıkça doğruluk artmaktadır. Tabi ki tam 1 değerini aramıyoruz. Belirli bir eşik değer üzerindeki değerler bizim için yeterlidir, 0.7 değeri gibi. Burada bir kenar var diyebiliriz.

2. resme baktığımızda bu feature'ların yüz tespitinde nasıl kullanıldığını görüyoruz. Teoriye göre bir insanın gözü, kaşlarından daha açık tonludur. Renkler bizim için önemsizdir çünkü bu algoritmayı kullanabilmek için resmi grayscale resme dönüştürürüz. Bir başka teori de bir insanın gözleri, gözlerinin arasındaki bölgeden daha koyudur gibi. Bu tarz teoriler ile bir feature listesi hazırlanır. Algoritmanın çok fazla detayına inmeyeceğim, araştırabilirsiniz. Algoritma gayet hızlı bir şekilde objeleri bulabiliyor. Hızlı olmasının sebebi integral image denen tekniği kullanmasıdır. Integral resimde sol üst pikselden başlanarak tüm pikseller toplanarak yeni bir resim elde edilir. Bu teknikle hesaplanacak değer sayısı 4-5 kat düşürülür, yüksek performans sağlar. Çok basit bir tekniktir, internetten araştırıp bakabilirsiniz. Diğer bir hız kazandıran özellik ise, tüm feature'lara bakılmamasıdır. Eğer bir bölgede bir feature denenir ve fail olursa o bölgeye tekrar bakılmaz. Böylelike yine hız artışı sağlanmış olur. Bu yazımızda daha önceden train edilmiş face ve eye cascadeleri kullanacağız. Python üzerinden görelim. Kütüphaneyi ve resmi import edelim:


import cv2

img = cv2.imread('../data/barney.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
>>

Haar Cascades

Resmi grayscale hale dönüştürelim, cascade dosyasını alalım:


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
frontalfaceHaarCascade = cv2.CascadeClassifier('../data/haarcascades/haarcascade_frontalface_default.xml')
detectMultiScale methodu ile resmi gönderelim. Bu method tespit edilen yüzün etrafında bir dikdörtgen çiziyormuş gibi koordinatlar döner. Bu koordinatlar ile dikdörtgeni çizelim:


frontalRect = frontalfaceHaarCascade.detectMultiScale(gray)
imgForFace = img.copy()

for (x, y, w, h) in frontalRect:
    cv2.rectangle(imgForFace, (x, y), (x + w, y + h), (0, 0, 255), 2)

cv2.imshow('img', imgForFace)
cv2.waitKey(0)
>>

Haar Cascades

Aynı teknikleri şimdi de eye cascade kullanarak yapalım:


eyeHaarCascade = cv2.CascadeClassifier('../data/haarcascades/haarcascade_eye.xml')
eyeRect = eyeHaarCascade.detectMultiScale(gray)
imgForEyes = img.copy()

for (x, y, w, h) in eyeRect:
    cv2.rectangle(imgForEyes, (x, y), (x + w, y + h), (0, 0, 255), 2)

cv2.imshow('img', imgForEyes)
cv2.waitKey(0)
cv2.destroyAllWindows()
>>

Haar Cascades


Sonraki Yazı: Plate Detection
Yorumlar

Henüz bir yorum bulunmuyor.