Детекция живого лица и защита от спуфинга
Face recognition без liveness detection — это просто распознавание фотографий. Любой с распечатанным фото или видео с телефона проходит аутентификацию. В банковских приложениях, системах KYC и биометрическом контроле доступа это критическая уязвимость.
Типы атак спуфинга
2D-атаки: распечатанное фото, экран телефона/планшета с фото, видео на экране. Самые распространённые, относительно легко детектируются.
3D-атаки: 3D-маски (силикон, бумага), 3D-модели лица. Требуют более сложных методов детекции.
Deepfake-атаки: синтезированное видео с лицом жертвы в реальном времени. Растущая угроза, особенно с инструментами типа DeepFaceLive.
Adversarial атаки: специально подготовленные изображения, которые обманывают конкретную модель детекции.
Методы liveness detection
Passive liveness. Анализ одного кадра или короткого видео без взаимодействия пользователя. Работает на текстурных признаках (бумага vs. кожа), анализе бликов, частотных характеристиках изображения, артефактах сжатия.
Модели: FeatherNets, FaceAntiSpoofing (CDCN архитектура), Binary Supervision. На LFW Anti-Spoofing benchmark современные passive методы достигают ACER (Average Classification Error Rate) < 1%.
Active liveness. Пользователь выполняет случайные действия: моргнуть, повернуть голову, улыбнуться. Детектируем выполнение challenge через landmark tracking. Более надёжно против 2D-атак, хуже UX.
Depth-based liveness. Использует depth sensor (Face ID от Apple, Intel RealSense). Почти идеальная защита от 2D-атак, но требует специального оборудования.
Техническая реализация
Для мобильных/web-приложений без специального железа — passive + active комбинация:
class LivenessDetector:
def __init__(self):
# CDCN++ для passive detection
self.passive_model = load_model("cdcn_plus_plus.onnx")
# MediaPipe для landmark tracking
self.face_mesh = mp.solutions.face_mesh.FaceMesh(
max_num_faces=1,
min_detection_confidence=0.7
)
def check_liveness(self, frames: list) -> LivenessResult:
# Passive: анализ текстуры и артефактов
passive_scores = [self.passive_model(f) for f in frames]
passive_score = np.mean(passive_scores)
# Active: трекинг движения landmarks
motion_valid = self._verify_challenge_completion(frames)
combined_score = 0.6 * passive_score + 0.4 * float(motion_valid)
return LivenessResult(
is_live=combined_score > 0.75,
confidence=combined_score,
passive_score=passive_score
)
Защита от deepfake-атак
Это отдельная и сложная задача. Deepfake-видео в реальном времени создаёт артефакты, которые детектируются через:
- Временну́ю консистентность: deepfake даёт нестабильные landmarks между кадрами
- Анализ сердечного ритма (rPPG): реальное лицо показывает микро-изменения цвета кожи от пульса; deepfake — нет
- Frequency domain analysis: GAN-артефакты в высокочастотной области спектра
rPPG-based детекция: сигнал извлекается из ROI (лоб, щёки), обрабатывается полосовым фильтром 0.7–3.0 Гц. Настоящий человек показывает чёткий пик на ЧСС (~1.2 Гц). Deepfake — нет пика или хаотичный сигнал.
Практический кейс
Банк внедрял мобильную биометрическую аутентификацию. Первая версия: только face recognition без liveness. В течение первых двух недель 3 попытки доступа через фото с экрана телефона (2 успешных — потери $14 000).
После внедрения passive liveness (CDCN++) + challenge (random моргание):
- 0 успешных спуфинг-атак за 8 месяцев
- FAR (False Acceptance Rate) для реальных атак: < 0.01%
- FRR (False Rejection Rate) для реальных пользователей: 1.8% (после калибровки)
- Среднее время проверки: 2.1 секунды
Регуляторные требования
Для KYC в российском финтехе необходимо соответствие требованиям ЦБ РФ по биометрической аутентификации. Системы liveness detection должны соответствовать ISO/IEC 30107-3 (Presentation Attack Detection). Сертификация через iBeta — стандарт для enterprise-деплоев.
Сроки: 3–6 недель для базового passive liveness, 8–14 недель для комплексной системы с deepfake detection и соответствием ISO 30107-3.







