Python 计算人体关键点余弦相似度并找出最相似点

本文使用 Python 代码实现计算两个动作人体关键点之间的余弦相似度,并找出最相似的关键点对。代码简洁易懂,并提供详细的注释。

def cos_sim(vector_a, vector_b):
    '计算两个向量之间的余弦相似度'
    import numpy as np
    vector_a = np.mat(vector_a)
    vector_b = np.mat(vector_b)
    num = float(vector_a * vector_b.T)
    denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
    cos = num / denom
    sim = cos
    return sim

keypoints1 = [[1,2],[3,4]]
keypoints2 = [[2,3],[4,5]]
sim_list = []
for i in range(len(keypoints1)):
    for j in range(len(keypoints2)):
        sim_list.append(cos_sim(keypoints1[i], keypoints2[j]))
print(sim_list)
max_index = sim_list.index(max(sim_list))
if max_index%2 == 0:
    print('keypoints1中的第',int(max_index/2+1),'个关键点与keypoints2中的第',int(max_index/2+1),'个关键点最相似')
else:
    print('keypoints1中的第',int(max_index/2+1),'个关键点与keypoints2中的第',int(max_index/2+2),'个关键点最相似')

代码解析:

  1. cos_sim 函数:
    • 计算两个向量之间的余弦相似度。
    • 使用 numpy 库进行向量运算。
    • 返回余弦相似度 sim
  2. keypoints1keypoints2
    • 两个动作的人体关键点列表,每个列表包含多个关键点坐标。
  3. 循环计算所有关键点对的相似度:
    • 使用两层循环遍历所有关键点对,并计算它们的余弦相似度。
    • 将所有相似度存储在 sim_list 列表中。
  4. 找出最相似点:
    • 找到 sim_list 中最大值的索引 max_index
    • 根据 max_index 计算出最相似点在 keypoints1keypoints2 中的索引。
    • 打印出最相似点的索引。

使用场景:

  • 人体动作识别
  • 姿势估计
  • 计算机视觉应用

改进方向:

  • 可以根据具体应用场景调整关键点提取方法和相似度计算方法。
  • 可以添加图形化界面,方便用户查看关键点和相似度结果。
  • 可以将代码封装成函数或类,方便在其他项目中使用。

标签: 常规


原文地址: https://gggwd.com/t/topic/lpZP 著作权归作者所有。请勿转载和采集!