
Иногда пользователи пытаются пройти биометрическую верификацию не совсем честно. Иногда — совсем нечестно. Кто-то показывает фото на экране другого телефона, кто-то — печатает лицо на бумаге и машет им в камеру.
Всё это — спуфинг, и он давно вышел из лабораторий и научных статей в суровую продакшен-практику. А задача при этом, казалось бы, простая: по одному кадру понять, есть ли перед камерой живой человек. Ни видео, ни поведенческой биометрии, ни инфракрасных сенсоров. Просто JPEG. Просто ад.
Хорошая новость: у нас в команде есть Александр. Он знает о спуфинге всё. И о методах борьбы с ним — тоже. Именно он вместе с командой собирал решение для промышленного предприятия, где от надёжности антиспуфинга зависит не просто результат верификации, а физический доступ на объект.
Контроль доступа на КПП, где счёт идёт на секунды, — это совсем другой мир. Там нет времени просить пользователя моргнуть или покрутить головой. Поэтому фокус — только на 2D-снимке. Один кадр с фронталки — и всё, больше ничего от человека не требуется.
Если бы это был онлайн-сценарий — сделали бы иначе. Добавили бы поведенческую биометрию, реакции на команды, maybe даже дипфейк-детекцию. Но на проходной такое не взлетает. Нужно просто и быстро: встал, сфоткался, прошёл.
Зачем вообще такая система?
Во-первых, потому что пользователи не любят заморачиваться. Им хочется: камера включилась — и всё работает. Во-вторых — потому что и те, кто пытается обмануть систему, тоже не любят напрягаться. На производстве не редкость, когда один человек оформлен, а приходит другой. Или когда нужно «протащить» чужой пропуск — зачем изобретать дипфейк, если можно просто показать фотку с экрана?
Вот мы и решили: пусть система сама определяет, настоящий человек перед камерой или нет. Причём — без магии, без второстепенных сенсоров, без фонового анализа. Просто кастомный датасет, ансамбль CNN и несколько честных инженерных костылей.
Спойлер: получилось. Но не сразу.
Сложности на старте
Первая проблема: нет нормальных открытых датасетов. Те, что есть, либо слишком маленькие, либо давно потеряли свою актуальность и не подходят по качеству для современных реалий. Обучив на них модель, в продакшене получаем кучу ложных срабатываний и дыр в безопасности.
Вторая проблема: хочется, чтобы модель не переобучалась на конкретные ситуации, пиксельные артефакты или ракурсы, а реально понимала: «это живой человек» или «это обман».
Третья проблема: нам нужен один кадр. Без таймлайна, без видеоаналитики. Только изображение.
Четвёртая проблема: большинство готовых моделей хорошо себя чувствуют, когда видят рамки дисплея или другой контекст вокруг лица. Но как только фейк приближен — лицо занимает весь кадр, края не видны — они начинают выдавать ошибки.
Пятая проблема: все приличные датасеты, где действительно есть качественные спуф-атаки, либо приватные, либо недоступны из-за NDA. Более того, большая часть корпоративных датасетов имеет привязку к своим устройствам и сценариям (свои камеры, свои условия съёмки), и переиспользовать такие данные для генерализации — почти бесполезно. Так что пришлось собирать свой, с нуля, руками и с болью.
Как мы собирали датасет: немного магии и много ручного труда
1. Положительный класс: реальные лица
Сначала собрали порядка 40 000 изображений с нашей собственной верификационной системы (естественно, с соблюдением всех норм хранения и приватности). Оттуда взяли лица живых пользователей, прошедших проверку.
Извлекали только центральную часть лица, без лишнего контекста.
Это и стало основой «положительного» класса.
2. Отрицательный класс: фейковые лица
Интернет — плохой источник. Открытые наборы данных с фейками либо низкого качества, либо не соответствуют реалиям.
Легче найти фото НЛО с хорошим разрешением, чем реалистичную подделку лица на телефоне.
Поэтому решили генерировать свои подделки вручную:
Взяли несколько телефонов и мониторов с разной плотностью пикселей и цветопередачей.
Слепили из имеющихся реальных лиц видео..
Прогнали видео на всех устройствах.
Сверху установили две внешние камеры, снимали экраны под разными углами, с разным освещением: день, вечер, настольная лампа.
Нарезали кадры — это и стали наши «подделки».
Таким образом, собрали большой и качественный отрицательный класс.
Предобработка: чистим, режем, балансируем
Прежде чем скармливать всё это в модель:
Прогнали через детектор лиц .
Вырезали только лица — никаких краёв телефонов, обоев и света из окна, мы учим модель на определение самых сложных ситуаций, где края экрана явно не видно.
Провели балансировку классов, чтобы избежать переобучения на «норму».
Всё максимально близко к боевым условиям.
Архитектура модели: ансамбль трёх нейросетей
Чтобы модель не была узконаправленной и не училась на артефактах (например, рамке iPhone 11 Pro Max), мы пошли по пути ансамбля нейросетей. У каждой — своё «зрение»:
Сеть 1: смотрит только на лицо, без фона. Это именно наша сеть – нами созданная и обученная.
Сеть 2: берет лицо + небольшой контекст. Уже можно догадаться, подделка это или нет.
Сеть 3: максимально широкая область вокруг лица, если доступна.
Каждая сеть предсказывает независимо. Далее используется агрегация оценок: простое голосование, или сложная логика с весами — зависит от эксперимента.
Технологии под капотом
Pytorch — обучение модели
Albumentations — библиотека с разнообразным аугментациями для обучения
ONNX — фреймворк для быстрого инференса моделей на CPU
Flask — бэкенд на python
Что в итоге
Модель внедрена в продакшен и обрабатывает реальные запросы.
Ложные срабатывания практически отсутствуют (жалобы были, но редкие и обоснованные).
Фейки в упор не проходят, даже если показать фото лица без видимых рамок или экран под углом.
Целевая метрика достигнута, а результат — устойчив к новым атакам.
Что дальше?
Мы уже думаем над использованием ИК и стереокамер. Но даже сейчас один кадр — это уже защита, если её правильно обучить.
Вывод
Нет видео? Нет проблем. Просто обучите три CNN-сетки, соберите датасет вручную, десятки часов попейна — и вы готовы к бою со спуфингом. А если серьёзно — один кадр может многое, если вы правильно выбрали признаки и хорошо его подготовили.
Готовы ответить на любые вопросы в комментариях — как собирали датасет, какие модели тестировали, что не взлетело и почему нельзя просто найти готовую сеть и радоваться жизни.
Подписывайтесь на мой тг-канал: больше об ИИ в бизнесе и жизни компании там –https://t.me/roslyakovgo