Система распознавания лиц для контроля доступа

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Система распознавания лиц для контроля доступа
Средний
~1-2 недели
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1361
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1189
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Система контроля доступа на основе распознавания лиц

Замена пропусков и PIN-кодов на биометрию лица — задача, где разница между «работает на демо» и «работает в продакшене» особенно велика. Демо: фото 10 сотрудников, офисное освещение, камера в лоб. Продакшен: 500 человек, боковые ракурсы, маски, очки, тёмные очки, подсветка сзади, 4 утра. Наш опыт показывает, что без грамотного проектирования и настройки точность падает до 70%. При правильно построенном пайплайне система стабильно обеспечивает точность 99%+.

Экономия затрат на управление доступом за счёт исключения пластиковых пропусков и перевыпуска — до 90% в годовом исчислении. Для 500 сотрудников это более 1,5 млн рублей в год. Интеграция с существующей СКУД занимает от двух дней.

Пайплайн распознавания лиц для СКУД

Камера (RTSP) → Детекция лица → Выравнивание (alignment) → Эмбеддинг (ArcFace/AdaFace) → Поиск в базе → Решение → Управление замком

Критичный компонент — качество эмбеддинга. ArcFace (InsightFace) и AdaFace сегодня — стандарт де-факто для face recognition в контроле доступа. Мы используем проверенный стек: InsightFace buffalo_l, FAISS для быстрого поиска, CUDA-оптимизации под NVIDIA GPU.

ArcFace в 3 раза точнее старых методов eigenfaces и обеспечивает robustность к углам до 60°. AdaFace на 15% устойчивее к большим углам (до 75°) и плохому освещению.

import insightface
import numpy as np
import faiss
from pathlib import Path
import cv2

class FaceAccessControl:
    def __init__(self, db_path: str, threshold: float = 0.5):
        # InsightFace buffalo_l: detection + ArcFace embedding
        self.app = insightface.app.FaceAnalysis(
            name='buffalo_l',
            providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
        )
        self.app.prepare(ctx_id=0, det_size=(640, 640))

        self.threshold = threshold  # cosine distance
        self.index, self.id_map = self._load_db(db_path)

    def _load_db(self, db_path: str):
        """Загрузка базы эмбеддингов в FAISS"""
        embeddings = []
        id_map = {}

        for i, emb_file in enumerate(Path(db_path).glob('*.npy')):
            emb = np.load(emb_file)
            embeddings.append(emb)
            id_map[i] = emb_file.stem  # employee_id

        if not embeddings:
            return None, {}

        emb_matrix = np.vstack(embeddings).astype('float32')
        faiss.normalize_L2(emb_matrix)  # cosine similarity через IP

        index = faiss.IndexFlatIP(512)  # ArcFace dim = 512
        index.add(emb_matrix)
        return index, id_map

    def recognize(self, frame: np.ndarray) -> list[dict]:
        faces = self.app.get(frame)
        results = []

        for face in faces:
            if face.det_score < 0.7:
                continue  # низкое качество детекции

            emb = face.embedding.reshape(1, -1).astype('float32')
            faiss.normalize_L2(emb)

            D, I = self.index.search(emb, k=1)
            score = float(D[0][0])

            if score >= self.threshold:
                results.append({
                    'employee_id': self.id_map[I[0][0]],
                    'confidence': score,
                    'bbox': face.bbox.astype(int).tolist(),
                    'decision': 'ALLOW'
                })
            else:
                results.append({
                    'employee_id': None,
                    'confidence': score,
                    'bbox': face.bbox.astype(int).tolist(),
                    'decision': 'DENY'
                })

        return results

Как настроить порог решения (threshold) для минимизации ошибок?

Это самый болезненный параметр. Cosine distance 0.5 для ArcFace означает:

  • FAR (False Accept Rate) ~0.1% — чужой проходит 1 раз на 1000 попыток
  • FRR (False Reject Rate) ~3% — сотрудник получает отказ в 3% случаев

Реальные цифры сдвигаются при: очках (+2–4% FRR), масках (+8–15% FRR), боковом ракурсе > 45° (+5–10% FRR), плохом освещении (+6–12% FRR).

Решение для сложных условий — adaptive threshold: понижаем порог при низком качестве входного кадра и требуем повторного захвата.

def adaptive_threshold(face_quality: float,
                       base_threshold: float = 0.5) -> float:
    """Качество 0–1: liveness score * illumination * sharpness"""
    if face_quality > 0.85:
        return base_threshold        # хорошие условия
    elif face_quality > 0.65:
        return base_threshold + 0.05  # чуть строже
    else:
        return 1.1  # отказ, запрос повторного кадра

