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