LabeledSetSelection.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * @file LabeledSetSelection.h
  3. * @brief Select a subset of a LabeledSet
  4. * @author Erik Rodner
  5. * @date 02/08/2008
  6. */
  7. #ifndef LABELEDSETSELECTIONINCLUDE
  8. #define LABELEDSETSELECTIONINCLUDE
  9. #include "core/image/ImageT.h"
  10. #include "core/vector/VectorT.h"
  11. #include "core/vector/MatrixT.h"
  12. #include <set>
  13. #include <map>
  14. namespace OBJREC {
  15. /** Select a subset of a LabeledSet */
  16. template <class F>
  17. class LabeledSetSelection
  18. {
  19. protected:
  20. public:
  21. static void selectRandom ( const std::map<int,int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
  22. {
  23. F & base_nonconst = const_cast< F & >(base);
  24. //srand(time(NULL));
  25. for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
  26. i != fixedPositiveExamples.end() ;
  27. i++ )
  28. {
  29. int classno = i->first;
  30. int fixedPositiveExamples = i->second;
  31. std::set<int> memory;
  32. int count = base_nonconst[classno].size();
  33. if ( (count < fixedPositiveExamples) ) {
  34. fthrow ( Exception, "LabeledSetSelection::selectRandom: unable to select " << fixedPositiveExamples
  35. << " of " << count << " examples" );
  36. }
  37. for ( int j = 0 ; j < fixedPositiveExamples ; j++ )
  38. {
  39. int k;
  40. do {
  41. k = rand() % count;
  42. } while ( memory.find(k) != memory.end() );
  43. memory.insert(k);
  44. positive.add_reference ( classno, base_nonconst[classno][k]);
  45. }
  46. for ( int k = 0 ; k < count ; k++ )
  47. if ( memory.find(k) == memory.end() )
  48. negative.add_reference ( classno, base_nonconst[classno][k]);
  49. }
  50. }
  51. static void selectRandomMax ( const std::map<int,int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
  52. {
  53. F & base_nonconst = const_cast< F & >(base);
  54. //srand(time(NULL));
  55. for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
  56. i != fixedPositiveExamples.end() ;
  57. i++ )
  58. {
  59. int classno = i->first;
  60. int fixedPositiveExamples = i->second;
  61. std::set<int> memory;
  62. int count = base_nonconst[classno].size();
  63. int m = fixedPositiveExamples < count ? fixedPositiveExamples : count;
  64. for ( int j = 0 ; j < m ; j++ )
  65. {
  66. int k;
  67. do {
  68. k = rand() % count;
  69. } while ( memory.find(k) != memory.end() );
  70. memory.insert(k);
  71. positive.add_reference ( classno, base_nonconst[classno][k]);
  72. }
  73. for ( int k = 0 ; k < count ; k++ )
  74. if ( memory.find(k) == memory.end() )
  75. negative.add_reference ( classno, base_nonconst[classno][k]);
  76. }
  77. }
  78. static void selectSequentialStep ( const std::map<int, int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
  79. {
  80. F & base_nonconst = const_cast< F & >(base);
  81. for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
  82. i != fixedPositiveExamples.end() ;
  83. i++ )
  84. {
  85. int classno = i->first;
  86. int fixedPositiveExamples = i->second;
  87. int count = base_nonconst[classno].size();
  88. int step = fixedPositiveExamples ? (count / fixedPositiveExamples) : 0;
  89. if ( count < fixedPositiveExamples ) {
  90. fthrow ( Exception, "LabeledSetSelection::selectSequentialStep: unable to select " << fixedPositiveExamples
  91. << " of " << count << " examples (classno " << classno << ")" );
  92. }
  93. int k = 0;
  94. for ( int j = 0 ; j < count ; j++ )
  95. {
  96. if ( (step == 0) || (k >= fixedPositiveExamples) || (j % step != 0) )
  97. negative.add_reference ( classno, base_nonconst[classno][j] );
  98. else {
  99. k++;
  100. positive.add_reference ( classno, base_nonconst[classno][j] );
  101. }
  102. }
  103. }
  104. };
  105. static void selectSequential ( const std::map<int, int> & fixedPositiveExamples, const F & base, F & positive, F & negative )
  106. {
  107. F & base_nonconst = const_cast< F & >(base);
  108. for ( std::map<int,int>::const_iterator i = fixedPositiveExamples.begin();
  109. i != fixedPositiveExamples.end() ;
  110. i++ )
  111. {
  112. int classno = i->first;
  113. int fixedPositiveExamples = i->second;
  114. int count = base_nonconst[classno].size();
  115. if ( count < fixedPositiveExamples ) {
  116. fthrow ( Exception, "LabeledSetSelection::selectSequential: unable to select " << fixedPositiveExamples
  117. << " of " << count << " examples" );
  118. }
  119. for ( int j = 0 ; j < fixedPositiveExamples ; j++ )
  120. positive.add_reference ( classno, base_nonconst[classno][j] );
  121. for ( int j = fixedPositiveExamples ; j < count ; j++ )
  122. negative.add_reference ( classno, base_nonconst[classno][j] );
  123. }
  124. };
  125. static void selectClasses ( const std::set<int> & classnos, const F & base, F & positive, F & negative )
  126. {
  127. F & base_nonconst = const_cast< F & >(base);
  128. std::vector<int> classes;
  129. base.getClasses(classes);
  130. for ( std::set<int>::const_iterator i = classnos.begin();
  131. i != classnos.end() ;
  132. i++ )
  133. {
  134. int classno = *i;
  135. int count = base_nonconst[classno].size();
  136. for ( int j = 0 ; j < count ; j++ )
  137. positive.add_reference ( classno, base_nonconst[classno][j]);
  138. }
  139. for ( std::vector<int>::const_iterator i = classes.begin();
  140. i != classes.end() ;
  141. i++ )
  142. {
  143. int classno = *i;
  144. if ( classnos.find(classno) != classnos.end() ) continue;
  145. int count = base_nonconst[classno].size();
  146. for ( int j = 0 ; j < count ; j++ )
  147. negative.add_reference ( classno, base_nonconst[classno][j]);
  148. }
  149. };
  150. };
  151. } // namespace
  152. #endif