Что такое adaptive threshold и зачем он нужен?

Adaptive threshold автоматически подстраивает строгость распознавания под текущие условия съёмки. Это снижает FRR в сложных сценах без увеличения FAR. На практике: при использовании adaptive threshold в бизнес-центре с 800 сотрудниками FRR упал с 12% до 1.8%.

Почему без liveness detection система ненадёжна?

Без anti-spoofing система бесполезна — фотография на смартфоне открывает дверь. Мы используем сертифицированные методы защиты.

Метод Защита от Задержка Точность
Texture analysis (LBP/CNN) Печатное фото +10ms 96–98%
Depth camera (IR) Фото + видео +5ms 99%+
Challenge-response (blinking) Фото + видео 1–2 сек 99%+
3D face model Маски, 3D-печать +20ms 97–99%

Для турникетов с высокой пропускной способностью — texture analysis + passive IR (без challenge). Закажите пилотное тестирование на своём объекте. Для серверных комнат и высококритичных зон — 3D depth camera обязательна.

Сравнение методов: ArcFace vs AdaFace

ArcFace — лучший выбор для frontal face и контролируемого освещения. AdaFace устойчивее к большим углам и плохому свету. В типовой СКУД достаточно ArcFace; AdaFace выбирают для уличных проходных или нестабильного освещения.

Кейс: бизнес-центр на 800 сотрудников

Использовали InsightFace buffalo_l + FAISS IVF256 (approximated, ускоряет поиск при > 500 лицах). Камеры Hikvision 4MP с ИК-подсветкой, установлены на высоте 1.4–1.6м.

Проблема при запуске: FRR 12% — слишком много отказов. Причина — в базе у ряда сотрудников было только одно фото анфас. После дообучения базы на 5 фото с разными углами (±30°, +/-15° pitch) и в очках при наличии:

  • FRR снизился до 1.8%
  • FAR: 0.02% за 3 месяца эксплуатации
  • Пропускная способность: 40 человек/мин на турникет (задержка 120–180ms)

Инференс на Intel Core i7 + NVIDIA RTX 3060 Ti: 35ms на лицо, 8 параллельных потоков.

Регистрация новых сотрудников

def enroll_employee(employee_id: str, photos: list[np.ndarray],
                    min_photos: int = 3) -> np.ndarray:
    """Усреднённый эмбеддинг из нескольких фото"""
    embeddings = []
    for photo in photos:
        faces = app.get(photo)
        if faces and faces[0].det_score > 0.85:
            embeddings.append(faces[0].embedding)

    if len(embeddings) < min_photos:
        raise ValueError(f"Недостаточно качественных фото: {len(embeddings)}")

    # Среднее нормализованное — лучше чем просто первое фото
    mean_emb = np.mean(embeddings, axis=0)
    mean_emb /= np.linalg.norm(mean_emb)
    return mean_emb

Как мы реализуем СКУД по лицу: пошаговый план

  1. Аудит проходных зон (освещённость, ракурсы, пропускная способность)
  2. Подбор и закупка оборудования (камеры, ИК-прожекторы, глубинные сенсоры)
  3. Разработка и интеграция ПО: детекция, антиспуфинг, связка с СКУД
  4. Тестирование и калибровка (сбор метрик FAR/FRR, адаптивный порог)
  5. Обучение администраторов, документация, гарантийная поддержка

Ориентировочные сроки:

Масштаб Срок
До 100 сотрудников, 1–2 точки 2–4 недели
До 500 сотрудников, 5–15 точек 5–8 недель
Enterprise 1000+ сотрудников 10–16 недель

Получите консультацию инженера — мы подберём оптимальную конфигурацию под ваши условия. Свяжитесь с нами для бесплатного аудита вашего объекта и расчёта стоимости решения. Разработка системы контроля доступа по лицу под ключ.

Как distribution shift убивает метрики CV-модели в промышленности

На производстве ставят камеру, контролируют качество продукции. Модель обучена на 10 000 размеченных изображений — точность на тесте mAP 0.84. Запускают в продакшен — и в первую же неделю пропускают 30 % дефектов. Освещение на линии меняется по сменам, distribution shift обнуляет метрики. Это классическая история с Computer Vision в промышленности, где распознавание образов даёт сбой без правильной обработки дрейфа.

Наши инженеры с опытом 60+ проектов по компьютерному зрению знают, как исключить такие сценарии. Гарантируем стабильную работу модели под реальными условиями.

Детекция объектов: YOLO, RT‑DETR и всё что между ними

