首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推理过程中人脸嵌入比较的最佳度量

推理过程中人脸嵌入比较的最佳度量
EN

Stack Overflow用户
提问于 2020-04-19 10:34:28
回答 2查看 4.7K关注 0票数 2

我想在闭路电视镜头上进行面部识别。在推理过程中,我实现了几种人脸嵌入比较的距离度量,如欧氏距离、余弦距离、KDTree、支持向量机、L1和L2距离等,但最后我只保留了前两种方法,因为无法从它们中获得预期的精度,很难找到一个好的阈值。

代码语言:javascript
复制
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:比欧几里德和余弦距离更快和更好的人脸嵌入比较方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2020-04-19 10:59:55

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

目前,ArcFace是最佳的评分模式。

它利用加性角边缘损失作为人脸识别的高分辨特征。

好的是,它可以很容易地推广,其他损失函数可以根据特征的角度表示和包括三重态损失在内的权向量来设计。

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

本文还研究了一些加速度研究。

代码可从以下网址获得:

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

https://github.com/TreB1eN/InsightFace_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)以找到合适的面。

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

Stack Overflow用户

发布于 2020-12-15 11:20:33

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

代码语言:javascript
复制
#!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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61302918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档