У вас в телефоне наверняка уже есть технология распознавания лиц. Ещё она есть в городских камерах наблюдения, на заводах и военных объектах, в лабораториях и даже в автомобилях. Посмотрим, как они устроены.
Из чего состоит распознавание лиц
Чтобы машина узнала лицо с помощью камеры, нужны такие компоненты:
- Оптическая камера или лидар, чтобы получить изображение или объёмную карту лица.
- База данных с заранее проанализированными лицами.
- Алгоритм, который находит в кадре лицо.
- Алгоритм приведения лица к какому-то набору векторов.
- Алгоритм сравнения векторов с эталонами.
Теперь посмотрим детали.
Получаем изображение с камеры
Это самая простая часть, которая может даже не зависеть от алгоритма распознавания лиц. Задача компьютера — взять видеопоток с камеры, в реальном времени нарезать его на несколько кадров и эти кадры отправить в алгоритм.
Некоторые алгоритмы используют плоское изображение с камеры. Другие используют лидары — это когда лазерная пушка быстро-быстро стреляет лазером во все стороны и измеряет скорость возвращения лучей. Получается не слишком точная, но в некоторой степени объёмная картинка. Часто её совмещают с изображением основной камеры, чтобы убедиться, что перед нами действительно человек, а не его фотография.
Иногда алгоритм настроен так, чтобы получать только подвижные изображения с меняющейся мимикой — чтобы не сканировали спящих людей или маски.
Некоторые алгоритмы вычисляют трёхмерную модель на основании поворота головы. Прямо говорят: посмотрите налево, посмотрите направо, приблизьтесь, отдалитесь. Так они пытаются построить более точную объёмную модель лица. Всё это — для безопасности.
Находим лицо в кадре
Перед тем как алгоритм приступит к распознаванию, ему нужно найти лицо на картинке. Для этого он использует метод Виолы — Джонса и специальные чёрно-белые прямоугольники (примитивы Хаара), которые выглядят примерно так:
С помощью этих прямоугольников алгоритм пытается найти на картинке похожие переходы между светлыми и тёмными областями. Если в одном месте программа находит много таких совпадений, то, скорее всего, это лицо человека. Например, вот как с помощью этих примитивов алгоритм находит нос и глаза:
Все примитивы специально подобраны так, чтобы с их помощью можно было найти границы лица и отсечь всё остальное. Поэтому, как только алгоритм находит место скопления таких совпадений, он для проверки сравнивает там остальные прямоугольники:
Если их набирается достаточное количество — это точно лицо. Обычно алгоритмы поиска лиц для контроля обводят рамкой найденную область — она помогает разработчикам понять, всё ли в порядке с логикой программы:
Строим модель по ключевым точкам
После того как алгоритм нашёл лицо, он строит его цифровую модель. Для этого он:
- Расставляет точки в ключевых местах: нос, рот, глаза, брови и так далее.
- Считает расстояние между точками.
- По этим расстояниям строит цифровую карту или вектор. Про векторы поговорим ниже.
От того, как будут расставлены эти точки, зависит точность распознавания, поэтому каждая коммерческая компания держит свой метод в секрете. Чем больше точек — тем выше точность, но минимально нужно проставить 68 точек. Если точек будет меньше, алгоритм может не сработать.
Считаем вектор и сравниваем с базой
Когда все точки найдены, алгоритм считает вектор — математический результат обработки свойств этих точек. Например, он находит расстояние между глазами, форму носа, толщину губ, форму бровей, расстояния между ними и ещё массу других параметров. В результате получается набор чисел, который называется вектором.
Если алгоритм работает в режиме «выучить новое лицо», то он записывает полученный вектор в базу данных с каким-то именем или идентификатором. Условно говоря, в базе это выглядит так:
«Вот здоровенный вектор из 900 чисел — я назову его Мишей»
Другой режим работы алгоритма — сопоставление с эталоном. В базе данных уже есть один или несколько векторов, а задача алгоритма — сравнить их с новым вектором, который посчитали только что по картинке с камеры. Тогда алгоритм считает, насколько новый вектор отличается от тех, которые уже лежат в базе данных. Если этот вектор отличается достаточно мало, считаем, что мы распознали лицо.
На картинке видно, что синий неизвестный вектор, который мы хотим распознать, ближе всех находится к Мише. Если расстояние между векторами будет достаточно маленьким, алгоритм скажет, что человек в кадре — это Миша.
У каждого алгоритма свои коэффициенты совпадения: где-то допустимо совпадение только на 98% и выше — тогда алгоритм не будет вас узнавать, если вы в маске или вокруг плохое освещение. Есть алгоритмы, где совпадение может быть меньше — тогда это менее безопасно, но лучше работает. Есть алгоритмы, которые в одном месте требуют точного совпадения, а в других — менее точного (например, глаза должны совпасть точно, а рот может двигаться). Это уже нюансы настройки и подкрутки конкретного алгоритма.
Уточнение векторов и самообучение
Есть алгоритмы, которые уточняются и узнают вас всё лучше со временем. При каждом распознавании лица они видят, что в вас изменилось с прошлого раза, и уточняют свою модель. Например, вы занесли себя в базу данных с бодуна, а на следующий день пришли огурцом. Алгоритм запомнил вас в обоих состояниях.
Что дальше
Теперь, когда мы знаем, как работает эта технология, попробуем повторить это сами — сделаем систему распознавания лиц на Python.