Лучший показатель c для сравнения встраивания лица при выводе - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу запустить распознавание лиц на кадрах видеонаблюдения. Я реализовал несколько метрик расстояния для сравнения встраивания лица во время вывода, таких как евклидово расстояние, косинусное расстояние, KDTree, SVM, расстояние L1 и L2 и т. Д. c, но в итоге я сохранил только первые два, так как не получал ожидаемой точности из тех, которые было трудно найти хороший порог.

def distance(self, embeddings1, embeddings2, distance_metric=0):
        if distance_metric == 0:
            # Euclidian distance
            embeddings1 = embeddings1/np.linalg.norm(embeddings1, axis=1, keepdims=True)
            embeddings2 = embeddings2/np.linalg.norm(embeddings2, axis=1, keepdims=True)
            dist = np.sqrt(np.sum(np.square(np.subtract(embeddings1, embeddings2))))
            return dist
        elif distance_metric == 1:
            # Distance based on cosine similarity
            dot = np.sum(np.multiply(embeddings1, embeddings2), axis=1)
            norm = np.linalg.norm(embeddings1, axis=1) * np.linalg.norm(embeddings2, axis=1)
            similarity = dot/norm
            dist = np.arccos(similarity) / math.pi
            return dist[0]
        else:
            raise 'Undefined distance metric %d' % distance_metric

Q1: Каков лучший показатель c с точки зрения точности для сравнения Face Embedding и как установить порог в этом?

Q2: Какой самый быстрый и лучший способ сравнения встраивания лица, кроме евклидова и косинусного расстояния?

1 Ответ

1 голос
/ 19 апреля 2020

Лучше всего, если вы имеете в виду современное состояние - вот следующий список: https://paperswithcode.com/sota/face-verification-on-labeled-faces-in-the

В настоящее время ArcFace является лучшей моделью оценки.

Он использует Additive Angular Margin Loss для отличительной черты распознавания лиц.

Хорошо, его можно легко обобщить, а другие функции потерь можно спроектировать на основе представления angular функций и веса. векторы, включая потерю триплетов.

Для вашего вопроса 2 это выглядит довольно расплывчато. Если вы имеете в виду, что как сделать matchinf быстрее, вы всегда можете использовать методы кластеризации вместо линейного поиска.

В статье также рассматриваются некоторые исследования ускорения.

Код доступен по адресу:

https://github.com/deepinsight/insightface (м xnet)

https://github.com/TreB1eN/InsightFace_Pytorch (pytorch)

https://github.com/happynear/AMSoftmax (caffe)

Для более быстрого вывода вы можете использовать только расстояние L1 между два вложения, для практических целей на этапах вывода используются более простые метрики расстояния. Я бы посоветовал вам экспериментально наблюдать, какой из них лучше всего работает в вашей обученной модели. Некоторые другие метрики расстояния https://scikit-learn.org/stable/modules/classes.html#module -sklearn.metrics.pairwise

Как определить, какое лицо из базы данных встраивания?

  • Самый простой подход линейное сканирование Итак, для всех вложений в вашем наборе данных вычислите расстояние по вашему выбору metri c между вычисляемым в настоящее время внедрением граней и базой данных внедрений. Выберите тот с минимальным расстоянием. Кроме того, вам может потребоваться указать порог для удаления неизвестных лиц. Сложность O (N)

  • Немного лучший подход - запустить алгоритм кластеризации без присмотра на вашем наборе данных для встраивания лица, чтобы создать несколько кластеров. Скажем, есть k кластеров, и в каждом кластере есть в среднем p-гранные вложения.

Сначала вы выполняете поиск по всем кластерам, чтобы найти тот, который близок к текущему. встраивая O (k), затем в этот кластер запустите линейное сканирование O (p), чтобы найти подходящее лицо.

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