Spaces:
Runtime error
Runtime error
from __future__ import absolute_import, division | |
from collections import defaultdict | |
import numpy as np | |
from pose_estimation import joints_angle | |
def fastdtw(x, y, radius=1, dist=None, method={}, angle_comp_method=''): | |
''' return the approximate distance between 2 time series with O(N) | |
time and memory complexity | |
Parameters | |
---------- | |
x : array_like | |
input array 1 | |
y : array_like | |
input array 2 | |
radius : int | |
size of neighborhood when expanding the path. A higher value will | |
increase the accuracy of the calculation but also increase time | |
and memory consumption. A radius equal to the size of x and y | |
will yield an exact dynamic time warping calculation. | |
dist : function or int | |
The method for calculating the distance between x[i] and y[j]. If | |
dist is an int of value p > 0, then the p-norm will be used. If | |
dist is a function then dist(x[i], y[j]) will be used. If dist is | |
None then abs(x[i] - y[j]) will be used. | |
Returns | |
------- | |
distance : float | |
the approximate distance between the 2 time series | |
path : list | |
list of indexes for the inputs x and y | |
''' | |
x = np.asanyarray(x, dtype='float') | |
y = np.asanyarray(y, dtype='float') | |
return __dtw(x, y, None, angle_comp_method=angle_comp_method) | |
def cost(x, y, method, angle_comp_method=''): | |
mae_angle = joints_angle.mean_absolute_error( | |
x, y | |
) | |
cost = mae_angle | |
return cost | |
def __dtw(x, y, method, angle_comp_method=''): | |
len_x, len_y = len(x), len(y) | |
dtw_mapping = defaultdict(lambda: (float('inf'),)) | |
similarity_score = defaultdict(lambda: float('inf'), ) | |
dtw_mapping[0, 0] = (0, 0, 0) | |
similarity_score[0, 0] = 0 | |
for i in range(1, len_x + 1): | |
for j in range(1, len_y + 1): | |
dt = cost( | |
x[i - 1], y[j - 1], method, angle_comp_method=angle_comp_method | |
) | |
dtw_mapping[i, j] = min( | |
(dtw_mapping[i - 1, j][0] + dt, i - 1, j), | |
(dtw_mapping[i, j - 1][0] + dt, i, j - 1), | |
(dtw_mapping[i - 1, j - 1][0] + dt, i - 1, j - 1), | |
key=lambda a: a[0] | |
) | |
similarity_score[i, j] = dt | |
path = [] | |
i, j = len_x, len_y | |
while not (i == j == 0): | |
path.append( | |
(i - 1, j - 1, dtw_mapping[i - 1, j - 1][0], | |
similarity_score[i - 1, j - 1]) | |
) | |
i, j = dtw_mapping[i, j][1], dtw_mapping[i, j][2] | |
path.reverse() | |
return (dtw_mapping[len_x, len_y][0], path) | |