【问题标题】:Pose keypoints numpy averaging姿势关键点 numpy 平均
【发布时间】:2018-07-26 16:16:06
【问题描述】:

我知道你在这里提问时应该举例说明,但我真的想不出任何不涉及粘贴大量项目代码的事情,所以我将尝试将其描述为尽可能好。

我正在做一个涉及使用 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?))

再次,我很抱歉没有给出某种例子。

【问题讨论】:

    标签: python numpy openpose


    【解决方案1】:

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

    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。

    【讨论】:

    • 谢谢!虽然,我并不打算得到每一帧中每个点的平均值。我想列出多个帧中每个点的平均位置。
    • 我添加了另一个可能更接近您想要的示例。我认为有很多方法可以写这个,我不确定这里的解决方案是最清晰的和更少的混乱......我建议你尝试不同的事情,以便根据输入数据的结构找到最连贯的代码和想要的输出
    • 感谢您的建议,实际上它帮助了很多!最后,我实际上选择了仅使用每秒中具有最高置信度的点。它更简单,而且我认为它对噪音不会那么敏感。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2013-02-15
    • 1970-01-01
    • 2021-05-28
    • 2020-06-11
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多