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

14.03.2020

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

Распознавание лиц — это последняя тенденция, когда дело доходит до аутентификации пользователей. Недавно Apple выпустила свой новый iPhone X, который использует идентификатор лица для аутентификации пользователей. OnePlus 5 скоро получит функцию Face Unlock от theOnePlus 5T. И Baidu использует распознавание лиц вместо удостоверений личности, чтобы позволить своим сотрудникам войти в их офисы. Эти приложения могут показаться волшебными для многих людей. Но в этой статье мы стремимся демистифицировать предмет, обучая вас, как сделать свою собственную упрощенную версию системы распознавания лиц в Python.

Задний план

Прежде чем мы перейдем к деталям реализации, я хочу обсудить детали FaceNet. Какую сеть мы будем использовать в нашей системе.

FaceNet

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

Триплетная потеря

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

Сиамские сети

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

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

В FaceNet это делается путем вычисления расстояния между двумя выходами.

Реализация

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

  1. fr_utils.py содержит функции для подачи изображений в сеть и получения кодирования изображений;
  2. inception_blocks_v2.py содержит функции для подготовки и компиляции сети FaceNet

Компиляция сети FaceNet

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

Мы начнем с инициализации нашей сети с входной формой (3, 96, 96). Это означает, что каналы Red-Green-Blue (RGB) являются первым измерением объема изображения, подаваемого в сеть. И все изображения, которые подаются в сеть, должны быть 96×96 пикселей.

Затем мы определим функцию потери триплета.

Если вы не знакомы с любой функцией Tensorflow, используемой для выполнения расчета, я бы рекомендовал прочитать документацию, так как это улучшит ваше понимание кода.
Как только у нас есть функция потерь, мы можем скомпилировать нашу модель распознавания лиц с помощью Keras. И мы будем использовать оптимизатор Адама, чтобы минимизировать потери, рассчитанные функцией Triplet Loss.

Подготовка базы данных

Теперь, когда мы собрали FaceNet, мы собираемся подготовить базу данных тех людей, которых хотим, чтобы наша система распознала. Мы будем использовать все изображения, содержащиеся в нашем каталоге изображений, для нашей базы данных отдельных лиц. Для каждого изображения мы преобразуем данные изображения в кодировку 128 чисел с плавающей запятой. Мы делаем это, вызывая функцию img_path_to_encoding. Функция принимает путь к изображению и передает изображение в нашу сеть распознавания лиц. Затем он возвращает вывод из сети, который, оказывается, является кодировкой изображения.

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

Признание лица

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

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

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

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

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

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

Вывод

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

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

[alert type=blue]Поужинайте с демонстрацией и поразите всех своих друзей своим удивительным знанием распознавания лица![/alert]


Похожие

Добавить комментарий

Ваш e-mail не будет опубликован.