Что такое векторные представления
Векторные представления — это технология, смежная с широкой темой больших языковых моделей (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), но и это значительно проще, чем собирать собственную громадную базу и обучать систему «с нуля».
В целом, эмбеддинги обеспечивают «стержень» систем распознавания лиц и находят применение в самых разных сферах — от систем безопасности и контроля доступа до медицины и аналитики поведения в розничных сетях.