Распознавание лиц для систем контроля доступа (от банков и аэропортов до ноутбуков) и различных веб-сервисов становится все более популярной технологией. Конечно, реальные системы распознавания лиц сложны и используют значительное число алгоритмов. Тем не менее, попытаемся рассмотреть некоторые подходы, позволяющие реализовать эту технологию.

Немного теории
Распознавание лица на изображении можно представить в виде следующих шагов:
1) Детекция области лица на изображении 2) Выделение признаков изображения. В простом случае это могут быть пиксели исходного изображения, возможно преобразованные в одномерный вектор.
3) Обработка признаков изображения. Вектор признаков изображения служит входом некой функции, которая выдает выходной вектор признаков изображения.
4) Заключительный этап — определение расстояния от выходного вектора признаков до аналогичных векторов изображений людей, находящихся в базе. То есть человек с минимальным расстояним считается опознанным. Здесь стоит отметить проблему порога для минимального расстояния. Если изображение некачественное и алгоритм не может распознать лицо, расстояние будет больше порога и сделан вывод о невозможности распознавания.

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



Детекция лица.


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

1) Сравнение эталонов. Это, пожалуй, первое, что приходит в голову — эталонное изображение лица в разных масштабах попиксельно сравнивается с различными областями изображения. Эталоном может быть лицо не полностью, а, например, только глаза. Однако, сразу напрашивается вывод о вычислительной трудоемкости метода, так как требуется соответствие размеров эталона с лицом на фотографии.

2) Модификацией предыдущего метода можно считать сравнение эталона не по пикселям, а по рассчитываемой для эталона и для исходного изображения разностной матрицы яркостей. Например, для каждого пикселя считаются 2 числа, определяемые как разница между этим пикселем и соседним справа и снизу. Результирующие значения можно записать в виде 1 0 -1 (больше, равно или меньше). Таким образом, образуется некая градиентная карта для изображения.

3) Для цветного изображения можно использовать информацию о цвете кожи. Определяются области, соответствующие цвету кожи человека. Кроме лица человека в эти области попадают области рук, шеи и другие случайные элементы изображения. Далее необходимо произвести поиск области лица среди выбранных областей.
Процесс локализации лиц реализуется в таких цветовых пространствах, в которых области лиц (область «skin-color») выделяются из остального фона. Среди них наибольший интерес вызывают пространства YCbCr и HSV.
Пример для цветового пространства HSV правило для маски областей, соответствующих цвету кожи:
Mask = (S>=0.1 & S<0.25)&( (H>=0 & H<0.1)|(H>=0.9 & H<1)) & (V>=0.2 & S<0.8);
4) Замечательная библиотека Open CV (библиотека с открытым кодом, подробнее описано здесь) предоставляет функцию детекции лица, основанную на вейвлетах Хаара. На понятийном уровне про вейвлеты хорошо написано здесь.

Функции Хаара относятся к классу кусочно-постоянных функций, они локализованы в отдельных частях изучаемого интервала и позволяют оценить локальные свойства исследуемых сигналов, поэтому их часто называют вейвлетами Хаара.
Применение функций Хаара особенно эффективно при анализе сигналов с сильно выраженными локальными особенностями в виде кратковременных всплесков и колебаний, это объясняется тем, что аппроксимация всплесков и колебаний осуществляется ограниченным числом составляющих ряда, расположенных в соответствующей части интервала.
Классификатор (или каскад усиленных классификаторов, работающий с элементами базиса Хаара) обучается с помощью нескольких сотен изображений лица. Эти изображения могут быть как «положительными» — относятся к классу изображений (лица), так и «отрицательными» — изображения, не являющиеся лицами. Все изображения приводятся к одному размеру (например, 20×20)

Используемые функции библиотеки OpenCV.
cvLoadHaarClassifierCascade — Загружает обученный каскад классификаторов из файла или базы классификаторов имеющейся в OpenCV. База может быть обучена при помощи haartraining (opencv/apps/haartraining).
cvHaarDetectObjects — Определение объектов на изображении.
В библиотеке уже представлены рассчитанные классификаторы Хаара для детекции лица в различных ситуациях — например для фронтального изображения или в профиль.

______________________
Текст подготовлен в Хабра Редакторе от © SoftCoder.ru