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

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

Алгоритм Виолы-Джонса

Алгоритм Виолы-Джонса, разработанный в 2001 году Полом Виолой и Майклом Джонсом, представляет собой структуру распознавания объектов, которая позволяет обнаруживать особенности изображения в режиме реального времени.

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

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

Алгоритм Виолы-Джонса состоит из 2 этапов:

  1. Обучение
  2. Обнаружение

Обучение предшествует обнаружению, но для пояснения я сначала остановлюсь на обнаружении.

2. Обнаружение

Виола-Джонс был разработан для фронтальных лиц, поэтому он может лучше распознавать фронтальные лица, а не лица, смотрящие вбок, вверх или вниз. Перед обнаружением лица изображение преобразуется в оттенки серого, так как с ним легче работать и требуется меньше данных для обработки. Алгоритм Виолы-Джонса сначала обнаруживает лицо на изображении в оттенках серого, а затем находит его местоположение на цветном изображении.

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

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

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

Особенности типа Хаара названы в честь Альфреда Хаара, венгерского математика в 19 веке, который разработал концепцию вейвлетов Хаара (что-то вроде предка хааровидных особенностей). Функции, представленные ниже, показывают прямоугольник со светлой стороной и темной стороной, по которым машина определяет, что это за функция. Иногда одна сторона будет светлее другой, например, на краю брови. Иногда средняя часть может быть более блестящей, чем окружающие коробки, что можно интерпретировать как нос.

В своем исследовании Виола и Джонс определили 3 типа характерных черт Хаара:

  • Особенности края
  • Линия-особенности
  • Четырехсторонние особенности

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

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

Представьте, что наш волосоподобный объект был преобразован в сетку. Каждый квадрат представляет собой пиксель. Для демонстрации я выбрал сетку 4 x 8, но на самом деле было бы намного больше пикселей и, следовательно, гораздо большая сетка для определенной функции. Цифры в квадратах обозначают темноту деталей. Чем он выше, тем пиксель темнее. Таким образом, вы можете видеть, что числа справа выше, чем слева. Теперь, если вы сложите числа в двух левых (белых) столбцах и вычтите их из суммы правых столбцов, вы получите значение конкретной функции.

Таким образом, в этом случае значение нашей функции равно →
(0,5 + 0,4 + 0,5 +0,6 + 0,4 + 0,7 + 0,5 + 0,4 +
0,4 ​​+ 0,5 + 0,6 + 0,8 + 0,5 + 0,7 + 0,6 + 0,6) -
(0,1 + 0,1 + 0,2 + 0,2 + 0,2 + 0,1 + 0,2 + 0,2 +
0,2 + 0,3 + 0,2 + 0,1 + 0,2 + 0,3 + 0,2 + 0,2)
B - W = 8,7 - 3
= 5,7

4. Интегральное изображение

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

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

Чтобы вычислить значение одного прямоугольника на интегральном изображении, мы берем сумму всех прямоугольников слева от него. На изображении ниже показан пример:

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

Давайте посмотрим на ценность примера, который я выбрал ранее:

Все, что нам нужно сделать, это посмотреть на 4 угла нашего объекта и добавить пурпурный, вычесть зелень.
→ 168–114 + 79–110 = 23

Так почему мы используем цельное изображение?

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

5. Обучение классификаторов

Теперь, когда мы рассмотрели обнаружение, перейдем к обучению.
Так что именно мы подразумеваем под обучением? Мы обучаем машину распознавать эти особенности. Мы скармливаем ему информацию, а затем обучаем его извлекать уроки из информации для прогнозирования. Итак, в конечном итоге алгоритм устанавливает минимальный порог, чтобы определить, можно ли что-то классифицировать как функцию или нет.

Алгоритм сжимает изображение до 24 x 24 и ищет в нем обученные особенности. Требуется много данных об изображении лица, чтобы можно было видеть черты лица в разных и разнообразных формах. Вот почему нам нужно предоставить алгоритму много данных об изображении лиц, чтобы его можно было обучить. Виола и Джонс загрузили в свой алгоритм 4 960 изображений (каждое помечено вручную). Для некоторых изображений вы можете передать зеркальное отображение определенного изображения, что будет совершенно новой информацией для компьютера.

Вам также потребуется предоставить алгоритму не-лицевые изображения, чтобы он мог различать два класса. Виола и Джонс предоставили свой алгоритм 9 544 изображения лица. В них некоторые изображения могут быть похожи на черты лица, но алгоритм поймет, какие черты с большей вероятностью будут на лице, а какие явно не будут на лице.

6. Адаптивное ускорение (AdaBoost)

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

Допустим, у нас есть уравнение для наших функций, которое определяет степень успеха (как показано на изображении), где f1, f2 и f3 являются функциями, а a1, a2, a3 - соответствующими весами функций. Каждая из характеристик известна как слабый классификатор. Левая часть уравнения F (x) называется сильным классификатором. Поскольку один слабый классификатор может быть не таким хорошим, мы получаем сильный классификатор, когда у нас есть комбинация двух или трех слабых классификаторов. По мере того, как вы продолжаете добавлять, он становится все сильнее и сильнее. Это называется ансамблем. Вы хотите убедиться, что перед вами самые важные функции, но вопрос в том, как вы находите самые важные или «лучшие» функции? Вот где в игру вступает Adaptive Boosting.

Например, предположим, что у вас есть 10 изображений: 5 изображений лица и 5 изображений без лица.
Итак, вы находите важную особенность, лучшую, по вашему мнению, особенность и используете ее, чтобы делать прогнозы.
Модель дает нам 3 из 5 истинных положительных результатов и 2 из 5 истинных отрицаний.

Он правильно предсказывает эти изображения, но также есть некоторые ошибки: 3 ложных срабатывания и 2 ложных отрицания. Таким образом, он не обнаружил особенности этих двух изображений, которые на самом деле являются лицами. В то время как он нашел эту особенность в 3 изображениях без лица.

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

7. Каскадирование

Каскадирование - это еще один вид «взлома», призванный повысить скорость и точность нашей модели. Итак, мы начинаем с подокна, и внутри этого подокна мы берем нашу самую важную или лучшую функцию и смотрим, присутствует ли она на изображении внутри подокна. Если его нет в подокне, то мы даже не смотрим на подокно, мы просто отбрасываем его. Затем, если он присутствует, мы смотрим на вторую функцию в подокне. Если его нет, мы отклоняем подокно. Мы продолжаем количество имеющихся функций и отклоняем подокна без этой функции. Оценка может занять доли секунды, но, поскольку вы должны делать это для каждой функции, это может занять много времени. Каскадирование значительно ускоряет этот процесс, и машина может предоставлять результаты намного быстрее.

8. Заключение

Итак, просто чтобы добавить несколько заключительных замечаний об алгоритме Виолы-Джонса:
- Алгоритм был разработан в 2001 году Полом Виолой и Майклом Джонсом, первый в своем роде и в основном использовался для приложений обнаружения лиц.
- Алгоритм состоит из двух этапов: обучение с использованием лицевых и не-лицевых изображений, а затем - фактическое обнаружение.
- У нас есть 2 шага для обучения: обучение классификаторов и Adaboost
- У нас есть 2 шага для обнаружения: обнаружение волосообразных особенностей и создание целостного изображения
- Виола-Джонс - один из самых мощных алгоритмов своего времени, и даже несмотря на то, что сегодня существуют лучшие модели, Виола-Джонс заложила основу для него в области распознавания лиц.

9. Источники

Изображения / гифки: