Мы живем в мире, где системы распознавания лиц (далее — CРЛ) используются практически везде: от валидации возраста и биометрической идентификации в режиме онлайн до наблюдения и проведения оплаты в реальном мире. Технологические аспекты таких алгоритмов развиваются на наших глазах: начиная с простых систем, основанных на базовых алгоритмах, мы перешли к системам, использующим алгоритмы машинного обучения, однако и их развитие еще далеко от завершения.
![](https://habrastorage.org/getpro/habr/upload_files/9f5/609/14b/9f560914bde673e94a32bd2dc6d32a6a.png)
В предыдущих исследованиях мы затронули биометрическую идентификацию, и эта работа является логичным продолжением погружения в системы распознавания лиц и эксплуатацию их недостатков.
Этическая сторона поиска по лицам
Важно отметить, что вся информация, которую используют упоминаемые в статье сервисы, получена из открытых источников. Это те данные, к которым люди сами предоставили доступ. Сервисы не могут использовать данные, полученные из нелегальных источников (например, в результате сливов или утечек).
Системы распознавания лиц
![](https://habrastorage.org/getpro/habr/upload_files/211/b6e/7a8/211b6e7a8b84bf5664111f64dab8ea13.png)
Задача распознавания лиц декомпозируется на несколько подзадач, решаемых разными системами. Среди таких подзадач:
Обнаружение лиц (face detection).
Нормализация лица (face alignment).
Извлечение признаков (feature extraction).
Нахождение записи со схожим набором признаков (face matching).
Принятие финального решения (decision making).
Первый этап — обнаружение лиц.
На этом шаге алгоритм определяет, присутствует ли вообще человеческое лицо в представленных данных и где именно оно находится (исключаются все нерелевантные объекты). Эта задача может решаться с помощью алгоритмических подходов или нейронных сетей.
После обнаружения лица и выполнения предварительной обработки, включающей выравнивание лица и нормализацию параметров освещенности и контрастности, необходимо трансформировать лицо в математическое представление — в виде вектора признаков. Это второй этап. Такой вектор позволяет применять математические методы для сравнения лиц, определяя степень их сходства на основе расстояния между соответствующими векторами.
Современные подходы используют алгоритмы извлечения более широкого набора признаков (например, HOG, SIFT, SURF, ORB), а также применяют сверточные нейронные сети, которые на основе данных обучаются выявлять признаки человеческого лица. Подробнее о работе сверточных сетей можно прочитать по ссылке.
Такие подходы позволяют не только обнаружить лицо, но и создать уникальное представление его признаков в числовой форме. Далее полученный вектор признаков может применяться в разнообразных сценариях, включая идентификацию личности путем сопоставления с базой данных аналогичных векторов или поиск и сравнение лиц. В контексте применения в области распознавания лиц такие задачи могут включать определение человека на фотографии, аутентификацию пользователя в системе.
Стоит отметить принципиальную разницу между FR-системой, работающей онлайн, куда можно загружать цифровые фотографии и работать с системой как с сервисом через интернет, и офлайн, когда мы сталкиваемся с некоторой FR-системой в реальном мире (например, с системой видеонаблюдения или оплаты проезда в метро с помощью технологии распознавания лица). В онлайн-системах мы имеем дело с цифровыми данными, что позволяет нам точно контролировать корректировку отдельных пикселей на изображении. Это делает такие системы относительно более стабильными и предсказуемыми в плане обработки данных.
В то же время в офлайн-системах, требующих физического взаимодействия, возникают такие специфические проблемы, как нелинейное искажение изображений, тепловой шум камеры и точность цветопередачи. Эти факторы усложняют проведение атак на такие системы. Кроме того, испытания этих систем представляют собой отдельный вызов. В отличие от онлайн-систем, где возможно выполнить тысячи запросов в режиме черного ящика и быстро получить обратную связь, аналогичные эксперименты с офлайн-системами потребовали бы значительно больше времени.
В этом исследовании мы рассматривали онлайн-системы распознавания лиц на примере сервисов поиска по лицам.
Обзор сервисов поиска информации о людях по изображениям
Платформа «Глаз Бога»
Особенностью сервиса является взаимодействие через телеграм-бота, а для поиска по лицам требуется подписка. Сервис имеет много сценариев поиска публичной информации о людях, в частности нас интересует возможность поиска информации о человеке по его лицу.
![](https://habrastorage.org/getpro/habr/upload_files/349/4ff/29a/3494ff29ac83191af196df25aad41285.png)
Сервис PimEyes
Этот сервис поиска по лицам требует подписки для доступа к полной информации, однако данные о том, что сервис смог найти ваши фотографии, можно получить бесплатно.
![](https://habrastorage.org/getpro/habr/upload_files/1da/11d/22b/1da11d22be8ffdb574427e2955372784.png)
Сервис Search4faces
Большая часть доступных данных взята из социальной сети «ВКонтакте». Простой и прозрачный инструмент для поиска по лицам из открытых источников.
![](https://habrastorage.org/getpro/habr/upload_files/f33/18f/877/f3318f87704b2c3d9a89265eba2a64ad.png)
Обзор возможных атак на системы распознавания лиц
![](https://habrastorage.org/getpro/habr/upload_files/ffa/bb2/ae6/ffabb2ae6c1e3a33b66ce7556a4417a9.png)
Большинство потенциальных атак на системы распознавания направлены в первую очередь на компонент обнаружения лиц. Их также принято называть атаками на уклонение. В этом контексте выделяют две основные категории ошибок:
ошибка первого рода происходит, когда, несмотря на предъявление фотографии с лицом, системе не удается распознать его на изображении;
ошибка второго рода возникает, когда система ошибочно классифицирует какое-либо изображение как лицо, не являющееся таковым.
Помимо атаки на обнаружение, возможно проведение атак на экстракцию — когда алгоритм извлечения признаков выдает вектор представления, не отражающий реальных характеристик лица. Как следствие, система считает вас другим человеком (misclassification).
Намеренное внесение определенной информации с целью воздействия на систему, обрабатывающую эту информацию, называется патчем (adversarial patch). Для онлайн-систем изменения, вносимые в изображения, могут быть невидимыми или почти незаметными, в то время как для атак на офлайн-системы необходимо значительно корректировать изображения, так как нужно преодолеть искажения, вносимые реальным миром.
Схожие категории применимы к атакам на системы распознавания людей и других объектов.
Патч для обмана сети VGG16.
![](https://habrastorage.org/getpro/habr/upload_files/aee/b19/87f/aeeb1987f770c9ce1125b8f66c29306b.png)
Патч для обмана детектора YOLOv2.
![](https://habrastorage.org/getpro/habr/upload_files/eb2/5e2/6f2/eb25e26f266aafeda32e6bff8596a99f.png)
Другой патч для обмана детектора YOLOv2.
![](https://habrastorage.org/getpro/habr/upload_files/e2e/e3d/5c4/e2ee3d5c49a6581741a271b0da415d87.png)
По схожему принципу строятся исследования по обходу систем распознавания лиц:
-
Исследователи создали патч, который влияет на алгоритм HOG, заставляя его ошибочно распознавать патч как лицо и не распознавать само лицо за патчем.
![](https://habrastorage.org/getpro/habr/upload_files/534/e7c/ce0/534e7cce0d7b9ce8c606beb5eb4c4903.png)
-
В этом случае исследователь использовал открытый детектор лиц Dlib — mmod_human_face_detector.dat. Он трансформировал сеть из проприетарного формата Dlib в формат, совместимый с PyTorch. Затем был выбран слой сети, максимизация активации которого представляла интерес. Используя центральный пиксель выхода фильтра как функцию потерь, исследователь вычислял градиенты и модифицировал изображение, вводя случайные вращения и повороты. Этот подход позволил создать изображения, максимально активирующие определенные слои сети.
![Примеры образцов, полученных исследователем Примеры образцов, полученных исследователем](https://habrastorage.org/getpro/habr/upload_files/64c/009/4bc/64c0094bcef6edc77b813279bc37177d.png)
Это исследование демонстрирует возможности использования ошибки второго рода.
Работа исследователей из «Сколково», которые создали патчи, способные обходить алгоритмы детектирования лиц, использующие сеть MTCNN.
![Фото исследователей без патча Фото исследователей без патча](https://habrastorage.org/getpro/habr/upload_files/05f/8f4/d9b/05f8f4d9be41878def6f951744afdcd5.png)
![Фото с патчем Фото с патчем](https://habrastorage.org/getpro/habr/upload_files/ba2/ab6/955/ba2ab6955816d4f8ba39c639d47404d5.png)
Эти исследования покрывают самые популярные технологии распознавания лиц.
Обнаруженные закономерности
Большую часть рассматриваемых нами атак можно осуществить по принципу белого ящика — когда атакующему доступна полная информация о системе. В реальном же мире практически все системы представляют собой черный ящик. Без наличия исходного кода и обратной связи сложность атак существенно возрастает.
Сверточные нейронные сети обучаются выявлять определенные визуальные паттерны, если атакующий точно понимает, какие признаки ищет нейросеть, он может использовать это. С этой целью используются алгоритмы машинного обучения, например для генерации состязательных примеров (adversarial examples). В этом случае одна нейросеть пытается обмануть другую. Наконец, все атаки имеют конкретную цель. Метод, успешно применяемый против одной сети, не будет работать против другой.
Заметив эти закономерности, мы сформулировали вопрос: а можно ли использовать предложенные патчи для определения того, применяют ли сервисы по распознаванию лиц какие-либо из вышеперечисленных алгоритмов? И если нет, то можно ли такие патчи создать?
Активационные патчи
Напомним, что в контексте тестирования FR-систем бывает довольно сложно быстро получить доступ к внутреннему алгоритму, который производит обработку входящих данных пользователя (если это вообще предусмотрено сервисом). Если система активна и доступна, то можно провести несколько экспериментов и быстро получить ответ от целевой системы. Было бы удобно, если бы у нас был инструмент, который позволил бы быстро просканировать систему на предмет использования популярных алгоритмов и примерно локализовал бы технологический стек. Например, прогоняя некоторый набор картинок через сервис или устройство и получая его реакцию, можно было бы достоверно определить, какой алгоритм используется для обнаружения лиц или экстракции признаков.
Если выясняется, что сервис использует определенные опенсорсные инструменты, то можно подготовить патчи для любого типа атаки, будь то уклонение (сеть вас не находит) или ошибочная классификация (вас классифицируют как другого человека), так как фактически у вас на руках появляется точное представление о той модели, которая используется, а зачастую даже сама модель.
Активационный патч — информационное возмущение (изображение), вызывающее срабатывание детектора, что помогает идентифицировать определенные алгоритмы, модели, системы методом черного ящика.
Создание тестовой системы обнаружения лиц
Перед тем как мы продолжим, необходимо собрать свой конвейер (pipeline) для проверки и валидации гипотез. Принцип его работы достаточно прост: мы загружаем необходимые алгоритмы распознавания лиц и последовательно проверяем нужные нам фотографии, пытаясь обнаружить на них лицо, и выделяем границы вокруг лица, если оно было обнаружено:
- dlib.get_frontal_face_detector() — HOG;
- pytorch_mtcnn(keep_all=True, device="cpu");
- tensorflow_MTCNN();
- dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat").
![Результаты работы алгоритма обнаружения лиц Результаты работы алгоритма обнаружения лиц](https://habrastorage.org/getpro/habr/upload_files/c1f/d3f/897/c1fd3f8974b4cc2b120d22f9b8926170.png)
Используем существующие подходы для решения задачи
Исследование Dlib HOG для создания активационного патча
![Фотография исследователя с патчем Фотография исследователя с патчем](https://habrastorage.org/getpro/habr/upload_files/22a/66b/cea/22a66bcea05c839c196a6d068dfbfb59.png)
Чтобы узнать, как работает этот алгоритм, можно прочитать статью. Нам важно понять, используется ли HOG в описанных сервисах. Для этого можно взять визуализированный дескриптор лица из статьи и проверить его в нашем pipeline и в доступных сервисах.
![Успешное обнаружение HOG Успешное обнаружение HOG](https://habrastorage.org/getpro/habr/upload_files/180/c3c/cb5/180c3ccb548d2544dc61dc1d4ca601b5.png)
Патч приводит к однозначной активации только одной системы и не приводит к активации других.
Проведем тесты во внешних системах.
Сервис |
Результат проверки |
«Глаз Бога» |
False |
Search4faces |
False |
PimEyes |
False |
Исследование Dlib CNN для создания активационного патча
Проверим, как пройдут образцы, полученные исследователем, через наш pipeline.
![](https://habrastorage.org/getpro/habr/upload_files/7b2/5a1/522/7b25a1522b2579d50505c62d57532c63.png)
Сразу видно, что эта работа вызывает много ошибок первого и второго рода: где-то галлюцинирующие лица определяются многими системами, где-то — ни одной. То же самое и с публичными сервисами.
![Search4faces обнаружил лицо Search4faces обнаружил лицо](https://habrastorage.org/getpro/habr/upload_files/50f/36c/124/50f36c12438792b9ba9e9879179c4eca.png)
![«Глаз Бога» обнаружил лицо «Глаз Бога» обнаружил лицо](https://habrastorage.org/getpro/habr/upload_files/f04/56b/4a0/f0456b4a0c7c4a9f746c59cd67e35229.png)
![PimEyes не обнаружил лиц PimEyes не обнаружил лиц](https://habrastorage.org/getpro/habr/upload_files/73c/24c/278/73c24c278ba00b7db6da1d49a14813d5.png)
Сервис |
Результат проверки |
«Глаз Бога» |
True |
Search4faces |
True |
PimEyes |
False |
Исследование MTCNN для создания активационного патча
Возьмем оригинальные футажи исследователей и проведем их через наш pipeline обнаружения лиц.
![](https://habrastorage.org/getpro/habr/upload_files/45e/c1a/f9a/45ec1af9a52459fbfa7787eedb4d0b68.png)
Заметим, что ни один алгоритм в нашей тестовой системе не обнаруживает лицо. Можно сделать предположение о том, что работают не патчи, а простое перекрытие черт лица, важных для обнаружения.
Пробуем проверить наблюдение, взяв патчи из GitHub.
![Неоднозначные результаты Неоднозначные результаты](https://habrastorage.org/getpro/habr/upload_files/e70/d5a/57b/e70d5a57b2113e278d370410dfe24372.png)
Видно, что простое перекрытие определенных зон уже приводит к тому, что все три детектора не могут верно определить область лица. Однако в том случае, когда изображение слишком маленькое, все детекторы обнаруживают лицо.
Проведем тестирование оригинальных фотографий с помощью сервисов.
Сервис |
Результат проверки |
«Глаз Бога» |
False |
Search4faces |
False |
PimEyes |
True |
Рефлексия
Эксперименты с использованием готовых работ показали, что:
Несмотря на то что патчи создаются для активации или обхода конкретных систем, они не всегда позволяют выделить эти системы в ряду других. Например, галлюцинирующие лица могут определяться «Глазом Бога» и Search4faces на основании того, что изображения действительно очень похожи на лица. В то же время патчи для MTCNN позволяют обходить обнаружение во множестве сервисов из-за того, что они перекрывают половину лица.
Не совсем корректно называть все патчи активационными. Патч для MTCNN, несмотря на то что его можно использовать для идентификации MTCNN, не активирует детектор, а подавляет его активацию.
Создаем активационные патчи
Создание активационного патча для Dlib MMOD CNN
Наша задача — создать изображение, которое приведет к активации детектора Dlib. Он имеет широкое распространение, в частности используется фреймворком face_recognition.
Шаг № 1. Загрузка модели
Для начала нам нужна возможность выполнять математические операции с моделью. У Dlib есть свой формат хранения моделей, но также есть возможность (благодаря этому энтузиасту) загрузить модель в PyTorch и выполнять с ней любые действия, в частности применять прямой и обратный проход.
Прямой проход (forward pass) — данные (в нашем случае изображение) подаются на входной слой сети, в скрытых слоях выполняются все математические расчеты, в конце выводится результат обработки данных — область, где обнаружено лицо.
Обратный проход (backward pass) — наличие функции потерь (MSE) позволяет оценить вклад каждого входного параметра в результат, полученный из модели, относительно определенного правила (функции потерь). Если быть более точным, то вычисляются градиенты функции потерь по отношению к весам слоев — от выходного к входному. Этот процесс использует цепное правило дифференцирования, позволяя вычислить влияние каждого веса на конечную ошибку.
После загрузки модели в PyTorch мы можем выполнять прямой и обратный проходы, а значит, можем быстро и очень точно, используя градиентный спуск, подобрать уникальный паттерн, который будет восприниматься моделью как лицо.
Шаг № 2. Алгоритм создания патча
У нас есть сеть, и мы бы хотели создать уникальный узор, который будет определяться детектором как лицо, но при этом им являться не будет. Возьмем референсную картинку и выполним прямой проход через модель, запомним выход и визуализируем его.
![Референсное изображение и отклик модели Референсное изображение и отклик модели](https://habrastorage.org/getpro/habr/upload_files/5bc/7e2/249/5bc7e2249eaaa3444b64652f18328737.png)
Нам нужно сгенерировать такое возмущение, которое давало бы похожий на лицо отклик.
![Картинка с вопросом и отклик модели Картинка с вопросом и отклик модели](https://habrastorage.org/getpro/habr/upload_files/074/a71/da3/074a71da3c0d55c9480fbd1c0c66da07.png)
Принцип создания патча для этой модели заключается в проведении через нее референсной фотографии, на которой есть лицо; в запоминании выхода (output); далее, используя функцию потерь (MSE) и градиентный спуск, из шума мы генерируем картинку, которая при прохождении через сеть создаст максимально похожий на настоящее лицо отклик, при этом визуально входные данные не будут являться лицом.
![Схема атаки Схема атаки](https://habrastorage.org/getpro/habr/upload_files/61c/94f/a87/61c94fa87b43a2399311d8c39e37e165.png)
![Гифка создания картинки Гифка создания картинки](https://habrastorage.org/getpro/habr/upload_files/2a5/3a6/b53/2a53a6b53c8064743f88a5448666ec1d.gif)
![График функции потерь График функции потерь](https://habrastorage.org/getpro/habr/upload_files/823/cae/e7b/823caee7ba2440b4cab86294548cd41b.png)
Обратите внимание, что остановить алгоритм лучше сразу же после первых срабатываний оригинальной модели: чем больше количество итераций оптимизации, тем выше вероятность срабатывания других моделей. Мы не очень заинтересованы в создании галлюцинирующих лиц, поэтому учтем эту особенность.
Применять такой алгоритм можно к любой модели и системе, в которой можно рассчитать градиент ошибки по вычислительному графу. Таким образом, под каждый детектор можно сделать патч, который позволит его обнаружить (при условии, что детектор может быть загружен во фреймворк глубокого обучения).
Технологий много, но мы ограничимся самыми популярными опенсорсными решениями для распознавания лиц.
Шаг № 3. Тесты
Проверим работоспособность патча на реальной модели без преобразования в среде PyTorch. Для этого проведем проверку в нашем pipeline.
![Тестирование образцов на реальной фотографии Тестирование образцов на реальной фотографии](https://habrastorage.org/getpro/habr/upload_files/b87/0e2/52d/b870e252d65085fc8bed26db65418cef.jpg)
![Тестирование при частичном перекрытии лица Тестирование при частичном перекрытии лица](https://habrastorage.org/getpro/habr/upload_files/e5b/51e/67d/e5b51e67dfeb9381673cf6785e7381c4.png)
Патч успешно привлекает к себе только модель, для которой и был изготовлен, другие же детекторы на него не реагируют. Эта особенность и отличает наш патч от галлюцинирующий лиц, на которые срабатывали все детекторы.
При определенном наложении патча можно скрывать основное лицо, как это было с HOG, но подобное использование требует модификации технологии, наша же задача — обнаружить.
Сервис |
Результат проверки |
«Глаз Бога» |
False |
Search4faces |
False |
PimEyes |
False |
Можно сделать вывод, что сервисы не используют модель MMOD из Dlib для обнаружения лиц. Патчи работают для конкретной модели, если переобучить ее с нуля, результат будет другим.
Создание активационного патча для MTCNN
MTCNN, или multi-task cascaded convolutional networks, — это метод для обнаружения лиц, который использует каскад сверточных нейронных сетей для последовательного выполнения нескольких задач.
Система работает в три этапа, каждый из которых использует отдельную сверточную сеть, специализирующуюся на разных аспектах задачи:
P-Net (proposal network) — первая сеть, отвечающая за предложение кандидатов на лица в изображении, выполняющая быстрый поиск по всему изображению и создающая квадратные области, которые могут содержать лица.
R-Net (refinement network) — вторая сеть, которая уточняет предложения, отсеивая большинство ложных срабатываний и уточняя позиционирование лиц на изображении для последующей точной обработки.
O-Net (output network) — третья сеть, которая выполняет окончательное уточнение позиций обнаруженных лиц и одновременно работает над распознаванием ключевых точек лица (глаз, носа, рта).
Эти три этапа объединяются в эффективный инструмент, способный с высокой точностью распознавать лица на изображениях разного качества и при различных условиях освещения. Кроме того, MTCNN может работать в режиме реального времени, что делает этот метод популярным и позволяет применять его в широком спектре задач. Хорошо бы иметь активационный патч для этой архитектуры сети. Эта задача, конечно, сложнее, чем было с Dlib, однако общие концепты остаются прежними.
Создание патча для P-Net
MTCNN имеет более сложную структуру, поэтому нужно погрузиться во внутреннее устройство сети для проведения атаки. Уже не получится просто запомнить выходы и повторить их. Для нашего эксперимента возьмем самую распространенную реализацию MTCNN на PyTorch — from facenet_pytorch import MTCNN.
Необходимо пошагово проследить, как проходит обработка фотографии внутри сети. Первое, что сделает сеть, — это построит пирамиду, где картинка будет преобразована в ряд картинок меньшего размера.
Это нужно для того, чтобы одна и та же сеть смогла найти как большие, так и маленькие лица на одной фотографии.
![Фото взято из статьи Фото взято из статьи](https://habrastorage.org/getpro/habr/upload_files/368/f56/92b/368f5692bafb5d6398e5a4221889a23e.png)
Далее эта группа из фотографий разного масштаба направляется в первую сеть — P-Net.
P-Net пройдется по всем фотографиям и выдаст зоны, где может находиться лицо. Если мы их визуализируем, то увидим следующее.
![](https://habrastorage.org/getpro/habr/upload_files/400/d98/40d/400d9840d6fe2fd5f4dac4fee6879abe.png)
Название файла указывает на то, с каким масштабным коэффициентом было выполнено преобразование.
Возьмем референсную фотографию.
![](https://habrastorage.org/getpro/habr/upload_files/4ac/e36/108/4ace361088f448069950924aafc8a5da.png)
Карта активации P-Net будет следующая.
![](https://habrastorage.org/getpro/habr/upload_files/35c/a43/883/35ca43883ecb719526ee79260408a3b8.png)
Сохраняем эти данные в отдельный файл, также сохраняем значение масштабных коэффициентов — все это потребуется при создании патча.
Нам пришлось немного пропатчить библиотеку для перехвата нескольких параметров.
Что нам пригодится:
Выходы P-Net.
Значения масштабных коэффициентов.
Финальная область обнаруженного лица.
Ключевые точки обнаруженного лица (keypoints).
Заметим, что референсная картинка служит только для моделирования желаемого отклика от сети и может быть любым образцом, на котором сеть распознает лицо.
Далее загрузим только одну сеть P-Net и напишем простую функцию оптимизации, целью которой будет генерация максимально похожего отклика на то, что нами уже было успешно перехвачено. Затем нужно будет создать картинку из случайного набора пикселей, которая в процессе оптимизации и станет патчем.
Напомним, что наша задача — сделать так, чтобы результат, который выдаст нейросеть и который она будет считать настоящим лицом, таковым не являлся.
Функция для обхода первой сети выглядит следующим образом.
```python
#P net optimization step
for count, scale in enumerate(scales):
input_resampled = imresample(input, (int(N * scale + 1), int(N * scale + 1)))
reg, probs = mtcnn.pnet(input_resampled)
iter_pnet_loss = loss_pnet(probs[:, 1], outputs_model[count][:, 1])
history_loss_pnet[count].append(float(iter_pnet_loss))
pbar.set_description(f"Loss {scale} - {history_loss_pnet[-1]}")
iter_pnet_loss.backward()
# Gradient normalization
grad_cpu = input.grad
grad_cpu = grad_cpu / torch.norm(grad_cpu, 2)
lr = 2
input = input.clone().detach() - lr * grad_cpu
input.requires_grad = True
```
Необходимо уменьшить изображение (патч) в соответствии с масштабными коэффициентами, которые были перехвачены во время пропуска референсного изображения лица через сеть. Далее нужно выполнить прямой проход в P-Net, а после — посчитать ошибку, которая состоит из среднеквадратичного отклонения между перехваченными ранее откликами и полученными в результате прямого прохода данными в контексте каждого конкретного масштаба. Затем необходимо выполнить обратный проход, посчитать градиенты и идти в противоположном направлении, уменьшая MSE (то есть делая выход сети максимально похожим на то, что было перехвачено ранее). Получили следующий патч.
![Созданный патч Созданный патч](https://habrastorage.org/getpro/habr/upload_files/b03/24e/ba6/b0324eba697d89570c74687d916ba9bb.png)
Теперь нужно посмотреть, насколько отклик нашего патча похож на оригинал. На рисунке представлено оригинальное лицо с обведенными зонами (которые называются кандидатами на лицо и впоследствии идут в R-Net).
![Активации P-Net с использованием референсного лица Активации P-Net с использованием референсного лица](https://habrastorage.org/getpro/habr/upload_files/266/f77/671/266f77671ed7303f475ec3df0d14a3e5.png)
![Активации P-Net созданным патчем Активации P-Net созданным патчем](https://habrastorage.org/getpro/habr/upload_files/c10/35f/7b0/c1035f7b0be39e99899698d447f7aed1.png)
Данные очень похожи, что также можно видеть по уменьшению показателя функции потерь.
![](https://habrastorage.org/getpro/habr/upload_files/c11/4a1/dfe/c114a1dfeff92ee7779e06461d6e87e0.png)
Теперь у нас есть патч, который вызывает отклик, будто на изображении присутствует оригинальное лицо, при этом его там нет. Выделяются первичные кандидаты на лица, обводятся зоны, которые будут переданы в R-Net для оценки того, насколько они похожи лица. Мы обошли первую сеть.
![](https://habrastorage.org/getpro/habr/upload_files/4a5/ac6/0a7/4a5ac60a7dd777d651e424c5f1309273.png)
Необходимо понимать, что патч должен одномоментно учитывать особенности всех сетей, его изменение только для прохождения R-Net необратимо приведет к изменению отклика P-Net.
Стоит поговорить о других двух сетях.
R-Net, O-Net
R-Net занимается только оценкой выбранных кандидатов (фотографий, полученных после P-Net). Происходит проверка того, насколько в этой зоне действительно находится лицо. Сперва был выбран подход, согласно которому нужно было оптимизировать каждого кандидата. То есть в каждой области через градиентный спуск необходимо было максимизировать уверенность сети в каждом кандидате, но это, конечно, меняет картинку, и P-Net уже не выберет на следующем этапе оптимизации эту зону как кандидата на лицо. Что же делать?
Решение довольно простое: необходимо выполнить прямой проход референсного лица через все три сети и сохранить финальное решение MTCNN о том, где находится лицо (то есть финальный выход работы детектора).
![](https://habrastorage.org/getpro/habr/upload_files/ecf/fdd/407/ecffdd407fde8bd7b566954e27ef3ba0.png)
Теперь используем только ту область при оптимизации, которая выделена на фотографии выше, потому что именно в этой зоне должно быть лицо (по результатам работы детектора). Используя градиентный спуск, необходимо объяснить это сперва R-Net, делая так, чтобы вероятность оценки в этой зоне была приближена к единице, и то же самое нужно сделать с O-Net.
Таким образом, чтобы создать патч, нужно выполнить несколько шагов:
Инициализировать случайное изображение, которое будет изменяться в ходе оптимизации.
Пропустить изображение через сеть P-Net со всеми изменениями размеров (forward pass).
Посчитать MSE loss относительно перехваченных заранее откликов от референсного изображения.
На этом этапе появляется группа кандидатов на лица для проверки в R-Net. Их отвергаем и предлагаем своего кандидата, причем единственного. Это именно та область, где точно есть лицо, она же финальная область, которую мы получили от сети в ответ на референсную фотографию.
Повысить уверенность R-Net в том, что в определенной области точно присутствует лицо, минимизируя MSE между выходом сети и единицей (так как единица — максимальная уверенность), рассчитывая градиенты относительно этой ошибки, и внести изменение в изображение.
Сделать то же самое с O-Net.
Все это нужно будет повторить несколько раз, пока оценки функций потерь не достигнут минимальных значений.
![Схема одной итерации оптимизации Схема одной итерации оптимизации](https://habrastorage.org/getpro/habr/upload_files/eaa/99e/297/eaa99e297123b237efc8e30b6c44669a.png)
![График функции потерь График функции потерь](https://habrastorage.org/getpro/habr/upload_files/312/487/1c7/3124871c7d243b7cc5c8369d8f6fb48e.png)
На графике виден loss по всем масштабным коэффициентам P-Net и ошибки O-Net и R-Net.
Получаем вот такой патч.
![Патч для MTCNN Патч для MTCNN](https://habrastorage.org/getpro/habr/upload_files/a09/2ee/cfe/a092eecfe930f76dda94a51bd05ecfd5.png)
![Активация P-Net с использованием патча Активация P-Net с использованием патча](https://habrastorage.org/getpro/habr/upload_files/400/09f/f65/40009ff6503a30712f34266b6cd29e62.png)
Сразу же выполняем тесты в нашей системе. Была использована имплементация MTCNN в PyTorch и TensorFlow.
![Проверка патча в тестовой системе Проверка патча в тестовой системе](https://habrastorage.org/getpro/habr/upload_files/c12/a24/13d/c12a2413dd81416e0cd196832a41d16f.png)
К сожалению, патч не работает ни в одном публичном сервисе, который мы тестировали.
Сервис |
Результат проверки |
«Глаз Бога» |
False |
Search4faces |
False |
PimEyes |
False |
Отметим, что инференс этой модели на OpenCV на С++ тоже срабатывает на этот патч, это может означать, что там используется та же модель, под которую мы готовили патч, только преобразованная и загруженная абсолютно другой вычислительной средой.
![Тестирование патча, инференс на С++ Тестирование патча, инференс на С++](https://habrastorage.org/getpro/habr/upload_files/844/c78/055/844c78055b918cdf166343826ae20fda.png)
Заключение
Мы разработали метод, позволяющий идентифицировать алгоритмы машинного обучения, используемые в системах распознавания лиц, даже если эти системы являются черным ящиком. Наш подход основан на создании активационных патчей, которые, взаимодействуя с системой, позволяют определить по их реакции используемые технологии. Мы изготовили патчи для популярных алгоритмов обнаружения лиц, и эти патчи могут быть применены в исследовательских и практических целях.
![Патч HOG Патч HOG](https://habrastorage.org/getpro/habr/upload_files/093/bae/716/093bae716b6a7129decffb96f0bf1509.png)
![Патч для модели MMOD Dlib Патч для модели MMOD Dlib](https://habrastorage.org/getpro/habr/upload_files/2a7/57e/502/2a757e502cc5604cd3fa9df4d2ecf7ee.jpg)
![Патч MTCNN Патч MTCNN](https://habrastorage.org/getpro/habr/upload_files/6a2/6dc/afd/6a26dcafd889774c9bab408477768c26.jpg)
Фото Патчей.png — вот готовые патчи. Берите и используйте.
Больше вариантов — в репозитории на GitHub.
Главный вопрос: если активационные патчи действительно работают, то почему мы не смогли обнаружить ни одну систему методом черного ящика? Ответ довольно очевиден: тестируемые нами сервисы не используют опенсорс, а именно конкретные имплементации моделей, которые были рассмотрены в этом исследовании.
Результаты могут заинтересовать:
Исследователей, белых хакеров.
В работе был продемонстрирован общий алгоритм создания активационного патча. Этот алгоритм позволит любому человеку создать такой патч при наличии доступа к модели. Отдельный интерес представляет создание патча методом черного ящика, то есть на основе анализа ответов на запросы. Однако эта тема выходит за рамки нашей статьи.
Разработчиков.
Крайне интересный вопрос, вытекающий из исследования, — это способы защиты от подобных атак. Мы попробовали несколько методов и получили разные результаты:
Наложение случайного шума на изображение. Гипотеза заключалась в том, что наложение случайного шума должно нарушить обнаружение лица на активационном патче, но не нарушит на обычном лице. Но при добавлении 5% гауссового шума патчи для MTCNN сохраняли свою работоспособность.
Обучение модели с нуля. Вероятно, обучение модели с весами, отличными от представленных в опенсорсе, позволяет достичь того же эффекта — сгенерированные для оригинальной модели активационные патчи перестают работать.
Простых пользователей.
Главный совет, который можно дать, опираясь на результаты исследования: будьте сознательны, предоставляя доступ к своим данным, алгоритмы обработки информации очень быстро меняются, и непонятно, какую информацию люди научатся извлекать из данных в будущем и к каким последствиям это может привести.
Активистов гражданских свобод, проповедников анонимности.
Одним из интересных выводов этой работы стало создание термина этичный ML. Идея заключается в создании нового подхода к разработке систем распознавания лиц — встраивании в процесс обработки данных опенсорсного компонента, задача которого — обнаруживать фотографии с определенным визуальным паттерном (патчем) и отказывать в обработке таких изображений.
Отказ от куки, несогласие с политикой обработки данных на сайтах, право на забвение — ряд этих механизмов, которые были введены ФЗ «О персональных данных» и GDPR, может дополнить и новый подход к разработке систем распознавания лиц.
Преимуществами такого стандарта были бы:
Независимость от основной системы распознавания лиц.
Так как это отдельный компонент, его можно легко интегрировать с различными системами без изменения их основного набора функций.
Уважение к личной конфиденциальности.
Этот подход позволяет людям активно управлять своей конфиденциальностью, поскольку пользователи в таком случае прямо могут указывать, что они не хотят быть распознаны.
Простота реализации и обновления.
Поскольку это отдельный компонент, его легче обновлять и адаптировать под новые типы паттернов или изменения в стандартах о защите конфиденциальных данных.
Соответствие этическим стандартам.
Такой подход позволяет компаниям и организациям соблюдать этические стандарты, связанные с защитой личных и конфиденциальных данных.
С помощью патча можно проверить, следует ли определенный сервис стандартам этичного ML.
Спасибо, что дочитали до конца :)
freeExec
Смешной абзац про этичность. Так на каком ресурсе субъект даёт согласие на обработку его биометрии любому проходящему мимо? Напомню, что в случае с биометрией согласие должно быть дано письменно (аля электронной подписью). Не говоря уже о том, что недавно вообще запретили хранить их где либо кроме единой биометрической системы.