我已经为面部嵌入比较实现了多个距离度量,例如欧几里得距离,余弦距离,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:除了欧几里得距离和余弦距离之外,人脸嵌入比较最快,更好的方法是什么?
最好,如果您是指最先进的技术-这是要遵循的列表:https://paperswithcode.com/sota/face-verification-on-labeled-faces-in-the
当前,ArcFace是最佳评分模型。
它使用加法角余量损失来实现面部识别的高判别特征。
好是,它可以容易地泛化,并且可以基于特征和包括三重态损失的权重向量的角度表示来设计其他损失函数。
对于您的问题2,似乎有点含糊。如果您想知道如何使Matchinf更快,则可以始终使用聚类技术而不是线性搜索。
本文也研究了一些加速研究。
代码可在以下位置找到:
https://github.com/deepinsight/insightface(mxnet)