Позы ключевых точек NumPy усреднения

Я знаю, что вы должны приводить примеры, когда задаете вопросы здесь, но я не могу придумать ничего такого, что не включало бы вставку значительного кода проекта, поэтому я просто постараюсь описать это как можно лучше,

Я работаю над проектом, который включает в себя использование ключевых точек, сгенерированных с использованием OpenPose (после того, как я выполнил некоторую предварительную обработку для них, чтобы упростить все, я придумаю данные, отформатированные так: [x0, y0, c0, x1, y1, c1...], где всего 18 точек, а x и y представляют их координаты, а c представляют достоверность.) Я хочу взять вложенный список, в котором есть ключевые точки для одного человека, перечисленные выше, для каждого кадр, и выведите новый вложенный список списков, составленный из средневзвешенных значений x и y (весами будут значения достоверности для каждой точки) наряду со средними доверительными значениями по каждой секунде (а не по кадрам) в том же формат, как указано выше.

Я уже преобразовал исходный список в трехмерный список, в котором каждая секунда содержит каждый из его кадров, каждый из которых содержит свой список ключевых точек. Я знаю, что могу сам написать код, чтобы сделать все это без использования numpy.average(), но я надеялся, что мне это не понадобится, потому что это быстро сбивает с толку. Вместо этого мне было интересно, есть ли способ, которым я мог бы выполнять итерацию в течение каждой секунды, используя упомянутый метод, достаточно простым способом, и просто добавлять полученные списки в новый список, например так:

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

Еще раз прошу прощения за то, что не привел какой-то пример.

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.

Другие вопросы по тегам