Реализация распознавания лиц в мобильном приложении
Распознавание лиц в мобильном приложении — технически одна из самых сложных задач компьютерного зрения, юридически — одна из самых чувствительных. Неправильно реализованный антиспуфинг открывает уязвимость для bypass через фотографию. Отсутствие соблюдения GDPR или 152-ФЗ — предмет регуляторных претензий. Работаем с обоими уровнями.
Архитектура системы распознавания лиц
Пайплайн распознавания состоит из трёх независимых шагов:
- Детекция — найти лицо в кадре, получить bounding box и ключевые точки (landmarks).
- Верификация/идентификация — получить face embedding (128- или 512-мерный вектор) и сравнить с базой эталонов.
- Антиспуфинг — убедиться, что перед камерой живой человек, а не фото/видео/маска.
Пропустить третий шаг — значит создать систему, которую обходит любая распечатанная фотография.
Детекция и landmarks
На iOS: VNDetectFaceLandmarksRequest из Vision framework. Возвращает VNFaceObservation с landmarks (76 точек: контур лица, брови, нос, губы, глаза) и boundingBox. Работает on-device, без сети, ~8–15 ms на iPhone 12.
На Android: ML Kit Face Detection с FaceDetectorOptions.ACCURATE. Возвращает FirebaseFace с 468 точками при включённом setContourDetectionEnabled(true) — это полноценный face mesh, не просто ключевые точки. Тяжелее, но нужен для точного выравнивания лица перед embedding.
Face alignment перед инференсом embedding-модели критичен. Без выравнивания по глазам точность face recognition падает на 15–25%. Геометрически: находим центры глаз, вычисляем угол поворота, аффинная трансформация к стандартному положению (глаза на высоте 1/3 от верха, симметрично).
Embedding и сравнение
Стандарт — FaceNet (128D) или ArcFace (512D). FaceNet из коробки доступен как TFLite-модель. ArcFace — более точный, но тяжелее. Для мобиля: FaceNet INT8 — 12 MB, инференс ~35 ms на Pixel 6.
Косинусное расстояние между векторами — основная метрика. Threshold для «одно лицо»: обычно cosine similarity > 0.75. Порог подбирается под конкретный датасет — это не универсальная константа.
Хранение эталонных embeddings: в зашифрованном Keychain (iOS) или EncryptedSharedPreferences / Android Keystore (Android). Никогда — исходные фотографии. Embedding необратим (теоретически), фотография — нет.
Антиспуфинг: без него нет смысла
Два подхода:
Пассивный — модель анализирует текстуру кожи и оптические артефакты фотографии/экрана. MiniFASNet, Silent-Face-Anti-Spoofing. Работает without user action, но слабее против 3D-масок.
Активный — challenge-response: «моргните», «поверните голову влево». Реализация: последовательность VNDetectFaceLandmarksRequest с анализом изменения Eye Aspect Ratio (EAR) для детекции моргания, или Head Pose Estimation через VNFaceObservation.yaw/roll/pitch.
Для банковских и финтех-приложений — комбинация: пассивный антиспуфинг + активный challenge. Для корпоративного доступа — пассивный достаточен.
Регуляторные требования
Биометрические данные (face embedding — это биометрия согласно GDPR ст. 9 и 152-ФЗ ст. 11) требуют явного согласия пользователя, отдельного от общего Terms of Service. Хранить embeddings в облаке можно только с шифрованием в транзите и at rest и при наличии DPA с провайдером. Если приложение работает в РФ с российскими пользователями — требования 152-ФЗ об локализации данных.
В App Store Review Guidelines п. 5.1.1 прямо запрещает собирать биометрию без явного разрешения. Отказ в ревью по этому пункту — не редкость.
Сроки
Детекция + идентификация on-device без антиспуфинга — 1–2 недели. Полный пайплайн с антиспуфингом, зашифрованным хранилищем эталонов и compliance-аудитом — 3–4 недели. Стоимость рассчитывается индивидуально.







