Немного о FaceNet
FaceNet — нейронная сеть, которая учится преобразовывать изображения лица в компактное евклидово пространство, где дистанция соответствует мере схожести лиц. Проще говоря, чем более похожи лица, тем они ближе.
Триплет потерь
- f(a) это энкодинг якоря
- f(p) это энкодинг похожих лиц (positive)
- f(n) это энкодинг непохожих лиц (negative)
- Альфа — это константа, которая позволяет быть уверенным, что сеть не будет пытаться оптимизировать напрямую f(a) — f(p) = f(a) — f(n) = 0
- […]+ экиввалентено max(0, sum)
Сиамские сети
FaceNet — сиамская сеть. Сиамская сеть — тип архитектуры нейросети, который обучается диффиренцированию входных данных. То есть, позволяет научиться понимать какие изображения похожи, а какие нет.
В FaceNet это делается путем вычисления расстояния между двумя выходами.
Реализация
В реализации мы будем использовать Keras и Tensorflow. Кроме того, мы используем два файла утилиты из репозитория, чтобы абстрагироваться от взаимодействий с сетью FaceNet.
- fr_utils.py содержит функции для подачи изображений в сеть и получения кодирования изображений;
- inception_blocks_v2.py содержит функции для подготовки и компиляции сети FaceNet.
Компиляция сети FaceNet
Первое, что нам нужно сделать, это собрать сеть FaceNet для нашей системы распознавания лиц.
Мы начнем инициализпцию нашей сети со входа размерности (3, 96, 96). Это означает, что картинка передается в виде трех каналов RGB и размерности 96×96 пикселей.
Теперь давайте определим Triplet Loss функцию. Функция в сниппете кода выше удовлетворяет уравнению Triplet Loss, которое мы определили в предыдущей секции.
Если вы не знакомы с фреймворком TensorFlow, ознакомьтесь с документацией.
Сразу после того, как мы определили функцию потерь, мы можем скомпилировать нашу систему распознавания лиц с помощью Keras. Мы будем использовать Adam optimizer для минимизации потерь, подсчитанных с помощью функции Triplet Loss.
Подготовка базы данных
Теперь когда мы скомпилировали FaceNet, нужно подготовить базу данных личностей, которых сеть будет распознавать. Мы будем использовать все изображения, которые лежат в директории images.
Замечание: мы будем использовать по одному изображения на человека в нашей реализации. FaceNet достаточно мощна, чтобы распознать человека по одной фотографии.
Для каждого изображения мы преобразуем данные изображения в 128 float чисел. Этим занимается функция img_path_to_encoding. Функция принимает на вход путь до изображения и «скармливает» изображение нашей распознающей сети, после чего возвращают результаты работы сети.
Как только мы получили закодированное изображения в базе данных, сеть наконец готова приступить к распознаванию!
Распознавание лиц
Как уже обсуждалось ранее, FaceNet пытается минимизировать расстояние между схожими изображениями и максимизировать между разными. Наша реализация использует данную информацию для того, чтобы определить, кем является человек на новой картинке.
Загружаем новое изображение в функцию img_to_encoding. Функция обрабатывает изображения, используя FaceNet и возвращает закодированное изображение. Теперь мы можем сделать предположение о наиболее вероятной личности этого человека.
Для этого подсчитываем расстояние между полученным новым изображением и каждым человеком в нашей базе данных. Наименьшая дистанция укажет на наиболее вероятную личность человека.
Наконец, мы должны определить действительно ли совпадают личности на картинке и в базе. Следующий кусок кода как раз для этого:
Магическое число 0.52 получено методом проб и ошибок. Для вас это число может отличатся, в зависимости от реализации и данных. Попробуйте настроить самостоятельно.
На GitHub есть демо работы полученной сети, с входом от простой вебкамеры.
Часто задаваемые вопросы о распознавании лиц
Вопрос: Что такое нейросеть для распознавания лиц?
Ответ: Это искусственная нейронная сеть, обученная обнаруживать, анализировать и идентифицировать уникальные черты человеческого лица на изображениях или видео.
Вопрос: Как нейросеть отличает одно лицо от другого?
Ответ: Сеть выделяет уникальные антропометрические точки (расстояние между глазами, форма скул, контур губ) и создает для каждого лица цифровой отпечаток — вектор признаков (эмбеддинг).
Вопрос: Что такое обучение с триплетными потерями?
Ответ: Это метод обучения, при котором сеть учится на тройках изображений: якорь (базовое лицо), позитив (то же лицо), негатив (другое лицо). Цель — сблизить эмбеддинги якоря и позитива и отдалить от негатива.
Вопрос: Для чего нужна сиамская архитектура в распознавании лиц?
Ответ: Сиамская сеть состоит из двух идентичных подсетей, которые обрабатывают два изображения одновременно, чтобы сравнить их и определить, принадлежат ли они одному человеку, используя общие веса.
Вопрос: Что такое эмбеддинг лица?
Ответ: Это компактный числовой вектор (например, из 128 чисел), который представляет собой математическое описание уникальных особенностей лица. Сравнение лиц происходит через сравнение их эмбеддингов.
Вопрос: Почему важна подготовка базы данных лиц?
Ответ: Качество распознавания напрямую зависит от качества и размера базы данных. Чем больше размеченных и разнообразных изображений каждого человека, тем точнее будет создан его эталонный эмбеддинг.
Вопрос: Как происходит процесс распознавания в реальном времени?
Ответ: Кадр с камеры обрабатывается: сначала детектор находит все лица, затем для каждого вычисляется эмбеддинг, который сравнивается с эмбеддингами из базы данных. При совпадении выше порога выдается идентификация.
Вопрос: Какие основные трудности у технологии распознавания лиц?
Ответ: Изменение освещения, ракурса, наличие макияжа, очков, бороды, возрастные изменения, низкое качество изображения и попытки обмана (маски, фото).
Вопрос: В чем разница между верификацией и идентификацией лица?
Ответ: Верификация — это проверка «это тот самый человек?» (сравнение 1:1). Идентификация — это ответ на вопрос «кто этот человек?» (сравнение 1:N со всей базой).
Вопрос: Где сегодня применяется технология распознавания лиц?
Ответ: В системах безопасности и контроля доступа, разблокировке смартфонов, платежных системах, поиске пропавших людей, персонализации рекламы и в социальных сетях для автоматической разметки фото.
Краткая памятка: как работает нейросеть для распознавания лиц
- Система получает изображение или видеопоток.
- Детектор лиц находит и вырезает все области с лицами на кадре.
- Производится предобработка: нормализация, выравнивание, приведение к единому размеру.
- Обработанное изображение подается на вход глубокой нейронной сети (например, на архитектуру, подобную FaceNet).
- Сеть, обученная на миллионах изображений, выделяет ключевые и уникальные признаки лица.
- На выходе сети формируется компактный числовой вектор — эмбеддинг лица.
- Этот эмбеддинг сравнивается с векторами из предварительно созданной базы данных известных лиц.
- Сравнение происходит путем вычисления расстояния между векторами (например, евклидова расстояния или косинусной близости).
- Если расстояние до какого-то вектора из базы меньше заданного порога, система идентифицирует человека.
- Для обучения таких сетей часто используется метод тройных потерь (triplet loss).
- Архитектура сети часто является сиамской для эффективного сравнения пар изображений.
- Точность работы зависит от качества обучения, размера и разнообразия базы данных, условий съемки.
- Готовые модели интегрируются в приложения для верификации (1:1) или идентификации (1:N).
- Технология находит применение в безопасности, финансах, розничной торговле и потребительской электронике.
























