File size: 4,685 Bytes
f31c85a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import numpy as np 
import pandas as pd
from scipy.spatial.distance import euclidean

def normalize(row, lenBody_x, lenBody_y):
    row_df = pd.DataFrame(row).transpose()
    excluded_columns = ['center_X','center_Y']

    for column in row_df.columns:
        if column not in excluded_columns:
            if (column.find('_X') != -1) and ((row_df[column]!=-1).all()):
                row_df[column] = (row_df[column] - row_df['center_X'])/lenBody_x
            if (column.find('_Y') != -1) and ((row_df[column]!=-1).all()):
                row_df[column] = (row_df[column] - row_df['center_Y'])/lenBody_y
    return row_df.squeeze()

def calculate_distance(point1, point2):
    if -1 in point1 or -1 in point2:
        return -1
    return euclidean(point1, point2)

def point_to_point_distance(df):
    df_new = pd.DataFrame()
    df_new['r ankle'] = df.apply(lambda row: (row['r ankle_X'], row['r ankle_Y']), axis=1)
    df_new['r knee'] = df.apply(lambda row: (row['r knee_X'], row['r knee_Y']), axis=1)
    df_new['r hip'] = df.apply(lambda row: (row['r hip_X'], row['r hip_Y']), axis=1)
    df_new['l hip'] = df.apply(lambda row: (row['l hip_X'], row['l hip_Y']), axis=1)
    df_new['l knee'] = df.apply(lambda row: (row['l knee_X'], row['l knee_Y']), axis=1)
    df_new['l ankle'] = df.apply(lambda row: (row['l ankle_X'], row['l ankle_Y']), axis=1)
    df_new['pelvis'] = df.apply(lambda row: (row['pelvis_X'], row['pelvis_Y']), axis=1)
    df_new['thorax'] = df.apply(lambda row: (row['thorax_X'], row['thorax_Y']), axis=1)
    df_new['upper neck'] = df.apply(lambda row: (row['upper neck_X'], row['upper neck_Y']), axis=1)
    df_new['head top'] = df.apply(lambda row: (row['head top_X'], row['head top_Y']), axis=1)
    df_new['r wrist'] = df.apply(lambda row: (row['r wrist_X'], row['r wrist_Y']), axis=1)
    df_new['r elbow'] = df.apply(lambda row: (row['r elbow_X'], row['l elbow_Y']), axis=1)
    df_new['r shoulder'] = df.apply(lambda row: (row['r shoulder_X'], row['r shoulder_Y']), axis=1)
    df_new['l shoulder'] = df.apply(lambda row: (row['l shoulder_X'], row['l shoulder_Y']), axis=1)
    df_new['l elbow'] = df.apply(lambda row: (row['l elbow_X'], row['l elbow_Y']), axis=1)
    df_new['l wrist'] = df.apply(lambda row: (row['l wrist_X'], row['l wrist_Y']), axis=1)

    distances_list = []

    # Iterate over each row
    for index, row in df_new.iterrows():
        check = []
        # Dictionary to store distances for the current row
        row_distances = {}
        # Iterate over each column pair
        for column1 in df_new.columns:
            for column2 in df_new.columns:
                tupletoAdd = (column2, column1)
                check.append(tupletoAdd)
                if column1 != column2 and (column1, column2) not in check:
                    # Calculate distance between current pair of columns
                    distance = calculate_distance(row[column1], row[column2])
                    # Construct the name for the new distance column
                    distance_column_name = f'{column1}_{column2}_distance'
                    # Store the distance in the dictionary
                    row_distances[distance_column_name] = distance
        # Append the distances for the current row to the list
        distances_list.append(row_distances)

    # Create a DataFrame from the list of dictionaries
    distances_df = pd.DataFrame(distances_list)
    return distances_df

def preprocess_keypoints(keypoints):
    x_values = [keypoint[0] for keypoint in keypoints]
    y_values = [keypoint[1] for keypoint in keypoints]

    lenBody_x = max(x_values) - min(x_values)
    lenBody_y = max(y_values) - min(y_values)
    labels= ['r ankle','r knee', 'r hip', 'l hip', 'l knee', 'l ankle', 'pelvis', 'thorax', 'upper neck', 'head top', 'r wrist', 'r elbow', 'r shoulder', 'l shoulder', 'l elbow', 'l wrist']
    new_labels = []
    for label in labels:
        new_labels.extend([f"{label}_X", f"{label}_Y"])
    new_keypoints = []
    for keypoint in keypoints:
        if keypoint[2]<0.05:    #might change threshold
            new_keypoints.extend([-1, -1])
        else:
            new_keypoints.extend([keypoint[0], keypoint[1]])
    

    df = pd.DataFrame([new_keypoints], columns = new_labels)
    #find center
    df['center_X'] = (df['r hip_X'] + df['l hip_X'])/2
    df['center_Y'] = (df['r hip_Y'] + df['l hip_Y']) / 2

    #normalize the values
    df_normalized = df.apply(lambda row: normalize(row, lenBody_x, lenBody_y), axis=1)
    df_final = df_normalized.drop(columns = ['center_X', 'center_Y'])

    #df_to_return = point_to_point_distance(df_final)
    return df_final.to_numpy().astype(np.float32)