Иногда пользователи пытаются пройти биометрическую верификацию не совсем честно. Иногда — совсем нечестно. Кто-то показывает фото на экране другого телефона, кто-то — печатает лицо на бумаге и машет им в камеру.
Всё это — спуфинг, и он давно вышел из лабораторий и научных статей в суровую продакшен-практику. А задача при этом, казалось бы, простая: по одному кадру понять, есть ли перед камерой живой человек. Ни видео, ни поведенческой биометрии, ни инфракрасных сенсоров. Просто 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


Комментарии (9)


  1. Kamil_GR
    24.06.2025 15:19

    То есть модель научилась различать прямая съемка vs съемка экрана. Правда дальше вы упоминаете фото (стоит уточнить профессиональное фото или распечатка джипега)

    Модель обучилась контролировать: Муар от пикселей экрана. Искажения цветопередачи. Характерные блики. Неестественные градиенты освещения.

    Полагаю закроет 90% атак. Вот только с фото бы разобраться.


  1. Alex-Freeman
    24.06.2025 15:19

    Ну ок, допустим я мошенник, это мой бизнес, мой заработок, я же не буду использовать кривой монитор, а возьму 8к OLED телевизор с матовым экраном)


    1. randomsimplenumber
      24.06.2025 15:19

      Или виртуальную камеру задействую.


  1. ivazhu
    24.06.2025 15:19

    Я правильно понял, что если распечатать фото на хорошем принтере и сфоткать, то вы это не задетектите, потому что обучились только на экраны?)


  1. alexsphera Автор
    24.06.2025 15:19

    @Kamil_GR @ivazhu отвечу сразу одним комментом)

    Собрать вручную датасет с распечаткой большая проблема, те модели что мы уже нашли работают с ней достаточно хорошо (проверяли на CelebaSpoof), нашей же задачей было покрыть самый популярный и ожидаемый вид атак через использования дисплея.

    Чтобы добиться более стабильной работы на всех вариантах спуфов нужно уже смотреть на варианты такие как ИК и стерео камеры – и это уже в планах на будущее)


    1. ivazhu
      24.06.2025 15:19

      Ну т.е. ответ на мой вопрос «да, спуф пройдёт». Тогда не понятно, зачем вы это делали. Если бы это была курсовая работа, то ок, норм работа. Но на диплом уже не тянет, потому что существует очевидная дыра, которая никак не закрыта.

      Более интересный вопрос с точки зрения бизнеса - зачем было тратить столько денег на незаконченный рисеч, если можно было бы купить продукт профессионалов. Не реклама, но idrnd и по одному кадру без всяких подсветок работает так, что вам потребуется очень много времени, чтобы их решение заспуфить. И да, они собирали базы, которые «собрать вручную большая проблема»


  1. alexsphera Автор
    24.06.2025 15:19

    @Alex-Freemanrandomsimplenumber

    Анти-спуфинг сделан для КПП, куда большой монитор пронести весьма проблематично))
    Также и виртуальную камеру не подключишь, используется только наша камера внутри приложения.


  1. InfinityMe
    24.06.2025 15:19

    И вот кто-то такие системы называет Face ID, хотя Face ID это конкретная система, разработанная Apple и находящаяся на недосягаемом уровне, по сравнению вот с такими вероятностными штуками.


  1. siealex
    24.06.2025 15:19

    Что мешает снимать ДВА кадра с небольшим промежутком времени (порядка секунды) и сравнивать их? Если это живое лицо, кадры обязательно будут хоть немного, но отличаться, это по идее распознать в разы проще, чем артефакты от экрана.