Моя попытка разблокировки лица для моего дома (Часть 1)

Вы сожалеете только о том, чего не делаете. -Майкл Кёртис

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



Итак, эта серия разделена на три части, каждая из которых обрабатывает небольшие независимые подзадачи, которые, в свою очередь, составляют весь проект.

  1. В основе нашего приложения лежит модель распознавания лиц.
  2. Добавление Firebase к сопутствующему приложению для Android.
  3. Создание модели определения жизнеспособности, чтобы люди не подделывали личности.

Распознавание лиц

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

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

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

Другим важным алгоритмом был HOG (гистограмма ориентированных градиентов). Основная идея этого алгоритма заключается в том, что внешний вид и форма локального объекта в изображении могут быть описаны распределением градиентов интенсивности или направлениями краев.

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

HOG метод

С точки зрения непрофессионала алгоритм HOG в основном вычисляет градиенты, то есть направление увеличения интенсивности пикселей для каждого пикселя изображения как в направлениях X, так и в направлениях Y. Теперь эти градиенты объединены, чтобы сформировать базовое описание своего рода изображения. нормализованы по интенсивности, рассматривая более крупные блоки ячеек, чем отдельные пиксели. Это обеспечивает лучшее обобщение с точки зрения освещенности и теней. Теперь этот дескриптор изображения намного проще классифицировать, чем изображение с тысячами пикселей. мельчайшие подробности алгоритма.

Https://www.learnopencv.com/histogram-of-oriated-gradients/

Метод CNN

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

Адам Гейтгей написал по этому поводу замечательную статью. Вы можете найти более подробные объяснения.



Распознавание лиц

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

Сиамские сети представляют собой тип модели однократного обучения. При распознавании лиц эта сеть используется для создания 128-мерного вектора, представляющего лицо. Теперь эти сети обучаются таким образом, что векторы почти равны для лиц одного и того же человека, но различаются, когда лица у разных людей. Допустим, у нас есть база данных на 1 миллион человек, содержащая 1000 изображений каждого человека. Нейронная сеть получает случайные тройки изображений, которые состоят из одного якорного изображения, скажем, Человека А, другого другого изображения А (позитивного) и изображения человека. другой человек, скажем, B (отрицательный). Используемая функция потерь называется «тройной функцией потерь».

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

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

Основная идея здесь будет заключаться в том, чтобы извлечь кадрирование лица из каждого кадра видеопотока, нормализовать и выровнять лицо в определенной плоскости. Для этого нужно найти некоторые лицевые ориентиры и затем спроецировать их в нужной нам плоскости. затем пропустите его через нашу сиамскую сеть, чтобы создать 128-мерный вектор и классифицировать его как одну из известных личностей или неизвестного человека на основе некоторого алгоритма классификации. Мы можем использовать любой алгоритм классификации, такой как SVM, логистическая регрессия и т. д. Даже норма L2 достаточно При использовании потери L2 мои эксперименты показали, что потеря 0,45 является хорошим пороговым значением для того, чтобы иметь что-либо выше, что не должно распознаваться как известная личность.

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

  1. Уровень приложения - обрабатывает ввод / вывод
  2. Уровень базы данных - обрабатывает поток данных
  3. Слой обработки изображений - извлекает векторы кодирования из изображений лиц.
  4. Слой ML - обрабатывает модель классификации.

Я не буду объяснять, как работает код, потому что полагаю, что это говорит само за себя. Тем не менее, если возникнут сомнения, вы можете задать их в разделе комментариев. Я буду рад помочь :).

Весь код можно найти здесь.

Результат

Вторая часть этого сериала выйдет в эфир на следующей неделе. Следите за обновлениями!