YOLO — стандарт для real‑time детекции. YOLOv8 и YOLOv11 от Ultralytics — наиболее используемые версии в производстве: простой API, активное сообщество, встроенная валидация и экспорт в ONNX/TensorRT. Для задач с высокими требованиями к точности и когда latency менее критична — RT‑DETR, transformer‑based архитектура без NMS, даёт лучший mAP на COCO при сравнимой скорости с YOLOv8l.

Архитектура mAP на COCO (val2017) FPS (A10G, FP16) Сложность деплоя
YOLOv8n 37.3 700+ Низкая (ONNX/TensorRT)
YOLOv8m 50.2 250 Низкая
RT‑DETR-L 53.0 140 Средняя (требует PyTorch)
Mask R‑CNN 38.2 (bbox) 30 Высокая

Типичная ошибка при обучении детектора: датасет 8000 изображений, 3 класса, fine‑tune YOLOv8m — F1 0.73 на валидации. Смотрим confusion matrix — один класс почти никогда не детектируется. Причина: дисбаланс 1:23. Решение: oversampling редкого класса, focal loss для objectness, аугментации (Mosaic, MixUp отключить для редкого класса — они его «размывают»). Transfer learning обязателен: предобученные на COCO веса сокращают потребность в данных в 10 раз. Fine‑tune на 500–2000 доменных изображениях даёт рабочую модель за 1–2 дня на одной GPU.

Для edge deployment: экспорт в ONNX → TensorRT engine. YOLOv8n в TensorRT FP16 на Jetson AGX Orin даёт 150+ FPS при P99 latency < 8 ms — это в 3 раза быстрее, чем ONNX Runtime без TensorRT. На сервере A10G: 700+ FPS для YOLOv8n в TensorRT INT8.

Как fine‑tuning YOLO помогает в распознавании образов?

Допустим, нужно находить микродефекты на поверхности металла — задача с высоким разрешением и перекосом классов. Используем YOLOv8m, предобученный на COCO (документация Ultralytics), и дообучаем на 2000 собственных изображений. Применяем аугментации Mosaic, MixUp, random perspective. После 200 эпох mAP 0.5 достигает 0.93. Ключевые приёмы:

  • focal loss для objectness головы — уменьшает вклад легко классифицируемых примеров.
  • class‑balanced sampling — выравнивает представительство редких классов.
  • Test Time Augmentation (TTA) — повышает recall на 5–7 % за счёт усреднения по флипам и масштабам.

Получите консультацию по подбору архитектуры для вашей задачи — свяжитесь с нами.

Сегментация: SAM, Mask R‑CNN и instance segmentation

SAM (Segment Anything Model) от Meta изменил подход к сегментации. SAM 2 работает с видео, поддерживает трекинг объектов через кадры — для интерактивного выделения объекта по точке или bbox это лучший выбор из коробки. Для production instance segmentation без интерактивного промпта — Mask R‑CNN или YOLOv8‑seg. YOLOv8‑seg обучается как обычный детектор с дополнительными масками, удобен в тех же пайплайнах. Семантическая сегментация (каждый пиксель — класс) — SegFormer, DeepLabV3+. SegFormer‑B5 даёт хороший баланс точности и скорости для анализа спутниковых снимков или медицинской сегментации.

Кейс: сегментация клеток на микроскопических изображениях. Датасет 400 изображений с ручной разметкой. Обучение Mask R‑CNN на ResNet‑50 backbone дало IoU 0.61 — плохо. Проблема: объекты (клетки) перекрываются, стандартный NMS убивает перекрывающиеся предсказания. Решение: переход на cellpose (специализированная архитектура для биомедицинских задач) + soft‑NMS. IoU вырос до 0.79.

OCR: когда Tesseract не справляется

Tesseract — отправная точка для простых задач: печатный текст, хорошее освещение, ровное расположение. Как только появляются рукописные элементы, нестандартные шрифты, перспективные искажения или многоколоночный макет — Tesseract деградирует быстро.

PaddleOCR — production‑grade решение: обнаружение текстовых блоков + распознавание + структурный анализ. Работает из коробки для 80+ языков, включая русский. Поддерживает таблицы и документы со сложной структурой. Wikipedia: Оптическое распознавание символов. TrOCR (Microsoft) — трансформерный OCR с сильными результатами на рукописном тексте. Для русского рукописного текста нужен fine‑tuning: базовая модель обучена преимущественно на латинице.

Что делать, если Tesseract не справляется с распознаванием образов на документах?

Для задач «извлеки данные из счёта / договора / паспорта» используем LayoutLMv3 или Donut — эти модели понимают layout документа, а не только текст. Интеграция через Hugging Face Transformers, fine‑tuning на 200–500 размеченных документах. Типичный pipeline:

  1. Preprocessing: deskew, denoising, binarization через OpenCV.
  2. Обнаружение текстовых блоков: PaddleOCR detection или CRAFT.
  3. Распознавание: PaddleOCR recognition или TrOCR.
  4. Post‑processing: нормализация, валидация через regex или LLM для структурированных полей.

