Розробка системи розпізнавання облич (Face Recognition)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка системи розпізнавання облич (Face Recognition)
Складний
від 2 тижнів до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1282
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка системи розпізнавання осіб

Розпізнавання осіб — завдання ідентифікації людини за зображенням обличчя шляхом зіставлення з базою даних. Повний pipeline: детекція обличчя → вирівнювання (alignment) → видобування embedding → пошук найближчого сусіда у базі. Кожен етап впливає на загальну точність, і помилка на ранніх етапах не компенсується наступними.

Повний Pipeline

import cv2
import numpy as np
from insightface.app import FaceAnalysis

class FaceRecognitionSystem:
    def __init__(self, db_path: str, threshold: float = 0.5):
        # InsightFace поєднує детекцію + вирівнювання + видобування
        self.app = FaceAnalysis(
            providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
        )
        self.app.prepare(ctx_id=0, det_size=(640, 640))

        self.threshold = threshold
        self.face_db = self._load_database(db_path)

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

        for face in faces:
            embedding = face.embedding  # 512-dim ArcFace embedding
            match = self._search_database(embedding)
            results.append({
                'bbox': face.bbox.astype(int).tolist(),
                'person_id': match['id'] if match else None,
                'person_name': match['name'] if match else 'Unknown',
                'similarity': match['similarity'] if match else 0.0,
                'verified': match['similarity'] > self.threshold if match else False
            })
        return results

    def _search_database(self, query_emb: np.ndarray) -> dict | None:
        # Пошук Cosine similarity
        similarities = np.dot(self.face_db['embeddings'], query_emb) / (
            np.linalg.norm(self.face_db['embeddings'], axis=1) *
            np.linalg.norm(query_emb)
        )
        best_idx = np.argmax(similarities)
        best_sim = similarities[best_idx]

        if best_sim < self.threshold:
            return None
        return {
            'id': self.face_db['ids'][best_idx],
            'name': self.face_db['names'][best_idx],
            'similarity': float(best_sim)
        }

Моделі для видобування Embedding

ArcFace (InsightFace) — індустріальний стандарт. LFW точність: 99.83%, IJB-C TAR@FAR=1e-4: 96.5%. Розмір embedding: 512 dimensions.

FaceNet (Google) — більш ранніша модель, все ще популярна. LFW: 99.65%. Розмір embedding: 128 або 512 dimensions.

MagFace — поліпшений ArcFace зі масштабованим margin. IJB-C: 97.1%.

Для периферійних пристроїв: MobileFaceNet — 1MB, працює на мобільних, LFW: 99.5%.

Масштабованість бази осіб

При малій базі (< 10k осіб) — brute-force cosine similarity працює миттєво. Для великих баз — approximate nearest neighbor (ANN):

import faiss

class FaceDatabase:
    def __init__(self, dimension: int = 512):
        # FAISS IVF індекс для million-scale баз
        quantizer = faiss.IndexFlatIP(dimension)  # Inner Product = cosine sim
        self.index = faiss.IndexIVFFlat(quantizer, dimension, 100)
        self.index.nprobe = 10  # якість vs швидкість пошуку

    def add_faces(self, embeddings: np.ndarray):
        # Нормалізуємо для cosine similarity через IP
        faiss.normalize_L2(embeddings)
        if not self.index.is_trained:
            self.index.train(embeddings)
        self.index.add(embeddings)

    def search(self, query: np.ndarray, k: int = 5):
        faiss.normalize_L2(query.reshape(1, -1))
        similarities, indices = self.index.search(query.reshape(1, -1), k)
        return similarities[0], indices[0]

FAISS IVFFlat: пошук серед 1M осіб за < 1ms на CPU.

Робота з якістю зображення

Система реального світу працює з нечіткими, частково закритими, погано освітленими обличчями. Заходи:

  • Face quality score — перед додаванням до бази та перед ідентифікацією оцінюємо якість кропу (BRISQUE або спеціалізований FaceQNet). Відкидаємо низькоякісні зображення
  • Anti-spoofing — захист від фотографій та екранів: MiniFASNet, CDCN. FAS (Face Anti-Spoofing) має бути обов'язковим компонентом для production-систем
  • 3D liveness detection — через IR-камеру або depth-сенсор (Face ID-подібний підхід)

Правові та етичні аспекти

Система розпізнавання осіб вимагає відповідності законодавству: GDPR в ЄС, національні закони про біометрію. Біометричні дані — спеціальна категорія персональних даних. Обов'язкові: явна інформована згода, шифрування бази embedding, журналювання доступу, право на видалення.

Етапи розробки

Аудит вимог: верифікація 1:1 або ідентифікація 1:N, масштаб бази, цільове залізо. Збір тестового датасету з реальних умов (освітлення, кути зйомки, камери). Вибір та налаштування embedding-моделі, anti-spoofing. Побудова бази та налаштування порогу similarity. Інтеграція, навантажувальне тестування, моніторинг FAR/FRR.

Масштаб системи Хронологія
Верифікація (1:1), до 1000 користувачів 3–4 тижні
Ідентифікація 1:N, до 100k осіб 5–8 тижнів
Enterprise-система, 1M+ осіб, multi-camera 10–16 тижнів