|
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 = [] |
|
|
|
|
|
for index, row in df_new.iterrows(): |
|
check = [] |
|
|
|
row_distances = {} |
|
|
|
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: |
|
|
|
distance = calculate_distance(row[column1], row[column2]) |
|
|
|
distance_column_name = f'{column1}_{column2}_distance' |
|
|
|
row_distances[distance_column_name] = distance |
|
|
|
distances_list.append(row_distances) |
|
|
|
|
|
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: |
|
new_keypoints.extend([-1, -1]) |
|
else: |
|
new_keypoints.extend([keypoint[0], keypoint[1]]) |
|
|
|
|
|
df = pd.DataFrame([new_keypoints], columns = new_labels) |
|
|
|
df['center_X'] = (df['r hip_X'] + df['l hip_X'])/2 |
|
df['center_Y'] = (df['r hip_Y'] + df['l hip_Y']) / 2 |
|
|
|
|
|
df_normalized = df.apply(lambda row: normalize(row, lenBody_x, lenBody_y), axis=1) |
|
df_final = df_normalized.drop(columns = ['center_X', 'center_Y']) |
|
|
|
|
|
return df_final.to_numpy().astype(np.float32) |
|
|
|
|
|
|
|
|