Yapay zeka, günümüzde insan duyularını makinelere de kazandırmayı amaçlayan bir disiplindir. İnsanda bulunan görme yetisini de, bilgisayarlı görme teknolojileri sayesinde makinelere bir nebze de olsa kazandırabildik. Artık nesneleri, mekanları ve insanları tanıyan yapay zeka, görme duyusu konusunda becerilere sahip oldu. Yüz tanıma teknolojileri de bu alanda yapılan çalışmalardan birisi. Python ile Yüz Tespiti Nasıl Yapılır? yazımızda yüzümüzü tanıyacak bir uygulama yazmıştık. Bu yazıda ise bu yüz tanıma işlemini bilgisayar tam olarak nasıl yapıyor onu anlatacağız ve OpenCV kütüphanesi ile bir Mutluluk Detektörü geliştireceğiz.
İçindekiler
Görüntüden Yüz ve Özellikler Nasıl Tespit Edilir
Yapay zekanın çoğu kısmında olduğu gibi bilgisayarlar, fotoğraflardan yüzleri tanırken de arkada çok fazla matematik dönmekte. Yüz tanıma işlemine geçmeden önce bilgisayarların görselleri nasıl gördüğünden biraz bahsedelim.
Bilgisayarlar görselleri insanların gördüğü gibi görmez. Makine için fotoğraflar sadece sayıdan ibarettir. Görsellerin boyutu pikseller ile belirtilir. 14×14 piksellik bir görsel aslında içinde sayısal değerler taşıyan 14 sütun, 14 satırlık bir matristir ve içinde 196 adet piksel barındırır. Bu piksellerdeki değerlere göre de resmimiz ortaya çıkar. Aşağıdaki örnekte görüldüğü üzere el yazısı ile yazılmış “1” rakamı aslında belirli yerlerde yüksek değerlere sahip olan bir matristir.
Renkli görseller üzerinden gitmemiz gerekirse de her fotoğraf RGB (Red- Green- Blue) olan üç katmana sahiptir. Bu 3 katmandaki değerler üst üste gelerek görselde her pikselde bulunan renkleri oluşturur.
Viola-Jones Algoritması
Viola-Jones Algoritması 2001 yılında Paul Viola ve Micheal Jones tarafından geliştirilmiş bir algoritmadır. İkili algoritmayı görüntülerdeki nesnelerin gerçek zamanlı tespit edilmesi adına geliştirdi. Viola-Jones algoritması her ne kadar eski bir algoritma olsa da, zamanına göre hala oldukça güçlüdür ve yüksek performans sergiler.
Algoritma, ön yüzler için tasarlandığından yan profillerden ziyade direk kameraya bakan yüzleri çok daha rahat algılar. Algoritma bir yüzü algılamadan önce çalışması daha kolay olduğundan görüntüyü gri tonlamaya dönüştürür ve bu gri fotoğrafta yüzü tespit eder. Ardından tespit edilen yüzü renkli görselde işaretler. Kernel adı verilen bir matris görselde yüz özelliklerini arar ve özellikleri karşılayan bölgeyi tespit edip işaretler.
Kernel her seferinde Haar-like özellikleri tespit etmeye çalışır. Eğer belirlenen özellikler o bölgede var ise algoritma o bölgenin yüz olduğunu algılar.
Haar-like Features (Haar-Benzeri Özellikler)
Adını Hungar matematikçi Alfred Haar’dan alan Haar-like özellikleri piksellerdeki parlaklık ve koyuluğa göre bazı özellikleri tespit eder. Örnek vermek gerekirse bir yüz görselinde kaşlar, kaşın üst kısmına göre daha koyu olduğundan bunu tespit edebilmekte. Viola-Jones’un araştırmalarında kullandıkları 3 tür Haar-like özelliği vardır:
- Edge Features (Kenar Özellikleri)
- Line Features (Hat Özellikleri)
- Four-rectangle Features (Dört taraflı özellikler)
Bu özellikleri kullanarak algoritma ilk olarak yüzde bulunan kaş, burun, ağız gibi özellikleri tespit edip ardından yüzü belirlemekte. Bu filtreler XML dosyalarında tutulmaktadır. Bu GitHub reposundan xml dosyalarına ulaşabilirsiniz. Biz bu projede bir adet XML dosyası kullanacağız:
- haarcascade_smile.xml
OpenCV ile Mutluluk detektörü
Mutluluk detektörü kodlamaya tam olarak başlamadan önce her zamanki gibi ilk olarak gerekli kütüphanelerimizi import ediyoruz. Bu projede OpenCV Kütüphanesini kullanacağımızdan ilk olarak onu import ederek başlıyoruz.
import cv2
Şimdi sıra XML dosyalarını da projeye dahil etmeye geldi. Bu kısımda yapmanız gereken XML dosyasını çalıştığınız Python dosyası ile aynı klasöre koymanız. Eğer aynı klasörde değil ise dosyanın bulunduğu konumu tamamen belirtmeniz gerekir.
cascade_smile = cv2.CascadeClassifier('haarcascade_smile.xml')
OpenCV kütüphanesinde bulunan CascadeClassifier() metodu ile indirdiğimiz XML dosyasını projeye dahil ediyoruz. Şimdi ise gülümsememizi tespit edecek fonksiyonu oluşturuyoruz.
def detect(gray_image,image):
smile = cascade_smile.detectMultiScale(gray_image,1.7,50)
for(x,y,w,h) in smile:
cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
return image
Yukarıdaki detect() fonksiyonu “gray_image” ve “image” olmak üzere iki farklı parametre almakta. Viola-Jones algoritması gri görsellerde çalıştığından girdi olarak görselin gri halini de vermemiz gerekmekte. detectMultiScale() fonksiyonu ile gülümsemeyi, gülümseme için belirlenen haar-like özellikleri ile tespit edeceğiz. Bu fonksiyon bize “x,y,w,h” olmak üzere dört farklı çıktı verecek. Buradaki x, x ekseninde gülümsenin başladığı yer, y, y ekseninde gülümsenin başladığı yer, w ve h ise gülümsemenin genişliği ve yüksekliği. Bu sayıları elde ettikten sonra cv2.rectangle() fonksiyonu ile gülümsemeyi orijinal görselde bir dikdörtgen içine alıyoruz.
Tespit etme fonksiyonumuzun ardından gülümsemeyi canlı olarak tespit etmek için bilgisayarımızın kendi kamerasına bağlanacağız.
cap = cv2.VideoCapture(0)
while True:
_,frame = cap.read()
grayImage = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
canvas = detect(grayImage,frame)
cv2.imshow('Video',canvas)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Yukarıda bir while döngüsüyle video kameramızdan gelen görüntüleri kare kare detect() fonksiyonuna sokmaktayız. Uygulama gülümsediğimizi tespit ettiği anda dikdörtgeni oluşturmakta. Burada bizim seçtiğimiz ‘q’ ile kamerayı kapatabilirsiniz.
Çok da zor olmayan bir şekilde bir OpenCV kütüphanesi ile bir mutluluk detektörü oluşturduk. Kodun tam haline aşağıdan erişebilirsiniz.