Внедрение Face ID для iPhone X с помощью Python и Deep Learning

глубокое обучение Python Нейронные сети Apple
Внедрение Face ID для iPhone X с помощью Python и Deep Learning

В прошлом году последний продукт Apple, iPhone X, был самым обсуждаемым из-за его новой функции разблокировки — FaceID, которая заменила TouchID.

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

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

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

Так в чем секрет FaceID iPhone X? Как обычные разработчики, можем ли мы реализовать это сами? Парень по имени Норман Ди Пало, который специализировался в области искусственного интеллекта в Римском университете, недавно задумался над этой проблемой и после некоторых исследований обратил эту технологию вспять с помощью технологии глубокого обучения и программирования на Python. Давайте послушаем, как он это делает.


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

Я сосредоточен на том, как реализовать этот процесс с помощью глубокого обучения и как оптимизировать каждый шаг. В этой статье я покажу, как реализовать алгоритм, подобный FaceID, с помощью Keras. Я подробно объясню различные архитектурные решения, которые я принял, и представлю окончательные экспериментальные результаты. Я использовал Kinect, популярную камеру RGB и глубины, которая выдает такие же результаты, как и фронтальная камера на iPhone X, только немного больше. Возьмите чашку чая и откиньтесь на спинку кресла, пока мы реконструируем эту новую революционную функцию от Apple.

Понимание FaceID

Первый шаг — проанализировать, как FaceID работает на iPhone X. Белая книга iPhone X может помочь нам понять, как работает FaceID. При использовании TouchID пользователю необходимо несколько раз прикоснуться к сенсору, чтобы записать отпечаток пальца. После 15-20 касаний TouchID настроен. FaceID аналогичен, пользователям сначала нужно ввести данные лица. Процесс прост:Пользователь просто смотрит прямо на телефон, как обычно, затем медленно поворачивает голову, чтобы завершить всенаправленный сбор данных.

Это так просто, FaceID настроен на разблокировку телефона. Невероятная скорость процесса входа может многое рассказать нам об алгоритме, стоящем за ним. Например, нейронная сеть, управляющая FaceID, занимается не только классификацией, как я объясню далее.

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

Мало того, этот метод делает невозможным для Apple обучение более сложной сети «в автономном режиме», например, обучение сети в лаборатории, а затем размещение обученной, готовой к использованию сети на телефоне. Поэтому я думаю, что FaceID использует сверточную нейронную сеть, похожую на близнецовую сеть, которая была обучена Apple «в автономном режиме», сопоставляет лица с низкоразмерным скрытым пространством, а затем использует потерю контраста, чтобы максимизировать расстояние между разными лицами. Таким образом, вы получаете архитектуру, которую можно изучить один раз, кратко упомянутую в Keynote от Apple. Я знаю, что некоторые судьи могут быть незнакомы со многими терминами; не волнуйтесь, продолжайте читать, и я объясню шаг за шагом.

Нейронные сети: от лиц к числам

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

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

Используя эту технику, мы можем использовать большое количество лиц для обучения архитектуры, которая может распознавать похожие лица. При достаточном бюджете и вычислительной мощности (как это делает Apple) нейронные сети могут стать более надежными и могут обрабатывать более сложные примеры, такие как близнецы, состязательные атаки и т. д. В чем заключается последнее преимущество этого метода? То есть у вас есть plug-and-play модель, не требующая дополнительного обучения, пока вы делаете несколько фотографий в начале входа, вычисляете положение лица пользователя на скрытой карте, и вы можете идентифицировать разные пользователи. (Представьте себе создание вектора, представляющего ее породу для новой собаки, как я только что сказал, и сохранение его где-нибудь) волосы — просто добавьте на карту эталонный вектор лица и рассчитайте на основе новой внешности.

Внедрение FaceID с помощью Keras

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

Если вы хотите увидеть окончательную реализацию, вы можете перейти в мой репозиторий Github, в котором естьJupyter Notebook.

Кроме того, яColab NotebookЭто также было проверено, вы можете попробовать.

Я построил сверточную нейронную сеть на основе SqueezeNet, вход — изображение лица в формате RGB-D, т.е. 4-канальное изображение, а выход — расстояние между двумя гнездами. Нейронная сеть обучается на контрастной функции потерь, чтобы уменьшить расстояние между изображениями одного и того же человека и увеличить расстояние между изображениями разных людей.

На рисунке показана функция сравнения потерь.

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

Я визуализирую 128-мерное вложенное пространство в 2-мерном пространстве, используя Т-распределенные случайные вложения ближайших соседей. Каждый цвет представляет человека:Как видите, нейросеть научилась плотно группировать фотографии.. (В случае использования T-распределенных случайных вложений ближайших соседей расстояния между кластерами не имеют смысла.) Интересные изображения появляются и при использовании алгоритма уменьшения размерности PCA.

На фото кластер фотографий лиц во вложенном пространстве, созданном с помощью t-SNE.

На фото кластер фотографий лиц во вложенном пространстве, созданном с помощью PCA.

эксперимент! запускать!

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

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

На рисунке показаны смоделированные входные данные лица FaceID.

На картинке показан процесс ввода данных о лице, видимый камерой глубины.

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

На картинке показано расстояние между лицами одного и того же человека во вложенном пространстве

Расстояние между RGB-D-изображениями разных людей в среднем равно 1,1.

На картинке показано расстояние между лицами разных людей во вложенном пространстве

Таким образом, установка порога около 0,4 не позволит посторонним разблокировать ваше устройство.

Эпилог

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

Инструмент Keras, используемый в этой статье, и модули глубокой нейронной сети, которые он предоставляет, можно найти на моем веб-сайте.Краткое руководство.