laurenok24 commited on
Commit
8556490
1 Parent(s): e1a7885

Upload somersault_counter.py

Browse files
Files changed (1) hide show
  1. somersault_counter.py +153 -0
somersault_counter.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import math
3
+
4
+ def distance_point_to_line_segment(px, py, x1, y1, x2, y2):
5
+ # Calculate the squared distance from point (px, py) to the line segment [(x1, y1), (x2, y2)]
6
+ def sqr_distance_point_to_segment():
7
+ line_length_sq = (x2 - x1)**2 + (y2 - y1)**2
8
+ if line_length_sq == 0:
9
+ return (px - x1)**2 + (py - y1)**2
10
+ t = max(0, min(1, ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / line_length_sq))
11
+ return ((px - (x1 + t * (x2 - x1)))**2 + (py - (y1 + t * (y2 - y1)))**2)
12
+
13
+ # Calculate the closest point on the line segment to the given point (px, py)
14
+ def closest_point_on_line_segment():
15
+ line_length_sq = (x2 - x1)**2 + (y2 - y1)**2
16
+ if line_length_sq == 0:
17
+ return x1, y1
18
+ t = max(0, min(1, ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / line_length_sq))
19
+ closest_x = x1 + t * (x2 - x1)
20
+ closest_y = y1 + t * (y2 - y1)
21
+ return closest_x, closest_y
22
+
23
+ closest_point = closest_point_on_line_segment()
24
+ distance = math.sqrt(sqr_distance_point_to_segment())
25
+
26
+ return closest_point, distance
27
+
28
+ def min_distance_from_line_to_circle(line_start, line_end, circle_center, circle_radius):
29
+ closest_point, distance = distance_point_to_line_segment(circle_center[0], circle_center[1],
30
+ line_start[0], line_start[1],
31
+ line_end[0], line_end[1])
32
+
33
+ min_distance = max(0, distance - circle_radius)
34
+ return min_distance
35
+
36
+
37
+ # def twist_counter(pose_pred, prev_pose_pred=None, in_petal=False, petal_count=0):
38
+ # if pose_pred is None:
39
+ # return petal_count, in_petal
40
+ # min_dist = 0
41
+ # # Users/lokamoto/Comprehensive_AQA/output/joint_plots/FINAWorldChampionships2019_Women10m_final_r1_0
42
+ # pose_pred = pose_pred[0]
43
+ # vector1 = [pose_pred[2][0] - pose_pred[3][0], 0-(pose_pred[2][1] - pose_pred[3][1])]
44
+ # if prev_pose_pred is not None:
45
+ # prev_pose_pred = prev_pose_pred[0]
46
+ # prev_pose_pred = [prev_pose_pred[2][0] - prev_pose_pred[3][0], 0-(prev_pose_pred[2][1] - prev_pose_pred[3][1])]
47
+ # # m = (vector1[1] - prev_pose_pred[1])/(vector1[0] - prev_pose_pred[0])
48
+ # # b = prev_pose_pred[1] - m * prev_pose_pred[0]
49
+ # # min_dist = np.abs(b)/np.sqrt(m**2+1)
50
+ # min_dist = min_distance_from_line_to_circle(prev_pose_pred, vector1, (0, 0), 5)
51
+
52
+ # if min_dist is not None and in_petal and np.linalg.norm(vector1) > 5 and min_dist == 0: #and np.linalg.norm(vector1) > 8
53
+ # petal_count += 1
54
+ # # print('leaving petal')
55
+ # # print('going in new petal')
56
+ # elif not in_petal and np.linalg.norm(vector1) > 5: #and min_dist > 3: #and np.linalg.norm(vector1) > 8
57
+ # in_petal = True
58
+ # # print('going in petal')
59
+ # elif in_petal and np.linalg.norm(vector1) < 5:
60
+ # in_petal = False
61
+ # petal_count += 1
62
+ # # print('leaving petal')
63
+ # # print(vector)
64
+ # return petal_count, in_petal
65
+
66
+ def twist_counter(pose_pred, prev_pose_pred=None, in_petal=False, petal_count=0):
67
+ # if key[0].startswith('FINAWorldChampionships2019'):
68
+ # valid = 19
69
+ # outer = 3
70
+ # inner = 3
71
+ # elif key[0].startswith('FINADivingWorldCup2021'):
72
+ # valid = 19
73
+ # outer = 5.5
74
+ # inner = 5.5
75
+ valid = 17
76
+ outer = 10
77
+ inner = 9
78
+ if pose_pred is None:
79
+ return petal_count, in_petal
80
+ min_dist = 0
81
+ pose_pred = pose_pred[0]
82
+ vector1 = [pose_pred[2][0] - pose_pred[3][0], 0-(pose_pred[2][1] - pose_pred[3][1])]
83
+ if prev_pose_pred is not None:
84
+ prev_pose_pred = prev_pose_pred[0]
85
+ prev_pose_pred = [prev_pose_pred[2][0] - prev_pose_pred[3][0], 0-(prev_pose_pred[2][1] - prev_pose_pred[3][1])]
86
+ min_dist = min_distance_from_line_to_circle(prev_pose_pred, vector1, (0, 0), 0.5)
87
+ if np.linalg.norm(vector1) > valid:
88
+ return petal_count, in_petal
89
+ if min_dist is not None and in_petal and np.linalg.norm(vector1) > outer and min_dist == 0: #and np.linalg.norm(vector1) > 8
90
+ petal_count += 1
91
+ elif not in_petal and np.linalg.norm(vector1) > outer: #and min_dist > 3: #and np.linalg.norm(vector1) > 8
92
+ in_petal = True
93
+ elif in_petal and np.linalg.norm(vector1) < inner:
94
+ in_petal = False
95
+ petal_count += 1
96
+ return petal_count, in_petal
97
+
98
+ # def som_counter(pose_pred=None, prev_pose_pred=None, half_som_count=0, handstand=False):
99
+ # if pose_pred is None:
100
+ # return half_som_count
101
+ # pose_pred = pose_pred[0]
102
+ # vector1 = [pose_pred[7][0] - pose_pred[6][0], 0-(pose_pred[7][1] - pose_pred[6][1])] # flip y axis
103
+ # if (not handstand and half_som_count % 2 == 0) or (handstand and half_som_count %2 == 1):
104
+ # vector2 = [0, -1]
105
+ # else:
106
+ # vector2 = [0, 1]
107
+ # unit_vector_1 = vector1 / np.linalg.norm(vector1)
108
+ # unit_vector_2 = vector2 / np.linalg.norm(vector2)
109
+ # dot_product = np.dot(unit_vector_1, unit_vector_2)
110
+ # current_angle = math.degrees(np.arccos(dot_product))
111
+
112
+ # if prev_pose_pred is not None:
113
+ # prev_pose_pred = prev_pose_pred[0]
114
+ # prev_vector = [prev_pose_pred[7][0] - prev_pose_pred[6][0], 0-(prev_pose_pred[7][1] - prev_pose_pred[6][1])] # flip y axis
115
+ # prev_unit_vector = prev_vector / np.linalg.norm(prev_vector)
116
+ # prev_angle_diff = math.degrees(np.arccos(np.dot(unit_vector_1, prev_unit_vector)))
117
+ # # if prev_angle_diff > 120:
118
+ # # print('pose pred is probably off')
119
+ # # return half_som_count
120
+
121
+ # # print("unit_vector_1:", unit_vector_1)
122
+ # # print("looking for vector:", vector2)
123
+ # if current_angle < 80:
124
+ # half_som_count += 1
125
+ # return half_som_count
126
+
127
+ def som_counter(pose_pred=None, prev_pose_pred=None, half_som_count=0, handstand=False):
128
+ if pose_pred is None:
129
+ return half_som_count, True
130
+ pose_pred = pose_pred[0]
131
+ vector1 = [pose_pred[7][0] - pose_pred[6][0], 0-(pose_pred[7][1] - pose_pred[6][1])] # flip y axis
132
+ if (not handstand and half_som_count % 2 == 0) or (handstand and half_som_count %2 == 1):
133
+ vector2 = [0, -1]
134
+ else:
135
+ vector2 = [0, 1]
136
+ unit_vector_1 = vector1 / np.linalg.norm(vector1)
137
+ unit_vector_2 = vector2 / np.linalg.norm(vector2)
138
+ dot_product = np.dot(unit_vector_1, unit_vector_2)
139
+ current_angle = math.degrees(np.arccos(dot_product))
140
+ if prev_pose_pred is not None:
141
+ prev_pose_pred = prev_pose_pred[0]
142
+ prev_vector = [prev_pose_pred[7][0] - prev_pose_pred[6][0], 0-(prev_pose_pred[7][1] - prev_pose_pred[6][1])] # flip y axis
143
+ prev_unit_vector = prev_vector / np.linalg.norm(prev_vector)
144
+ prev_angle_diff = math.degrees(np.arccos(np.dot(unit_vector_1, prev_unit_vector)))
145
+ if prev_angle_diff > 115:
146
+ return half_som_count, True
147
+
148
+ # print("unit_vector_1:", unit_vector_1)
149
+ # print("looking for vector:", vector2)
150
+ if current_angle <= 80:
151
+ half_som_count += 1
152
+ return half_som_count, False
153
+