Задача: Получить эмбединг всех лиц, содержащихся на изображении.
├── notebooks/ # Jupyter-ноутбуки с исследованиями и пайплайнами
├── models/ # Предобученные модели
├── images/ # Примеры и результаты
└── README.md # Документация проекта
Ноутбук | Описание |
---|---|
face-recognition-full-pipeline.ipynb |
Полный пайплайн: выравнивание лиц и получение эмбедингов |
arcface-model.ipynb |
Обучение модели для генерации эмбедингов |
face-key-points.ipynb |
Детекция ключевых точек лица |
Модель | Назначение | Архитектура |
---|---|---|
face_emb_model |
Генерация эмбеддингов лиц | ResNet101 + ArcFace |
eyes_model_v3.pt |
Детекция координат глаз | ResNet50 |
Архитектура: ResNet101 с ArcFace Loss для оптимального распределения эмбедингов
- Модель: ResNet101 с ArcFace Loss
- Датасет: Урезанный CelebA (500 классов)
- Аугментации: Color Jitter, Random Horizontal Flip
- Цель: Лучшее распределение эмбедингов в пространстве признаков
Метрика: Identification Rate (IR)
False Positive Rate | Left Threshold | True Positive Rate |
---|---|---|
0.05 | 0.236 | 46.5% |
0.10 | 0.193 | 58.8% |
0.20 | 0.146 | 72.5% |
![]() |
![]() |
График loss и accuracy на train и valid выборках | Результаты тестирования на лицах не присутствующих при обучении |
Задача: Детекция 12 ключевых точек глаз для выравнивания лиц
- Архитектура: ResNet50
- Датасет: Helen Dataset
- Точки: 12 ключевых точек глаз
- Аугментации:
- Случайная обрезка изображения
- Color Jitter
- Случайные повороты
- Loss Function: MSE Loss
- Нормализация: Координаты нормированы на размеры изображения
graph LR
A[Входное изображение] --> B[YOLOv8 детекция лиц]
B --> C[Обрезка лица]
C --> D[Поиск координат глаз]
D --> E[Выравнивание лица]
E --> F[Генерация эмбединга]
Шаг | Операция | Инструмент |
---|---|---|
1 | Детектируем лицо | YOLOv8 |
2 | Обрезаем изображение | Bounding Box |
3 | Находим координаты глаз | ResNet50 |
4 | Выравниваем лицо | Geometric Transform |
5 | Генерируем эмбединг | ResNet101 + ArcFace |
Косинусная близость используется для определения похожести лиц:
def cos_sim(a, b):
"""
Вычисляет косинусную близость между двумя векторами
Args:
a, b: эмбединги лиц
Returns:
float: косинусная близость (от -1 до 1)
"""
dot_product = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
if norm_a == 0 or norm_b == 0:
return 0.0
return dot_product / (norm_a * norm_b)
Принцип: Эмбединги лиц одного человека должны иметь большую косинусную близость между собой, чем эмбединги разных людей.
Результаты косинусной близости:
Одинаковые лица: 0.199
Разные лица 1: -0.001
Разные лица 2: 0.134
Результаты косинусной близости:
Одинаковые лица: 0.386
Разные лица 1: 0.170
Разные лица 2: -0.005
Векторы одного класса имеют меньший угол между собой (большую косинусную близость), чем векторы разных классов