Видеонаблюдение

Векторные представления лиц

Векторные представления лиц

Что такое векторные представления

Векторные представления — это технология, смежная с широкой темой больших языковых моделей (LLM), на основе которых построены различные инструменты: ChatGPT, Bard, Claude и прочие. В основе векторных представлений лежит преобразование заданной информации в массив чисел с плавающей точкой. Ключевая черта данного массива состоит в том, что длина, которая зависит от выбранной модели эмбеддинга, всегда будет одинакова, независимо от длины контента.

Векторное представление лица (эмбеддинг) — это числовой вектор (например, размером 128, 512 и т.д.), в котором зашита информация о ключевых особенностях внешнего вида человека. Основная идея:

● Вместо того чтобы хранить всё изображение лица (огромное количество пикселей), мы «сжимаем» его в небольшой вектор.

● Этот вектор должен быть таким, что «похожие» лица (один и тот же человек или очень похожие люди) будут иметь близкие векторные представления в каком‑то метрическом пространстве.

● На практике «близость» измеряется через такие метрики, как евклидово расстояние, косинусная близость и т.д.

Зачем это нужно:

1. Поиск и сравнение лиц: Можно быстро искать лицо человека в большой базе, просто вычисляя расстояние между векторами.

2. Кластеризация: Лица одного человека будут группироваться вместе.

3. Универсальность: Однажды получив эмбеддинг, его можно использовать для идентификации, верификации, классификации (например, пола, возраста) и других задач.

Как теоретически происходит обучение моделей векторных представлений

Самый распространённый подход — глубокие свёрточные сети, обученные на задаче «узнать, являются ли два лица фотографиями одного и того же человека» или «отнести лицо к правильной личности (ID) среди множества возможных».

1. Архитектура

Используются свёрточные нейронные сети (ResNet, Inception, VGG и т.д.).

На выходе — вектор фиксированной размерности (эмбеддинг), обычно на последнем или предпоследнем слое.

2. Стратегии обучения

Siamese / Triplet loss: Модель подгоняют так, чтобы расстояние между векторами «одного человека» было меньше, чем между векторами «разных людей».

Softmax-классификация по многим идентичностям: У нас большая база разных лиц, модель обучается отличать всех сразу (N классов). После обучения последний слой убирают, и предпредпоследний слой становится эмбеддингом.

АркFace, SphereFace, CosFace: Специализированные функции потерь, ориентированные на то, чтобы векторные представления разных людей более чётко отделялись друг от друга на сферическом пространстве.

3. Цель

Минимизировать внутриклассовое расстояние (один и тот же человек).

Максимизировать межклассовое расстояние (разные люди).

При этом сеть учится так, чтобы любой человек (из тех, что были в обучении) получал свой уникальный участок пространства.

После обучения модель способна обобщать на новых людей, не встречавшихся ранее, формируя их «уникальные» вектора в том же пространстве.

Получение эмбеддинга лица с VGG-Face

Векторные представления лиц
Векторные представления лиц

VGG-Face — одна из первых и широко используемых моделей, обученных на большой базе лиц (более 2,6 млн изображений ~2,6 тыс. различных персон). Она основана на архитектуре VGG (16 или 19 слоёв) и служит для генерации эмбеддингов лиц.

1. Подготовка лица

Обычно сначала детектируют лицо (например, MTCNN, Haar, Dlib).

Вырезают лицо (crop) и приводят к формату, ожидаемому моделью (размер, каналы, центрирование или нормализация).

2. Получение вектора

Используется предобученная сеть VGG-Face (доступны открытые реализации в Keras, PyTorch).

На вход подаём подготовленное изображение лица.

Снимаем выход (или слой перед финальной классификацией) размером 4096, 2048 или 512 (в зависимости от конкретной реализации).

В практике Python существует готовая библиотека keras-vggface, которая предоставляет предобученные версии VGG-Face (и некоторые другие модели) в формате Keras/TensorFlow.

1. Установка

Убедитесь, что у вас установлены необходимые пакеты:

pip install keras-vggface keras-applications

