Teknoloji Forumu

Python ile Yüz Tespiti Nasıl Yapılır? – Python Kütüphanesi

Bu yazımızda, Python ile yüz ve yüzde bulunan göz, burun ve ağız gibi özelliklerin tespiti nasıl yapılır, bunu öğreneceğiz. Bu yazıdan sonra, Snapchat ve Instagram’da gördüklerinize benzer şekilde efektler ve filtreler oluşturabileceksiniz.

Yüz tespiti (yüz algılama olarak da adlandırılır), dijital görüntülerde insan yüzlerini bulmak ve tanımlamak için kullanılan yapay zeka (AI) tabanlı bir bilgisayar teknolojisidir. Yüz algılama teknolojisi; sağlık, askeri, güvenlik alanlarında oldukça kullanılan bir teknolojidir. Yüz tanıma, temel bilgisayar görme tekniklerinden makine öğrenimindeki ilerlemelere, giderek daha karmaşıklaşan yapay sinir ağlarına ve ilgili teknolojilere kadar ilerlemiştir.

Peki, bu nasıl çalışıyor?

Yüzümüzün tanımlanabilecek çeşitli özellikleri vardır, bunlar göz, ağız, burun, dudak vb.dir. Bu özellikleri saptamak için DLib algoritmalarını kullandığımızda aslında her özelliği çevreleyen noktaların bir haritasını alırız. Peki bu DLib nedir? DLib, karmaşık gerçek dünya problemlerini çözmek için kullanılan ileri seviye bir makine öğrenmesi kütüphanesidir. Bu kütüphane C++ programlama dilini kullanarak yapılmıştır, C/C++, Python ve Java dillerinde de çalışmaktadır.

Bu harita 67 noktadan oluşmaktadır (yer işareti olarak da adlandırılmaktadır) ve aşağıdaki özellikleri tanımlayabilir:

Python ile Yüz Tespiti
Noktalar haritası
  • Çene Noktaları: 0-16
  • Sağ Kaş Noktaları: 17-21
  • Sol Kaş Noktaları: 22-26
  • Burun Noktaları: 27-35
  • Sağ Göz Noktaları: 36-41
  • Sol Göz Noktaları: 42-47
  • Ağız Noktaları: 48-60
  • Dudak Noktaları: 61-67

Gerekli Kütüphanelerin Yüklenmesi

  • opencv-python
  • dlib

Python ile yüz tespiti yapmak için öncelikle bu kütüphaneleri terminale şunları yazarak yüklememiz gerekmektedir:

pip install opencv-python,dlib

Bazı işletim sistemlerinde dlib kütüphanesini yüklerken bir takım hatalar alabilirsiniz. Bu hatalardan biri de CMake hatasıdır. Bunu halletmek için dlib kütüphanesini yüklemeden önce CMake kütüphanesini yüklememiz gerekmektedir.

pip install cmake

Gerekli kütüphaneleri yükledikten sonra, bu kütüphaneleri projemize dahil edebiliriz.

import cv2
import dlib

Python ile Yüz Tespiti Uygulaması

OpenCv kütüphanesini kullanarak fotoğrafımızı yüklüyoruz.

img = cv2.imread("foto.png")

# Fotoğrafı ekrana gösterir
cv2.imshow(winname="Face", mat=img)

#Fotoğrafı kapatmak için bir tuşa basmanız gerekir
cv2.waitKey(delay=0)

#Bütün pencereleri kapatır.
cv2.destroyAllWindows()

Gayet basit, değil mi? Fotoğrafı yükledik ve .imshow metodunu kullanarak ekrana bastırdık. Eğer bu kodu çalıştırsanız, Face isimli bir fotoğraf karşınıza çıkacaktır.

python-ile-yuz-tespiti
Face isimli fotoğraf

Şimdi Dlib kütüphanesinin get_frontal_face_detector() fonksiyonunu kullanarak yüz tespiti yapacağız. Ancak bu fonksiyon sadece gri fotoğraflarda çalışmaktadır, bu yüzden OpenCv kütüphanesini kullanarak fotoğrafı gri hale çeviriyoruz.

get_frontal_face_detector() fonksiyonu bize “detector” adında yüz bilgilerini kullanmamız için gerekli olan bir fonksiyon döndürmektedir. Her yüz, görüntünün bulabileceği noktaları içeren bir nesnedir.

import cv2
import dlib

detector = dlib.get_frontal_face_detector()

img = cv2.imread("foto.png")

# Resimi grayscale dönüştürür.
gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

#Yüzü tespit edebilmemiz için detector fonksiyonunu kullanıyoruz.
faces = detector(gray)

for face in faces:
    x1 = face.left()
    y1 = face.top()
    x2 = face.right()
    y2 = face.bottom()

    #Bir dikdörtgen çiziyoruz
    cv2.rectangle(img=img, pt1=(x1,y1), pt2=(x2,y2), color=(0,255,0), thickness=4)

