Распознавания лиц с использованием каскадных классификаторов Хаара

Теория

Обнаружение объектов с использованием каскадных классификаторов Хаара — эффективный метод обнаружения объектов, работающий в реальном времени. Это подход, основанный на механизме обучения. Каскадная функция обучается из множества положительных и отрицательных изображений.

Первоначально алгоритм требует много положительных изображений (изображений лиц) и негативных изображений (изображений без лиц) для обучения классификатора. Затем нам нужно извлечь из него функции. Для этого используются хаарные функции.

Функции применяются на всех обучающих изображениях. Для каждой функции находится лучший порог, который будет относить лица к положительным и отрицательным. Очевидно, что будут ошибки. Мы выбираем функции с минимальной частотой ошибок, которые лучше всего классифицируют изображения лица. Процесс не так прост, как это кажется. Каждому изображению присваивается одинаковый вес в начале. После каждой классификации увеличивается количество ошибочных изображений. Затем снова выполняется тот же процесс, рассчитываются новые коэффициенты ошибок, а также новые веса. Процесс продолжается до тех пор, пока не будет достигнута требуемая точность или частота ошибок.

Конечный классификатор представляет собой взвешенную сумму слабых классификаторов. Слабым классификатор называется, потому что он сам по себе не может классифицировать изображение, но вместе с другими образует сильный классификатор. 200 функций обеспечивают обнаружение с точностью до 95%. Окончательная настройка имеет около 6000 функций.

В большинстве изображении большая часть области изображения является областью без лица. Поэтому лучше всего иметь простой способ проверить, есть ли в области изображение лицо. Если нет идем дальше, если есть проверяем регион, где может быть лицо. Таким образом, мы можем найти больше времени для проверки возможной области лица.

Каскада Хаара в OpenCV

Обучить классификатор можно не только на распознование лиц но и других объектов, таких как автомобиль, самолет и т.д. Для этого Вы можете использовать OpenCV.

OpenCV уже содержит много предварительно подготовленных классификаторов для лица, глаз, улыбки и т.д. Эти файлы XML хранятся в opencv/data/haarcascades/. Давайте создадим детектор лица и глаза с OpenCV.

Сначала нам нужно загрузить требуемые классификаторы XML. Затем загрузите наше входное изображение (или видео).

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread(lico.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Теперь мы находим грани в изображении. Если грани найдены, они возвращают позиции обнаруженных лиц как Rect (x, y, w, h). Так как на лице всегда есть глаза, будем искать глаза. Как только мы получим регионы лиц, мы можем создать ROI для лица и применить обнаружение глаз в этой ROI.

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
   img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
   roi_gray = gray[y:y+h, x:x+w]
   roi_color = img[y:y+h, x:x+w]
   eyes = eye_cascade.detectMultiScale(roi_gray)
   for (ex,ey,ew,eh) in eyes:
       cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

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

Результат выглядит так: