Найти тему
Python Lounge

Как работает FaceID в iPhone X: алгоритм на языке Python

Оглавление

Одна из самых обсуждаемых фишек iPhone X – новый метод разблокировки: FaceID. В этой статье разобран принцип работы данной технологии.

Создав безрамочный телефон без TouchID, Apple пришлось разработать новый метод для разблокировки устройства простым и быстрым способом. В то время как некоторые конкуренты продолжали использовать сканер отпечатка пальца, Apple решила обновить и революционизировать способ разблокировки телефона. Благодаря продвинутой (и удивительно маленькой) фронтальной глубинной камере, iPhone X имеет возможность создать 3D-карту лица пользователя.

Кроме того, изображение лица пользователя снимается с помощью инфракрасной камеры, которая более устойчива к изменениям света и цвета окружающей среды. Используя глубокое обучение, смартфон способен распознать лицо пользователя в мельчайших деталях, тем самым “узнавая” владельца каждый раз, когда тот подхватывает свой телефон. Удивительно, но Apple заявила, что этот метод даже безопаснее, чем TouchID: частота ошибок 1:1 000 000.

В этой статье разобран принцип алгоритма, подобного FaceID, с использованием Keras. Также представлены некоторые окончательные наработки, созданные с помощью Kinect.

-2

Понимание FaceID

“...нейронные сети, на которых основана технология FaceID, не просто выполняют классификацию.”

-3

Первым шагом является анализ принципа работы FaceID на iPhone X. Техническая документация может помочь нам в этом. С TouchID пользователь должен был сначала зарегистрировать свои отпечатки, несколько раз нажав на датчик. После 10-15 различных касаний смартфон завершает регистрацию. Аналогично с FaceID: пользователь должен зарегистрировать своё лицо. Процесс довольно прост: пользователь просто смотрит на телефон так, как делает это ежедневно, а затем медленно поворачивает голову по кругу, тем самым регистрируя лицо в разных позах. На этом регистрация заканчивается, и телефон готов к разблокировке. Эта невероятно быстрая процедура регистрации может рассказать многое об основных алгоритмах обучения. Например, нейронные сети, на которых основана технология FaceID, не просто выполняют классификацию.

-4

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

Во-первых, сеть должна тренироваться с нуля, используя новые данные, полученные с лица пользователя. Это потребовало бы много времени, энергии и множество данных разных лиц (не являющимися лицом пользователя), чтобы иметь отрицательные примеры. Кроме того, этот метод не позволит Apple тренировать более сложную сеть “оффлайн”, то есть в своих лабораториях, а затем отправлять ёе уже обученной и готовой к использованию в своих телефонах. Считается, что FaceID основан на сиамской свёрточной нейронной сети, которая обучается “оффлайн”, чтобы отображать лица в низкоразмерном скрытом пространстве, сформированном для максимизации различия между лицами разных людей, используя контрастную потерю. Вы получаете архитектуру, способную делать однократное обучение, как упоминалось в Keynote.

-5

От лиц к числам

Сиамская нейронная сеть в основном состоит из двух идентичных нейронных сетей, которые также разделяют все веса. Эта архитектура может научиться различать расстояния между конкретными данными, такими как изображения. Идея состоит в том, что вы передаёте пары данных через сиамские сети (или просто передаёте данные в два разных шага через одну и ту же сеть), сеть отображает их в низкоразмерных характеристиках пространства, как n-мерный массив, а затем вы обучаете сеть, чтобы сделать такое сопоставление, что данные точек из разных классов были как можно дальше, в то время как данные точек из одного и того же класса находились как можно ближе.

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

-6

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

В чём заключительное преимущество такого подхода? В том, что у вас, наконец, есть модель plug and play, которая может распознавать различных пользователей без какой-либо дополнительной подготовки, а просто вычислять, нахождение лица пользователя на скрытой карте лиц, образовавшейся после настройки FaceID. Кроме того, FaceID способен адаптироваться к изменениям в вашей внешности: как к внезапным (например, очки, шапка, макияж), так и к “постепенным” (растущие волосы). Это делается путём добавления опорных векторов лица, вычисленных на основе вашего нового внешнего вида, на карту.
В чём заключительное преимущество такого подхода? В том, что у вас, наконец, есть модель plug and play, которая может распознавать различных пользователей без какой-либо дополнительной подготовки, а просто вычислять, нахождение лица пользователя на скрытой карте лиц, образовавшейся после настройки FaceID. Кроме того, FaceID способен адаптироваться к изменениям в вашей внешности: как к внезапным (например, очки, шапка, макияж), так и к “постепенным” (растущие волосы). Это делается путём добавления опорных векторов лица, вычисленных на основе вашего нового внешнего вида, на карту.

Теперь давайте посмотрим, как реализовать FaceID на Python с помощью Keras.

Реализация FaceID с помощью Keras

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

Чтобы увидеть окончательную реализацию, вот ссылка на GitHub.

Создаётся свёрточная сеть на основе архитектуры SqueezeNet. В качестве входных данных сеть принимает как RGBD изображения пар лиц, так и 4-канальные изображения, и выводит различия между двумя вложениями. Сеть обучается со значительной потерей, которая минимизирует различие между изображениями одного и того же человека и максимизирует различие между изображениями разных лиц.

-8

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

Используется алгоритм t-SNE. Каждый цвет соответствует какому-либо человеку: как вы можете заметить, сеть научилась группировать эти фотографии довольно плотно. Интересный график также возникает при использовании алгоритма PCA для уменьшения размерности данных.

-9
-10

Эксперимент

Теперь попытаемся увидеть, как работает эта модель, имитируя обычный цикл FaceID. Первым делом зарегистрируем лицо. Затем проведём разблокировку как от лица пользователя, так и от других людей, которые не должны разблокировать устройство. Как упоминалось ранее, различие между лицом, которые “видит” телефон, и лицом зарегистрированным имеет определённый порог.

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

-11
-12

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

-13

С другой стороны, изображения от разных людей получают среднее различие около 1,1.

-14

Таким образом, значение порога, установленное примерно в 0,4, должно быть достаточным для предотвращения разблокировки телефона незнакомцами.

Весь Python код здесь.