Как добавить один раз вместо каждого цикла [закрыто]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, "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": xy_str})

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

data.append({"left elbow angle, right elbow angle, left shoulder angle, right shoulder angle, left hip angle, right hip angle, left knee angle, right knee angle":  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 ja, kp_id, (xy, kp_conf) in ja_list, enumerate(zip(xy, conf)):
xy_str = ', '.join(map(str, xy))

angle = calculate_angle(xy[ja[0]],xy[ja[1]],xy[ja[2]])
str_angle = str(angle)

data.append({all data})
Ошибка:

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

for ja, kp_id, (xy, kp_conf) in ja_list, enumerate(zip(xy, conf)):
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError:  too many values to unpack (expected 3)
Я пробовал:

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

for kp_id, (ja, xy, kp_conf) in enumerate(zip(ja_list, xy, conf)):
Вывод:

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

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,angle
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.77576
0,1,[        0.68909          0.39644] ,  [          0.6917          0.39235] ,  [        0.68635          0.39157] ,  [        0.69507          0.40165] ,  [                    0                      0] ,  [        0.70123          0.43593] ,  [        0.66924          0.43106] ,  [        0.72618            0.4416] ,  [        0.65064          0.43664] ,  [        0.73248          0.40108] ,  [        0.65353          0.41024] ,  [          0.6872          0.54132] ,  [        0.66779          0.53827] ,  [        0.68265          0.63291] ,  [        0.66896          0.62668] ,  [        0.68056          0.70402] ,  [        0.66196          0.69712],86.04971
Вывод имеет правильный формат!
Но только одно значение угла :(

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

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

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

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

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

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