Как добавить один раз вместо каждого цикла [закрыто]Python

Программы на Python
Ответить
Anonymous
 Как добавить один раз вместо каждого цикла [закрыто]

Сообщение Anonymous »

извините за весь код
К сожалению, я не знаю, как упростить

Контекст
Поза Извлечение ключевых точек изображения/каждого кадра видео
Координаты ключевых точек и рассчитанные углы экспортируются в формат .csv для последующего анализа

Код: Выделить всё

import csv
import pandas as pd
from ultralytics import YOLO
from pathlib import Path
import numpy as np

model = YOLO("yolo11n-pose.pt")
results = model.track(source='file.png', save=False)

def calculate_angle(p1, p2, p3):
# p1, p2, p3 are the points in format [x, y]
# Calculate the vectors
v1 = np.array(p1) - np.array(p2)
v2 = np.array(p3) - np.array(p2)

# Calculate the angle in radians
angle_rad = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))

# Convert to degrees
angle_deg = np.degrees(angle_rad)

return angle_deg

ja_list = [[9,7,5], [10,8,6], [7,5,11], [8,6,12], [5,11,13], [6,12,14], [11,13,15], [12,14,16]]

# Initialize an empty list to store data
data = []

for frame_id, (frame_results) in enumerate(results):
for person_id, person in enumerate(frame_results.keypoints):
xy = person.xyn.numpy()  # keypoints coordinates
conf = person.conf.numpy()  # confidence scores of keypoints
for kp_id, (xy, kp_conf) in enumerate(zip(xy, conf)):
xy_str = ', '.join(map(str, xy))  # Convert the array to a comma-separated string

data.append({"frame_id": frame_id, "person_id": person_id, "xy": xy_str})

for ja in ja_list:
angle = calculate_angle(xy[ja[0]],xy[ja[1]],xy[ja[2]])
str_angle = angle

data.append({"angles":  str_angle})

df = pd.DataFrame(data)
df.to_csv('file.csv', escapechar=' ', quoting=csv.QUOTE_NONE, index=False)
Текущий результат

Код: Выделить всё

frame_id,person_id,nose ,  left  eye ,  right  eye ,  left  ear ,  right  ear ,  left  shoulder ,  right  shoulder ,  left  elbow ,  right  elbow ,  left  wrist ,  right  wrist ,  left  hip ,  right  hip ,  left  knee ,  right  knee ,  left  ankle ,  right  ankle,left  elbow  angle ,  right  elbow  angle ,  left  shoulder  angle ,  right  shoulder  angle ,  left  hip  angle ,  right  hip  angle ,  left  knee  angle ,  right  knee  angle
0.0,0.0,[        0.27054          0.32959] ,  [        0.27079          0.32787] ,  [        0.26698          0.32339] ,  [                    0                      0] ,  [        0.25605          0.33095] ,  [        0.27429          0.39124] ,  [        0.24764          0.34531] ,  [        0.29295          0.40439] ,  [        0.25213            0.2805] ,  [        0.31294          0.41499] ,  [        0.26839          0.21751] ,  [        0.25684          0.49569] ,  [        0.23976          0.47824] ,  [        0.26361          0.59153] ,  [        0.25314          0.57706] ,  [        0.26301          0.68071] ,  [        0.25716          0.68032],
,,,172.7757568359375
,,,169.49624633789062
,,,64.31809997558594
,,,179.4266357421875
,,,166.47421264648438
,,,168.8917999267578
,,,175.57078552246094
,,,174.5126953125
Желаемый результат

Код: Выделить всё

frame_id,person_id,nose ,  left  eye ,  right  eye ,  left  ear ,  right  ear ,  left  shoulder ,  right  shoulder ,  left  elbow ,  right  elbow ,  left  wrist ,  right  wrist ,  left  hip ,  right  hip ,  left  knee ,  right  knee ,  left  ankle ,  right  ankle,left  elbow  angle ,  right  elbow  angle ,  left  shoulder  angle ,  right  shoulder  angle ,  left  hip  angle ,  right  hip  angle ,  left  knee  angle ,  right  knee  angle
0.0,0.0,[        0.27054          0.32959] ,  [        0.27079          0.32787] ,  [        0.26698          0.32339] ,  [                    0                      0] ,  [        0.25605          0.33095] ,  [        0.27429          0.39124] ,  [        0.24764          0.34531] ,  [        0.29295          0.40439] ,  [        0.25213            0.2805] ,  [        0.31294          0.41499] ,  [        0.26839          0.21751] ,  [        0.25684          0.49569] ,  [        0.23976          0.47824] ,  [        0.26361          0.59153] ,  [        0.25314          0.57706] ,  [        0.26301          0.68071] ,  [        0.25716          0.68032], 172.7757568359375, 169.49624633789062, 64.31809997558594, 179.4266357421875, 166.47421264648438, 168.8917999267578, 175.57078552246094, 174.5126953125
Проблема:

Код: Выделить всё

for ja in ja_list:
angle = calculate_angle(xy[ja[0]],xy[ja[1]],xy[ja[2]])
str_angle = angle

data.append({angles})
Я думаю, проблема в том, что data.append зацикливается.
Мне нужен способ добавить все 8 значений угла один раз
Решение:

Код: Выделить всё

for kp_id, (ja, xy, kp_conf) in enumerate(zip(ja_list, xy, conf)):
xy_str = ', '.join(map(str, xy))  # Convert the array to a comma-separated string

angles = [str(calculate_angle(xy[ja[0]], xy[ja[1]], xy[ja[2]])) for ja in ja_list]
str_angles = ', '.join(map(str, angles)).replace("'", "")

data.append({"frame_id": frame_id, "person_id": person_id, "xy": xy_str, "angles": str_angles})
Желаемый результат достигнут!

Подробнее здесь: https://stackoverflow.com/questions/792 ... every-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»