FPCSMLR.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "vislearning/classifier/fpclassifier/logisticregression/FPCSMLR.h"
  2. #include "vislearning/cbaselib/FeaturePool.h"
  3. #include "core/image/ImageT.h"
  4. //#include "core/imagedisplay/ImageDisplay.h"
  5. #include <iostream>
  6. using namespace OBJREC;
  7. using namespace std;
  8. using namespace NICE;
  9. FPCSMLR::FPCSMLR ()
  10. {
  11. inpic = false;
  12. }
  13. FPCSMLR::FPCSMLR ( const Config *_conf, string section ) : conf ( _conf )
  14. {
  15. confsection = section;
  16. inpic = conf->gB ( section, "inpic", false );
  17. }
  18. FPCSMLR::~FPCSMLR()
  19. {
  20. //clean up
  21. }
  22. ClassificationResult FPCSMLR::classify ( Example & pce )
  23. {
  24. FullVector overall_distribution ( maxClassNo);
  25. double maxp = -numeric_limits<double>::max();
  26. int classno = 0;
  27. double sum = 0.0;
  28. for ( int i = 0; i < maxClassNo; i++ )
  29. {
  30. overall_distribution[i] = classifiers[i].classify ( pce );
  31. sum += overall_distribution[i];
  32. if ( maxp < overall_distribution[i] )
  33. {
  34. classno = i;
  35. maxp = overall_distribution[i];
  36. }
  37. }
  38. for ( int i = 0; i < maxClassNo; i++ )
  39. {
  40. overall_distribution[i] /= sum;
  41. }
  42. return ClassificationResult ( classno, overall_distribution );
  43. }
  44. void FPCSMLR::train ( FeaturePool & _fp, Examples & examples )
  45. {
  46. cout << "start train" << endl;
  47. fp = FeaturePool ( _fp );
  48. // Anzahl von Merkmalen
  49. int fanz = examples.size();
  50. maxClassNo = -1;
  51. for ( int i = 0; i < fanz; i++ )
  52. {
  53. maxClassNo = std::max ( maxClassNo, examples[i].first );
  54. }
  55. maxClassNo++;
  56. assert ( fanz >= maxClassNo );
  57. classifiers.resize ( maxClassNo );
  58. for ( int i = 0; i < maxClassNo; i++ )
  59. {
  60. cout << "classifier no " << i << " training starts" << endl;
  61. classifiers[i] = SLR ( conf, confsection );
  62. if ( inpic )
  63. {
  64. vector<bool> classinpic;
  65. for ( int j = 0; j < ( int ) examples.size(); j++ )
  66. {
  67. if ( examples[j].first == i )
  68. {
  69. if ( examples[j].second.position < ( int ) classinpic.size() )
  70. classinpic[examples[j].second.position] = true;
  71. else if ( examples[j].second.position == ( int ) classinpic.size() )
  72. classinpic.push_back ( true );
  73. else
  74. {
  75. while ( examples[j].second.position > ( int ) classinpic.size() )
  76. {
  77. classinpic.push_back ( false );
  78. }
  79. classinpic.push_back ( true );
  80. }
  81. }
  82. }
  83. Examples ex2;
  84. for ( int j = 0; j < ( int ) examples.size(); j++ )
  85. {
  86. if ( examples[j].second.position >= ( int ) classinpic.size() )
  87. continue;
  88. if ( classinpic[examples[j].second.position] )
  89. {
  90. Example e;
  91. e.svec = examples[j].second.svec;
  92. e.vec = examples[j].second.vec;
  93. ex2.push_back ( pair<int, Example> ( examples[j].first, e ) );
  94. }
  95. }
  96. cout << "examples for class " << i << ": " << ex2.size() << endl;
  97. if ( ex2.size() <= 2 )
  98. continue;
  99. classifiers[i].train ( _fp, ex2, i );
  100. for ( int j = 0; j < ( int ) ex2.size(); j++ )
  101. {
  102. ex2[j].second.svec = NULL;
  103. }
  104. }
  105. else
  106. {
  107. classifiers[i].train ( _fp, examples, i );
  108. }
  109. }
  110. cout << "end train" << endl;
  111. }
  112. void FPCSMLR::restore ( istream & is, int format )
  113. {
  114. is >> maxClassNo;
  115. classifiers.resize ( maxClassNo );
  116. for ( int i = 0; i < maxClassNo; i++ )
  117. {
  118. classifiers[i].restore ( is, format );
  119. }
  120. }
  121. void FPCSMLR::store ( ostream & os, int format ) const
  122. {
  123. if ( format != -9999 ) os << maxClassNo;
  124. for ( int i = 0; i < maxClassNo; i++ )
  125. {
  126. classifiers[i].store ( os, format );
  127. }
  128. }
  129. void FPCSMLR::clear ()
  130. {
  131. //TODO: einbauen
  132. }
  133. FeaturePoolClassifier *FPCSMLR::clone () const
  134. {
  135. //TODO: wenn alle Variablen der Klasse bekannt sind, dann übergebe diese mit
  136. FPCSMLR *o = new FPCSMLR ( conf, confsection );
  137. o->maxClassNo = maxClassNo;
  138. return o;
  139. }
  140. void FPCSMLR::setComplexity ( int size )
  141. {
  142. cerr << "FPCSMLR: no complexity to set" << endl;
  143. }