Каскадный классификатор Хаара (также известный как алгоритм Виолы-Джонса) — это очень быстрый алгоритм обнаружения лиц, который используется в большинстве систем распознавания лиц в реальном времени, таких как цифровые камеры.

Этот более старый (примерно с 2001 года), но все еще популярный алгоритм использует каскады классификации на основе признаков, которые учатся обнаруживать лица на изображении. Вы можете прочитать оригинальную статью, предлагающую этот подход здесь или посмотреть это видео:

Как это работает

Первое, что нужно сделать, это получить яркость изображения (преобразовать его в оттенки серого).

Особенности Хаара

Функция типа Хаара рассматривает соседние прямоугольные области в определенном месте окна обнаружения, суммирует интенсивности пикселей в каждой области и вычисляет разницу между этими суммами.

Значение = Σ (пиксели в черной области) — Σ (пиксели в белой области)

Если значение разницы больше заданного порога, распознается лицо. Эти функции проходят через все изображение, как ядро ​​свертки.

Обратите внимание, что второе лицо не распознается, потому что оно слишком маленькое. Чтобы решить эту проблему, изображение сканируется с использованием классификаторов разного размера:

Адабуст

Реальные классификаторы намного сложнее. Они содержат тысячи функций. В случае алгоритма Виолы-Джонса при размере подокна 20×20 всего имеется 45891 возможных признаков.

Они создаются с помощью тренажеров (например, AdaBoost), которые содержат сотни изображений и находят лучшие функции Haar.

Он выходит из множества наборов данных лиц для обучения adaboost.

Каскад классификаторов (оптимизация)

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

Интегральное изображение (оптимизация)

Нам нужно вычислить много сложений прямоугольников, поэтому мы можем оптимизировать эту сумму. Интегральное изображение — это метод вычисления суммы прямоугольника пикселей очень быстро, за постоянное время o(1), вместо наивного вычисления с o(n²). Первым шагом является получение интегрального изображения, где каждый пиксель является суммой его предыдущих пикселей (верхнего и левого пикселей).

Затем, если мы хотим вычислить сумму заданного прямоугольника, например 3+2+5+4=14, мы можем использовать интегральное изображение и использовать только углы следующим образом:

сине-коричневый-зеленый+черный, что равно 46–22–20+10=14.

Код в openCV

import numpy as np
import cv2 as cv
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
img   = cv.imread('family.jpg')
gray  = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

использованная литература