-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathExample.m
277 lines (219 loc) · 8.4 KB
/
Example.m
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
%This example requires the MoCap Toolbox available at :
% https://www.jyu.fi/hytk/fi/laitokset/mutku/en/research/materials/mocaptoolbox
% or the direct link to avoid giving your e-mail :
% https://www.jyu.fi/hytk/fi/laitokset/mutku/en/research/materials/mocaptoolbox/@@resolveuid/195072f40a274f57a893387de8ecd695
% Download the toolbox and add the folder 'mocaptoolbox' to the same folder as this script
% Add the data you want to test to the same folder as this script
%% Initialize and load data
clear all;
close all;
clc;
%Do not forget to download and add the mocap toolbox folder in this repository
addpath('mocaptoolbox');
addpath('mocaptoolbox/private');
addpath('MoCapToolboxExtension'); %some extensions to the MoCap Toolbox
connectionFile = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% You can change these parameters
%input files (marker data and connections)
%dataFile = '85_02.c3d';
connectionFile = [];
dataFile = '01_karate.c3d';
connectionFile = '01_karate.txt';
%dataFile = '03_rolling.c3d';
%connectionFile = '03_rolling.txt';
%dataFile = '02_dancingandfalling.c3d';
%connectionFile = '02_dancingandfalling.txt';
use_manual_connection = true;
if isempty(connectionFile)
use_manual_connection = false;
end
% if you don't have any connection file, put use_manual_connection to
% false. Automatic bones (connections) will be designed instead
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Load data (requires the MoCap toolbox)
original = mcread(['data/' dataFile]);
%Remove invalid markers in hdm files
markernames = original.markerName;
ids = find(~ismember(markernames,{'*0','*1','*2'}));
original = mcgetmarker(original,ids);
%interpolate some unexpected really small gaps in some hdm files
if strcmp(lower(original.filename(1:3)),'hdm')
numberofnans = sum(sum(isnan(original.data)));
fprintf('number of nans in original file: %d\n',numberofnans);
if numberofnans > 0
figure(1);imagesc(isnan(original.data));
end
original.data = naninterp(original.data,'pchip');
disp('salut');
end
%% Display original data
%MoCap display parameters
p = mcinitanimpar;
%manual connections (from file)
if use_manual_connection
p=mccreateconnmatrix(['data/' connectionFile],p);
fprintf('Using manual connection matrix...\n');
else
%or automatic connections
%p.conn = mcautomaticbones(original,30,400,20);
p.conn = mcautomaticbones2(original);
fprintf('Using automatic connection matrix...\n');
end
%figure window size
p.scrsize = [1900/2 800];
%Display original data
myfighandle = figure(1);
mc3dplot(original,p,myfighandle);
title('Original data');
%%% If you want to recover from an incomplete original sequence:
incomplete = original;
%% (Optional) you can use this cell to simulate gaps on your data:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% You can change these parameters
nmissing = 5; %number of missing markers
gapsec = 2; %duration of gaps
multiple_gaps = true; %if true, multiple gaps in a marker trajectory (random number)
max_number_of_multiple_gaps = 10;% maximum possible number of multiple gaps in a marker trajectory
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(any(isnan(original.data)))
%Original sequence is already incomplete
warning(['Note that there are already missing data in your file.' ...
' Dont use this cell if you want to recover missing data from the original file.']);
end
%Simulate gaps
incomplete = original;
indices = zeros(size(incomplete.data));
nframes=incomplete.nFrames;
nmarkers = incomplete.nMarkers;
fps = incomplete.freq;
j=randperm(nmarkers);
j=j(1:nmissing);
gapframe=round(gapsec*fps);
%%%%one gap per marker
gaps=ones(nmarkers,1);
if multiple_gaps
%%%%several gaps per marker
gaps=round(rand(nmarkers,1)*max_number_of_multiple_gaps);
gaps(gaps<1)=1;
end
indicesperm=[];
%gaps at the same time
id1 = 1+floor(rand(1)*(nframes - gapsec*fps));
id2 = min(nframes,id1+gapframe);
for m=j
indicesperm{m} = zeros(incomplete.nFrames,1);
for g=1:gaps(m)
if multiple_gaps
%gaps at different times
id1 = 1+round(rand(1)*nframes*4/5.1);
id2 = min(nframes,id1+gapframe);
end
indicesperm{m}(id1:id2)=true;
indices(id1:id2,(3*m-2):(3*m))=true;%indexes of fake missing frames
end
indicesperm{m}=logical(indicesperm{m});
end
indices = logical(indices);
incomplete.data(indices)=nan;
figure(2);imagesc(indices);
title('Simulated gaps');
xlabel('Markers (interleaved x,y,z)');
ylabel('Frames');
%Display original data
myfighandle = figure(1);
mc3dplot(incomplete,p,myfighandle);
title('Fake data');
%% Recovery examples
%% Gloersen et al. 2016 only
%Check all possible options in the mcrecovery function
%options.saveastsv = 1;%save recovered sequence as tsv file
%options.recursivefilling = 0;%use or not recusrivefilling
%choose which method to use
options.method1 = 0;%Local interpolation
options.method2 = 0;% Local polynomial regression
options.method3 = 0;%Local GRNN
options.method4 = 0;%Global weighted linear regression
options.method5 = 1;%Gloersen et al. 2016
options.advancedordering = 1;
options.spaceconstraint = 0;%use or not spaceconstraint
options.timeconstraint = 0;%use or not timeconstraint
options.filtering = 0;%use or not timeconstraint
options.quiet = 0;%avoid console output
options.presenceMin = 30;%threshold (in % of available frames) under which discard some markers
% Gloersen would fail without discarding too bad markers
tic;
recovered = mcrecovery(incomplete,options);
toc;
myfighandle = figure(3);
mc3dplot(recovered,p,myfighandle);
title('PCA (Gloersen et al.)');
%% Gloersen et al. 2016 with input filtering and soft constraints
%clc;
%Check all possible options in the mcrecovery function
%options.saveastsv = 1;%save recovered sequence as tsv file
%options.recursivefilling = 0;%use or not recusrivefilling
%choose which method to use
options.method1 = 0;%Local interpolation
options.method2 = 0;% Local polynomial regression
options.method3 = 0;%Local GRNN
options.method4 = 0;%Global weighted linear regression
options.method5 = 1;%Gloersen et al. 2016
options.advancedordering = 1;
options.spaceconstraint = 1;%use or not spaceconstraint
options.timeconstraint = 1;%use or not timeconstraint
options.filtering = 1;%use or not timeconstraint
options.quiet = 1;%avoid console output
options.presenceMin = 30;%threshold (in % of available frames) under which discard some markers
tic;
recovered = mcrecovery(incomplete,options);
toc;
myfighandle = figure(4);
mc3dplot(recovered,p,myfighandle);
title('PCA (Gloersen et al.) with filtering and constraints');
%% Local GRNN
%Different combinations may be tried to extract the best results
%options.saveastsv = 0;%save recovered sequence as tsv file
%options.recursivefilling = 0;%use or not recusrivefilling
%choose which method to use
options.method1 = 0;%Local interpolation
options.method2 = 0;% Local polynomial regression
options.method3 = 1;%Local GRNN
options.method4 = 0;%Global weighted linear regression
options.method5 = 0;%Gloersen et al. 2016
options.advancedordering = 1;
options.spaceconstraint = 1;%use or not spaceconstraint
options.timeconstraint = 1;%use or not timeconstraint
options.filtering = 1;%use or not timeconstraint
options.quiet = 1;%avoid console output
options.presenceMin = 30;%threshold (in % of available frames) under which discard some markers
tic;
recovered = mcrecovery(incomplete,options);
toc;
myfighandle = figure(5);
mc3dplot(recovered,p,myfighandle);
title('Local GRNN');
%% PMA of different individual models
%Different combinations may be tried to extract the best results
%options.saveastsv = 0;%save recovered sequence as tsv file
%options.recursivefilling = 0;%use or not recusrivefilling
%choose which method to use
options.method1 = 1;%Local interpolation
options.method2 = 1;% Local polynomial regression
options.method3 = 1;%Local GRNN
options.method4 = 1;%Global weighted linear regression
options.method5 = 1;%Gloersen et al. 2016
options.advancedordering = 1;
options.spaceconstraint = 1;%use or not spaceconstraint
options.timeconstraint = 1;%use or not timeconstraint
options.filtering = 1;%use or not timeconstraint
options.quiet = 1;%avoid console output
options.presenceMin = 30;%threshold (in % of available frames) under which discard some markers
tic;
recovered = mcrecovery(incomplete,options);
toc;
myfighandle = figure(6);
mc3dplot(recovered,p,myfighandle);
title('PMA of different individual models');
%%
close all