sorry for the whole code
I’m very inexperienced and don’t know how to correctly simplify
Context
Pose Keypoint extraction of picture/video
keypoint coordinates & calculated angles export to .csv for later analysis
from ultralytics import YOLO
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]
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)))
angle_deg = np.degrees(angle_rad)
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
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})
angle = calculate_angle(xy[ja[0]],xy[ja[1]],xy[ja[2]])
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.to_csv('file.csv', escapechar=' ', quoting=csv.QUOTE_NONE, index=False)
<code>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)
</code>
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)
Current Output
<code>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],
<code>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
</code>
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
Desired Output
<code>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
<code>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
</code>
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
Problem:
angle = calculate_angle(xy[ja[0]],xy[ja[1]],xy[ja[2]])
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})
<code>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})
</code>
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})
I think the problem is the data.append is being looped.
I need a way to append all 8 angle values once
I don’t know how to integrate properly…
Sorry if this is trivial, I’ve been stuck on this for hours searching anywhere I could but I give up