Как работает детекция лиц с помощью каскадов Хаара?
Детекция лиц с помощью каскадов Хаара (Haar Cascades) — это один из первых широко применяемых и до сих пор актуальных методов обнаружения объектов (в частности, лиц) на изображениях в реальном времени. Алгоритм был предложен Полом Виолой и Майклом Джонсом в 2001 году в статье “Rapid Object Detection using a Boosted Cascade of Simple Features”. Его основными преимуществами являются высокая скорость работы и простота реализации, что делает его особенно полезным в мобильных и встроенных системах.
Основные этапы работы каскадов Хаара
- **Выделение признаков Хаара
** - **Интегральное изображение
** - **Обучение классификатора (AdaBoost)
** - **Каскадный классификатор
** - **Сканирование изображения на разных масштабах и позициях
**
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)
Обучение собственных каскадов Хаара
Можно обучить кастомный классификатор для распознавания других объектов:
-
**Подготовить положительные и отрицательные изображения
**-
Положительные: с объектом (например, лицо)
-
Отрицательные: без объекта
-
-
**Создать описание объектов
**- .vec файл с положительными примерами
Обучить каскад
python
opencv_traincascade -data data -vec positives.vec -bg negatives.txt -numStages 20 -w 24 -h 24
Процесс ресурсоёмкий, но позволяет создавать детекторы для своих задач.
Где применяется
-
Распознавание лиц на веб-камере
-
Детекторы в системах безопасности
-
Фотоавтоматическое кадрирование в галереях
-
Простейшие системы слежения за лицом
-
Робототехника и управление взглядом камеры
Каскады Хаара до сих пор используются как быстрый и простой метод для детекции лиц, особенно в реальном времени, несмотря на то, что современные сверточные нейросети значительно обогнали его по точности.