LabeledSetSelection.h 5.9 KB

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