Мы познакомимся с простой структурой для создания и использования настраиваемой системы распознавания лиц.

Изначально это было размещено в журнале Ars Futura.

С тех пор мы применили этот блог на практике и создали дверной замок для офиса, который использует распознавание лиц. Прочтите наш блог Smart Lock DYI и узнайте, как вы действительно можете сделать это самостоятельно.

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

Формально распознавание лиц определяется как проблема идентификации или проверки лиц на изображении. Как точно распознать лицо на изображении?

Распознавание лиц можно разделить на несколько этапов. На изображении ниже показан пример конвейера распознавания лиц.

  1. Распознавание лиц - обнаружение одного или нескольких лиц на изображении.
  2. Извлечение черт - извлечение наиболее важных черт из изображения лица.
  3. Классификация лиц - классификация лиц на основе извлеченных черт.

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

MTCNN

MTCNN или многозадачные каскадные сверточные нейронные сети - это нейронная сеть, которая обнаруживает лица и лицевые ориентиры на изображениях. Он был опубликован в 2016 году Zhang et al.

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

FaceNet

FaceNet - это глубокая нейронная сеть, используемая для извлечения черт из изображения лица человека. Он был опубликован в 2015 году исследователями Google Schroff et al.

Как работает FaceNet?

FaceNet принимает изображение лица человека в качестве входных данных и выводит вектор из 128 чисел, которые представляют наиболее важные черты лица. В машинном обучении этот вектор называется встраиванием. Зачем встраивать? Потому что вся важная информация из изображения встроена в этот вектор. По сути, FaceNet берет лицо человека и сжимает его в вектор из 128 чисел. В идеале вложения похожих лиц также похожи.

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

Хорошо, что нам делать с этими вложениями? Как распознать человека, использующего вложение?

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

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

Выглядит здорово, правда? Пропустите изображение через FaceNet, получите встраивание ✨ magic и посмотрите, достаточно ли близко расстояние до любого из известных лиц. Но откуда берется магия? Как FaceNet узнает, что нужно извлечь из изображения лица и что вообще означают эти числа в векторе встраивания?

Давайте попробуем углубиться в FaceNet и попытаемся объяснить, как FaceNet учится создавать вложения лиц.

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

FaceNet учится следующим образом:

  1. Случайным образом выбирает изображение привязки.
  2. Случайным образом выбирает изображение того же человека, что и изображение привязки (положительный пример).
  3. Случайным образом выбирает изображение человека, отличное от изображения привязки (отрицательный пример).
  4. Настраивает параметры сети FaceNet так, чтобы положительный пример был ближе к привязке, чем отрицательный.

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

Этот метод обучения с привязкой, положительными и отрицательными примерами называется потеря триплетов

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

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

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

Софтмакс

Ранее мы упоминали, что этап классификации может быть выполнен путем вычисления расстояний встраивания между новым лицом и известными лицами, но этот подход требует слишком больших вычислительных ресурсов и затрат памяти (этот подход называется k-NN). Вместо этого мы решили использовать классификатор Softmax, который запоминает границы между людьми, что намного эффективнее.

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

РЕДАКТИРОВАТЬ: Когда я писал эту часть, я не понимал, насколько сложно тренировать классификатор. Создав реальный проект по распознаванию лиц, я понял, что это совсем непросто. Подробнее о проекте можно прочитать здесь.

Система распознавания лиц

В Ars Futura мы разработали простую структуру для создания и использования системы распознавания лиц. Наша система распознавания лиц основана на компонентах, описанных в этом посте - MTCNN для обнаружения лиц, FaceNet для создания встраиваемых изображений лиц и, наконец, Softmax в качестве классификатора. Фреймворк бесплатный, с открытым исходным кодом, и вы можете найти его здесь.



Создайте свою систему распознавания лиц

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

- images 
    - person1
        - person1_1.png
        - person1_2.png
        ...
        - person1_n.png
    - person2
    ...
    - personN
    ...

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

Теперь, когда у вас есть подготовленные данные, вы можете создать свою собственную систему распознавания лиц с помощью следующей команды:

./tasks/train.sh path/to/folder/with/images

Вот и все! После успешного завершения этой команды у вас будет собственная система распознавания лиц! Вы можете использовать свою новую систему распознавания лиц несколькими способами. Существуют простые в использовании сценарии Python, которые выполняют распознавание лиц на изображениях или живом видео. Существует также Dockerfile для создания образа Docker с системой распознавания лиц и REST API, который вы можете вызвать. Подробнее об этом в README!

