FPCSMLR.cpp 3.9 KB

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