Публикация была переведена автоматически. Исходный язык: Русский
Любая система распознавания лиц уязвима к простейшей атаке — фотографию человека можно распечатать и поднести к камере. Без защиты система примет распечатку за живого человека. Нам нужно было решить эту задачу на стороне бекенда, без требований к клиентскому приложению — по одному фото, присланному через API.
Мы разработали многоуровневую систему антиспуфинга, которая анализирует входящее изображение по нескольким независимым критериям. Каждый уровень проверяет отдельный аспект фотографии, а итоговое решение принимается на основе взвешенной комбинации всех оценок.
Уровень 1 — анализ структуры изображения
Наш ключевой метод. Мы обучили алгоритм находить характерные артефакты, которые появляются когда камера фотографирует физический носитель (бумагу, карточку). Система анализирует пространственное распределение яркости и обнаруживает резкие границы, нетипичные для живой сцены. Живое фото имеет естественные градиентные переходы фона, тогда как снимок физического носителя содержит характерные ступенчатые перепады.
Уровень 2 — анализ окружения лица
Система оценивает область вокруг обнаруженного лица, выявляя однородные яркие зоны, характерные для бумажного носителя. Алгоритм учитывает геометрию расположения этих зон и их соотношение с позицией лица в кадре.
Уровень 3 — текстурный анализ
Проверка микротекстуры кожи. Живое лицо имеет характерный паттерн пор и неровностей, который частично теряется при печати. Этот уровень работает как дополнительный сигнал к основным проверкам.
Уровень 4 — нейросетевая модель
Специализированная компактная модель, обученная отличать живые лица от различных видов подделок. Работает как независимый классификатор в общем ансамбле.
Архитектура принятия решений
┌─ анализ структуры изображения ──┐
│ │
фото + лицо ─┤─ анализ окружения лица ──────────┤─→ взвешенная оценка → решение
│ │
├─ текстурный анализ ──────────────┤
│ │
└─ нейросетевая модель ────────────┘
При высокой уверенности первого уровня система сразу отклоняет фото, не дожидаясь остальных проверок. Это обеспечивает быструю реакцию на очевидные атаки (250-300 мс).
С какими сложностями столкнулись
Белые стены. Самый коварный кейс. Человек на фоне белой стены визуально похож на распечатку на белой бумаге. Пришлось долго калибровать алгоритм, чтобы он различал "равномерно белый фон комнаты" от "белая бумага вокруг распечатки".
Решающим оказался не сам факт яркого окружения, а характер перехода от фона к содержимому.
Качество входных данных. Фото приходят через API в произвольном качестве — разные камеры, разрешения, сжатие. Некоторые тонкие признаки подделки (например, растровый паттерн принтера) уничтожаются JPEG-компрессией ещё до того, как попадают на сервер.
Тёмные условия. Алгоритмы, использующие цветовые характеристики, ненадёжны — в тёмных помещениях живое лицо может давать те же показатели, что и распечатка. Мы сознательно отказались от цветовых проверок в пользу пространственного анализа.
Баланс точности. Ложное срабатывание (живой человек отклонён) хуже, чем пропущенная атака. Система настроена консервативно — лучше пропустить сомнительный случай, чем заблокировать реального пользователя.
Известные ограничения
- Экранные атаки. Фотография, показанная с экрана телефона или монитора, не имеет характерных признаков физического носителя. Для защиты от таких атак нужен клиентский liveness-контроль (моргание, поворот головы).
- Подготовленные подделки. Если злоумышленник обрежет носитель по границе фотографии, убрав характерные признаки — обнаружение затрудняется.
- Одно фото. Серверная проверка по одному кадру фундаментально ограничена. Полноценный liveness возможен только на стороне клиента.
Результаты
На нашем тестовом наборе система показывает 100% обнаружение распечатанных фотографий (включая цветные и ч/б) при нулевом уровне ложных срабатываний на живых фотографиях. Время проверки — 250-300 мс на CPU.
Что дальше
Для повышения надёжности планируем:
- Расширить тестовый датасет для более точной калибровки порогов
- Добавить обнаружение экранных атак (муар-паттерны, частота обновления)
- Интегрировать клиентский liveness SDK для критичных сценариев
Любая система распознавания лиц уязвима к простейшей атаке — фотографию человека можно распечатать и поднести к камере. Без защиты система примет распечатку за живого человека. Нам нужно было решить эту задачу на стороне бекенда, без требований к клиентскому приложению — по одному фото, присланному через API.
Мы разработали многоуровневую систему антиспуфинга, которая анализирует входящее изображение по нескольким независимым критериям. Каждый уровень проверяет отдельный аспект фотографии, а итоговое решение принимается на основе взвешенной комбинации всех оценок.
Уровень 1 — анализ структуры изображения
Наш ключевой метод. Мы обучили алгоритм находить характерные артефакты, которые появляются когда камера фотографирует физический носитель (бумагу, карточку). Система анализирует пространственное распределение яркости и обнаруживает резкие границы, нетипичные для живой сцены. Живое фото имеет естественные градиентные переходы фона, тогда как снимок физического носителя содержит характерные ступенчатые перепады.
Уровень 2 — анализ окружения лица
Система оценивает область вокруг обнаруженного лица, выявляя однородные яркие зоны, характерные для бумажного носителя. Алгоритм учитывает геометрию расположения этих зон и их соотношение с позицией лица в кадре.
Уровень 3 — текстурный анализ
Проверка микротекстуры кожи. Живое лицо имеет характерный паттерн пор и неровностей, который частично теряется при печати. Этот уровень работает как дополнительный сигнал к основным проверкам.
Уровень 4 — нейросетевая модель
Специализированная компактная модель, обученная отличать живые лица от различных видов подделок. Работает как независимый классификатор в общем ансамбле.
Архитектура принятия решений
┌─ анализ структуры изображения ──┐
│ │
фото + лицо ─┤─ анализ окружения лица ──────────┤─→ взвешенная оценка → решение
│ │
├─ текстурный анализ ──────────────┤
│ │
└─ нейросетевая модель ────────────┘
При высокой уверенности первого уровня система сразу отклоняет фото, не дожидаясь остальных проверок. Это обеспечивает быструю реакцию на очевидные атаки (250-300 мс).
С какими сложностями столкнулись
Белые стены. Самый коварный кейс. Человек на фоне белой стены визуально похож на распечатку на белой бумаге. Пришлось долго калибровать алгоритм, чтобы он различал "равномерно белый фон комнаты" от "белая бумага вокруг распечатки".
Решающим оказался не сам факт яркого окружения, а характер перехода от фона к содержимому.
Качество входных данных. Фото приходят через API в произвольном качестве — разные камеры, разрешения, сжатие. Некоторые тонкие признаки подделки (например, растровый паттерн принтера) уничтожаются JPEG-компрессией ещё до того, как попадают на сервер.
Тёмные условия. Алгоритмы, использующие цветовые характеристики, ненадёжны — в тёмных помещениях живое лицо может давать те же показатели, что и распечатка. Мы сознательно отказались от цветовых проверок в пользу пространственного анализа.
Баланс точности. Ложное срабатывание (живой человек отклонён) хуже, чем пропущенная атака. Система настроена консервативно — лучше пропустить сомнительный случай, чем заблокировать реального пользователя.
Известные ограничения
- Экранные атаки. Фотография, показанная с экрана телефона или монитора, не имеет характерных признаков физического носителя. Для защиты от таких атак нужен клиентский liveness-контроль (моргание, поворот головы).
- Подготовленные подделки. Если злоумышленник обрежет носитель по границе фотографии, убрав характерные признаки — обнаружение затрудняется.
- Одно фото. Серверная проверка по одному кадру фундаментально ограничена. Полноценный liveness возможен только на стороне клиента.
Результаты
На нашем тестовом наборе система показывает 100% обнаружение распечатанных фотографий (включая цветные и ч/б) при нулевом уровне ложных срабатываний на живых фотографиях. Время проверки — 250-300 мс на CPU.
Что дальше
Для повышения надёжности планируем:
- Расширить тестовый датасет для более точной калибровки порогов
- Добавить обнаружение экранных атак (муар-паттерны, частота обновления)
- Интегрировать клиентский liveness SDK для критичных сценариев