К какой команде вы принадлежите?

В качестве забавного способа протестировать фреймворк мы собрали изображения наших сотрудников и с помощью Face Recognition Framework создали нашу собственную систему распознавания лиц!

Мы использовали эту систему для реализации К какой команде вы принадлежите? на нашей странице Карьера.

Как это работает?

Вы делаете селфи или загружаете фотографию своего селфи, и мы анализируем, к какой команде вы принадлежите в Ars Futura.

Фактически, за кулисами мы обнаруживаем ваше лицо и получаем оценки схожести между вами и всеми сотрудниками Ars Futura. Мы суммируем и нормализуем оценки по командам и относим вас к команде с наивысшим показателем сходства!

Бонус: Apple FaceID

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

Настройка FaceID на iPhone - это запись нескольких изображений вашего лица с разных ракурсов.

Как работает FaceID? Как FaceID может распознать вас по нескольким фотографиям, сделанным в процессе настройки?

Если вы что-то знаете о машинном обучении, вы знаете, что сделать всего несколько фотографий недостаточно для обучения надежной модели. К тому же у мобильных телефонов действительно недостаточно ресурсов для проведения такого рода тренировок. У вас бы очень быстро разрядился аккумулятор, если бы на вашем iPhone проводилось какое-то обучение, поэтому мы можем с уверенностью заключить, что FaceID не выполняет никаких тренировок на устройстве.

Мы действительно не знаем, как работает FaceID, потому что Apple не раскрыла слишком много деталей, но, основываясь на фактах, которые мы действительно знаем, мы почти уверены, что основой FaceID является своего рода нейронная сеть, подобная FaceNet, которая извлекает вложения лица.

FaceID использует нейронную сеть, подобную FaceNet, которая обучена на миллионах лиц в автономном режиме для создания встраиваемых изображений лиц. Эта предварительно обученная сеть поставляется и обновляется вместе с операционной системой iOS. Когда вы настраиваете FaceID, он делает несколько фотографий вашего лица, вычисляет вложения лица и сохраняет эти вложения на устройстве. Когда вы пытаетесь разблокировать iPhone, FaceID делает снимок, вычисляет вложение вашего лица и сравнивает его с вложениями, сохраненными на устройстве. Если эти вложения достаточно похожи - ваш телефон будет разблокирован.

Погодите, разве это не то же самое, что функция Android Trusted Face, которую можно обмануть, используя фотографию лица человека, и которая недавно была удалена из-за этого?

Извините! Я соврал о том, что FaceID фотографирует. В этом FaceID отличается от технологий распознавания лиц на других мобильных устройствах. FaceID не использует реальные фотографии лиц. Вместо этого он использует 3D-модель вашего лица. Это дает FaceID более подробную информацию о лице и делает его более безопасным. FaceID нельзя обмануть картинками, а обмануть масками очень сложно (но не невозможно).

Что касается сенсора, Apple использует камеру TrueDepth для создания 3D-модели вашего лица. Камера TrueDepth основана на ИК-технологии. Вот почему iPhone старше X не поддерживает FaceID, потому что у них нет камеры TrueDepth.

Хотите узнать больше по этой теме? Ознакомьтесь с частью вторая.

Я хочу поблагодарить Ивана Божича за помощь в написании этого поста, также я хочу поблагодарить Domjan Barić и Натко Бишчан за полезные комментарии, я хочу поблагодарить Антонию Голич и Луку Дрезгу за создание визуализаций и анимаций для этого поста, и наконец, что не менее важно, я хочу поблагодарить Элизабету Перонья и Лею Метличич за редактирование сообщения :) Спасибо!

[1] Вложения в векторах FaceNet имеют 128 чисел, что означает, что они 128-мерны. Мы живем в трехмерном мире, мы не можем построить 128-мерный вектор. Мы делаем вид, что лица могут быть изображены в 2D для простоты, та же логика применяется для 2D и 128D, но в отличие от 128D, мы можем визуализировать 2D 😊.

[2] Это упрощенное объяснение, которое призвано дать читателю общее представление о процессе обучения FaceNet. Если вам интересно вникнуть в это, прочтите исходную статью FaceNet.