GestureRecognitionToolkit  Version: 0.2.0
The Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, c++ machine learning library for real-time gesture recognition.
Classifier.cpp
1 /*
2 GRT MIT License
3 Copyright (c) <2012> <Nicholas Gillian, Media Lab, MIT>
4 
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
6 and associated documentation files (the "Software"), to deal in the Software without restriction,
7 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
9 subject to the following conditions:
10 
11 The above copyright notice and this permission notice shall be included in all copies or substantial
12 portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
15 LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
17 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
18 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 */
20 
21 #define GRT_DLL_EXPORTS
22 #include "Classifier.h"
23 
24 GRT_BEGIN_NAMESPACE
25 
26 Classifier::StringClassifierMap* Classifier::stringClassifierMap = NULL;
27 UINT Classifier::numClassifierInstances = 0;
28 
29 Classifier* Classifier::createInstanceFromString(std::string const &classifierType){
30 
31  StringClassifierMap::iterator iter = getMap()->find( classifierType );
32  if( iter == getMap()->end() ){
33  return NULL;
34  }
35  return iter->second();
36 }
38  return createInstanceFromString( classifierType );
39 }
40 
42 
43  Classifier *newInstance = createInstanceFromString( classifierType );
44 
45  if( newInstance == NULL ) return NULL;
46 
47  if( !newInstance->deepCopyFrom( this ) ){
48  delete newInstance;
49  return NULL;
50  }
51  return newInstance;
52 }
53 
55  return this;
56 }
57 
59  Vector< std::string > registeredClassifiers;
60 
61  StringClassifierMap::iterator iter = getMap()->begin();
62  while( iter != getMap()->end() ){
63  registeredClassifiers.push_back( iter->first );
64  iter++;
65  }
66  return registeredClassifiers;
67 }
68 
70  baseType = MLBase::CLASSIFIER;
71  classifierMode = STANDARD_CLASSIFIER_MODE;
72  classifierType = "NOT_SET";
73  supportsNullRejection = false;
74  useNullRejection = false;
75  numInputDimensions = 0;
76  numOutputDimensions = 1;
77  numClasses = 0;
78  predictedClassLabel = 0;
79  maxLikelihood = 0;
80  bestDistance = 0;
81  phase = 0;
82  nullRejectionCoeff = 5;
83  numClassifierInstances++;
84 }
85 
87  if( --numClassifierInstances == 0 ){
88  delete stringClassifierMap;
89  stringClassifierMap = NULL;
90  }
91 }
92 
93 bool Classifier::copyBaseVariables(const Classifier *classifier){
94 
95  if( classifier == NULL ){
96  errorLog << "copyBaseVariables(const Classifier *classifier) - Classifier is NULL!" << std::endl;
97  return false;
98  }
99 
100  if( !this->copyMLBaseVariables( classifier ) ){
101  return false;
102  }
103 
104  this->classifierType = classifier->classifierType;
105  this->classifierMode = classifier->classifierMode;
106  this->supportsNullRejection = classifier->supportsNullRejection;
107  this->useNullRejection = classifier->useNullRejection;
108  this->numClasses = classifier->numClasses;
109  this->predictedClassLabel = classifier->predictedClassLabel;
110  this->nullRejectionCoeff = classifier->nullRejectionCoeff;
111  this->maxLikelihood = classifier->maxLikelihood;
112  this->bestDistance = classifier->bestDistance;
113  this->phase = classifier->phase;
114  this->classLabels = classifier->classLabels;
115  this->classLikelihoods = classifier->classLikelihoods;
116  this->classDistances = classifier->classDistances;
117  this->nullRejectionThresholds = classifier->nullRejectionThresholds;
118  this->ranges = classifier->ranges;
119 
120  return true;
121 }
122 
124 
125  //Reset the base class
126  MLBase::reset();
127 
128  //Reset the classifier
129  predictedClassLabel = GRT_DEFAULT_NULL_CLASS_LABEL;
130  maxLikelihood = 0;
131  bestDistance = 0;
132  phase = 0;
133  if( trained ){
134  classLikelihoods.clear();
135  classDistances.clear();
136  classLikelihoods.resize(numClasses,0);
137  classDistances.resize(numClasses,0);
138  }
139  return true;
140 }
141 
143 
144  //Clear the MLBase variables
145  MLBase::clear();
146 
147  //Clear the classifier variables
148  predictedClassLabel = GRT_DEFAULT_NULL_CLASS_LABEL;
149  maxLikelihood = 0;
150  bestDistance = 0;
151  phase = 0;
152  classLikelihoods.clear();
153  classDistances.clear();
154  nullRejectionThresholds.clear();
155  classLabels.clear();
156  ranges.clear();
157 
158  return true;
159 }
160 
161 std::string Classifier::getClassifierType() const{
162  return classifierType;
163 }
164 
166  return supportsNullRejection;
167 }
168 
170  return useNullRejection;
171 }
172 
174  return nullRejectionCoeff;
175 }
176 
178  if( trained ) return maxLikelihood;
180 }
181 
182 Float Classifier::getPhase() const{
183  return phase;
184 }
185 
187  if( trained ) return bestDistance;
188  return DEFAULT_NULL_DISTANCE_VALUE;
189 }
190 
192  return numClasses;
193 }
194 
195 UINT Classifier::getClassLabelIndexValue(UINT classLabel) const{
196  for(UINT i=0; i<classLabels.size(); i++){
197  if( classLabel == classLabels[i] )
198  return i;
199  }
200  return 0;
201 }
202 
204  if( trained ) return predictedClassLabel;
205  return 0;
206 }
207 
209  if( trained ) return classLikelihoods;
210  return VectorFloat();
211 }
212 
214  if( trained ) return classDistances;
215  return VectorFloat();
216 }
217 
219  if( trained ) return nullRejectionThresholds;
220  return VectorFloat();
221 }
222 
224  return classLabels;
225 }
226 
228  return ranges;
229 }
230 
231 bool Classifier::enableNullRejection(bool useNullRejection){
232  this->useNullRejection = useNullRejection;
233  return true;
234 }
235 
236 bool Classifier::setNullRejectionCoeff(Float nullRejectionCoeff){
237  if( nullRejectionCoeff > 0 ){
238  this->nullRejectionCoeff = nullRejectionCoeff;
239  return true;
240  }
241  return false;
242 }
243 
245  if( newRejectionThresholds.size() == getNumClasses() ){
246  nullRejectionThresholds = newRejectionThresholds;
247  return true;
248  }
249  return false;
250 }
251 
253  return *this;
254 }
255 
256 bool Classifier::saveBaseSettingsToFile( std::fstream &file ) const{
257 
258  if( !file.is_open() ){
259  errorLog << "saveBaseSettingsToFile(fstream &file) - The file is not open!" << std::endl;
260  return false;
261  }
262 
263  if( !MLBase::saveBaseSettingsToFile( file ) ) return false;
264 
265  file << "UseNullRejection: " << useNullRejection << std::endl;
266  file << "ClassifierMode: " << classifierMode << std::endl;
267  file << "NullRejectionCoeff: " << nullRejectionCoeff << std::endl;
268 
269  if( trained ){
270 
271  file << "NumClasses: " << numClasses << std::endl;
272 
273  file << "NullRejectionThresholds: ";
274  if (useNullRejection && nullRejectionThresholds.size()){
275  for(UINT i=0; i<nullRejectionThresholds.size(); i++){
276  file << " " << nullRejectionThresholds[i];
277  }
278  file << std::endl;
279  }else{
280  for(UINT i=0; i<numClasses; i++){
281  file << " " << 0.0;
282  }
283  file << std::endl;
284  }
285 
286  file << "ClassLabels: ";
287  for(UINT i=0; i<classLabels.size(); i++){
288  file << " " << classLabels[i];
289  }
290  file << std::endl;
291 
292  if( useScaling ){
293  file << "Ranges: " << std::endl;
294  for(UINT i=0; i<ranges.size(); i++){
295  file << ranges[i].minValue << "\t" << ranges[i].maxValue << std::endl;
296  }
297  }
298  }
299 
300  return true;
301 }
302 
303 bool Classifier::loadBaseSettingsFromFile( std::fstream &file ){
304 
305  if( !file.is_open() ){
306  errorLog << "loadBaseSettingsFromFile(fstream &file) - The file is not open!" << std::endl;
307  return false;
308  }
309 
310  //Try and load the base settings from the file
311  if( !MLBase::loadBaseSettingsFromFile( file ) ){
312  return false;
313  }
314 
315  std::string word;
316 
317  //Load if the number of clusters
318  file >> word;
319  if( word != "UseNullRejection:" ){
320  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read UseNullRejection header!" << std::endl;
321  clear();
322  return false;
323  }
324  file >> useNullRejection;
325 
326  //Load if the classifier mode
327  file >> word;
328  if( word != "ClassifierMode:" ){
329  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read ClassifierMode header!" << std::endl;
330  clear();
331  return false;
332  }
333  file >> classifierMode;
334 
335  //Load if the null rejection coeff
336  file >> word;
337  if( word != "NullRejectionCoeff:" ){
338  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read NullRejectionCoeff header!" << std::endl;
339  clear();
340  return false;
341  }
342  file >> nullRejectionCoeff;
343 
344  //If the model is trained then load the model settings
345  if( trained ){
346 
347  //Load the number of classes
348  file >> word;
349  if( word != "NumClasses:" ){
350  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read NumClasses header!" << std::endl;
351  clear();
352  return false;
353  }
354  file >> numClasses;
355 
356  //Load the null rejection thresholds
357  file >> word;
358  if( word != "NullRejectionThresholds:" ){
359  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read NullRejectionThresholds header!" << std::endl;
360  clear();
361  return false;
362  }
363  nullRejectionThresholds.resize(numClasses);
364  for(UINT i=0; i<nullRejectionThresholds.size(); i++){
365  file >> nullRejectionThresholds[i];
366  }
367 
368  //Load the class labels
369  file >> word;
370  if( word != "ClassLabels:" ){
371  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read ClassLabels header!" << std::endl;
372  clear();
373  return false;
374  }
375  classLabels.resize( numClasses );
376  for(UINT i=0; i<classLabels.size(); i++){
377  file >> classLabels[i];
378  }
379 
380  if( useScaling ){
381  //Load if the Ranges
382  file >> word;
383  if( word != "Ranges:" ){
384  errorLog << "loadBaseSettingsFromFile(fstream &file) - Failed to read Ranges header!" << std::endl;
385  clear();
386  return false;
387  }
388  ranges.resize(numInputDimensions);
389 
390  for(UINT i=0; i<ranges.size(); i++){
391  file >> ranges[i].minValue;
392  file >> ranges[i].maxValue;
393  }
394  }
395  }
396 
397  return true;
398 }
399 
400 GRT_END_NAMESPACE
401 
bool saveBaseSettingsToFile(std::fstream &file) const
Definition: Classifier.cpp:256
bool saveBaseSettingsToFile(std::fstream &file) const
Definition: MLBase.cpp:375
#define DEFAULT_NULL_LIKELIHOOD_VALUE
Definition: Classifier.h:38
Classifier * deepCopy() const
Definition: Classifier.cpp:41
Vector< UINT > getClassLabels() const
Definition: Classifier.cpp:223
Vector< MinMax > getRanges() const
Definition: Classifier.cpp:227
virtual bool reset()
Definition: MLBase.cpp:125
VectorFloat getNullRejectionThresholds() const
Definition: Classifier.cpp:218
std::string getClassifierType() const
Definition: Classifier.cpp:161
virtual UINT getNumClasses() const
Definition: Classifier.cpp:191
virtual bool resize(const unsigned int size)
Definition: Vector.h:133
const Classifier * getClassifierPointer() const
Definition: Classifier.cpp:54
static StringClassifierMap * getMap()
Definition: Classifier.h:333
Classifier(void)
Definition: Classifier.cpp:69
UINT getClassLabelIndexValue(UINT classLabel) const
Definition: Classifier.cpp:195
Float getNullRejectionCoeff() const
Definition: Classifier.cpp:173
virtual bool deepCopyFrom(const Classifier *classifier)
Definition: Classifier.h:63
bool getSupportsNullRejection() const
Definition: Classifier.cpp:165
virtual bool setNullRejectionThresholds(VectorFloat newRejectionThresholds)
Definition: Classifier.cpp:244
bool getNullRejectionEnabled() const
Definition: Classifier.cpp:169
Float getPhase() const
Definition: Classifier.cpp:182
UINT getPredictedClassLabel() const
Definition: Classifier.cpp:203
bool copyMLBaseVariables(const MLBase *mlBase)
Definition: MLBase.cpp:50
Float getBestDistance() const
Definition: Classifier.cpp:186
static Classifier * createInstanceFromString(std::string const &classifierType)
Definition: Classifier.cpp:29
bool copyBaseVariables(const Classifier *classifier)
Definition: Classifier.cpp:93
virtual ~Classifier(void)
Definition: Classifier.cpp:86
bool loadBaseSettingsFromFile(std::fstream &file)
Definition: Classifier.cpp:303
Float getMaximumLikelihood() const
Definition: Classifier.cpp:177
This is the main base class that all GRT Classification algorithms should inherit from...
bool loadBaseSettingsFromFile(std::fstream &file)
Definition: MLBase.cpp:398
virtual bool setNullRejectionCoeff(Float nullRejectionCoeff)
Definition: Classifier.cpp:236
virtual bool reset()
Definition: Classifier.cpp:123
virtual bool clear()
Definition: MLBase.cpp:127
VectorFloat getClassDistances() const
Definition: Classifier.cpp:213
static Vector< std::string > getRegisteredClassifiers()
Definition: Classifier.cpp:58
VectorFloat getClassLikelihoods() const
Definition: Classifier.cpp:208
std::map< std::string, Classifier *(*)() > StringClassifierMap
Definition: Classifier.h:250
bool enableNullRejection(bool useNullRejection)
Definition: Classifier.cpp:231
Definition: Vector.h:41
virtual bool clear()
Definition: Classifier.cpp:142
Classifier * createNewInstance() const
Definition: Classifier.cpp:37
const Classifier & getBaseClassifier() const
Definition: Classifier.cpp:252