#resimi göster
cv2.imshow(winname="Face",mat=img)

cv2.waitKey(delay=0)

cv2.destroyAllWindows()

Yukarıdaki kod, görüntüdeki tüm yüzleri alır ve her yüzün üzerinde bir dikdörtgen oluşturur.

python-ile-yuz-tespiti-2
Yüz tespit edilmiş fotoğraf

Bir sonraki adımda ise daha önceden de bahsettiğimiz üzere, yüzün bazı özelliklerini keşfedeceğiz. Bunun için yine DLib kütüphanesini kullanıyor olacağız. Bu kütüphanenin sunduğu shape_predictor() fonksiyonu bizim için tüm bu sihirli işleri yapıyor. Ancak çalışması için önceden eğitilmiş bir modele ihtiyacımız var.

Bunun için bir sürü internette bir sürü model bulunmaktadır, bu proje için benim kullandığımı modeli indirebilirsiniz.

import cv2
import dlib

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape.predictor("shape_predictor_68_face_landmarks.dat")

img = cv2.imread("foto.png")

gray =  cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

faces = detector(gray)

for face in faces:
    x1 = face.left()
    y1 = face.top()
    x2 = face.right()
    y2 = face.bottom()
    landmarks = predictor(image=gray, box=face)
    x = landmarks.part(27).x
    y = landmarks.part(27).y

   cv2.circle(img=img, center=(x,y), radius=5, color=(0,255,0),thickness=-1)

cv2.imshow(winname="Face",mat=img)
cv2.waitKey(delay=0)
cv2.destroyAllWindows()

Her seferinde aynı kodun üzerinden iyileştirme yapıyoruz, bu sefer farklı olarak predictor fonksiyonunu kullandık. Burada dikkatimizi çeken şey neden 27 sayısını kullandık?

Buradaki predictor fonksiyonu, yazının başındaki yüz şemasına uyan 68 noktanın tümünü içeren bir nesne döndürecektir. Dikkat ederseniz, 27 noktası tam olarak gözlerin arasına denk gelmektedir. Her şey doğru çalıştıysa, yüzdeki gözler arasında yeşil bir nokta görmelisiniz.

python-ile-yuz-tespiti-3
Gözler arasındaki yeşil nokta

Şimdi, tek bir nokta yerine bütün noktaları gösterelim.

import cv2
import dlib

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape.predictor("shape_predictor_68_face_landmarks.dat")

img = cv2.imread("foto.png")

gray =  cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

faces = detector(gray)

for face in faces:
    x1 = face.left()
    y1 = face.top()
    x2 = face.right()
    y2 = face.bottom()
    landmarks = predictor(image=gray, box=face)
    for n in range(0,68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y

   cv2.circle(img=img, center=(x,y), radius=5, color=(0,255,0),thickness=-1)

cv2.imshow(winname="Face",mat=img)
cv2.waitKey(delay=0)
cv2.destroyAllWindows()

Ve şu şekilde bir çıktı alıyoruz.

python-ile-yuz-tespiti-3

Bir sonraki ve son aşama ise en heyecanlı kısım! Web kameramızı bağlayıp gerçek zamanlı bir yüz tespiti yapacağız.

import cv2
import dlib

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

cap = cv2.VideoCapture(0)
while True:
  _, frame = cap.read() 

  gray = cv2.cvtColor(src=frame, code=cv2.COLOR_BGR2GRAY) 
  faces = detector(gray) 
  for face in faces: 
      x1 = face.left() 
      y1 = face.top() 
      x2 = face.right() 
      y2 = face.bottom() 
      landmarks = predictor(image=gray, box=face) 
      for n in range(0,68): 
          x = landmarks.part(n).x 
          y = landmarks.part(n).y 
         cv2.circle(img=frame, center=(x,y), radius=2, color=(0,255,0),thickness=-1)
   cv2.imshow(winname="Face",mat=frame) 
   if cv2.waitKey(delay=1)== 27: 
            break
cap.release()
cv2.destroyAllWindows()

Yukarıdaki kodu kullanarak bilgisayarınızın kamerasını aktif hale getirebiliir ve gerçek zamanlı yüz tespit yapabilirsiniz. Sonuçlar şu şekilde olmalıdır:

python-ile-yuz-tespiti-gif

Gördüğümüz gibi Python kütüphanelerini kullanarak yüz tespiti bu şekilde gerçekleşiyor. OpenCV ve DLib kütüphaneleri, makine öğrenimi ve bilgisayarla görme ile çalışmayı kolaylaştıran oldukça güçlü kütüphanelerdir.

Teknoloji'den geri kalmamak için e-posta listemize abone olun!

Muğla Sıtkı Koçman Üniversitesi Bilgisayar Mühendisliği 3.sınıf öğrencisi.


Yorum yapın