Исходный код доступен по адресу https://github.com/sumantrajoshi/Face-recognition-using-deep-learning

Глубокое обучение произвело революцию в области распознавания лиц за последние несколько лет. Благодаря постоянно растущей вычислительной эффективности GPU, в 2015 году исследователи Google опубликовали статью о новой системе глубокого обучения под названием FaceNet, которая достигла почти 100-процентной точности на популярном наборе данных для распознавания лиц под названием Labeled Faces in the Wild. (LFW) ». Эта статья проложила путь к созданию следующего поколения систем распознавания лиц с использованием машинного обучения.

Разница между верификацией лиц и распознаванием лиц

Метод проверки лица используется для проверки того, принадлежит ли входное изображение законному заявителю (сопоставление 1 к 1). Однако распознавание лиц используется для распознавания того, принадлежит ли входящее изображение лица набору авторизованной группы лиц (отображение от 1 до M).

Разница между распознаванием лиц и обнаружением подделки лиц

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

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

Использование предварительно обученной нейронной сети для распознавания лиц

Я буду использовать OpenFace, модель распознавания лиц с открытым лицом и глубоким обучением. Он основан на статье FaceNet: унифицированное встраивание для распознавания лиц и кластеризации Флориана Шроффа, Дмитрия Калениченко и Джеймса Филбина из Google. OpenFace реализован с использованием Python и Torch, что позволяет запускать сеть на CPU или с CUDA.

Я хотел реализовать приложение в Keras (используя бэкэнд Tensorflow), и для этого я использовал предварительно обученную модель, известную как Keras-OpenFace Виктора Си. Wang, который представляет собой реализацию Keras с открытым исходным кодом для OpenFace.

Ниже приведено небольшое видео распознавания лиц в реальном времени с помощью веб-камеры ноутбука, которое было снято с использованием модели Keras-OpenFace и некоторых элементарных концепций архитектуры OpenFace и FaceNet.

Демо приложения распознавания лиц

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

По сути, я использовал предварительно обученную модель Keras-OpenFace для подачи изображений лиц для генерации вектора встраивания 128 измерений. Я предполагаю, что читатели знают о глубоком обучении и о том, как работает сверточная нейронная сеть (CNN).

Проблема использования CNN в качестве классификатора распознавания лиц

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

Что такое обучение одним выстрелом?

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

Как нейронная сеть изучает распознавание лиц (функция тройной потери)?

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

Обучение нейронной сети распознаванию лиц не является одноразовой задачей.

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

Понимание основного дизайна

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

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

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

При обработке изображения выполняется обнаружение лиц, чтобы найти ограничивающие рамки вокруг лиц. Я использовал Каскадные классификаторы Хаара на основе функций OpenCV для выделения области лица. Перед передачей изображения в нейронную сеть его размер изменяется до 96x96 пикселей, поскольку глубокая нейронная сеть ожидает фиксированный размер входного изображения (96x96).

Вычисление сходства между двумя изображениями

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

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

Что такое аффинное преобразование?

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

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

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

Ссылки:

  1. FaceNet: унифицированное встраивание для распознавания лиц и кластеризации (https://arxiv.org/pdf/1503.03832.pdf)
  2. DeepFace: устранение пробелов в проверке лиц на уровне человека (https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf)
  3. OpenFace, бесплатное распознавание лиц с открытым исходным кодом с глубокими нейронными сетями (https://cmusatyalab.github.io/openface/)
  4. Предварительно обученный режим OpenFace от Keras-OpenFace (https://github.com/iwantooxxoox/Keras-OpenFace)