我想在闭路电视镜头上进行面部识别。在推理过程中,我实现了几种人脸嵌入比较的距离度量,如欧氏距离、余弦距离、KDTree、支持向量机、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_metricQ1:在人脸嵌入比较的准确性方面,什么是最好的度量标准,以及如何设置阈值?
Q2:比欧几里德和余弦距离更快和更好的人脸嵌入比较方法是什么?
发布于 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(k)的簇,然后在该簇中运行线性扫描O(p)以找到合适的面。
发布于 2020-12-15 11:20:33
我建议你在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)https://stackoverflow.com/questions/61302918
复制相似问题