Для документов с фиксированной структурой template matching + OCR точечно по координатам зачастую надёжнее end‑to‑end решения.

Face Recognition: идентификация и верификация

Face recognition = detection + alignment + embedding + matching. Каждый этап важен.

Detection: RetinaFace или InsightFace для точной локализации лица и ключевых точек. MTCNN — более старое, но надёжное решение. Embedding: ArcFace (InsightFace) — state‑of‑the‑art для face recognition embeddings. Модели iresnet50/iresnet100 предобучены на MS1MV3 (5M идентичностей). Эмбеддинг‑вектор 512 float32, сравнение по cosine similarity. Threshold tuning: порог решения — критический параметр. При threshold 0.6 типичный FPR на LFW benchmark — 0.001, TPR — 0.985. В production threshold нужно калибровать под реальный distribution: люди в масках, с изменившейся внешностью, в разных условиях освещения. Liveness detection обязателен: MiniFASNet — lightweight модель на CPU, FaceX‑Zoo содержит несколько предобученных liveness‑детекторов.

Видеоаналитика

Видео — последовательность кадров плюс временное измерение. Наивный подход — детектировать на каждом кадре — дорого.

Трекинг: ByteTrack и BoT‑SORT — стандарт для multi‑object tracking. Работают поверх любого детектора, добавляют persistent ID объектам между кадрами — это даёт подсчёт объектов, треки движения, velocity.

Оптимизация: не нужно обрабатывать каждый кадр. Для статичных сцен детекция на каждом 5–10 кадре, между ними — трекер. Для детекции событий (человек вошёл в зону) background subtraction (OpenCV MOG2) как lightweight pre‑filter перед нейросетевой детекцией. Action Recognition: SlowFast, VideoMAE для классификации действий. Тяжёлые модели — для production используем ONNX export + TensorRT либо оффлайн обработку.

Как измерить качество модели распознавания образов в продакшене?

Мониторинг качества — ключевой элемент MLOps. Отслеживаем:

  • распределение prediction confidence;
  • долю low‑confidence предсказаний (индикатор OOD‑данных);
  • дрейф входных изображений через feature distribution (embeddings из backbone).

Падение средней confidence с 0.87 до 0.71 за неделю — ранний сигнал о distribution shift. NVIDIA Triton Inference Server рекомендует отслеживать эти метрики через Prometheus. Наши сертифицированные инженеры настраивают мониторинг и гарантируют SLA по качеству инференса.

Деплой CV‑моделей

Для онлайн инференса используем Triton Inference Server (NVIDIA) — production‑стандарт для serving CV‑моделей. Поддерживает TensorRT, ONNX, PyTorch, dynamic batching, multiple instances. REST и gRPC API. Гарантируем стабильную работу под нагрузкой.

Edge deployment: ONNX Runtime на ARM/x86 CPU. TensorFlow Lite для мобильных устройств. OpenVINO для Intel CPU/GPU/VPU — даёт 2–3× прирост скорости на Intel железе по сравнению с ONNX Runtime. После деплоя передаём модель с документацией и обучаем персонал.

Что входит в работу

Этап Содержание Ориентировочный срок
Анализ Техническое задание, подбор архитектуры, оценка данных 3–5 дней
Разметка Сбор изображений, аннотирование (до 5000 объектов) 1–3 недели
Обучение Fine‑tuning модели, валидация на тестовой выборке 1–2 недели
Оптимизация Экспорт в ONNX/TensorRT/OpenVINO, тестирование на целевом железе 1–2 недели
Интеграция REST/gRPC API, интеграция с существующей инфраструктурой 1–2 недели
Деплой Развёртывание на сервере или edge‑устройстве, нагрузочное тестирование 1 неделя
Документация и обучение Инструкции, обучение персонала, передача кода и модели 3–5 дней
Поддержка Техническая поддержка на 3 месяца после запуска

Сроки и стоимость

Прототип детектора на существующих данных — 1–2 недели. Production‑система с оптимизацией под целевое железо — 4–8 недель. Полный цикл включая разметку данных (1000–5000 изображений) — 2–4 месяца. Стоимость рассчитывается индивидуально под каждую задачу. Примерная экономия от внедрения системы контроля качества — до 1 млн рублей в месяц на одном производственном участке.

Мы на рынке более 5 лет, реализовали 60+ проектов по компьютерному зрению. Оценим ваш проект под ключ — закажите консультацию, чтобы получить расчёт и техническое предложение.