-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata_processing.py
101 lines (77 loc) · 2.75 KB
/
data_processing.py
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
100
101
import numpy as np
import copy
import interpolation as ip
def stay_at_origin(data):
first_pos = data[0, 0:1]
last_pos = data[-1, 0:1]
lerp_pos = np.linspace(first_pos, last_pos, len(data))
return data - lerp_pos, lerp_pos
def bbox_fit(data_3d, interval):
fitted_3d = copy.deepcopy(data_3d)
exist_frames = list(range(0, len(data_3d), interval))
mins = np.min(data_3d[exist_frames])
maxs = np.max(data_3d[exist_frames])
fitted_3d = (data_3d - mins) / (maxs - mins) * 2.0 - 1.0
return fitted_3d, [mins, maxs]
def bbox_unfit(data_3d, min_max_values):
unfitted_3d = copy.deepcopy(data_3d)
mins, maxs = min_max_values
unfitted_3d = (data_3d + 1.0) / 2.0 * (maxs - mins) + mins
return unfitted_3d
def calc_loss(output, target):
return np.mean(np.square(output - target))
def lost(marker_data, interval):
output_data = copy.deepcopy(marker_data)
for frame in range(len(marker_data)):
if frame % interval != 0:
output_data[frame, :] = 0.0
return output_data
def get_value(data, index):
index1 = np.floor(index).astype(int)
index2 = np.ceil(index).astype(int)
val1 = data[index1]
val2 = data[index2]
val = val1 + (val2 - val1) * (index - index1)
return val
def resample(data, rate):
new_data = []
sample_count = int(len(data) // rate - 1)
for i in range(sample_count):
new_data.append(get_value(data, i * rate))
return np.array(new_data)
PARENTS = [
None,
0, 1, 2, 3,
2, 5, 6, 7,
2, 9, 10, 11,
0, 13, 14, 15,
0, 17, 18, 19
]
def absolute_to_relative(data):
relative_data = copy.deepcopy(data)
for marker in range(1, 21):
parent = PARENTS[marker]
relative_data[:, marker] -= data[:, parent]
return relative_data
def relative_to_absolute(data):
absolute_data = copy.deepcopy(data)
for marker in range(1, 21):
parent = PARENTS[marker]
absolute_data[:, marker] += absolute_data[:, parent]
return absolute_data
def relative_to_length(data):
length_data = np.zeros((data.shape[0], 21, 1))
for frame in range(data.shape[0]):
for marker in range(1, 21):
length_data[frame, marker, 0] = np.linalg.norm(data[frame, marker])
return length_data
def align_bone_length(data, interval):
relative_data = absolute_to_relative(data)
length_data = relative_to_length(relative_data)
lerp_length_data = ip.linear_interpolate(length_data, interval)
dir_data = np.zeros(relative_data.shape)
dir_data[:, 1:] = relative_data[:, 1:] / length_data[:, 1:]
for marker in range(1, 21):
relative_data[:, marker] = lerp_length_data[:, marker] * dir_data[:, marker]
absolute_data = relative_to_absolute(relative_data)
return absolute_data