Системы распознавания лиц (СРЛ, или face recognition, FR) применяются практически везде: от механизмов валидации возраста и биометрической идентификации в онлайне до камер видеонаблюдения и платежных терминалов в реальном мире. Технология развивается прямо на наших глазах: все начиналось с довольно простых решений, а теперь в СРЛ используются алгоритмы машинного обучения.
В этой статье мы разберем общие принципы работы СРЛ и расскажем, как сделать активационный патч для популярной библиотеки Dlib (используется для обработки видео и решения задач в области компьютерного зрения).
Системы распознавания лиц
Процесс распознавания лиц можно разбить на несколько подзадач, за решение которых отвечают разные системы:
- Детекция (face detection). На первом этапе алгоритм определяет, присутствует ли человеческое лицо в представленных данных и где именно оно находится. Все нерелевантные объекты исключаются. Для решения этой задачи можно использовать алгоритмические подходы или нейронные сети.
- Нормализация (face alignment). После детекции и предварительной обработки (выравнивания и нормализации параметров освещенности и контрастности) необходимо трансформировать лицо в математическое представление — вектор признаков. Это позволит применять математические методы для сравнения лиц и определять степень их сходства на основе расстояния между соответствующими векторами.
- Извлечение признаков (feature extraction). Важными фундаментальными измеряемыми признаками лица традиционно считались такие параметры, как расстояние между глазами, носом и другими ключевыми точками лица. Однако современные алгоритмы (HOG, SIFT, SURF, ORB и др.) и сверточные нейронные сети позволяют извлекать более широкий набор признаков.
- Поиск записи со схожим набором признаков (face matching). Далее полученный вектор признаков можно использовать для решения разных задач, например, идентификации личности. Для этого нужно сравнить его с записями в соответствующей базе данных.
- Принятие финального решения (decision making). Финальный этап — вывод результатов.
Сервисы для поиска информации о людях по изображениям
«Глаз Бога»
Главная особенность сервиса — взаимодействие через телеграм-бота. Для поиска по лицам нужно оформить подписку.
PimEyes
Узнать о том, что сервис нашел ваши фотографии, можно бесплатно. Если хотите получить полную информацию, придется оформить подписку.
Search4Face
Большая часть доступных данных взята из социальной сети «ВКонтакте». Это простой и прозрачный инструмент для поиска по лицам из открытых источников.
Также для полноты картины приведем пример бесплатного API. Возможности детекции лиц предоставляет сервис Yandex Vision OCR, однако на момент написания статьи функционал находился на этапе бета-тестирования.
Атаки на системы распознавания лиц
Большинство атак на СРЛ в первую очередь направлены на компонент детекции. Их принято называть атаками на уклонение (сеть не находит вас на изображении). В этом контексте выделяют две основные категории ошибок СРЛ:
- Ошибка первого рода: системе не удается распознать лицо на содержащем его изображении.
- Ошибка второго рода: система ошибочно классифицирует изображение, не являющееся лицом, как лицо.
Второй вариант — атаки на экстракцию признаков, или мисклассификация (вас классифицируют как другого человека). В этом случае алгоритм извлечения признаков выдает вектор представления, не отражающий реальные характеристики лица. Как следствие, система будет считать вас другим человеком.
Намеренное внесение информации для воздействия на систему называется «патчем» (adversarial patch). Для онлайн-сервисов изменения, вносимые в изображения, могут быть невидимыми или почти незаметными. При этом для атак на офлайн-системы необходимо сильно менять изображения, так как в этом случае требуется преодолевать всевозможные искажения, вызванные нелинейностью физического мира.
Активационный патч — информационное возмущение (изображение), которое вызывает сработку детектора и тем самым идентифицирует определенные алгоритмы/модели/системы
В качестве примера рассмотрим атаку на алгоритм HOG, имплементированный в библиотеке Dlib. Исследователи создали патч, который влияет на алгоритм, заставляя его ошибочно распознавать сам патч как лицо. В итоге система «пропускает» лицо, скрытое за патчем.
Другой пример — атака на Dlib CNN. Здесь исследователь использовал открытый детектор лиц Dlib — mmod_human_face_detector.dat. Он трансформировал сеть из проприетарного формата Dlib в формат, совместимый с PyTorch, и выбрал слой сети, активация которого представляла интерес. Определяя попиксельный loss, исследователь вычислял градиенты и модифицировал изображение, вводя случайные вращения и повороты. Этот подход позволил создать изображения, максимально активирующие определенные слои сети.
Отметим, что упомянутые выше атаки осуществлялись по принципу белого ящика — когда атакующему доступна полная информация о системе. Но в реальном мире практически все системы реализованы в формате черного ящика. Как результат — сложность атак в отсутствие исходного кода и обратной связи существенно возрастает.
Атаки на СРЛ крайне таргетированны. Метод, который успешно применяется против одного решения, не будет работать против другого.
Все сверточные нейронные сети, которые используются в СРЛ, обучаются выявлять определенные визуальные паттерны. При этом разные детекторы работают с разными наборами признаков. Если сервис построен на open source, злоумышленник может подготовить патчи как для атаки уклонения, так и для мисклассификации (с проприетарными решениями ситуация сложнее — это тема для отдельной статьи). Благодаря этому у него появится представление о детекторе, который применяет СРЛ, — эту информацию можно использовать для развития атаки.
Создание активационного патча для Dlib MMOD CNN
Итак, перейдем непосредственно к созданию активационного патча. Наша задача — создать изображение, которое приведет к активации детектора Dlib. Это широко распространенное решение, в частности оно используется фреймворком face-recognition.
Основная ценность активационных патчей — быстрая проверка СРЛ. Теоретически под каждый нейросетевой детектор можно сделать патч, который позволит его обнаружить.
Шаг 1. Загрузка модели
Для начала нам нужно получить возможность выполнять математические операции с моделью. У Dlib свой формат хранения, но благодаря одному энтузиасту мы можем загрузить модель в PyTorch. За счет этого мы сможем выполнять любые действия с сеткой в PyTorch, в частности прямой и обратный проход. Благодаря этому можно быстро и точно подобрать уникальный паттерн, который будет восприниматься моделью как лицо (используя градиентный спуск).
- Прямой проход (forward pass). Подаем предобработанное изображение на вход сети, выполняем все математические расчеты и получаем область, где обнаружено лицо.
- Обратный проход (back propagation). При наличии функции потерь (MSE) позволяет оценить вклад каждого входного параметра в выход, полученный из модели, относительно определенного правила (функции потерь). Если точнее: мы вычисляем градиенты функции потерь по отношению к весам слоев — от выходного к входному. Этот процесс использует цепное правило дифференцирования и позволяет вычислить влияние каждого веса на конечную ошибку.
Шаг 2. Алгоритм создания патча
Далее нам нужно создать уникальный узор, который будет определяться детектором как лицо, но не будет им являться. Возьмем референс изображения, выполним прямой проход через модель, запомним выход и визуализируем.
Теперь нужно сгенерировать возмущение, которое давало бы отклик модели, похожий на отклик от настоящего лица. Принцип создания патча:
- пропускаем через модель референсное фото, на котором есть лицо;
- запоминаем выход модели;
- используя функцию потерь и градиентный спуск, из шума генерируем картинку, которая при прохождении через сеть создаст максимально похожий на естественное лицо отклик.
Остановить алгоритм лучше сразу после первых сработок оригинальной модели: чем больше итераций оптимизации, тем выше вероятность сработок другими моделями. Мы не заинтересованы в создании галлюцинирующих лиц (см. рис. 6), поэтому учтем эту особенность.
Отметим, что алгоритм применим к любой модели, в которой можно определить градиент ошибки по вычислительному графу. Теоретически под каждый нейросетевой детектор можно сделать патч, который однозначно позволит его обнаружить.
Шаг 3. Тесты
Проверим, насколько работоспособен наш патч. Берем реальную модель без преобразования в PyTorch и делаем проверку на нашем пайплайне распознавания лиц (см. рис. 9).
Получилось! Патч привлекает только ту модель, для которой был изготовлен, другие детекторы на него не реагируют.
Код решения можно посмотреть на GitHub