Нежное введение в то, что это такое и как это работает

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

Темы для освещения

  1. Распознавание лиц — что представляет собой лицо и как мы идентифицируем его численно
  2. Распознавание лиц — Хорошо, мы нашли несколько лиц, но кому они принадлежат
  3. Демонстрационная установка — знакомство с простым примером

Распознавание лиц

В этой демонстрации мы будем использовать OpenCV. OpenCV — это бесплатная библиотека компьютерного зрения, которая в основном используется в C++ или Python. Один из более простых режимов обнаружения лиц, который он предлагает, использует каскадный классификатор Хаара.

В классификаторе Хаара каждый из этих квадратов представляет собой матрицу пикселей 3x3, где белый — это, например, 0, а черный — 5. Квадрат помещается поверх изображения с камеры и обычно сканирует каждый пиксель, умножая это 3x3. с фрагментом изображения 3x3, чтобы определить, тесно ли этот фрагмент изображения связан с какой-либо из этих 4 функций. Идея здесь в том, что эти черты приближаются к лицу вот так.

Поскольку большая часть изображения не является лицом, полезно отбрасывать участки изображения, которые на раннем этапе идентифицируются как «не лица». Каскадная часть каскадного классификатора делит изображение на квадраты размером 24x24 пикселя и применяет матрицы признаков к каждому квадрату. Как только он определяет после первых нескольких признаков, что квадрат не содержит граней, он отбрасывает квадрат и движется дальше.

Когда классификатор OpenCV Haar обучался, ему давали тысячи изображений лиц и без лиц. После применения функций Хаара в методе скользящего окна используется Adaptive Boosting или AdaBoost, чтобы определить, какие комбинации функций лучше всего представляют лицо.

AdaBoost с высоты 10 000 футов

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

Поскольку лицо/не лицо прогнозируется на всех обучающих данных, культи/признаки, которые чаще всего являются правильными, получают больший вес в следующем прогнозе, пока каждый признак не будет иметь вес, отражающий, насколько хорошо он обнаруживает лицо. Например, функции 2 и 3 на изображении выше могут иметь больший вес, чем функции 1 и 4.

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

Распознавание лиц

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

Скользящее окно размещается над областью, определенной нашим каскадным классификатором Хаара как лицо, и мы преобразуем каждый пиксель в белый или черный пиксель в зависимости от того, насколько они отличаются от центрального пикселя в фильтре 3x3.

Повторение этого процесса приводит к гистограмме для каждого фрагмента 3x3 и окончательному объединению всех этих фрагментов для окончательной «подписи».

Также изображение выглядит странно

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

Реализация для себя

Наконец, на этом шаге вы узнаете, что вы можете сделать, чтобы настроить себя. Это предполагает, что на вашем компьютере установлен OpenCV, а ваша среда настроена на использование Python 3. Вам нужно будет установить jupyter, если вы еще этого не сделали. Блокнот jupyter доступен здесь, и вы можете запустить его, перейдя в каталог проекта и запустив jupyter notebook В браузере по адресу localhost:8888 перейдите к блокноту Демонстрация распознавания лиц.

Этот блокнот разбит на 4 основных этапа. Фаза настройки, на которой мы импортируем необходимые пакеты и инициализируем конфигурацию камеры, фаза сбора лиц, на которой мы делаем 30 снимков лица для обучения распознавателя БДГМ, обучение распознавателя БДГП и, наконец, его использование для распознавания лиц. Первая часть носит пояснительный характер, поэтому я не буду тратить на нее время.

Во второй части становится интереснее. Здесь вы увидите эту строкуface_cascade = cv2.CascadeClassifier('./classifiers/haar_frontal_face.xml'), где мы настроили наш каскадный классификатор для использования черт лица Хаара. Существуют и другие функции, которые вы можете использовать для обнаружения различных типов объектов с помощью каскадных классификаторов, но сейчас давайте сосредоточимся на лицах. Каскадный классификатор — это только часть, в которой мы игнорируем области изображения, которые, как мы знаем, не содержат лиц на ранней стадии, и сосредотачиваемся на тестировании дополнительных функций Хаара в областях, которые с большей вероятностью содержат лицо. Как только мы инициализируем наш каскадный классификатор, мы запрашиваем имя для настройки идентификатора лица, сопоставления имен, чтобы сделать его более удобным для пользователя.

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

Следующий блок обучает классификатор, открывая каждое изображение лица, сохраненное в вашей папке datasets, и строит гистограммы. Затем он сохраняет гистограмму для каждого лица в виде строки обучающих данных, чтобы позже можно было сравнить входящие потоки.

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

Объединяем

Надеемся, что это введение в распознавание лиц было интересным и доступным способом понять распознавание лиц и послужило хорошей отправной точкой для создания собственных приложений для распознавания лиц или погружения в более глубокие аспекты ML и CV, такие как CNN и Adaptive Boosting. Напишите мне в Twitter или LinkedIn, если у вас есть вопросы или комментарии. Я не претендую на звание эксперта в этом, поэтому, если у вас есть предложения, я широко открыт. Спасибо за чтение!