【问题标题】:Best metric for Face Embedding comparison during inference推理过程中人脸嵌入比较的最佳指标
【发布时间】:2020-04-19 10:34:28
【问题描述】:

我想在闭路电视镜头上运行人脸识别。我已经在推理过程中实现了几个用于人脸嵌入比较的距离度量,例如欧几里德距离、余弦距离、KDTree、SVM、L1 和 L2 距离等,但最后我只保留了前两个,因为我没有得到预期的准确度很难找到一个好的阈值。

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:关于人脸嵌入比较准确度的最佳指标是什么?如何设置阈值?

Q2:除了欧式和余弦距离之外,Face Embedding 比较最快更好的方法是什么?

【问题讨论】:

  • 您是否尝试搜索Triplet-loss
  • 我之前使用Triplet-loss 训练了我的模型,但在这里我想要一个距离度量,用于在识别过程中进行人脸比较,而不是Loss function

标签: python face-recognition


【解决方案1】:

我建议您在 deepface 中使用那些最先进的人脸识别模型。它提供了一个通用接口,您只需将模型名称作为参数传递。

#!pip install deepface
from deepface import DeepFace
models = ['VGG-Face', 'Facenet', 'OpenFace', 'DeepFace'
           , 'DeepID', 'Dlib', 'ArcFace']
metrics = ['cosine', 'euclidean', 'euclidean_l2']
obj = DeepFace.verify("img1.jpg", "img2.jpg"
   , model_name = models[6], distance_metric = metrics[0])
print(obj)

【讨论】:

    【解决方案2】:

    最好,如果您指的是最先进的技术 - 以下是要遵循的列表:https://paperswithcode.com/sota/face-verification-on-labeled-faces-in-the

    目前,ArcFace 是最好的评分模型。

    它使用 Additive Angular Margin Loss 来实现人脸识别的高度判别特征。

    好消息是,它可以很容易地泛化,并且可以根据特征的角度表示和包括三元组损失在内的权重向量设计其他损失函数。

    对于您的问题 2,它似乎有点含糊。如果您的意思是如何使 matchinf 更快,您始终可以使用聚类技术而不是线性搜索。

    该论文还研究了一些加速研究。

    代码可在:

    https://github.com/deepinsight/insightface (mxnet)

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

    https://github.com/happynear/AMSoftmax(咖啡)

    为了更快的推理,您可以只使用两个嵌入之间的 L1 距离,在推理阶段,为了实际目的,使用更简单的距离度量。我建议您通过实验观察哪一个在您的训练模型中效果最好。其他一些距离指标https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics.pairwise

    如何从嵌入数据库中检测出哪张脸?

    • 最简单的方法是线性扫描。因此,对于数据集中的所有嵌入,计算您选择的当前计算的人脸嵌入与嵌入数据库之间的距离度量。选择距离最短的那个。此外,您可能需要指定一个阈值来丢弃未知面孔。复杂度 O(N)

    • 更好的方法是在人脸嵌入数据集上运行无监督聚类算法以生成多个聚类。假设有 k 个聚类,每个聚类中平均有 p 个人脸嵌入。

    您首先搜索所有集群以找到与当前嵌入 O(k) 接近的集群,然后在该集群中运行线性扫描 O(p) 以找到合适的人脸。

    • 之后就变成了数据结构问题。您可以创建平衡树以进一步加快匹配速度。

    【讨论】:

    • 嗨!我正在使用 ArcFace 来获取人脸嵌入,但我正在寻找更好的指标来在模型推断后进行嵌入比较,而不是损失函数或模型。谢谢!
    • 在哪种情况下更好,你读过论文吗?我没有提到因为损失函数,而是因为它们的角距离度量。模型推断后??如果你用 arcface 训练你的模型,你认为在你进行推理时,另一个距离度量会更好吗?您的问题毫无意义,请阅读论文以获得一些想法。
    • 嗨!另外,假设您已经使用任何损失函数训练了一个 FR 模型,并且您得到了一个嵌入向量,那么您将如何使用它来识别该人,因为您的数据库中有数千个已知人的嵌入?
    • 你能分享一些代码吗? “计算您选择的距离度量”我的问题仅基于哪个是最佳距离度量?
    • 正如我清楚地说的,没有任何实验是不可能判断的。我给了你 SOTA 论文的链接,你可以使用他们使用的 L2 距离,但也有其他选项。 “最佳”需要一些参数(在准确性方面最好(很难说,取决于数据集),最快(L1 距离))。
    猜你喜欢
    • 2020-03-09
    • 2015-01-16
    • 2010-12-14
    • 2012-07-25
    • 2017-08-28
    • 2016-06-06
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多