Как сохранить несколько функций для лица и найти расстояние? - PullRequest
1 голос
/ 06 января 2020

Я работаю над проектом, основанным на распознавании лиц и проверке. Я использую сиамскую сеть, чтобы получить вектор 128 лица (Embeddings).

Я храню кодировки / встраивания лица человека в базу данных, а затем проверяю или говорю, совпадает ли кодировка входящего лица с ранее сохраненные кодировки для распознавания человека.

Чтобы создать надежную систему, мне нужно хранить более одной кодировки одного и того же человека. Когда я использовал только один вектор кодирования и сопоставлялся с:

Из face_recognition библиотеки (чтобы получить расстояние):

face_recognition.compare_faces( stored_list_of_encodings, checking_image_encodings )

Это не работает все время, потому что я сравнить только с одной кодировкой. Чтобы сделать систему достаточной для большинства случаев, я хочу сохранить как минимум 3 кодировки одного человека, а затем сравнить с новыми данными.

Теперь вопрос: как сохранить несколько вложений одного человека, а затем сравнить расстояние?

Я использую face_recognition в качестве библиотеки и Сиамскую сеть для извлечения объектов.

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Вы можете хранить все вложения лиц в базе данных / структуре данных, которая поддерживает запросы ближайших соседей, а затем для любого конкретного лица вы должны найти совпадение и получить вложения ближайших соседей в базе данных. С k ближайшими соседями и их расстоянием до объекта запроса вы можете решить, кому принадлежит это новое лицо (если оно вообще принадлежит известным лицам).

Вы можете взглянуть на Приблизительный ближайший сосед Тест для доступных вариантов.

Просто помните, они называются приблизительными, поэтому вы не получите точных результатов, но это лучший вариант, если вы имеете дело с большим количеством объектов. Если это не так с вами, вы можете просто использовать грубые методы решения ближайших соседей, уже предоставленные в sklearn, чтобы получить точные совпадения.

0 голосов
/ 07 января 2020

Существует несколько подходов к этому, я довольно много работал над распознаванием лиц, и я попробовал несколько вещей. Вы можете сделать некоторые из следующих действий:

Создать классификатор KNN

Способ сделать это - создать БД сорта, где у каждого объекта есть имя человека связанный с ним (в этом случае особенность представляет одно изображение лица человека). Затем во время сравнения вы вычисляете расстояние вашего объекта запроса с каждым представлением. Вы берете сравнения с N наименьшими расстояниями. Затем вы можете go пройти через N расстояний и посмотреть, к каким классам принадлежит каждый, а затем вы можете использовать максимальную встречающуюся метку, и это будет ваш целевой класс. По моему опыту, хотя это не очень надежно (хотя это полностью зависит от типа ваших тестовых данных, мое было связано с большим количеством диких изображений, так что это было недостаточно надежно)

Усредненные представления

Другой подход, который я использовал, заключался в том, что я усреднял представления для каждого человека. Если бы у меня было 5 изображений, я бы взял среднее или медиану 5 представлений, извлеченных из этих представлений. По моему опыту медиана работала лучше, чем средняя. Теперь у вас будет среднее представление, связанное с каждым человеком, вы можете просто взять дистанцию ​​с каждым средним представлением, и тот, у кого наименьшее расстояние, будет вашим целевым классом.

Представления кластера

Другой подход состоит в том, чтобы кластеризовать представление в кластеры с помощью DBScan, а затем во время выполнения классифицировать представителя запроса в кластер и принять класс большинства в этом кластере. как метка

По моему опыту, среднее представление лучше, но в итоге вам понадобится несколько изображений, по крайней мере, 5, я думаю. Но в моем случае мне нужно было как минимум 5, так как я обслуживал несколько углов, а что нет.

ПРИМЕЧАНИЕ :: SVM - ПЛОХОЙ подход, вы ограничиваете размер БД, и каждый -время, когда вам нужно добавить нового человека в БД, вам нужно будет подготовить новый SVM для дополнительного класса, который только что появился

Кроме того, для целей хранения вы всегда можете сохранить его в JSON

0 голосов
/ 07 января 2020

Рассматривали ли вы использовать классификатор SVM для классификации лиц? Таким образом, входными данными для классификатора SVM будет вектор размером 128. Затем вы можете скомпилировать несколько векторов, принадлежащих лицу одного человека (3 в вашем случае), и приспособить его к SVM в качестве класса. Затем вы можете сделать то же самое для разных лиц (классов).

Затем, при прогнозировании лица, просто введите новый вектор и запустите

svm.predict([..])

У меня был похожий вариант использования для моего проекта, но я использовал Fa cenet вместо этого в качестве экстрактора функций. Работает отлично.

...