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

Python 推理过程中人脸嵌入比较的最佳度量,python,face-recognition,Python,Face Recognition,我想在闭路电视画面上进行人脸识别。在推理过程中,我实现了几个用于人脸嵌入比较的距离度量,如欧几里德距离、余弦距离、KDTree、SVM、L1和L2距离等,但最后我只保留了前两个,因为我无法从这些度量中获得预期的准确度,因此很难找到一个好的阈值 def距离(自、嵌入1、嵌入2、距离度量=0): 如果距离_度量==0: #欧几里得距离 嵌入s1=嵌入s1/np.linalg.norm(嵌入s1,轴=1,keepdims=True) 嵌入S2=嵌入S2/np.linalg.norm(嵌入S2,轴=1,

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

def距离(自、嵌入1、嵌入2、距离度量=0):
如果距离_度量==0:
#欧几里得距离
嵌入s1=嵌入s1/np.linalg.norm(嵌入s1,轴=1,keepdims=True)
嵌入S2=嵌入S2/np.linalg.norm(嵌入S2,轴=1,keepdims=True)
dist=np.sqrt(np.sum(np.square)(np.subtract(嵌入s1,嵌入s2)))
返回区
elif距离_度量==1:
#基于余弦相似度的距离
点=np.和(np.乘(嵌入S1,嵌入S2),轴=1)
norm=np.linalg.norm(嵌入S1,轴=1)*np.linalg.norm(嵌入S2,轴=1)
相似性=点/范数
dist=np.arccos(相似性)/math.pi
返回距离[0]
其他:
提高“未定义的距离度量%d%”距离度量
Q1:就人脸嵌入比较的准确性而言,什么是最好的度量标准?如何设置阈值?

Q2:除了欧几里德距离和余弦距离之外,什么是最快和更好的人脸嵌入比较方法?


如果你指的是最先进的技术,那么最好的方法是以下列表:

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

它使用加性角裕度损失作为人脸识别的高分辨特征

好的是,它可以很容易地进行推广,并且可以基于特征的角度表示和权重向量(包括三重态损耗)设计其他损耗函数

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

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

代码可从以下网址获取:

(mxnet)

(小火炬)

(caffe)

为了更快地进行推理,您可以只使用两个嵌入之间的L1距离,为了在推理阶段的实际目的,可以使用更简单的距离度量。我建议你通过实验观察哪一个在你训练过的模型中效果最好。其他一些距离度量

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

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

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

首先搜索所有簇以找到接近当前嵌入O(k)的簇,然后在该簇中运行线性扫描O(p)以找到合适的面

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

我建议您使用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)

您是否尝试搜索
三重丢失
?我之前使用
三重丢失
训练过我的模型,但这里我想要的是识别过程中面部比较的距离度量,而不是
丢失函数
。嗨!我使用ArcFace来获得人脸嵌入,但我在寻找一个更好的度量,用于在模型推断后嵌入比较,而不是损失函数或模型。谢谢你读过报纸了吗?我没有提到是因为损失函数,而是因为它们的角距离度量。模型推理后??如果你用arcface训练你的模型,你认为在你进行推理时,另一个距离度量会更好吗?你的问题毫无意义,请看报纸了解一些情况。嗨!另外,假设您已经使用任何损失函数训练了一个FR模型,并得到了一个嵌入向量,那么,如果您在数据库中有数千个已知的人的嵌入,您将如何使用它来识别那个人?您能分享一些代码吗?“计算你选择的距离度量”我的问题只是基于哪一个是最佳距离度量?正如我清楚地说的,没有任何实验就无法判断。我给了你索塔论文的链接,你可以像他们一样使用L2距离,但也有其他选择。“最佳”需要一些参数(准确度最好(很难说,取决于数据集),最快(L1距离))。