|
1 | | -%% Load Data |
2 | | -clear; |
3 | | -clc; |
4 | | -% load('TsukubaHandDigitsDataset.mat') |
5 | | -% Check if the variable 'trainData' and 'testData' do not exist in the workspace |
6 | | -if ~(exist('trainData', 'var') == 1 && exist('testData', 'var') == 1) |
7 | | - % If they don't exist, load the data from the .mat file |
8 | | - load('TsukubaHandDigitsDataset24x24.mat'); |
9 | | -end |
10 | | -% you can use the following code to convert the test data format from 3d to 4d |
11 | | -% testData = subsetTestData(testData, 4); |
12 | | -specific_class = 1; |
13 | | -class_num = 6; |
14 | | -%% to accomodate for MATLAB indexing |
15 | | -specific_class = specific_class + 1; |
16 | | -training_data = trainData; |
17 | | -% testing_data = testData; |
18 | | -testing_data = testData(:, :, specific_class); |
19 | | -size_of_test_data = size(testing_data); |
20 | | -dim = size_of_test_data(1); |
21 | | -del_subspace_dim = 3; |
| 1 | +%% Load data |
| 2 | +testDataUsage = TestDataUsage.SingleClass; |
| 3 | +n = 2; |
| 4 | +[trainData, testData, testLabels] = prepareData(testDataUsage, n); |
22 | 5 |
|
23 | | -% get number of elements of size_of_test_data |
24 | | -array_size = numel(size_of_test_data); |
| 6 | +%% Train model |
| 7 | +numDimReferenceSubspace = 10; |
| 8 | +numDimInputSubspace = 4; |
| 9 | +indexOfEigsToKeep = 3; |
25 | 10 |
|
26 | | -if array_size == 4 |
27 | | - % do nothing |
28 | | - num_samples_per_set = size_of_test_data(2); |
29 | | - num_sets = size_of_test_data(3); |
30 | | - num_classes = size_of_test_data(4); |
31 | | -elseif array_size == 3 |
32 | | - num_sets = 1; |
33 | | - num_classes = size_of_test_data(3); |
34 | | -else |
35 | | - num_classes = 1; |
36 | | - num_sets = 1; |
37 | | -end |
| 11 | +model = CMSM(trainData,... |
| 12 | + numDimReferenceSubspace,... |
| 13 | + numDimInputSubspace,... |
| 14 | + indexOfEigsToKeep,... |
| 15 | + testLabels); |
38 | 16 |
|
39 | | -%% Train Model |
40 | | -tic; |
41 | | -num_dim_reference_subspaces = 10; |
42 | | -num_dim_input_subpaces = 5; |
| 17 | +%% Evaluate model |
| 18 | +modelEvaluation = model.evaluate(testData); |
| 19 | +modelEvaluation.printResults(); |
43 | 20 |
|
44 | | -reference_subspaces = cvlBasisVector(training_data, num_dim_reference_subspaces); |
45 | | -input_subspaces = cvlBasisVector(testing_data, num_dim_input_subpaces); |
46 | 21 |
|
47 | | -save('reference_subspaces.mat', 'reference_subspaces'); |
48 | | -% reference_subspaces = reference_subspaces(:, :, 1); |
49 | | -% Generalizated difference subspace(Constraint Subspace) |
50 | | -P = zeros(dim, dim); |
51 | | -for I=1:class_num |
52 | | - P = P + reference_subspaces(:,:,I)*reference_subspaces(:,:,I)'; |
53 | | -end |
54 | | -[B, C] = eig(P); |
55 | | -C = diag(C); |
56 | | -[~, index] = sort(C,'descend'); |
57 | | -B = B(:,index); C = C(index); |
58 | | -difference = B(:,del_subspace_dim+1:rank(P))'; |
59 | 22 |
|
60 | | -difference_subspace = zeros(size(difference,1), num_dim_reference_subspaces, size(reference_subspaces,3)); |
61 | | -for I=1:size(reference_subspaces,3) |
62 | | - difference_subspace(:,:,I) = orth(difference*reference_subspaces(:,:,I)); |
63 | | -end |
64 | 23 |
|
65 | | -% process input difference subspace |
66 | | -if array_size == 4 |
67 | | - input_difference_subspace = zeros(size(difference,1), num_dim_input_subpaces, num_sets, num_classes); |
68 | | -for I=1:num_classes |
69 | | - for J=1:num_sets |
70 | | - input_difference_subspace(:,:,J,I) = orth(difference*input_subspaces(:,:,J,I)); |
71 | | - end |
72 | | -end |
73 | | -elseif array_size == 3 |
74 | | - input_difference_subspace = zeros(size(difference,1), num_dim_input_subpaces, num_classes); |
75 | | - for I=1:num_classes |
76 | | - input_difference_subspace(:,:,I) = orth(difference*input_subspaces(:,:,I)); |
77 | | - end |
78 | | -else |
79 | | - input_difference_subspace = orth(difference*input_subspaces); |
80 | | -end |
81 | | - |
82 | | -reference_subspaces= difference_subspace; |
83 | | -input_subspaces = input_difference_subspace; |
84 | | - |
85 | | -reference_subspaces = reference_subspaces(:, :, 1:3); |
86 | | - |
87 | | -tic; |
88 | | -%% Recognition Phase |
89 | | -% convert reference and input subspace to cells |
90 | | -reference_subspaces = mat2cell(reference_subspaces, size(reference_subspaces, 1), size(reference_subspaces, 2), ones(1, size(reference_subspaces, 3))); |
91 | | -input_subspaces = mat2cell(input_subspaces, size(input_subspaces, 1), size(input_subspaces, 2), ones(1, size(input_subspaces, 3))); |
92 | | -similarities = cvlCanonicalAngles(reference_subspaces, input_subspaces); |
93 | | -similarities = similarities(:, :, end, end); |
94 | | -% End timing and display the elapsed time |
95 | | -elapsedTime = toc; |
96 | | -fprintf('The code block executed in %.5f seconds.\n', elapsedTime); |
97 | | -model_evaluation = ModelEvaluation(similarities, generateLabels(num_classes, num_sets, specific_class)); |
98 | | - |
99 | | -displayModelResults('Contained Mutual Subspace Methods', model_evaluation); |
100 | | - |
101 | | -%% Print preditions |
102 | | -disp(model_evaluation.predicted_labels); |
103 | | -disp(model_evaluation.true_labels); |
104 | | -disp(similarities); |
105 | | -plotSimilarityMatrix(similarities, 'CMSM') |
106 | | -% disp(similarities) |
107 | | -% plotSimilarities(similarities) |
0 commit comments