【问题标题】:Find Eucledian distance between landmarks of faces查找面部标志之间的欧几里得距离
【发布时间】:2020-12-25 17:25:42
【问题描述】:

我有多个帧,我使用Retinaface 检测到每个帧中的人脸。我想使用他们的地标来跟踪人脸。

为了找到两个地标之间的相似性,我尝试计算欧几里得距离:

输入:

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

(在这种情况下期望一些较小的值)

我猜代码只能用于一维向量,但我真的被困在这里。任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy euclidean-distance


    【解决方案1】:

    您似乎将答案平方了两次 (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,它将在数组的最后一个轴上求和,因此您可以使用二维向量数组,例如。

    【讨论】:

      【解决方案2】:

      你也可以使用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()
      

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2019-07-10
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        相关资源
        最近更新 更多