OpenCV ile Yüz Tespiti

OpenCV genel amaçlı nesne tespiti için pek çok sınıflandırıcı sunmaktadır. Bu sınıflandırıcılardan en yaygın bilineni Paul Viola ve Michael Jones tarafından keşfedilen ve Viola-Jones yüz dedektörü olarak adlandırılan “haar-based cascade” sınıflandırıcıdır. OpenCV data klasörü altında bulunan bazı sınıflandırıcılar aşağıda verilmiştir:

 

Sınıflandırıcı İsmi XML Dosya Yolu
Yüz Tespiti haarcascade_frontalface_default.xml
Sol Göz Tespiti haarcascade_lefteye_2splits.xml
Sağ Göz Tespiti haarcascade_righteye_2splits.xml
Ağız Tespiti haarcascade_mcs_mouth.xml
Burun Tespiti haarcascade_mcs_nose.xml
Gülümseme Tespiti haarcascade_smile.xml

 

Yüz tespit örneği için küçük bir Python uygulama tüm kodu aşağıda verilmiştir. Öncelikle gerekli kütüphaneler yüklenmiştir. Yüz tespit edilecek. jpg formatlı görüntü cv2.imread fonksiyonu ile okunmaktadır. cv2.CascadeClassifier fonksiyonu ile tabloda verilen yüz tespiti için kullanılacak olan XML dosya yolu belirtilmektedir. Görüntüdeki yüzleri bulmamızı sağlayan detectMultiScale fonksiyonu birkaç seçenek sunmaktadır. minFeatureSize, düşünülen minimum yüz boyutudur (20×20 piksel gibi). searchScaleFactor görüntüyü yeniden ölçekleme (rescale) miktarıdır. Kod içinde verilen 1.1 değeri, verilen görüntünün %10 oranında boyutunun azaltılması anlamına gelmektedir. minNeighbors parametresi bir yüzü dikdörtgen içine almak için ne kadar komşu sayısının gerekli olduğunu hesaplamaktadır ve genellikle 3 ya da 5 iyi bir seçimdir.  detectMultiScale fonksiyonu tespit edilen yüzlerin (x,y,w,h) konum bilgisini tutmaktadır. Yüz tespitinin başarısını göstermek için cv2.rectangle fonksiyonu ile tutulan koordinat bilgilerini dikdörtgen kutu içerisine alınmaktadır. Bir görüntü OpenCV kullanarak yüklendiğinde BGR renk formatındadır. Bu sebeple matplotlib kullanarak renkli görüntüyü göstermek istediğimizde cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) ile görüntüyü RGB formatına çevirmemiz gerekmektedir.

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('meghan-harry.jpg')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=3)
print('Yüz Tespiti: ', len(faces))
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x + w, y + h), (100, 255, 0), 2)
plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))

OpenCV 3.3 ayrıca yüz tanıma için derin sinir ağları (deep neural networks-dnn) modülü sunmaktadır. Bu modül Caffe, TensorFlow ve PyTorch derin öğrenme platformlarını desteklemektedir. Bu üç popüler platformdan eğitilmiş modelleri yükleme ve kullanma imkanı sunan OpenCV ayrıca farklı sınıflandırma modelleri, nesne tespiti, cinsiyet ve yaş tespiti gibi pek çok probleme çözüm sunmaktadır. Caffe, TensorFlow ve PyTorch modüllerini içeren ve bu platformda eğitilmiş modelleri yüklemeye imkan tanıyan dnn modüllerine buradan ulaşılabilmektedir. .prototxt dosyaları model mimarilerini yani katmanları ve .caffemodel katmanların ağırlıklarını içermektedir.

Caffe model şu şekilde yüklenmektedir:

import cv2
import numpy as np
net_caffe = cv2.dnn.readNetFromCaffe('bvlc_googlenet.prototxt', 
                                     'bvlc_googlenet.caffemodel')

Torch eğitim modelini okumak ve yüklemek için:

net_torch = cv2.dnn.readNetFromTorch('torch_enet_model.net')

TensorFlow eğitim modelini okumak ve yüklemek için:

net_tensorflow = cv2.dnn.readNetFromTensorflow('tensorflow_inception_graph.pb')