查找面部特征点之间的欧几里得距离
Find Eucledian distance between landmarks of faces
我有多个帧,我使用 Retinaface
检测了每个帧中的面孔。我想使用他们的地标来跟踪面孔。
为了找到 2 个地标之间的相似性,我尝试计算欧几里德距离:
输入:
landmark_1 = [1828, 911], [1887, 913], [1841, 942], [1832, 974], [1876, 976]
landmark_2 = [1827, 928], [1887, 926], [1848, 963], [1836, 992], [1884, 990]
参考其他链接后,我写了下面的函数,但是产生的值很高:
def euclidean_dist(vector_x, vector_y):
vector_x, vector_y = np.array(vector_x), np.array(vector_y)
if len(vector_x) != len(vector_y):
raise Exception('Vectors must be same dimensions')
ans = sum((vector_x[dim] - vector_y[dim]) ** 2 for dim in range(len(vector_x)))
return np.sqrt(np.sum(ans**2))
输出:
euclidean_dist(landmark_1, landmark_2)
>> 1424.9424549784458
(在这种情况下期望值更小)
我猜代码只能用于一维向量,但我真的被困在这里了。任何帮助将不胜感激。
您似乎对答案进行了两次平方 (ans**2
)。但是你也可以稍微简化一下功能:
def euclidean_dist(vector_x, vector_y):
vector_x, vector_y = np.array(vector_x), np.array(vector_y)
return np.sqrt(np.sum((vector_x - vector_y)**2, axis=-1))
当向量是不兼容的形状时,这将自动引发异常。
编辑: 如果您使用 axis=-1
它将对数组的最后一个轴求和,因此您可以使用二维向量数组,例如.
您可以使用linalg.nor来。
def euclidean_dist(vector_x, vector_y):
distances = np.linalg.norm(np.array(vector_x)-np.array(vector_y), axis=1)
return distances.tolist()
我有多个帧,我使用 Retinaface
检测了每个帧中的面孔。我想使用他们的地标来跟踪面孔。
为了找到 2 个地标之间的相似性,我尝试计算欧几里德距离:
输入:
landmark_1 = [1828, 911], [1887, 913], [1841, 942], [1832, 974], [1876, 976]
landmark_2 = [1827, 928], [1887, 926], [1848, 963], [1836, 992], [1884, 990]
参考其他链接后,我写了下面的函数,但是产生的值很高:
def euclidean_dist(vector_x, vector_y):
vector_x, vector_y = np.array(vector_x), np.array(vector_y)
if len(vector_x) != len(vector_y):
raise Exception('Vectors must be same dimensions')
ans = sum((vector_x[dim] - vector_y[dim]) ** 2 for dim in range(len(vector_x)))
return np.sqrt(np.sum(ans**2))
输出:
euclidean_dist(landmark_1, landmark_2)
>> 1424.9424549784458
(在这种情况下期望值更小)
我猜代码只能用于一维向量,但我真的被困在这里了。任何帮助将不胜感激。
您似乎对答案进行了两次平方 (ans**2
)。但是你也可以稍微简化一下功能:
def euclidean_dist(vector_x, vector_y):
vector_x, vector_y = np.array(vector_x), np.array(vector_y)
return np.sqrt(np.sum((vector_x - vector_y)**2, axis=-1))
当向量是不兼容的形状时,这将自动引发异常。
编辑: 如果您使用 axis=-1
它将对数组的最后一个轴求和,因此您可以使用二维向量数组,例如.
您可以使用linalg.nor来。
def euclidean_dist(vector_x, vector_y):
distances = np.linalg.norm(np.array(vector_x)-np.array(vector_y), axis=1)
return distances.tolist()