构成关键点的numpy平均

时间:2018-07-26 16:16:06

标签: python numpy openpose

我知道您在这里提出问题时应该给出示例,但是我真的想不出任何与粘贴大型项目无关的代码,因此我将尝试将其描述为很好。

我正在研究一个项目,该项目涉及使用通过OpenPose生成的关键点(在对它们进行一些预处理以简化所有操作之后,我想到了这样格式化的数据:[x0,y0,c0,x1, y1,c1 ...],总共有18个点,x和y代表它们的坐标,而c代表置信度。)我想获取一个嵌套列表,上面列出了一个人的关键点每帧的显示方式,并输出一个新的嵌套列表列表,该列表由加权平均值x和y(权重为每个点的置信度值)以及每秒的平均置信度(而不是逐帧)组成,格式与上述相同。

我已经将原始列表转换为3维列表,其中每一秒都包含其每个框架,每个帧都包含其关键点列表。我知道我可以自己编写代码来执行所有这些操作,而无需使用numpy.average(),但是我希望我不必这样做,因为它很快就会造成混乱。相反,我想知道是否有一种方法可以以一种相当简单的方式使用所述方法每秒进行一次迭代,并将结果列表追加到一个新列表中,如下所示:

out = []
for second in lst:
  out.append(average(second, axis=1, weights=?, other params?))

再次,很抱歉没有提供此类示例。

1 个答案:

答案 0 :(得分:0)

也许您可以从这段代码中得到一些启发:

import numpy as np

def pose_average(sequence):
    x, y, c = sequence[0::3], sequence[1::3], sequence[2::3]
    x_avg = np.average(x, weights=c)
    y_avg = np.average(y, weights=c)
    return x_avg, y_avg

sequence = [2, 4, 1, 5, 6, 3, 5, 2, 1]
pose_average(sequence)
>>> (4.4, 4.8)

对于多个分组姿势序列:

data = [[1, 2, 3, 2, 3, 4, 3, 4, 5], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 1, 2, 5, 3, 3, 4, 1, 2]]

out = [ pose_average(seq) for seq in data ]
out
>>> [(2.1666666666666665, 3.1666666666666665),
(5.0, 6.0),
(4.428571428571429, 1.8571428571428572)]

编辑

假设:

  • 数据是序列的列表
  • 序列是已分组姿势(例如按秒分组)的列表
  • 姿势是连接位置的坐标:[x1,y1,c1,x2,y2,c2,...]

经过稍微修改的代码现在是:

import numpy as np

data = [
        [[1, 2, 3, 2, 3, 4, 3, 4, 5], [9, 2, 3, 4, 5, 6, 7, 8, 9], [4, 1, 2, 5, 3, 3, 4, 1, 2], [5, 3, 4, 1, 10, 6, 5, 0, 0]],
        [[6, 9, 11, 0, 8, 6, 1, 5, 11], [3, 5, 4, 2, 0, 2, 0, 8, 8], [1, 5, 9, 5, 1, 0, 6, 6, 6]],
        [[9, 4, 7, 0, 2, 1], [9, 4, 7, 0, 2, 1], [9, 4, 7, 0, 2, 1]]
        ]


def pose_average(sequence):
    sequence = np.asarray(sequence)
    x, y, c = sequence[:, 0::3], sequence[:, 1::3], sequence[:, 2::3]
    x_avg = np.average(x, weights=c, axis=0)
    y_avg = np.average(y, weights=c, axis=0)
    return x_avg, y_avg

out = [ pose_average(seq) for seq in data ]
out
>>> [(array([4.83333333, 2.78947368, 5.375     ]),
array([2.16666667, 5.84210526, 5.875     ])),
(array([3.625, 0.5  , 1.88 ]), array([6.83333333, 6.        , 6.2   ])),
(array([9., 0.]), array([4., 2.]))]

x_avg现在是序列中每个点的平均x位置列表,权重为c。