www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Определение живого лица в реальном времени с помощью Python, Keras и OpenCV

Дата публикации Mar 4, 2019

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

Теперь давайте представим, что мы хотим внедрить устройство открывания дверей для распознавания лиц. Система будет работать хорошо, чтобы различать известные лица и неизвестные лица, так что только уполномоченные лица имеют доступ. Тем не менее злоумышленнику было бы легко войти, показав только фотографию уполномоченного лица. Именно здесь в игру вступают 3D-детекторы, аналогичные Apple FaceID. Но что, если у нас нет 3D-детекторов?

Пример фото-атаки с лицом Обамы ❌

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

  1. Обнаружение лиц в каждом кадре, сгенерированном веб-камерой.
  2. Для каждого обнаруженного лица определяют глаза.
  3. Для каждого обнаруженного глаза определите, являются ли глаза открытыми или закрытыми.
  4. Если в какой-то момент было обнаружено, что глаза были открыты, а затем закрыты, а затем открыты, мы заключаем, что человек моргнул, и программа отображает его имя (в случае устройства для открывания дверей с распознаванием лиц мы бы разрешили человеку войти).

Для обнаружения и распознавания лиц вам необходимо установитьраспознавание лицабиблиотека, которая предоставляет очень полезные методы глубокого обучения для поиска и идентификации лиц на изображении. В частности,face_locations, face_encodingsа такжеcompare_facesфункции являются 3 наиболее полезными,face_locationsМетод может обнаружить лица с помощью двух методов: Гистограмма ориентированных градиентов (HoG)и CИнволюционная нейронная сеть (CNN).Из-за нехватки времениборовметод был выбран.face_encodingsФункция представляет собой предварительно обученную сверточную нейронную сеть, способную кодировать изображение в вектор из 128 объектов. Этот вектор внедрения должен представлять достаточно информации, чтобы различать двух разных людей. Наконец,compare_facesвычисляет расстояние между двумя векторами вложения,Это позволит алгоритму распознавать лицо, извлеченное из кадра веб-камеры, и сравнивать его вектор встраивания со всеми закодированными лицами в нашем наборе данных. Ближайшие векторы должны соответствовать одному человеку.

1. Известное кодирование набора данных лица

В моем случае алгоритм способен распознать себя и Барака Обаму. Я выбрал около 10 фотографий каждого. Ниже приведен код для обработки и кодирования нашей базы данных известных лиц.

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

2. Обнаружение живого лица

Как напоминание, цель состоит в том, чтобы обнаружить паттерн «открыто-закрыто-открыто глаз» в какой-то момент. Я обучил сверточную нейронную сеть классифицировать, является ли глаз закрытым или открытым. Выбранная модель - LeNet-5, который был обучен наЗакрытые глаза в дикой природе (CEW)набор данных. Он состоит из около 4800 изображений глаз размером 24x24.

Оценивая модель, я достиг94%точность.

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

3. Распознавание лиц живых людей

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

Функция выше - это код, используемый для обнаружения и распознавания реальных лиц. Это принимает в аргументах:

  • модель: наш классификатор с открытыми / закрытыми глазами
  • video_capture: потоковое видео
  • face_detector: классификатор лиц каскада Хаара. я использовалhaarcascade_frontalface_alt.xml
  • open_eyes_detector: классификатор открытого глаза каскада Хаара. я использовалhaarcascade_eye_tree_eyeglasses.xml
  • left_eye_detector: классификатор левого глаза Ха-каскада. я использовалhaarcascade_lefteye_2splits.xmlкоторый может обнаружить открытые или закрытые глаза.
  • right_eye_detector: классификатор правого глаза по каскаду Хаара. я использовалhaarcascade_righteye_2splits.xmlкоторый может обнаружить открытые или закрытые глаза
  • данные: словарь известных кодировок и известных имен
  • eyes_detected: словарь, содержащий для каждого имени историю статуса eyes.

ВСтроки 2–4мы берем кадр из потока веб-камеры и изменяем его размер, чтобы ускорить вычисления. Встрока 10мы обнаруживаем лица из кадра, затем встрока 21мы кодируем их в 128-й вектор. Встрока 23–38мы сравниваем этот вектор с известными кодировками лиц и определяем имя человека, подсчитывая количество совпадений. Выбран тот, у которого наибольшее количество совпадений. Начинается слиния 45мы пытаемся обнаружить глаза в лицо. Сначала мы пытаемся обнаружить открытые глаза с помощьюopen_eye_detector, Если детектор успешен, то прилиния 54,«1» добавляется в историю состояния глаз, что означает, что глаза открыты сopen_eye_detectorне может обнаружить закрытые глаза. В противном случае, если первый классификатор потерпел неудачу (возможно, потому что глаза закрыты или просто потому, что он не распознал глаза), тогдалевый глаза такжеправый глаздетекторы используются. Лицо разделено на левую и правую сторону для классификации соответствующих детекторов. Начиная сстрока 92,часть глаза извлекается, и обученная модель предсказывает, закрыты ли глаза. Если обнаружен один закрытый глаз, то прогнозируется, что оба глаза будут закрыты, и в историю состояния глаз добавляется «0». В противном случае делается вывод, что глаза открыты. Наконец влиния 110isBlinking ()Функция используется для обнаружения моргания глаз, и если человек моргнул, отображается имя. Весь код можно найти на моемаккаунт на github,

Фото атака сорвана с помощью обнаружения моргания глаз ✔️

Ссылки

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map