Распознавание лиц и эмбеддинги

Распознать лицо — не значит «выбрать из списка классов». Это умное сравнение через числовые отпечатки лиц.

Эмбеддинг (embedding) — компактный вектор чисел, в который сеть превращает лицо так, что у одного человека векторы близки, а у разных — далеки.

Почему лицо нельзя «классифицировать»

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

Идея эмбеддингов

Сеть учат не называть имя, а превращать лицо в вектор-отпечаток (эмбеддинг) из, скажем, 128 чисел. Обучают так, чтобы:

  • два фото одного человека давали близкие векторы;
  • фото разных людей — далёкие векторы.

Тогда распознавание превращается в простое сравнение: получили эмбеддинг нового лица, сравнили с эмбеддингом из базы. Близко — тот же человек, далеко — другой. Новый человек просто добавляется в базу как один вектор, переобучать сеть не нужно.

Сравниваем лица руками

Близость векторов часто меряют косинусной близостью: 1 — векторы смотрят в одну сторону (одно лицо), около 0 — разные. Покажем на маленьких векторах.

import math

def cos(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a))
    nb = math.sqrt(sum(y * y for y in b))
    return dot / (na * nb)

alice_1 = [0.9, 0.1, 0.4, 0.2]   # фото Алисы
alice_2 = [0.8, 0.2, 0.5, 0.1]   # другое фото Алисы
bob     = [0.1, 0.9, 0.2, 0.8]   # фото Боба

print("Алиса vs Алиса:", round(cos(alice_1, alice_2), 3))
print("Алиса vs Боб:  ", round(cos(alice_1, bob), 3))

Вывод:

Алиса vs Алиса: 0.98
Алиса vs Боб:   0.34

Два фото Алисы дали близость 0.98 (почти 1 — один человек), Алиса и Боб — лишь 0.34. Поставив порог (например, 0.7), система решает: совпадение или нет. Настоящие эмбеддинги длиннее (128–512 чисел), но принцип ровно этот.

Верификация против идентификации

ЗадачаВопросПример
Верификация (1:1)это тот же человек?разблокировка телефона лицом
Идентификация (1:N)кто это из базы?поиск по базе сотрудников

Та же идея эмбеддингов работает шире лиц: поиск похожих картинок, дубликатов товаров, распознавание по отпечаткам — везде, где нужно «насколько эти два объекта похожи».

Итог

  • Распознавание лиц — это сравнение эмбеддингов, а не классификация.
  • Эмбеддинг — вектор-отпечаток: у одного человека близкие, у разных — далёкие.
  • Близость меряют косинусной мерой; порог решает «совпадение или нет».
  • Новый человек добавляется одним вектором — переобучение не нужно.
Проверьте себя
1. Почему распознавание лиц обычно строят на эмбеддингах, а не на классификаторе «класс = человек»?
AКлассификатор работает медленнее
BЛюдей миллиарды и новые появляются постоянно — нужен подход, работающий без переобучения под каждого, через сравнение векторов
CЭмбеддинги не требуют нейросети
DКлассификатор не различает цвета
2. Что означает высокая косинусная близость (например, 0.98) между двумя эмбеддингами лиц?
AЭто разные люди
BВекторы смотрят почти в одну сторону — скорее всего, это один и тот же человек
CКартинки разного разрешения
DЛица повёрнуты на 90 градусов
3. Как обучают сеть выдавать хорошие эмбеддинги лиц?
AЧтобы все векторы были одинаковы
BЧтобы у одного человека векторы были близки, а у разных людей — далеки
CЧтобы вектор совпадал с именем человека
DЧтобы вектор зависел только от фона
Поддержать проект