我想对闭路电视录像运行人脸识别。我在推理过程中实现了几个用于人脸嵌入比较的距离度量,如欧几里德距离、余弦距离、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
Run Code Online (Sandbox Code Playgroud)
问题 1:人脸嵌入比较准确度的最佳指标是什么以及如何设置阈值?
Q2:除了欧氏距离和余弦距离之外,Face Embedding 比较最快、更好的方法是什么?
我有一个大小为:的张量torch.Size([64, 2941]),它是 64 个批次,共 2941 个元素。
在所有 64 个批次中,我想计算张量第二维中 1 和 0 的总数,一直到第 2941 个,以便我将这些计数作为大小的张量torch.Size([2941])
我怎么做?