Библиотека keras-vggface содержит конвертированные в Keras веса оригинальной VGG-Face (а также опционально ResNet50 и SENet50, обученные на лицах).

2. Использование VGG-Face

Ниже пример кода, показывающего, как получить векторное представление (эмбеддинг) лица с помощью VGG-Face (конфигурация, похожая на оригинальную статью VGG-Face):

import cv2

import numpy as np

from tensorflow.keras.preprocessing import image

from keras_vggface.vggface import VGGFace

from keras_vggface.utils import preprocess_input

# 1) Инициализируем модель

# model=’vgg16′ — базовая архитектура, аналогичная VGG-Face

# include_top=False — значит мы берём сеть без финального классификатора (чтобы получить эмбеддинг)

# pooling=’avg’ — усредняем пространственные признаки и получаем один вектор на выходе

vggface = VGGFace(model=’vgg16′,

  include_top=False,

  input_shape=(224, 224, 3),

  pooling=’avg’)

# 2) Считываем и подготавливаем изображение (уже обрезанное до лица или детектированное заранее)

face_path = ‘path_to_face.jpg’

face_img = cv2.imread(face_path)

face_img = cv2.cvtColor(face_img, cv2.COLOR_BGR2RGB)

face_img = cv2.resize(face_img, (224, 224)) # VGGFace ожидает вход 224×224

face_array = image.img_to_array(face_img) # Преобразуем в numpy (H, W, C)

face_array = np.expand_dims(face_array, axis=0) # (1, 224, 224, 3)

# 3) Нормализация под специфику VGGFace

# version=1 соответствует параметрам, используемым для VGG16 (не путать с ResNet/SENet)

face_array = preprocess_input(face_array, version=1)

# 4) Прогоняем через сеть, получаем эмбеддинг

embedding = vggface.predict(face_array) # shape = (1, 512), (1, 2048) или др. в зависимости от конфигурации

embedding = embedding[0] # Убираем размерность батча, теперь (512,)

print(«Вектор эмбеддинга VGG-Face:», embedding)

print(«Длина эмбеддинга:», len(embedding))

3. Интерпретация и применение эмбеддинга

1. Сравнение лиц:

Если у вас есть два эмбеддинга, скажем emb1 и emb2, то можно вычислить косинусную близость или евклидово расстояние.

Меньшее расстояние или большая косинусная схожесть укажет на то, что лица, вероятно, принадлежат одному человеку.

2. Поиск в базе:

Если хотите найти, есть ли человек в базе, храните эмбеддинги всех лиц в базе (например, в массиве NumPy или специализированной структуре вроде hnswlib), а потом ищите ближайший вектор к новому эмбеддингу.

3. Особенности предобученной модели:

Исходные веса «VGGFace» были обучены на большом датасете лиц (около 2,6 млн изображений), что даёт хорошую универсальность.

Однако для конкретных задач (скажем, в других условиях съёмки, другой популяции пользователей) можно дообучить (fine-tune) эту модель на более специфических данных.

Таким образом, эмбеддинги — это своего рода «универсальный язык» для понимания и анализа лиц компьютерными системами. Такой вектор:

● Отлично подходит для быстрого сравнения и идентификации,

● Может быть получен однажды и использоваться во многих задачах (верификация, кластеризация, поиск),

● Значительно упрощает решение сложных проблем распознавания, поскольку вместо пиксельных данных мы работаем в структурированном латентном пространстве.

На практике доступны мощные предобученные сети (VGG-Face, FaceNet, ArcFace), позволяющие любому разработчику запустить механизм «извлечь эмбеддинг → сравнить лица» без долгого и дорогостоящего обучения. При этом, для достижения высокой точности в специфических условиях (необычные ракурсы, особые группы пользователей, ограниченное освещение) может потребоваться дополнительное дообучение (fine-tuning), но и это значительно проще, чем собирать собственную громадную базу и обучать систему «с нуля».

В целом, эмбеддинги обеспечивают «стержень» систем распознавания лиц и находят применение в самых разных сферах — от систем безопасности и контроля доступа до медицины и аналитики поведения в розничных сетях.