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.
İçindekiler
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:
- Ç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.
Ş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.
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.
Ş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.
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:
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.
abi merhaba. cv2.circle(img=frame, center=(x,y), radius=2, color=(0,255,0),thickness=-1)
kısmında unindent does not match any outer indentation level hatası alıyorum. sebebi nedir?
https://stackoverflow.com/questions/492387/indentationerror-unindent-does-not-match-any-outer-indentation-level burdan bakabilirsiniz.