-
Notifications
You must be signed in to change notification settings - Fork 0
/
analyse_mocap.py
114 lines (93 loc) · 3.9 KB
/
analyse_mocap.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
102
103
104
105
106
107
108
109
110
111
112
113
114
import pickle
import numpy as np
import scipy.linalg as la
from matplotlib import pyplot as plt
from kalman import GaussianDensity
from linear_models import BasicLinearModel, DegenerateLinearModel
from learners_mcmc import (
load_learner,
BaseMCMCLearner,
MCMCLearnerObservationDiagonalCovarianceWithIGPrior,
MCMCLearnerTransitionBasicModelWithMNIWPrior,
MCMCLearnerTransitionDegenerateModelWithMNIWPrior)
# Create learner classes
class MCMCBasicLearner(
BaseMCMCLearner,
MCMCLearnerObservationDiagonalCovarianceWithIGPrior,
MCMCLearnerTransitionBasicModelWithMNIWPrior):
pass
class MCMCDegenerateLearner(
BaseMCMCLearner,
MCMCLearnerObservationDiagonalCovarianceWithIGPrior,
MCMCLearnerTransitionDegenerateModelWithMNIWPrior):
pass
class MCMCNaiveLearner(
BaseMCMCLearner,
MCMCLearnerObservationDiagonalCovarianceWithIGPrior):
pass
def mocap_msvd(markers, initial, prop_energy=0.95, num_it=1000):
md = np.isnan(markers)
markers = np.where(md, initial, markers)
last_S = np.nan*np.ones(markers.shape[1])
for it in range(num_it):
U,S,V = la.svd(markers)
if np.allclose(S,last_S,1E-7):
break
# Choose number of singular values
normS = S/np.sum(S)
cumsumS = np.cumsum(normS)
num_sing = np.where( cumsumS>prop_energy )[0][0]
# Reconstruct and fill in gaps
reconstructed = np.dot(U[:,:num_sing], np.dot(np.diag(S[:num_sing]),
V[:num_sing,:]))
markers = np.where(md, reconstructed, markers)
# Keep track of singular values in order to assess convergence
last_S = S
return markers
def mocap_rmse(truth, original, estimate):
err = truth-estimate
return la.norm(err[np.isnan(original)])
figure_path = './notes/figures/'
# Load the test data
data_path = './mocap-data/'
test_path = './results/mocap-final/'
markers_truth = np.genfromtxt(data_path+'downsampled_head_markers_truth.csv', delimiter=',')
test_data_file = 'mocap-test-data.p'
fh = open(test_path+test_data_file, 'rb')
markers = pickle.load(fh)
# Load the MCMC output
naive_learner = load_learner(test_path+'mocap-mcmc-naive.p')
basic_learner = load_learner(test_path+'mocap-mcmc-basic.p')
degenerate_learner = load_learner(test_path+'mocap-mcmc-degenerate.p')
# Get state estimates from each algorithm
num_burn = 10000
basic_mn, basic_sd = basic_learner.estimate_state_trajectory(
numBurnIn=num_burn)
degenerate_mn, degenerate_sd = degenerate_learner.estimate_state_trajectory(
numBurnIn=num_burn)
naive_mn, naive_sd = naive_learner.estimate_state_trajectory(
numBurnIn=num_burn)
# Run MSVD as a comparison
msvd_markers = mocap_msvd(markers, naive_mn[:,:12])
# Assess RMSE
basic_rmse = mocap_rmse(markers_truth, markers, basic_mn[:,:12])
degenerate_rmse = mocap_rmse(markers_truth, markers, degenerate_mn[:,:12])
naive_rmse = mocap_rmse(markers_truth, markers, naive_mn[:,:12])
msvd_rmse = mocap_rmse(markers_truth, markers, msvd_markers)
# Display results
print("Model | RMSE")
print("NCVM | {}".format(naive_rmse))
print("Basic | {}".format(basic_rmse))
print("Degenerate | {}".format(degenerate_rmse))
print("MSVD | {}".format(msvd_rmse))
# Draw it
fig, axs = plt.subplots(nrows=3,ncols=1)
color_list = 'brgc'
for mm in range(4):
for dd in range(3):
axs[dd].plot(markers[:,3*mm+dd], color=color_list[mm])
fig.savefig(figure_path+'mocap-data.pdf', bbox_inches='tight')
# Trace plots
naive_learner.plot_chain_trace('R', dims=([0],[0]))
basic_learner.plot_chain_trace('R', dims=([0],[0]))
degenerate_learner.plot_chain_trace('R', dims=([0],[0]))