姿势关键点 numpy 平均
Pose keypoints numpy averaging
我知道你在这里提问时应该举例说明,但我真的想不出任何不涉及粘贴大量代码的项目,所以我将尝试描述尽可能这样。
我正在从事一个涉及使用 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?))
再次抱歉,我没有给出某种例子。
也许您可以从这段代码中得到一些启发:
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。
我知道你在这里提问时应该举例说明,但我真的想不出任何不涉及粘贴大量代码的项目,所以我将尝试描述尽可能这样。
我正在从事一个涉及使用 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?))
再次抱歉,我没有给出某种例子。
也许您可以从这段代码中得到一些启发:
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。