Commit acab277e authored by Michal Balazia's avatar Michal Balazia
Browse files

distance map

parent 07d6abac
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import executor.Constants;
import java.util.ArrayList;
import java.util.List;
......
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import java.util.ArrayList;
import java.util.List;
import objects.Axis;
......
package methods;
package algorithms;
import Jama.Matrix;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import executor.Constants;
import java.util.ArrayList;
import java.util.List;
......@@ -26,13 +25,13 @@ public class MethodNareshKumarMS extends Method {
@Override
public void learnClassifier(List<Motion> motionsLearning) {
getClassifier().getDecision().getDistanceTemplates().setDistanceTemplatesMatrix(getMeanMatrix(extractTemplates(motionsLearning)));
((DistanceTemplatesNareshKumarMS) getClassifier().getDecision().getDistanceTemplates()).setMeanMatrix(getMeanMatrix(extractTemplates(motionsLearning)));
}
@Override
public List<Feature> extractFeatures(Motion motion) {
motion.adjustLinear(length);
double[][] data = motion.getVector().getArray();
double[][] data = motion.getMatrix().getArray();
double[] vector = new double[data.length];
for (int i = 0; i < data.length; i++) {
vector[i] = data[i][0];
......
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import java.util.ArrayList;
import java.util.List;
import objects.Feature;
......
package methods;
package algorithms;
import algorithms.Classifier;
import java.util.ArrayList;
import java.util.List;
import objects.Feature;
......
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoader;
import executor.MotionLoader;
import java.util.List;
import objects.Feature;
import objects.Motion;
......
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import java.util.ArrayList;
import java.util.List;
import objects.Feature;
......
package methods;
package algorithms;
import algorithms.Classifier;
import algorithms.MotionLoaderJointCoordinates;
import executor.MotionLoaderJointCoordinates;
import java.util.ArrayList;
import java.util.List;
import objects.Axis;
......
package methods;
package algorithms;
import algorithms.ClassifierTransform;
import algorithms.MotionLoader;
import executor.MotionLoader;
import java.util.ArrayList;
import java.util.List;
import objects.Feature;
......@@ -30,19 +29,19 @@ public class MethodTransform extends Method {
List<Sample> samples = new ArrayList();
for (Motion motion : motionsLearning) {
motion.adjustLinear(length);
samples.add(new Sample(motion.getIdentifier(), motion.getVector()));
samples.add(new Sample(motion.getIdentifier(), motion.getMatrix()));
}
ClassifierTransform classifier = (ClassifierTransform) getClassifier();
classifier.learnTransformationMatrix(samples);
// DISTANCE TEMPLATES
classifier.getDecision().getDistanceTemplates().setDistanceTemplatesMatrix(getTotalScatterMatrix(extractTemplates(motionsLearning)).inverse());
((DistanceTemplatesMahalanobis) classifier.getDecision().getDistanceTemplates()).setTotalScatterMatrix(getTotalScatterMatrix(extractTemplates(motionsLearning)).inverse());
}
@Override
public List<Feature> extractFeatures(Motion motion) {
motion.adjustLinear(length);
double[][] data = ((ClassifierTransform) getClassifier()).getTransformationMatrix().transpose().times(motion.getVector()).getArray();
double[][] data = ((ClassifierTransform) getClassifier()).getTransformationMatrix().transpose().times(motion.getMatrix()).getArray();
List<Feature> features = new ArrayList();
for (int d = 0; d < data.length; d++) {
features.add(new Feature(new Parameter[]{new Parameter(String.valueOf(d), data[d][0])}));
......
package algorithms;
import java.io.Serializable;
import objects.DistanceMatrix;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import objects.Template;
public abstract class Retriever implements Serializable {
private DistanceTemplates distanceTemplates;
private DistanceMatrix distanceMatrix;
public Retriever() {
}
private Map<String, Double> distanceMap = new HashMap();
public DistanceTemplates getDistanceTemplates() {
return distanceTemplates;
......@@ -20,11 +19,36 @@ public abstract class Retriever implements Serializable {
this.distanceTemplates = distanceTemplates;
}
public void setDistanceMatrix(DistanceMatrix distanceMatrix) {
this.distanceMatrix = distanceMatrix;
public Map<String, Double> getDistanceMap() {
return distanceMap;
}
public void setDistanceMap(Map<String, Double> distanceMap) {
this.distanceMap = distanceMap;
}
private String createKey(Template template1, Template template2) {
return template1.getIdentifier() + "#" + template2.getIdentifier();
}
public void calculateDistanceMap(List<Template> templates) {
distanceMap = new HashMap();
for (Template template1 : templates) {
for (Template template2 : templates) {
putDistance(template1, template2);
}
}
}
public double getDistance(Template template1, Template template2) {
return distanceMatrix == null ? distanceTemplates.getDistance(template1, template2) : distanceMatrix.getDistance(template1, template2);
String key = createKey(template1, template2);
if (!distanceMap.containsKey(key)) {
putDistance(template1, template2);
}
return distanceMap.get(key);
}
private void putDistance(Template template1, Template template2) {
distanceMap.put(createKey(template1, template2), distanceTemplates.getDistance(template1, template2));
}
}
......@@ -9,9 +9,6 @@ import algorithms.Classifier1NNL1L1;
import algorithms.ClassifierRandom;
import algorithms.ClassifierTransform1NNMMCMahalanobis;
import algorithms.ClassifierTransform1NNPCALDAMahalanobis;
import algorithms.MethodEvaluator;
import algorithms.MotionLoaderBoneRotations;
import algorithms.MotionLoaderJointCoordinates;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
......@@ -21,30 +18,29 @@ import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import objects.PoseJointCoordinates;
import objects.MotionJointCoordinates;
import objects.Feature;
import objects.Motion;
import methods.Method;
import methods.MethodAhmedM;
import methods.MethodAliS;
import methods.MethodAnderssonVO;
import methods.MethodBallA;
import methods.MethodDikovskiB;
import methods.MethodAhmedF;
import methods.MethodJiangS;
import methods.MethodKrzeszowskiT;
import methods.MethodNareshKumarMS;
import methods.MethodKwolekB;
import methods.MethodPreisJ;
import methods.MethodSedmidubskyJ;
import methods.MethodSinhaA;
import methods.MethodTransform;
import methods.MethodRandom;
import methods.MethodRaw;
import algorithms.Method;
import algorithms.MethodAhmedM;
import algorithms.MethodAliS;
import algorithms.MethodAnderssonVO;
import algorithms.MethodBallA;
import algorithms.MethodDikovskiB;
import algorithms.MethodAhmedF;
import algorithms.MethodJiangS;
import algorithms.MethodKrzeszowskiT;
import algorithms.MethodNareshKumarMS;
import algorithms.MethodKwolekB;
import algorithms.MethodPreisJ;
import algorithms.MethodSedmidubskyJ;
import algorithms.MethodSinhaA;
import algorithms.MethodTransform;
import algorithms.MethodRandom;
import algorithms.MethodRaw;
import objects.ClassifiableList;
import objects.Parameter;
import objects.Template;
......@@ -73,11 +69,11 @@ public class Executor {
private static final Classifier1NNDTWL1 classifier1NNDTWL1 = new Classifier1NNDTWL1();
private static final Classifier1NNDTWL2 classifier1NNDTWL2 = new Classifier1NNDTWL2();
private static final Classifier1NNL1L1 classifier1NNL1L1 = new Classifier1NNL1L1();
private static final ClassifierRandom classifierRandom = new ClassifierRandom();
private static final Classifier1NNDTWKrzeszowskiT classifier1NNDTWKrzeszowskiT = new Classifier1NNDTWKrzeszowskiT();
private static final Classifier1NNNareshKumarMS classifier1NNNareshKumarMS = new Classifier1NNNareshKumarMS();
private static final ClassifierTransform1NNMMCMahalanobis classifierTransform1NNMMCMahalanobis = new ClassifierTransform1NNMMCMahalanobis();
private static final ClassifierTransform1NNPCALDAMahalanobis classifierTransform1NNPCALDAMahalanobis = new ClassifierTransform1NNPCALDAMahalanobis();
private static final ClassifierRandom classifierRandom = new ClassifierRandom();
/*
All implemented MoCap-based gait recognition methods
......@@ -278,28 +274,28 @@ public class Executor {
nFoldsPG = 10;
fineness = 30;
methods = new Method[]{methods[2], methods[3], methods[13], methods[17]};
MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
//methodEvaluator.setSubjectsClosedSetFixed(new String[]{"15", "35", "36", "91"});
methodEvaluator.setSubjectsClosedSetRandom(nClasses);
methodEvaluator.evaluateClosedSet(nFoldsLE);
//methodEvaluator.setSubjectsOpenSetFixed(new String[]{"15", "35"}, new String[]{"36", "91"});
methodEvaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
methodEvaluator.evaluateOpenSet();
Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
//evaluator.setSubjectsClosedSetFixed(new String[]{"15", "35", "36", "91"});
evaluator.setSubjectsClosedSetRandom(nClasses);
evaluator.evaluateClosedSet(nFoldsLE);
//evaluator.setSubjectsOpenSetFixed(new String[]{"15", "35"}, new String[]{"36", "91"});
evaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
evaluator.evaluateOpenSet();
//
// // IJCB Figure 3
// nClasses = 64;
// nFoldsPG = 10;
// fineness = 30;
// methods = new Method[]{methods[1], methods[2], methods[3], methods[4], methods[5], methods[8], methods[10], methods[12], methods[14], methods[16]};
// MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// for (int i = 2; i <= nClasses - 2; i++) {
// System.out.println("i=" + i);
// nClassesLearning = i;
// nClassesEvaluation = nClasses - i;
// String[] fixed = new String[]{"54", "70", "06", "19", "132", "104", "91", "38", "40", "143", "142", "94", "90", "77", "78", "03", "74", "82", "127", "14", "41", "16", "01", "56", "85", "15", "136", "35", "60", "89", "55", "137", "108", "88", "114", "17", "39", "05", "120", "07", "138", "69", "86", "12", "13", "93", "49", "135", "61", "126", "107", "22", "81", "83", "106", "36", "111", "09", "63", "131", "08", "113", "18", "133"};
// methodEvaluator.setSubjectsOpenSetFixed(Arrays.copyOfRange(fixed, 0, nClassesLearning), Arrays.copyOfRange(fixed, nClassesLearning, nClassesLearning + nClassesEvaluation));
// evaluator.setSubjectsOpenSetFixed(Arrays.copyOfRange(fixed, 0, nClassesLearning), Arrays.copyOfRange(fixed, nClassesLearning, nClassesLearning + nClassesEvaluation));
// //methodEvaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// methodEvaluator.evaluateOpenSet();
// evaluator.evaluateOpenSet();
// }
//
// // ACM-TOMM Table 1
......@@ -307,9 +303,9 @@ public class Executor {
// nFoldsLE = 3;
// nFoldsPG = 10;
// fineness = 30;
// MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// methodEvaluator.setSubjectsClosedSetRandom(nClasses);
// methodEvaluator.evaluateClosedSet(nFoldsLE);
// Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// evaluator.setSubjectsClosedSetRandom(nClasses);
// evaluator.evaluateClosedSet(nFoldsLE);
//
// // S+SSPR Figure 3 and ACM-TOMM Figure 3
// nClasses = 64;
......@@ -317,16 +313,16 @@ public class Executor {
// nFoldsPG = 10;
// fineness = 30;
// methods = new Method[]{methods[14]};
// MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// for (int i = 2; i <= nClasses / 2; i++) {
// System.out.println("i=" + i);
// nClasses = i;
// nClassesLearning = i;
// nClassesEvaluation = i;
// methodEvaluator.setSubjectsClosedSetRandom(nClasses);
// methodEvaluator.evaluateClosedSet(nFoldsLE);
// methodEvaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// methodEvaluator.evaluateOpenSet();
// evaluator.setSubjectsClosedSetRandom(nClasses);
// evaluator.evaluateClosedSet(nFoldsLE);
// evaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// evaluator.evaluateOpenSet();
// }
//
// // S+SSPR Figure 4a
......@@ -334,13 +330,13 @@ public class Executor {
// nFoldsPG = 10;
// fineness = 30;
// methods = new Method[]{methods[14]};
// MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// for (int i = 2; i <= nClasses / 2; i++) {
// System.out.println("i=" + i);
// nClassesLearning = i;
// nClassesEvaluation = nClasses / 2;
// methodEvaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// methodEvaluator.evaluateOpenSet();
// evaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// evaluator.evaluateOpenSet();
// }
//
// // S+SSPR Figure 4b
......@@ -349,17 +345,16 @@ public class Executor {
// nFoldsPG = 10;
// fineness = 30;
// methods = new Method[]{methods[14]};
// MethodEvaluator methodEvaluator = new MethodEvaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// Evaluator evaluator = new Evaluator(methods, new File("amc" + distanceThreshold), nFoldsPG, fineness);
// for (int i = 2; i <= nClasses - 2; i++) {
// System.out.println("i=" + i);
// nClassesLearning = i;
// nClassesEvaluation = nClasses - i;
// methodEvaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// methodEvaluator.evaluateOpenSet();
// evaluator.setSubjectsOpenSetRandom(nClassesLearning, nClassesEvaluation);
// evaluator.evaluateOpenSet();
// }
//
System.out.print(
"time=" + printTime(System.currentTimeMillis() - beginning));
System.out.println("time=" + printTime(System.currentTimeMillis() - beginning));
}
private static String printTime(double time) {
......
package algorithms;
package executor;
import java.io.File;
import java.io.IOException;
......
package algorithms;
package executor;
import executor.MotionLoader;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
......
package algorithms;
package executor;
import executor.MotionLoader;
import executor.Constants;
import java.io.File;
import java.io.IOException;
......
package objects;
import algorithms.DistanceTemplates;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DistanceMatrix {
private final DistanceTemplates distanceTemplates;
private final Map<String, Double> distanceMap = new HashMap();
private final List<String> identifiers = new ArrayList();
public DistanceMatrix(DistanceTemplates distanceTemplates) {
this.distanceTemplates = distanceTemplates;
}
private String getKey(Template template1, Template template2) {
return template1.getIdentifier() + "#" + template2.getIdentifier();
}
public void putDistance(Template template1, Template template2) {
distanceMap.put(getKey(template1, template2), distanceTemplates.getDistance(template1, template2));
String identifier = template1.getIdentifier();
if (!identifiers.contains(identifier)) {
identifiers.add(identifier);
}
}
public double getDistance(Template template1, Template template2) {
return distanceMap.get(getKey(template1, template2));
}
public int getSize() {
return distanceMap.size();
}
public void print() {
Collections.sort(identifiers);
System.out.print(",");
for (String identifier : identifiers) {
System.out.print(identifier + ",");
}
System.out.print("\r\n");
for (String identifier1 : identifiers) {
System.out.print(identifier1 + ",");
for (String identifier2 : identifiers) {
System.out.print(distanceMap.get(identifier1 + "#" + identifier2) + ",");
}
System.out.print("\r\n");
}
}
}
......@@ -33,7 +33,7 @@ public abstract class Motion<T> extends Classifiable {
this.poses = adjustedPoses;
}
public abstract Matrix getVector();
public abstract Matrix getMatrix();
public abstract List<Feature> extractRawFeatures();
}
......@@ -11,7 +11,7 @@ public class MotionBoneRotations extends Motion {
}
@Override
public Matrix getVector() {
public Matrix getMatrix() {
double[][] data2 = getTensor();
double[] dataVector = new double[data2.length * data2[0].length];
int d = 0;
......
......@@ -12,7 +12,7 @@ public class MotionJointCoordinates extends Motion {
}
@Override
public Matrix getVector() {
public Matrix getMatrix() {
double[][][] data3 = getTensor();
double[] dataVector = new double[data3.length * data3[0].length * data3[0][0].length];
int d = 0;
......
......@@ -10,7 +10,7 @@ public class MotionNull extends Motion {
}
@Override
public Matrix getVector() {
public Matrix getMatrix() {
return null;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment