Иногда пользователи пытаются пройти биометрическую верификацию не совсем честно. Иногда — совсем нечестно. Кто-то показывает фото на экране другого телефона, кто-то — печатает лицо на бумаге и машет им в камеру. 

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


  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

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