查找面部特征点之间的欧几里得距离

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()