KSquare Utilities
TrainingProcess2.cpp
Go to the documentation of this file.
1 #include "FirstIncludes.h"
2 #include <stdio.h>
3 #include <string>
4 #include <sstream>
5 #include <ctype.h>
6 #include <fstream>
7 #include <iostream>
8 #include <map>
9 #include <vector>
10 #ifdef WIN32
11 #include <ostream>
12 #include <windows.h>
13 #else
14 #include <fstream>
15 #endif
16 #include "MemoryDebug.h"
17 using namespace std;
18 
19 
20 #include "GlobalGoalKeeper.h"
21 #include "KKBaseTypes.h"
22 #include "KKException.h"
23 #include "KKStr.h"
24 #include "OSservices.h"
25 #include "RBTree.h"
26 using namespace KKB;
27 
28 
29 #include "TrainingProcess2.h"
30 #include "ClassAssignments.h"
31 #include "ClassProb.h"
32 #include "DuplicateImages.h"
33 #include "FactoryFVProducer.h"
34 #include "FeatureFileIO.h"
35 #include "FeatureNumList.h"
36 #include "FeatureVector.h"
38 #include "MLClass.h"
41 #include "Model.h"
42 #include "ModelDual.h"
43 #include "ModelOldSVM.h"
44 #include "ModelKnn.h"
45 #include "ModelSvmBase.h"
46 #include "TrainingClass.h"
48 using namespace KKMLL;
49 
50 
51 
52 TrainingProcess2Ptr TrainingProcess2::LoadExistingTrainingProcess (const KKStr& configRootName,
53  VolConstBool& cancelFlag,
54  RunLog& log
55  )
56 {
57  TrainingProcess2Ptr trainer = NULL;
58 
59  KKStr configFileFullName = TrainingConfiguration2::GetEffectiveConfigFileName (configRootName);
60 
61  KKStr savedModelName = osRemoveExtension (configFileFullName) + ".Save";
62  if (!osFileExists (savedModelName))
63  {
64  log.Level (-1) << endl
65  << "TrainingProcess2::LoadExistingTrainingProcess ***ERROR*** SaveFile[" << savedModelName << "] does not exist." << endl
66  << endl;
67  return NULL;
68  }
69 
70  XmlStreamPtr stream = new XmlStream (savedModelName, log);
71  XmlTokenPtr t = stream->GetNextToken (cancelFlag, log);
72  while (t && (typeid (*t) != typeid (XmlElementTrainingProcess2)))
73  {
74  delete t;
75  t = stream->GetNextToken (cancelFlag, log);
76  }
77 
78  if (t)
79  trainer = dynamic_cast<XmlElementTrainingProcess2Ptr> (t)->TakeOwnership ();
80 
81  delete stream; stream = NULL;
82  delete t; t = NULL;
83 
84  return trainer;
85 } /* LoadExistingTrainingProcess */
86 
87 
88 
89 
90 TrainingProcess2Ptr TrainingProcess2::CreateTrainingProcess
91  (TrainingConfiguration2Const* config,
92  bool checkForDuplicates,
93  WhenToRebuild whenToRebuild,
94  bool saveTrainedModel,
95  VolConstBool& cancelFlag,
96  RunLog& log
97  )
98 {
99  log.Level (10) << "TrainingProcess2::CreateTrainingProcess." << endl;
100 
101  bool weShouldRebuild = false;
102  TrainingProcess2Ptr trainer = NULL;
103 
105  {
106  trainer = LoadExistingTrainingProcess (config->ConfigRootName (), cancelFlag, log);
107  if (!trainer)
108  {
109  log.Level (-1) << endl
110  << "TrainingProcess2::CreateTrainingProcess ***ERROR*** Could not load existing save model." << endl
111  << endl;
112  }
113  else if (trainer->Abort ())
114  {
115  log.Level (-1) << endl
116  << "TrainingProcess2::CreateTrainingProcess ***ERROR*** Existing Save model is Invalid." << endl
117  << endl;
118  delete trainer;
119  trainer = NULL;
120  }
121 
122  return trainer;
123  }
124 
125  FeatureVectorListPtr trainingExamples = NULL;
126  KKStr configRootName = config->ConfigRootName ();
127  KKStr configFileFullName = TrainingConfiguration2::GetEffectiveConfigFileName (configRootName);
128  DateTime configFileTimeStamp = KKB::osGetFileDateTime (configFileFullName);
129  DateTime latestTrainingImageTimeStamp;
130  bool changesMadeToTrainingLibrary = true;
131 
133  {
134  trainingExamples = ExtractTrainingClassFeatures (config, latestTrainingImageTimeStamp, changesMadeToTrainingLibrary, cancelFlag, log);
135  if (!trainingExamples)
136  {
137  log.Level (-1) << endl
138  << "TrainingProcess2::CreateTrainingProcess ***ERROR*** Failed to load training data." << endl
139  << endl;
140  return NULL;
141  }
142 
143  if (cancelFlag)
144  {
145  delete trainingExamples;
146  trainingExamples = NULL;
147  }
148  else
149  {
150  trainer = new TrainingProcess2 ();
151  trainer->BuildTrainingProcess (config,
152  whenToRebuild,
153  trainingExamples,
154  true, /**< true = Take ownership of 'trainingExamples'. */
155  checkForDuplicates,
156  cancelFlag,
157  log
158  );
159  if (saveTrainedModel && (!cancelFlag) && (!trainer->Abort ()))
160  trainer->SaveTrainingProcess (log);
161  }
162 
163  trainingExamples = NULL;
164 
165  return trainer;
166  }
167 
168  trainer = LoadExistingTrainingProcess (config->ConfigRootName (), cancelFlag, log);
169  if ((trainer) && (trainer->Abort ()))
170  {
171  delete trainer;
172  trainer = NULL;
173  }
174 
175  if (trainer && (whenToRebuild == TrainingProcess2::WhenToRebuild::NotValid))
176  {
177  // Model is valid and 'whenToRebuild' specifies to use existing model as long as valid.
178  log.Level (20) << "CreateTrainingProcess Existing model[" << configFileFullName << "] Valid!" << endl;
179  return trainer;
180  }
181 
182  bool rebuildTrainingProcess = false;
183  if (!trainer)
184  rebuildTrainingProcess = true;
185 
186  else if ((trainer->BuildDateTime () < configFileTimeStamp) ||
187  (trainer->BuildDateTime () < latestTrainingImageTimeStamp)
188  )
189  {
190  log.Level (-1) << endl
191  << "TrainingProcess2::CreateTrainingProcess ***WARNING*** Saved model was not up to date; we will rebuild." << endl
192  << endl;
193  rebuildTrainingProcess = true;
194  }
195 
196  if (rebuildTrainingProcess)
197  {
198  delete trainer;
199  trainer = NULL;
200  trainingExamples = ExtractTrainingClassFeatures (config, latestTrainingImageTimeStamp, changesMadeToTrainingLibrary, cancelFlag, log);
201  if (!trainingExamples)
202  {
203  log.Level (-1) << endl
204  << "TrainingProcess2::CreateTrainingProcess ***ERROR*** Failed to load training data." << endl
205  << endl;
206  return NULL;
207  }
208 
209  if (cancelFlag)
210  {
211  log.Level (-1) << "TrainingProcess2::CreateTrainingProcess Canceled !!!" << endl;
212  delete trainingExamples;
213  trainingExamples = NULL;
214  return NULL;
215  }
216 
217  trainer = new TrainingProcess2 ();
218  trainer->BuildTrainingProcess (config,
219  whenToRebuild,
220  trainingExamples,
221  true, /**< true = Take ownership of 'trainingExamples'. */
222  checkForDuplicates,
223  cancelFlag,
224  log
225  );
226  if (saveTrainedModel && (!cancelFlag) && (!trainer->Abort ()))
227  trainer->SaveTrainingProcess (log);
228 
229  // Since 'trainer' now has ownership to 'trainingExamples' we will set 'trainingExamples' to NULL
230  trainingExamples = NULL;
231  return trainer;
232  }
233 
234  else
235  {
236  // The model that we loaded is valid and up-to-date; we can use as is and discard the training data we just loaded.
237  delete trainingExamples;
238  trainingExamples = NULL;
239 
240  log.Level (10) << "TrainingProcess2::CreateTrainingProcess Existing saved model[" << trainer->ConfigFileName () << "]." << endl;
241  return trainer;
242  }
243 } /* CreateTrainingProcess */
244 
245 
246 
247 
248 TrainingProcess2Ptr TrainingProcess2::CreateTrainingProcessForLevel (TrainingConfiguration2Const* config,
249  kkuint32 level,
250  VolConstBool& cancelFlag,
251  RunLog& log
252  )
253 {
254  log.Level (20) << "TrainingProcess2::CreateTrainingProcessForLevel" << endl;
255  if (config == NULL)
256  {
257  KKStr errMsg = "CreateTrainingProcessForLevel ***ERROR*** Configuration file was not provided.";
258  log.Level (-1) << endl << errMsg << endl << endl;
259  return NULL;
260  }
261 
262  DateTime latestTrainingImageTimeStamp;
263  bool changesMadeToTrainingLibrary = false;
264  FactoryFVProducerPtr fvFactoryProducer = config->FvFactoryProducer (log);
265 
266  FeatureVectorListPtr trainingExamples
267  = ExtractTrainingClassFeatures (config, latestTrainingImageTimeStamp, changesMadeToTrainingLibrary, cancelFlag, log);
268  if (!trainingExamples)
269  {
270  log.Level (-1) << endl
271  << "TrainingProcess2::CreateTrainingProcessForLevel ***ERROR*** Failed to load training data." << endl
272  << endl;
273  return NULL;
274  }
275 
276 
277  {
278  DuplicateImagesPtr dupDetector = new DuplicateImages (trainingExamples->FileDesc (), log);
279  dupDetector->PurgeDuplicates (trainingExamples, true, NULL);
280  delete dupDetector;
281  dupDetector = NULL;
282  }
283 
284  MLClassListPtr mlClasses = config->ExtractClassList ();
285 
286  {
287  // We need to build data that is specific to the specified _level.
288  FeatureVectorListPtr newExamples = trainingExamples->ExtractExamplesForHierarchyLevel (level);
289  delete trainingExamples;
290  trainingExamples = newExamples;
291  newExamples = NULL;
292  }
293 
294  TrainingConfiguration2Ptr levelSpecificConfig = config->GenerateAConfiguraionForAHierarchialLevel (level, log);
295 
297  trainer->BuildTrainingProcess (levelSpecificConfig,
299  trainingExamples,
300  true, /**< true = Take ownership of 'trainingExamples' */
301  false,
302  cancelFlag,
303  log
304  );
305 
306  delete levelSpecificConfig;
307  levelSpecificConfig = NULL;
308  trainingExamples = NULL;
309 
310  return trainer;
311 } /* CreateTrainingProcessForLevel */
312 
313 
314 
315 
316 TrainingProcess2Ptr TrainingProcess2::CreateTrainingProcessForLevel (const KKStr& configFileName,
317  kkuint32 level,
318  VolConstBool& cancelFlag,
319  RunLog& log
320  )
321 {
322  log.Level (20) << "TrainingProcess2::CreateTrainingProcessForLevel configFileName: " << configFileName << endl;
323 
324  TrainingProcess2Ptr trainer = NULL;
325 
326  TrainingConfiguration2Ptr config = new TrainingConfiguration2 ();
327  config->Load (configFileName, true, log);
328  if (!config->FormatGood ())
329  {
330  log.Level (-1) << endl
331  << "TrainingProcess2::CreateTrainingProcessForLevel ***ERROR*** Config File[" << configFileName << "] Format is invalid." << endl
332  << endl;
333  }
334  else
335  {
336  trainer = CreateTrainingProcessForLevel (config, level, cancelFlag, log);
337  }
338  delete config;
339  config = NULL;
340 
341  return trainer;
342 } /* CreateTrainingProcessForLevel */
343 
344 
345 
346 
347 
348 
349 
350 
352  (TrainingConfiguration2Const* config,
353  FeatureVectorListPtr trainingExamples,
354  bool takeOwnershipOfTrainingExamples,
355  bool featuresAlreadyNormalized,
356  VolConstBool& cancelFlag,
357  RunLog& log
358  )
359 {
360  log.Level (20) << "TrainingProcess2::TrainingProcess2" << endl;
361 
362  if (!config)
363  {
364  log.Level (-1) << endl
365  << "TrainingProcess2::CreateTrainingProcessFromTrainingExamples ***ERROR*** No Configuration File Specified." << endl
366  << endl;
367  return NULL;
368  }
369 
370  else if (!config->FormatGood ())
371  {
372  log.Level (-1) << endl
373  << "TrainingProcess2::CreateTrainingProcessFromTrainingExamples ***ERROR*** Format error in Configuration File[" << config->FileName () << "]." << endl
374  << endl;
375  return NULL;
376  }
377 
378  else
379  {
380  TrainingProcess2Ptr trainer = new TrainingProcess2 ();
381  trainer->FeaturesAlreadyNormalized (featuresAlreadyNormalized);
382  trainer->BuildTrainingProcess (config,
383  WhenToRebuild::AlwaysRebuild,
384  trainingExamples,
385  takeOwnershipOfTrainingExamples,
386  true,
387  cancelFlag,
388  log
389  );
390  return trainer;
391  }
392 } /* CreateTrainingProcessFromTrainingExamples */
393 
394 
395 
396 
397 
398 
399 
400 
401 //*****************************************************************************************
402 //* Will build a new model from scratch for the specified class level. Will also remove *
403 //* duplicates. *
404 //*****************************************************************************************
406 
407  abort (false),
408  buildDateTime (DateTime (1900,1,1,0, 0, 0)),
409  config (NULL),
410  configOurs (NULL),
411  configFileName (""),
412  configFileNameSpecified (""),
413  duplicateCount (0),
414  duplicateDataCount (0),
415  featuresAlreadyNormalized (false),
416  fileDesc (NULL),
417  fvFactoryProducer (NULL),
418  mlClasses (NULL),
419  model (NULL),
420  priorProbability (NULL),
421  report (NULL),
422  savedModelName (),
423  subTrainingProcesses (NULL),
424  trainingExamples (NULL),
425  weOwnTrainingExamples (true),
426  weOwnMLClasses (true)
427 {
428 }
429 
430 
431 
432 
433 
435 {
436  cout << "TrainingProcess2::~TrainingProcess2 for Config[" << configFileName << "]" << endl;
437 
438  try
439  {
440  delete model;
441  model = NULL;
442  }
443  catch (...)
444  {
445  cerr << "TrainingProcess2::~TrainingProcess2 ***ERROR*** Exception deleting model." << endl;
446  }
447  model = NULL;
448 
449 
450  delete subTrainingProcesses; subTrainingProcesses = NULL;
451  delete priorProbability; priorProbability = NULL;
452 
453  if (weOwnTrainingExamples)
454  {
455  delete trainingExamples;
456  trainingExamples = NULL;
457  }
458 
459  if (weOwnMLClasses)
460  {
461  delete mlClasses; mlClasses = NULL;
462  }
463 
464  delete configOurs;
465  configOurs = NULL;
466 }
467 
468 
469 
470 
472 {
473  kkint32 memoryConsumedEstimated = sizeof (TrainingProcess2)
474  + configFileName.MemoryConsumedEstimated ()
475  + configFileNameSpecified.MemoryConsumedEstimated ()
476  + savedModelName.MemoryConsumedEstimated ();
477 
478  if (configOurs)
479  memoryConsumedEstimated += configOurs->MemoryConsumedEstimated ();
480 
481  if (weOwnTrainingExamples && (trainingExamples != NULL))
482  memoryConsumedEstimated += trainingExamples->MemoryConsumedEstimated ();
483 
484  if ((mlClasses != NULL) && weOwnMLClasses)
485  memoryConsumedEstimated += mlClasses->MemoryConsumedEstimated ();
486 
487  if (model)
488  memoryConsumedEstimated += model->MemoryConsumedEstimated ();
489 
490  if (priorProbability)
491  memoryConsumedEstimated += priorProbability->MemoryConsumedEstimated ();
492 
493  if (subTrainingProcesses)
494  memoryConsumedEstimated += subTrainingProcesses->MemoryConsumedEstimated ();
495 
496  return memoryConsumedEstimated;
497 } /* MemoryConsumedEstimated */
498 
499 
500 
501 
502 
503 
504 
505 
506 void TrainingProcess2::BuildTrainingProcess (TrainingConfiguration2Const* _config,
507  WhenToRebuild _whenToRebuild,
508  FeatureVectorListPtr _trainingExamples,
509  bool _takeOwnerShipOfTrainingExamples,
510  bool _checkForDuplicates,
511  VolConstBool& _cancelFlag,
512  RunLog& _log
513  )
514 {
515  if (_cancelFlag)
516  return;
517 
518  _log.Level (20) << "TrainingProcess2 Building Support Vector Machine";
519 
520  if (weOwnTrainingExamples)
521  {
522  delete trainingExamples;
523  trainingExamples = NULL;
524  }
525 
526  configOurs = _config->Duplicate ();
527  config = configOurs;
528 
529  configFileName = config->ConfigFileNameSpecified ();
530 
531  fvFactoryProducer = _config->FvFactoryProducer (_log);
532 
533  trainingExamples = _trainingExamples;
534  weOwnTrainingExamples = _takeOwnerShipOfTrainingExamples;
535 
536  if (_checkForDuplicates)
537  CheckForDuplicates (true, _log);
538 
539  // trainer->ReportTraningClassStatistics (*report);
540  CreateModelsFromTrainingData (_whenToRebuild,
541  _cancelFlag,
542  _log
543  );
544  if (Abort ())
545  {
546  _log.Level (-1) << endl
547  << "TrainingProcess2::BuildTrainingProcess ***ERROR*** Aborted During Model Creation ***" << endl
548  << endl;
549  return;
550  }
551 } /* BuildTrainingProcess */
552 
553 
554 
555 
557 {
559  savedModelName = osRemoveExtension (configFileName) + ".Save";
560  log.Level (20) << "TrainingProcess2::SaveTrainingProcess Saving trained model: " << savedModelName << endl;
561 
562  ofstream f (savedModelName.Str ());
563  if (!f.is_open ())
564  {
565  log.Level (-1) << endl
566  << "TrainingProcess2::SaveTrainingProcess ***ERROR*** Could not open SavedModelName[" << savedModelName << "]." << endl
567  << endl;
568  return;
569  }
570 
571  this->WriteXML ("TrainingProcess2", f);
572 
573  f.close ();
574 } /* SaveTrainingProcess */
575 
576 
577 
578 
579 
580 ModelOldSVMPtr TrainingProcess2::OldSVMModel () const
581 {
583  return dynamic_cast<ModelOldSVMPtr> (model);
584  else
585  return NULL;
586 }
587 
588 
589 
591 {
592  if (model)
593  return model->Description ();
594  else
595  return "No Model";
596 }
597 
598 
599 
601 {
602  if (model)
603  return model->ModelType ();
604  else
606 }
607 
608 
609 
611 {
612  if (model)
613  return model->ModelTypeStr ();
614  else
615  return "No_Model";
616 }
617 
618 
619 
621 {
622  ModelOldSVMPtr oldSvmModel = OldSVMModel ();
623  if (oldSvmModel)
624  return oldSvmModel->SvmModel ();
625  else
626  return NULL;
627 }
628 
629 
630 
631 
632 
633 
634 void TrainingProcess2::CheckForDuplicates (bool allowDupsInSameClass,
635  RunLog& log
636  )
637 {
638  // Lets check for duplicate trainingExamples in training data. Just to get a count, no other reason
639  DuplicateImages dupDetector (trainingExamples, log);
640  duplicateCount = dupDetector.DuplicateCount ();
641  duplicateDataCount = dupDetector.DuplicateDataCount ();
642  if ((allowDupsInSameClass && (duplicateDataCount > 0)) ||
643  (allowDupsInSameClass && (duplicateCount > 0))
644  )
645  {
646  log.Level (-1) << endl
647  << "ConstructOneVsOneModel *** WARNING *** Duplicates Detected in Training Data" << endl
648  << " DuplicateCount [" << duplicateCount << "]" << endl
649  << " DuplicateDataCount[" << duplicateDataCount << "]" << endl
650  << endl;
651 
652  if (report)
653  dupDetector.ReportDuplicates (*report);
654 
655  dupDetector.PurgeDuplicates (trainingExamples, allowDupsInSameClass, report);
656  }
657 } /* CheckForDuplicates */
658 
659 
660 
661 
662 FeatureVectorListPtr TrainingProcess2::ExtractFeatures (TrainingConfiguration2ConstPtr config,
663  MLClassList& mlClasses,
664  const TrainingClassPtr trainingClass,
665  DateTime& latestTimeStamp,
666  bool& changesMade,
667  VolConstBool& cancelFlag,
668  RunLog& log
669  )
670 {
671  log.Level (10) << "TrainingProcess2::ExtractFeatures ClassName: " << trainingClass->Name () << endl;
672  FactoryFVProducerPtr fvFactoryProducer = config->FvFactoryProducer (log);
673 
674  FeatureFileIOPtr driver = fvFactoryProducer->DefaultFeatureFileIO ();
675  FeatureVectorListPtr trainingExamples = fvFactoryProducer->ManufacturFeatureVectorList (true, log);
676 
677  bool abort = false;
678 
679  for (kkuint32 dirIdx = 0; dirIdx < trainingClass->DirectoryCount (); ++dirIdx)
680  {
681  KKStr expDirName = trainingClass->ExpandedDirectory (config->RootDir (), dirIdx);
682 
683  log.Level (30) << "TrainingProcess2::ExtractFeatures - Extracting Features Directory[" << expDirName << "], file[" << trainingClass->FeatureFileName () << "]." << endl;
684 
685  KKStr featureFileName = osMakeFullFileName (expDirName, trainingClass->FeatureFileName ());
686 
687  FeatureVectorListPtr extractedExamples = NULL;
688 
689  try
690  {
691  extractedExamples = driver->FeatureDataReSink
692  (fvFactoryProducer,
693  expDirName,
694  trainingClass->FeatureFileName (),
695  trainingClass->MLClass (),
696  true, // Make all entries in this directory 'trainingClass->MLClass ()'
697  mlClasses,
698  cancelFlag,
699  changesMade,
700  latestTimeStamp,
701  log
702  );
703 
704  }
705  catch (const std::exception& e1)
706  {
707  log.Level (-1) << endl
708  << "TrainingProcess2::ExtractFeatures ***ERROR*** Exception occurred calling 'FeatureDataReSink'" << endl
709  << e1.what () << endl
710  << endl;
711  extractedExamples = NULL;
712  abort = true;
713  }
714  catch (...)
715  {
716  log.Level (-1) << endl
717  << "TrainingProcess2::ExtractFeatures ***ERROR*** Exception occurred calling 'FeatureDataReSink'" << endl
718  << endl;
719  extractedExamples = NULL;
720  abort = true;
721  }
722 
723  if ((extractedExamples == NULL) || (extractedExamples->QueueSize () < 1))
724  {
725  log.Level (-1) << endl
726  << "ExtractFeatures *** No Training Examples Found ***"
727  << " Class [" << trainingClass->Name () << "]"
728  << " Directory[" << expDirName << "]"
729  << endl;
730  abort = true;
731  }
732 
733  if (extractedExamples)
734  {
735  trainingExamples->AddQueue (*extractedExamples);
736  extractedExamples->Owner (false);
737  delete extractedExamples;
738  extractedExamples = NULL;
739  }
740  }
741 
742  log.Level (30) << "TrainingProcess2::ExtractFeatures Exiting" << endl;
743 
744  if (abort)
745  {
746  delete trainingExamples;
747  trainingExamples = NULL;
748  }
749 
750  return trainingExamples;
751 } /* ExtractFeatures */
752 
753 
754 
755 
757  DateTime& latestImageTimeStamp,
758  bool& changesMadeToTrainingLibraries,
759  VolConstBool& cancelFlag,
760  RunLog& log
761  )
762 {
763  log.Level (10) << "TrainingProcess2::ExtractTrainingClassFeatures - Starting." << endl;
764 
765  changesMadeToTrainingLibraries = false;
766  bool abort = false;
767 
768  FactoryFVProducerPtr fvFactoryProdcer = config->FvFactoryProducer (log);
769 
770  FeatureVectorListPtr trainingExamples = fvFactoryProdcer->ManufacturFeatureVectorList (true, log);
771 
772  //****************************************************************************
773  // Make sure that there are no existing *.data files that we are going to use.
774  // We need to do this in a separate pass because more than one entry may refer
775  // to the same Class and hence the same *.data file.
776 
777 
778  //***********************************************************
779  // We will first extract the Raw features from each Class
780 
781  const TrainingClassList& trainingClasses = config->TrainingClasses ();
782 
783  bool weOwnMlClasses = false;
784  MLClassListPtr mlClasses = config->MlClasses ();
785  if (!mlClasses)
786  {
787  mlClasses = new MLClassList ();
788  weOwnMlClasses = true;
789  }
790 
791 
792  DateTime latestTimeStamp;
793  bool changesMadeToThisTrainingClass = false;
794 
795  for (auto tcIDX: trainingClasses)
796  {
797  if (cancelFlag || abort)
798  break;
799 
800  const TrainingClassPtr trainingClass = tcIDX;
801 
802  log.Level (20) << "TrainingProcess2::ExtractTrainingClassFeatures Starting on Class[" << trainingClass->Name () << "]." << endl;
803 
804  FeatureVectorListPtr examplesThisClass
805  = ExtractFeatures (config, *mlClasses, trainingClass, latestTimeStamp, changesMadeToThisTrainingClass, cancelFlag, log);
806 
807  if (latestTimeStamp > latestImageTimeStamp)
808  latestImageTimeStamp = latestTimeStamp;
809 
810  if (changesMadeToThisTrainingClass)
811  changesMadeToTrainingLibraries = true;
812 
813  if (!examplesThisClass)
814  {
815  abort = true;
816  log.Level (-1) << "TrainingProcess2::ExtractTrainingClassFeatures ***ERROR*** No examples returned by 'ExtractTrainingClassFeatures': " << trainingClass->Name () << endl;
817  }
818  else
819  {
820  trainingExamples->AddQueue (*examplesThisClass);
821  examplesThisClass->Owner (false);
822  delete examplesThisClass;
823  examplesThisClass = NULL;
824  }
825  }
826 
827  // DONE Extracting Raw features from All classes.
828  if ((!abort) && (!cancelFlag))
829  {
830  const TrainingClassPtr noiseTC = config->NoiseTrainingClass ();
831  if (noiseTC)
832  {
833  FeatureVectorListPtr examplesThisClass =
834  ExtractFeatures (config,
835  *mlClasses,
836  noiseTC,
837  latestTimeStamp,
838  changesMadeToThisTrainingClass,
839  cancelFlag,
840  log
841  );
842  if (latestTimeStamp > latestImageTimeStamp)
843  latestImageTimeStamp = latestTimeStamp;
844 
845  if (changesMadeToThisTrainingClass)
846  changesMadeToTrainingLibraries = true;
847  if (!examplesThisClass)
848  {
849  log.Level (-1) << endl
850  << "TrainingProcess2::ExtractTrainingClassFeatures ***ERROR*** Loading NoiseClass[" << noiseTC->Name () << "]." << endl
851  << endl;
852  abort = true;
853  }
854  else
855  {
856  trainingExamples->AddQueue (*examplesThisClass);
857  examplesThisClass->Owner (false);
858  delete examplesThisClass;
859  examplesThisClass = NULL;
860  }
861  }
862 
863  trainingExamples->RandomizeOrder ();
864 
865  if (weOwnMlClasses)
866  {
867  delete mlClasses;
868  mlClasses = NULL;
869  }
870  }
871 
872  if (abort)
873  {
874  delete trainingExamples;
875  trainingExamples = NULL;
876  log.Level (10) << "TrainingProcess2::ExtractTrainingClassFeatures Loading of training data failed." << endl;
877  }
878  else
879  {
880  log.Level (20) << "TrainingProcess2::ExtractTrainingClassFeatures Exiting" << endl;
881  }
882  return trainingExamples;
883 } /* ExtractTrainingClassFeatures */
884 
885 
886 
887 
888 
890 {
891  report << endl
892  << "Training Class Statistics" << endl
893  << endl;
894  trainingExamples->PrintClassStatistics (report);
895 } /* ReportTraningClassStatistics */
896 
897 
898 
899 
900 void TrainingProcess2::AddImagesToTrainingLibray (FeatureVectorList& trainingExamples,
901  FeatureVectorList& examplesToAdd,
902  RunLog& log
903  )
904 {
905  kkint32 idx = 0;
906 
907  kkint32 numOfImages = examplesToAdd.QueueSize ();
908 
909  FeatureVectorPtr example = NULL;
910 
911  for (idx = 0; idx < numOfImages; idx++)
912  {
913  example = examplesToAdd.IdxToPtr (idx);
914 
915  if (example->FeatureDataValid ())
916  {
917  trainingExamples.PushOnBack (example);
918  }
919  else
920  {
921  log.Level (-1) << endl
922  << "TrainingProcess2::AddImagesToTrainingLibray ***ERROR*** " << endl
923  << " Example[" << example->ExampleFileName () << "], Class[" << example->ClassName () << "] Has Invalid Feature Data."
924  << endl << endl;
925 
926  if (report)
927  {
928  *report << "** ERROR **, Image[" << example->ExampleFileName () << "], Class[" << example->ClassName () << "]"
929  << " Has Invalid Feature Data."
930  << endl;
931  }
932  }
933  }
934 } /* AddImagesToTrainingLibray */
935 
936 
937 
939  VolConstBool& cancelFlag,
940  RunLog& log
941  )
942 {
943  log.Level (20) << "TrainingProcess2::CreateModelsFromTrainingData Starting" << endl;
944 
945  if (config->ModelParameters () == NULL)
946  {
947  log.Level (-1) << endl
948  << "TrainingProcess2::CreateModelsFromTrainingData ***ERROR***" << endl
949  << endl
950  << " Parameters not specified in configuration file." << endl
951  << endl;
952  Abort (true);
953  return;
954  }
955 
956  if (!fvFactoryProducer)
957  fvFactoryProducer = config->FvFactoryProducer (log);
958 
959  if (!fileDesc)
960  fileDesc = fvFactoryProducer->FileDesc ();
961 
962  delete priorProbability;
963  priorProbability = trainingExamples->GetClassDistribution ();
964 
965  // Will Create the Appropriate Model class given 'config->ModelingMethod ()'.
967  osGetRootName (configFileName),
968  *(config->ModelParameters ()),
969  fvFactoryProducer,
970  cancelFlag,
971  log
972  );
973 
974  try
975  {
976  model->TrainModel (trainingExamples,
977  featuresAlreadyNormalized,
978  false, // false = 'model' We are not giving ownership of TrainingExdamples to model.
979  cancelFlag,
980  log
981  );
982  }
983  catch (const KKException& e)
984  {
985  log.Level (-1) << endl << endl
986  << "TrainingProcess2::CreateModelsFromTrainingData ***ERROR*** Exception occurred while running 'Model::TrainModel'." << endl
987  << " Exception[" << e.ToString () << endl
988  << endl;
989  Abort (true);
990  }
991  catch (...)
992  {
993  log.Level (-1) << endl << endl
994  << "TrainingProcess2::CreateModelsFromTrainingData ***ERROR*** Exception occurred while running 'Model::TrainModel'." << endl
995  << endl;
996  Abort (true);
997  }
998 
999  if (!model->ValidModel ())
1000  {
1001  Abort (true);
1002  }
1003 
1004  else if (cancelFlag)
1005  {
1006  Abort (true);
1007  }
1008 
1009  else
1010  {
1011  delete mlClasses;
1012  mlClasses = model->MLClassesNewInstance ();
1013 
1014  // Need to LOad Sub Processors.
1015  LoadSubClassifiers (whenToRebuild,
1016  false, /**< false = DON'T check for duplicates. */
1017  cancelFlag,
1018  log
1019  );
1020  }
1021 
1022  //trainingExamples->Owner (false);
1023  buildDateTime = osGetLocalDateTime ();
1024  log.Level (20) << "TrainingProcess2::CreateModelsFromTrainingData Ending" << endl;
1025 } /* CreateModelsFromTrainingData */
1026 
1027 
1028 
1029 
1030 
1031 
1032 
1033 ModelParamPtr TrainingProcess2::Parameters () const
1034 {
1035  if (!model)
1036  return NULL;
1037  else
1038  return model->Param ();
1039 } /* Parameters */
1040 
1041 
1042 
1043 
1045 {
1046  ModelOldSVMPtr oldSvmModel = OldSVMModel ();
1047  if (oldSvmModel)
1048  return oldSvmModel->NumOfSupportVectors ();
1049  else
1050  return 0;
1051 }
1052 
1053 
1054 
1056  kkint32& totalNumSVs
1057  )
1058 {
1059  numSVs = 0;
1060  totalNumSVs = 0;
1061  ModelOldSVMPtr oldSvmModel = OldSVMModel ();
1062  if (oldSvmModel)
1063  oldSvmModel->SupportVectorStatistics (numSVs, totalNumSVs);
1064 }
1065 
1066 
1067 
1068 
1069 TrainingProcess2Ptr TrainingProcess2::TrainingProcessLeft ()
1070 {
1071  if ((!model) || (model->ModelType () != Model::ModelTypes::Dual))
1072  return NULL;
1073  return dynamic_cast<ModelDualPtr>(model)->Trainer1 ();
1074 }
1075 
1076 
1077 
1079 {
1080  if ((!model) || (model->ModelType () != Model::ModelTypes::Dual))
1081  return NULL;
1082  return dynamic_cast<ModelDualPtr>(model)->Trainer2 ();
1083 }
1085 {
1086  if (model)
1087  return model->TrainingTime();
1088  else
1089  return 0.0;
1090 }
1091 
1092 
1093 
1094 
1096 {
1097  if (config)
1098  return config->ExtractFullHierachyOfClasses ();
1099 
1100  else if (mlClasses)
1101  return new MLClassList (*mlClasses);
1102 
1103  else
1104  return NULL;
1105 }
1106 
1107 
1108 
1109 
1110 /**
1111  @brief If there is a config file; will return a list of its FormatErrors ().
1112  */
1114 {
1115  if (config)
1116  return config->FormatErrorsWithLineNumbers ();
1117  else
1118  return VectorKKStr ();
1119 } /* ConfigFileFormatErrors */
1120 
1121 
1122 
1123 
1124 void TrainingProcess2::LoadSubClassifiers (WhenToRebuild whenToRebuild,
1125  bool checkForDuplicates,
1126  VolConstBool& cancelFlag,
1127  RunLog& log
1128  )
1129 {
1130  if (!config)
1131  {
1132  log.Level (-1) << endl << "TrainingProcess2::LoadSubClassifiers ***ERROR*** 'config' is not defines!!!!" << endl;
1133  Abort (true);
1134  return;
1135  }
1136 
1137  TrainingConfiguration2ListPtr subClassifiers = config->SubClassifiers ();
1138  if (!subClassifiers)
1139  {
1140  log.Level (10) << "TrainingProcess2::LoadSubClassifiers NO Sub-classifiers requested in 'config'." << endl;
1141  return;
1142  }
1143 
1144  delete subTrainingProcesses;
1145  subTrainingProcesses = new TrainingProcess2List (true);
1146 
1147  for (auto idx: *subClassifiers)
1148  {
1149  TrainingConfiguration2Ptr subClassifier = idx;
1150 
1151  KKStr subClassifierName = subClassifier->ConfigRootName ();
1152 
1153  log.Level (20) << "TrainingProcess2::LoadSubClassifiers Loading TrainingProcess2[" << subClassifierName << "]" << endl;
1154 
1155  TrainingProcess2Ptr tp =
1156  TrainingProcess2::CreateTrainingProcess (subClassifier,
1157  checkForDuplicates,
1158  whenToRebuild,
1159  true, /**< true = saveTrainedModel when model has to be trained. */
1160  cancelFlag,
1161  log
1162  );
1163  subTrainingProcesses->PushOnBack (tp);
1164  if (tp->Abort ())
1165  {
1166  log.Level (-1) << endl
1167  << "TrainingProcess2::LoadSubClassifiers ***ERROR*** Loading SubClassifier[" << subClassifierName << "]." << endl
1168  << endl;
1169  Abort (true);
1170  break;
1171  }
1172 
1173  else if (cancelFlag)
1174  {
1175  log.Level (-1) << "TrainingProcess2::LoadSubClassifiers Building of sub-classifiers canceled." << endl;
1176  Abort (true);
1177  break;
1178  }
1179  }
1180 } /* LoadSubClassifiers */
1181 
1182 
1183 
1184 
1185 void TrainingProcess2::WriteXML (const KKStr& varName,
1186  ostream& o
1187  ) const
1188 {
1189  XmlTag startTag ("TrainingProcess2", XmlTag::TagTypes::tagStart);
1190  if (!varName.Empty ())
1191  startTag.AddAtribute ("VarName", varName);
1192  startTag.WriteXML (o);
1193  o << endl;
1194 
1195  XmlElementDateTime::WriteXML (buildDateTime, "BuildDateTime", o);
1196 
1197  configFileNameSpecified.WriteXML ("ConfigFileNameSpecified", o);
1198  configFileName.WriteXML ("ConfigFileName", o);
1199 
1200  if (config)
1201  config->WriteXML ("Config", o);
1202 
1203  XmlElementBool::WriteXML (featuresAlreadyNormalized, "FeaturesAlreadyNormalized", o);
1204  if (fvFactoryProducer)
1205  fvFactoryProducer->Name ().WriteXML ("FvFactoryProducer", o);
1206 
1207  if (mlClasses)
1208  XmlElementMLClassNameList::WriteXML (*mlClasses, "MLClasses", o);
1209 
1210  if (model)
1211  model->WriteXML ("Model", o);
1212 
1213  if (priorProbability)
1214  priorProbability->WriteXML ("PriorProbability", o);
1215 
1216  if (subTrainingProcesses)
1217  {
1218  VectorKKStr subProcessorsNameList;
1219  for (auto idx: *subTrainingProcesses)
1220  {
1221  subProcessorsNameList.push_back (osGetRootName (idx->ConfigFileName ()));
1222  }
1223 
1224  XmlElementVectorKKStr::WriteXML (subProcessorsNameList, "SubTrainingProcesses", o);
1225  }
1226 
1227 
1228  XmlTag endTag ("TrainingProcess2", XmlTag::TagTypes::tagEnd);
1229  endTag.WriteXML (o);
1230  o << endl;
1231 } /* WriteXML */
1232 
1233 
1234 
1235 
1236 
1238  XmlTagConstPtr tag,
1239  VolConstBool& cancelFlag,
1240  RunLog& log
1241  )
1242 {
1243  log.Level (20) << "TrainingProcess2::ReadXML" << endl;
1244 
1245  VectorKKStr* subProcessorsNameList = NULL;
1246 
1247  delete configOurs;
1248  configOurs = NULL;
1249 
1250  config = NULL;
1251  fileDesc = NULL;
1252  fvFactoryProducer = NULL;
1253 
1254  if (weOwnMLClasses)
1255  {
1256  delete mlClasses;
1257  mlClasses = NULL;
1258  }
1259 
1260  delete model; model = NULL;
1261  delete priorProbability; priorProbability = NULL;
1262 
1263  delete subTrainingProcesses;
1264  subTrainingProcesses = NULL;
1265 
1266  if (weOwnTrainingExamples)
1267  delete trainingExamples;
1268  trainingExamples = NULL;
1269 
1270  bool errorsFound = false;
1271 
1272  XmlTokenPtr t = s.GetNextToken (cancelFlag, log);
1273  while (t)
1274  {
1276  {
1277  XmlElementPtr e = dynamic_cast<XmlElementPtr> (t);
1278  const KKStr& varName = e->VarName ();
1279  const KKStr& sectionName = e->SectionName ();
1280 
1281  if (varName.EqualIgnoreCase ("BuildDateTime") && (typeid (*e) == typeid (XmlElementDateTime)))
1282  buildDateTime = dynamic_cast<XmlElementDateTimePtr> (e)->Value ();
1283 
1284  else if (varName.EqualIgnoreCase ("ConfigFileNameSpecified") && (typeid (*e) == typeid (XmlElementKKStr)))
1285  configFileNameSpecified = *(dynamic_cast<XmlElementKKStrPtr> (e)->Value ());
1286 
1287  else if (varName.EqualIgnoreCase ("ConfigFileName") && (typeid (*e) == typeid (XmlElementKKStr)))
1288  configFileName = *(dynamic_cast<XmlElementKKStrPtr> (e)->Value ());
1289 
1290  else if (varName.EqualIgnoreCase ("Config") )
1291  {
1292  delete configOurs;
1293  XmlElementTrainingConfiguration2Ptr xmlConfigElement = dynamic_cast<XmlElementTrainingConfiguration2Ptr> (e);
1294  if (xmlConfigElement)
1295  {
1296  configOurs = xmlConfigElement->TakeOwnership ();
1297  config = configOurs;
1298  if ((config != NULL) && (fvFactoryProducer == NULL))
1299  {
1300  fvFactoryProducer = config->FvFactoryProducer (log);
1301  fileDesc = fvFactoryProducer->FileDesc ();
1302  }
1303  }
1304  }
1305 
1306  else if (varName.EqualIgnoreCase ("FvFactoryProducer"))
1307  {
1308  fvFactoryProducer = FactoryFVProducer::LookUpFactory (e->ToKKStr ());
1309  if (fvFactoryProducer)
1310  fileDesc = fvFactoryProducer->FileDesc ();
1311  }
1312 
1313  else if (varName.EqualIgnoreCase ("FeaturesAlreadyNormalized"))
1314  featuresAlreadyNormalized = e->ToBool ();
1315 
1316  else if (varName.EqualIgnoreCase ("MlClasses") && (typeid (*e) == typeid (XmlElementMLClassNameList)))
1317  {
1318  if (weOwnMLClasses)
1319  delete mlClasses;
1320  mlClasses = dynamic_cast<XmlElementMLClassNameListPtr> (e)->TakeOwnership ();
1321  weOwnMLClasses= true;
1322  }
1323 
1324  else if (varName.EqualIgnoreCase ("Model"))
1325  {
1326  delete model;
1327  XmlElementModelPtr xmlElementModel = dynamic_cast<XmlElementModelPtr> (e);
1328  if (xmlElementModel)
1329  {
1330  model = xmlElementModel->TakeOwnership ();
1331  if (!model->ValidModel ())
1332  {
1333  errorsFound = true;
1334  log.Level (-1) << endl
1335  << "TrainingProcess2::ReadXML ***ERROR*** Loaded Model is Invalid" << endl
1336  << endl;
1337  }
1338  }
1339  }
1340 
1341  else if (varName.EqualIgnoreCase ("PriorProbability") && (typeid (*e) == typeid (XmlElementClassProbList)))
1342  {
1343  delete priorProbability;
1344  priorProbability = dynamic_cast<XmlElementClassProbListPtr> (e)->TakeOwnership ();
1345  }
1346 
1347  else if (varName.EqualIgnoreCase ("SubTrainingProcesses") && (typeid (*e) == typeid (XmlElementVectorKKStr)))
1348  {
1349  delete subProcessorsNameList;
1350  subProcessorsNameList = dynamic_cast<XmlElementVectorKKStrPtr> (e)->TakeOwnership ();
1351  }
1352  else
1353  {
1354  log.Level (-1) << endl
1355  << "TrainingProcess2::ReadXML ***ERROR*** Unrecognized Element Section: " << e->NameTagStr () << endl
1356  << endl;
1357  }
1358  }
1359  delete t;
1360  if (cancelFlag)
1361  t = NULL;
1362  else
1363  t = s.GetNextToken (cancelFlag, log);
1364  }
1365  if (!cancelFlag)
1366  {
1367  if (!model)
1368  {
1369  log.Level (-1) << endl
1370  << "TrainingProcess2::ReadXML ***ERROR*** 'model' was not defined." << endl
1371  << endl;
1372  errorsFound = true;
1373  }
1374 
1375  if (mlClasses == NULL)
1376  {
1377  log.Level (-1) << endl
1378  << "TrainingProcess2::ReadXML ***ERROR*** 'mlClasses' was not defined." << endl
1379  << endl;
1380  errorsFound = true;
1381  }
1382 
1383  if (model && (model->MLClasses ()) && mlClasses)
1384  {
1385  if (*mlClasses != *(model->MLClasses ()))
1386  {
1387  log.Level (-1) << endl
1388  << "TrainingProcess2::ReadXML ***ERROR*** TrainingProcess2::mlClasses does not agree with model->MlClasses" << endl
1389  << endl;
1390  errorsFound = true;
1391  }
1392  }
1393 
1394  if (!errorsFound)
1395  {
1396  if (config)
1397  {
1398  if (config->SubClassifiers () != NULL)
1399  {
1400  LoadSubClassifiers (WhenToRebuild::NotValid,
1401  true, // CheckForDuplicates
1402  cancelFlag,
1403  log
1404  );
1405  }
1406  }
1407  }
1408 
1409  delete subProcessorsNameList;
1410  subProcessorsNameList = NULL;
1411  }
1412 
1413  if (errorsFound || cancelFlag)
1414  Abort (true);
1415 
1416  log.Level (20) << "TrainingProcess2::ReadXML Exiting!" << endl;
1417 } /* ReadXML */
1418 
1419 
1420 XmlFactoryMacro(TrainingProcess2)
1421 
1422 
1423 
1426 {
1427 }
1428 
1429 
1430 
1432 {
1433 }
1434 
1435 
1436 
1438 {
1439  kkint32 memoryConsumedEstimated = 0;
1440 
1441  TrainingProcess2List::const_iterator idx;
1442  for (idx = begin (); idx != end (); ++idx)
1443  {
1444  TrainingProcess2Ptr tp = *idx;
1445  if (tp)
1446  memoryConsumedEstimated += tp->MemoryConsumedEstimated ();
1447  }
1448  return memoryConsumedEstimated;
1449 }
void SupportVectorStatistics(kkint32 &numSVs, kkint32 &totalNumSVs)
const KKStr & FeatureFileName() const
Definition: TrainingClass.h:69
bool operator>(const DateTime &right) const
Definition: DateTime.cpp:1255
virtual void Load(const KKStr &_configFileName, bool _validateDirectories, RunLog &log)
XmlTag(const KKStr &_name, TagTypes _tagType)
Definition: XmlStream.cpp:586
Base class to all Learning Algorithms.
Definition: Model.h:82
void PushOnBack(FeatureVectorPtr image)
Overloading the PushOnBack function in KKQueue so we can monitor the Version and Sort Order...
void AddQueue(const FeatureVectorList &examplesToAdd)
Add the contents of &#39;examplesToAdd&#39; to the end of this list.
VectorKKStr ConfigFileFormatErrors() const
If there is a config file; will return a list of its FormatErrors ().
SVMModel * SVMModelPtr
Definition: SVMModel.h:557
bool EqualIgnoreCase(const char *s2) const
Definition: KKStr.cpp:1257
bool operator<(const DateTime &right) const
Definition: DateTime.cpp:1268
static ModelPtr CreateAModel(ModelTypes _modelType, const KKStr &_name, const ModelParam &_param, FactoryFVProducerPtr _factoryFVProducer, VolConstBool &_cancelFlag, RunLog &_log)
A factory method that will instantiate the appropriate class of training model based off &#39;_modelType&#39;...
Definition: Model.cpp:287
kkint32 MemoryConsumedEstimated() const
Definition: KKStr.cpp:766
KKStr osRemoveExtension(const KKStr &_fullFileName)
__int32 kkint32
Definition: KKBaseTypes.h:88
KKB::DateTime osGetLocalDateTime()
Returned the current local date and time.
ModelPtr TakeOwnership()
Definition: Model.h:470
FeatureVector * FeatureVectorPtr
Definition: Model.h:44
static TrainingProcess2Ptr CreateTrainingProcess(TrainingConfiguration2Const *config, bool checkForDuplicates, WhenToRebuild whenToRebuild, bool saveTrainedModel, VolConstBool &cancelFlag, RunLog &log)
const KKStr & ConfigRootName() const
MLClassListPtr ExtractFullHierachyOfClasses() const
Extracts the list of classes including ones from Sub-Classifiers.
virtual KKStr ToKKStr() const
Definition: XmlStream.h:314
virtual kkint32 MemoryConsumedEstimated() const
SVMModelPtr SvmModel() const
Definition: ModelOldSVM.h:92
ClassProbListPtr GetClassDistribution() const
virtual void ReadXML(XmlStream &s, XmlTagConstPtr tag, VolConstBool &cancelFlag, RunLog &log)
virtual void WriteXML(const KKStr &varName, std::ostream &o) const =0
kkint32 MemoryConsumedEstimated() const
Definition: ClassProb.cpp:68
TrainingConfiguration2Ptr GenerateAConfiguraionForAHierarchialLevel(kkuint32 level, RunLog &log) const
TrainingProcess2Ptr TrainingProcessRight()
KKStr osMakeFullFileName(const KKStr &_dirName, const KKStr &_fileName)
kkint32 MemoryConsumedEstimated() const
DuplicateImages(FeatureVectorListPtr _examples, RunLog &_log)
You would use this instance to search for duplicates in the list of &#39;examples&#39;.
ModelParamPtr Parameters() const
Model::ModelTypes ModelingMethod() const
static void WriteXML(const MLClassList &mlClassList, const KKStr &varName, std::ostream &o)
Definition: MLClass.cpp:1499
const FileDescPtr FileDesc() const
bool operator!=(const MLClassList &right) const
Definition: MLClass.cpp:1332
void SupportVectorStatistics(kkint32 &numSVs, kkint32 &totalNumSVs)
static FactoryFVProducerPtr LookUpFactory(const KKStr &name)
Returns pointer to existing instance of &#39;FactoryFVProducer&#39; that was previously registered with &#39;name...
kkint32 MemoryConsumedEstimated() const
Definition: MLClass.cpp:616
TrainingProcess2Ptr Trainer1()
Definition: ModelDual.h:98
static void WriteXML(const bool b, const KKStr &varName, std::ostream &o)
Definition: XmlStream.cpp:1035
KKStr operator+(const char *right) const
Definition: KKStr.cpp:3986
const KKB::DateTime & BuildDateTime() const
XmlElementDateTime * XmlElementDateTimePtr
Definition: XmlStream.h:560
kkuint32 DirectoryCount() const
XmlToken * XmlTokenPtr
Definition: XmlStream.h:18
unsigned __int32 kkuint32
Definition: KKBaseTypes.h:89
RunLog & Level(kkint32 _level)
Definition: RunLog.cpp:220
virtual void WriteXML(const KKStr &varName, std::ostream &o) const
kkint32 NumOfSupportVectors() const
KKStr ExpandedDirectory(const KKStr &rootDir, kkuint32 idx)
kkint32 DuplicateCount() const
DuplicateImages(FileDescPtr _fileDesc, RunLog &_log)
void BuildTrainingProcess(TrainingConfiguration2Const *_config, WhenToRebuild _whenToRebuild, FeatureVectorListPtr _trainingExamples, bool _takeOwnerShipOfTrainingExamples, bool _checkForDuplicates, VolConstBool &_cancelFlag, RunLog &_log)
Call this method just after you construct a new instance of "TrainingProcess2".
KKStr & operator=(KKStr &&src)
Definition: KKStr.cpp:1369
Container class for FeatureVector derived objects.
void WriteXML(const KKStr &varName, std::ostream &o) const
Definition: ClassProb.cpp:400
kkint32 NumOfSupportVectors() const
KKTHread * KKTHreadPtr
virtual bool ToBool() const
Definition: XmlStream.h:313
static TrainingProcess2Ptr CreateTrainingProcessForLevel(TrainingConfiguration2Const *config, kkuint32 level, VolConstBool &cancelFlag, RunLog &log)
XmlElement * XmlElementPtr
Definition: XmlStream.h:21
void AddAtribute(const KKStr &attributeName, const KKStr &attributeValue)
Definition: XmlStream.cpp:602
FeatureFileIO * FeatureFileIOPtr
Definition: FileDesc.h:45
virtual FeatureVectorListPtr ManufacturFeatureVectorList(bool owner, RunLog &runLog) const
Manufactures a instance of a derived &#39;FeatureVectorList&#39; class that is appropriate for containing ins...
static TrainingProcess2Ptr CreateTrainingProcessFromTrainingExamples(TrainingConfiguration2Const *config, FeatureVectorListPtr trainingExamples, bool takeOwnershipOfTrainingExamples, bool featuresAlreadyNormalized, VolConstBool &cancelFlag, RunLog &log)
Will Construct an instance using provided list of examples rather than loading from training library...
void ReportDuplicates(std::ostream &o)
static TrainingProcess2Ptr LoadExistingTrainingProcess(const KKStr &configRootName, VolConstBool &cancelFlag, RunLog &log)
Loads an existing TrainingProcess; if one does not exist will return NULL.
bool Empty() const
Definition: KKStr.h:241
XmlTag const * XmlTagConstPtr
Definition: KKStr.h:45
void WriteXML(const KKStr &varName, std::ostream &o) const
MLClassListPtr TakeOwnership()
Definition: MLClass.cpp:1491
Manages the reading and writing of objects in a simple XML format. For a class to be supported by Xml...
Definition: XmlStream.h:46
void ReportTraningClassStatistics(std::ostream &report)
ModelOldSVMPtr OldSVMModel() const
virtual kkint32 MemoryConsumedEstimated() const
Definition: Model.cpp:208
TrainingConfiguration2ListPtr SubClassifiers() const
ModelParamPtr Param() const
Definition: Model.h:183
static KKStr GetEffectiveConfigFileName(const KKStr &configFileName)
Determine the correct configuration file name.
void SaveTrainingProcess(RunLog &log)
Saves the built training model into the Save file in Xml Format.
kkint32 MemoryConsumedEstimated() const
static KKStr Concat(const std::vector< std::string > &values)
Concatenates the list of &#39;std::string&#39; strings.
Definition: KKStr.cpp:1082
void Abort(bool _abort)
TrainingProcess2Ptr Trainer2()
Definition: ModelDual.h:100
DateTime(short _year, uchar _month, uchar _day, uchar _hour, uchar _minute, uchar _second)
Definition: DateTime.cpp:1028
TrainingProcess2List(bool _owner)
void CreateModelsFromTrainingData(WhenToRebuild whenToRebuild, VolConstBool &cancelFlag, RunLog &log)
TrainingProcess2()
The default constructor; What will be used when creating an instance while reading in from a XML Stre...
const TrainingClassList & TrainingClasses() const
MLClassListPtr ExtractClassList() const
TrainingProcess2 * TrainingProcess2Ptr
void PurgeDuplicates(FeatureVectorListPtr examples, bool allowDupsInSameClass, std::ostream *report)
Delete duplicate examples from FeatureVectorList structure provided in constructor.
virtual const KKStr & VarName() const
Definition: XmlStream.cpp:794
KKStr(const char *str)
Definition: KKStr.cpp:537
XmlElementTrainingConfiguration2 * XmlElementTrainingConfiguration2Ptr
const KKStr & Name() const
bool ValidModel() const
Definition: Model.h:195
void WriteXML(const KKStr &varName, std::ostream &o) const
Definition: KKStr.cpp:4420
ModelParamPtr ModelParameters() const
MLClassListPtr MLClasses() const
Definition: Model.h:170
XmlStream(const KKStr &_fileName, RunLog &_log)
Definition: XmlStream.cpp:41
virtual const KKStr & SectionName() const
Definition: XmlStream.cpp:785
FeatureVectorListPtr ExtractExamplesForHierarchyLevel(kkuint32 level)
Will create a list of FeatureVectors where the class assignment will reflect the specified Hierarchy ...
const MLClassPtr MLClass() const
Definition: TrainingClass.h:70
TrainingConfiguration2List * TrainingConfiguration2ListPtr
virtual ModelTypes ModelType() const =0
virtual TrainingConfiguration2Ptr Duplicate() const
MLClassList(const MLClassList &_mlClasses)
Copy constructor; will copy list but not own the contents.
Definition: MLClass.cpp:570
const KKStr & RootDir() const
The root directory where Training library images are stored.
bool osFileExists(const KKStr &_fileName)
Definition: OSservices.cpp:568
virtual KKStr ModelTypeStr() const
Definition: Model.h:176
void WriteXML(std::ostream &o)
Definition: XmlStream.cpp:723
Detects duplicate images in a given FeaureVectorList objects.
KKStr & operator=(const KKStr &src)
Definition: KKStr.cpp:1390
KKB::DateTime osGetFileDateTime(const KKStr &fileName)
Used for logging messages.
Definition: RunLog.h:49
void EncodeProblem(const struct svm_paramater &param, struct svm_problem &prob_in, struct svm_problem &prob_out)
kkint32 DuplicateDataCount() const
virtual void TrainModel(FeatureVectorListPtr _trainExamples, bool _alreadyNormalized, bool _takeOwnership, VolConstBool &_cancelFlag, RunLog &_log)
Performs operations such as FeatureEncoding, and Normalization. The actual training of models occurs ...
Definition: Model.cpp:467
Model::ModelTypes ModelType() const
double TrainingTime() const
Definition: Model.h:191
const TrainingClassPtr NoiseTrainingClass() const
MLClassListPtr ExtractFullHierachyOfClasses() const
static void WriteXML(const DateTime &d, const KKStr &varName, std::ostream &o)
Definition: XmlStream.cpp:1113
virtual TokenTypes TokenType()=0
DateTime Value() const
Definition: XmlStream.h:543
Responsible for creating a FeatureFectorProducer instance.
virtual XmlTokenPtr GetNextToken(VolConstBool &cancelFlag, RunLog &log)
Definition: XmlStream.cpp:116
XmlElementModel * XmlElementModelPtr
Definition: Model.h:480
Maintains a list of MLClass instances.
Definition: MLClass.h:233
static FeatureVectorListPtr ExtractTrainingClassFeatures(TrainingConfiguration2ConstPtr config, KKB::DateTime &latestImageTimeStamp, bool &changesMadeToTrainingLibraries, VolConstBool &cancelFlag, RunLog &log)
FeatureVectorList * FeatureVectorListPtr
Definition: Model.h:46
Will only write the ClassName rather than complete MLClass instances.
Definition: MLClass.h:580
virtual FeatureVectorListPtr FeatureDataReSink(FactoryFVProducerPtr _fvProducerFactory, const KKStr &_dirName, const KKStr &_fileName, MLClassPtr _unknownClass, bool _useDirectoryNameForClassName, MLClassList &_mlClasses, VolConstBool &_cancelFlag, bool &_changesMade, KKB::DateTime &_timeStamp, RunLog &_log)
Synchronizes the contents of a feature data file with a directory of images.
virtual KKStr Description() const
Definition: Model.cpp:248
TrainingProcess2Ptr TrainingProcessLeft()
summary> Returns back pointer to 2nd classifier of Dual Classifier; if not a Dual classifier will ret...
TrainingClass * TrainingClassPtr
virtual FileDescPtr FileDesc() const =0
DuplicateImages * DuplicateImagesPtr
#define XmlFactoryMacro(NameOfClass)
Definition: XmlStream.h:688
FactoryFVProducer * FactoryFVProducerPtr
Definition: Model.h:75
const KKStr & ConfigFileNameSpecified() const
KKStr osGetRootName(const KKStr &fullFileName)
XmlElementMLClassNameList * XmlElementMLClassNameListPtr
Definition: MLClass.h:603
MLClassListPtr MLClassesNewInstance() const
Definition: Model.cpp:228
DateTime & operator=(const DateTime &right)
Definition: DateTime.cpp:1231
FactoryFVProducerPtr FvFactoryProducer(RunLog &log) const
virtual FeatureFileIOPtr DefaultFeatureFileIO() const =0
static TrainingProcess2Ptr CreateTrainingProcessForLevel(const KKStr &configFileName, kkuint32 level, VolConstBool &cancelFlag, RunLog &log)
volatile const bool VolConstBool
Definition: KKBaseTypes.h:163
void PrintClassStatistics(std::ostream &o) const