Как работает детекция лиц с помощью каскадов Хаара?

Детекция лиц с помощью каскадов Хаара (Haar Cascades) — это один из первых широко применяемых и до сих пор актуальных методов обнаружения объектов (в частности, лиц) на изображениях в реальном времени. Алгоритм был предложен Полом Виолой и Майклом Джонсом в 2001 году в статье “Rapid Object Detection using a Boosted Cascade of Simple Features”. Его основными преимуществами являются высокая скорость работы и простота реализации, что делает его особенно полезным в мобильных и встроенных системах.

Основные этапы работы каскадов Хаара

  1. **Выделение признаков Хаара
    **
  2. **Интегральное изображение
    **
  3. **Обучение классификатора (AdaBoost)
    **
  4. **Каскадный классификатор
    **
  5. **Сканирование изображения на разных масштабах и позициях
    **

1. Признаки Хаара (Haar-like features)

Это простые прямоугольные шаблоны, которые описывают изменение интенсивности пикселей в определённых областях изображения. Они могут быть:

  • Двухпрямоугольные признаки (например, вертикальные: левая часть — светлая, правая — тёмная)

  • Трёхпрямоугольные признаки (например, светлая-тёмная-светлая)

  • Четырёхпрямоугольные признаки (например, шахматное чередование светлого и тёмного)

Каждый такой признак измеряет разницу в яркости между светлыми и тёмными областями.

Пример:
Чтобы обнаружить глаз, можно использовать горизонтальный двухпрямоугольный признак: тёмная полоса (глаз) и светлая (щека/лоб).

2. Интегральное изображение (Integral Image)

Для ускорения вычисления признаков Хаара используется структура, называемая интегральным изображением. Это специальное представление, в котором каждая точка (x,y)(x, y) содержит сумму всех пикселей выше и левее этой точки, включая её саму.

Формула:

II(x, y) = ∑(i ≤ x, j ≤ y) I(i, j)

После построения интегрального изображения можно за 4 операции быстро вычислить сумму пикселей в любом прямоугольнике изображения.

3. Обучение классификатора (AdaBoost)

На основе извлечённых признаков Хаара обучается бинарный классификатор, который решает — является ли данный участок изображением с лицом или нет.

AdaBoost:

  • Из десятков тысяч признаков выбираются наиболее информативные.

  • Каждый слабый классификатор использует один признак.

  • Эти слабые классификаторы объединяются в сильный классификатор с помощью взвешенного голосования.

Цель — отобрать несколько сотен признаков, наиболее чувствительных к наличию лица.

4. Каскадный классификатор

Признаки и классификаторы организуются в каскад — последовательность этапов (стадий), где каждый последующий становится всё более сложным и точным.

На каждой стадии:

  • Если изображение однозначно не содержит лицо, оно отбрасывается.

  • Если возможно лицо, оно передаётся на следующий этап.

Каждая стадия:

  • Быстро фильтрует «очевидные» не-лица.

  • Позволяет фокусироваться на сложных случаях в последних этапах.

Таким образом, подавляющее большинство окон отбрасываются уже на первых стадиях, что даёт значительное ускорение работы.

5. Сканирование изображения

Поскольку лицо может находиться в любом месте и иметь разный размер, выполняется:

a. Скользящее окно (Sliding window)

  • Прямоугольное окно фиксированного размера последовательно перемещается по изображению с шагом в несколько пикселей.

  • На каждом положении проверяется, есть ли лицо.

b. Пирамиды масштабов (Image Pyramid)

  • Изображение многократно масштабируется (уменьшается).

  • Один и тот же классификатор применяется к окнам одного размера, но на разных масштабах изображения.

  • Это позволяет находить объекты разных размеров (например, лица ближе и дальше от камеры).

Пример использования в OpenCV

import cv2
\# Загрузка классификатора
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
\# Загрузка изображения и преобразование в серый формат
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
\# Детекция лиц
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
\# Отрисовка
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

Параметры detectMultiScale:

  • scaleFactor=1.1 — как сильно уменьшается изображение на каждом уровне пирамиды

  • minNeighbors=5 — сколько соседей должно быть у прямоугольника, чтобы он считался лицом

  • minSize=(30, 30) — минимальный размер обнаруживаемого объекта

Преимущества метода

  • Очень высокая скорость благодаря каскаду и интегральному изображению

  • **Поддерживается в OpenCV и работает в реальном времени
    **

  • **Не требует GPU
    **
  • Может работать даже на слабом железе и встроенных системах

Недостатки метода

  • Чувствительность к освещению — изменение яркости может сильно повлиять на точность

  • **Маленькие лица или сложный ракурс могут не обнаруживаться
    **

  • Зависимость от обучающего набора — если классификатор не обучен на повёрнутые лица, он их не найдёт

  • Невысокая точность по сравнению с современными методами на основе глубокого обучения (например, MTCNN, YOLO, RetinaFace)

Обучение собственных каскадов Хаара

Можно обучить кастомный классификатор для распознавания других объектов:

  1. **Подготовить положительные и отрицательные изображения
    **

    • Положительные: с объектом (например, лицо)

    • Отрицательные: без объекта

  2. **Создать описание объектов
    **

    • .vec файл с положительными примерами

Обучить каскад

python opencv_traincascade -data data -vec positives.vec -bg negatives.txt -numStages 20 -w 24 -h 24

Процесс ресурсоёмкий, но позволяет создавать детекторы для своих задач.

Где применяется

  • Распознавание лиц на веб-камере

  • Детекторы в системах безопасности

  • Фотоавтоматическое кадрирование в галереях

  • Простейшие системы слежения за лицом

  • Робототехника и управление взглядом камеры

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