Адриан Калинин
Адриан Калинин
Business IT Student and Python Backend Developer.
Читать 1 минуту

Распознавание и верификация по лицу с помощью Python

Image for post

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

Теория и подготовка

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

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

Откроем терминал или командную строку и установим необходимые модули:

Image for post

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

Их просто надо скачать и разместить в той же папке, где и будет скрипт.

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

Image for post

Эту одну картинку я распополамил на две разные – elon_before.png и elon_after.png соответственно. В итоге, получается следующая структура проекта.

Image for post

Пишем код

Первым делом, очевидно, импортируем модули для дальнейшей работы.

Image for post

С первой строчкой, надеюсь, всё уже понятно. Модуль cv2 нужен для загрузки изображений. А с помощью distance из scipy.spatial будем рассчитывать Евклидово расстояние между векторами признаков.

Далее создаем объекты уже скачанных моделей для выделения и распознавания лиц соответственно.

Image for post

Потом загружаем первую из двух фотографию функцией imread из cv2 и сразу же ищем лица на этой фотографии.

Image for post

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

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

Image for post

Отлично, дескриптор – именно то, что нам и нужно было. Аналогичные действия совершаем и со второй фотографией.

Image for post

Осталось всего лишь определить Евклидово расстояние между двумя дескрипторами, а делается этой буквально одной функцией.

Image for post

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

Image for post

С использованием такой метрики dlib обеспечивает точность 99.38% на тесте распознавания лиц Labeled Faces in the Wild. Подробности можно посмотреть по ссылке – http://dlib.net/face_recognition.py.html


Исходный код – https://github.com/adreex/FaceVerification/blob/master/main.py

2 950 просмотров
Добавить
Еще
Адриан Калинин
Business IT Student and Python Backend Developer.
Подписаться