PSSImageLevelPrior.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * @file PSSImageLevelPrior.cpp
  3. * @brief incorporate prior from image categorization method
  4. * @author Erik Rodner
  5. * @date 03/19/2009
  6. */
  7. #ifdef NOVISUAL
  8. #include <objrec/nice_nonvis.h>
  9. #else
  10. #include <objrec/nice.h>
  11. #endif
  12. #include <iostream>
  13. #include <set>
  14. #include <assert.h>
  15. #include <algorithm>
  16. #include "PSSImageLevelPrior.h"
  17. using namespace OBJREC;
  18. using namespace std;
  19. // refactor-nice.pl: check this substitution
  20. // old: using namespace ice;
  21. using namespace NICE;
  22. PSSImageLevelPrior::PSSImageLevelPrior( int imagePriorMethod, int priorK, double alphaImagePrior )
  23. {
  24. this->imagePriorMethod = imagePriorMethod;
  25. this->priorK = priorK;
  26. this->alphaImagePrior = alphaImagePrior;
  27. }
  28. PSSImageLevelPrior::~PSSImageLevelPrior()
  29. {
  30. }
  31. void PSSImageLevelPrior::setPrior ( FullVector & prior )
  32. {
  33. this->prior = prior;
  34. }
  35. void PSSImageLevelPrior::postprocess ( NICE::Image & result, GenericImage<double> & probabilities )
  36. {
  37. assert ( prior.size() == (int)probabilities.numChannels );
  38. int xsize = probabilities.xsize;
  39. int ysize = probabilities.ysize;
  40. if ( imagePriorMethod == IMAGE_PRIOR_BEST_K )
  41. {
  42. vector<int> indices;
  43. prior.getSortedIndices ( indices );
  44. reverse ( indices.begin(), indices.end() );
  45. set<int> bestComponents;
  46. vector<int>::const_iterator j = indices.begin();
  47. if ( indices.size() > (size_t)priorK )
  48. advance ( j, priorK );
  49. else
  50. j = indices.end();
  51. for ( vector<int>::const_iterator jj = indices.begin();
  52. jj != j ; jj++ )
  53. bestComponents.insert ( *jj );
  54. int offset_s = 0;
  55. for ( int ys = 0 ; ys < ysize ; ys ++ )
  56. for ( int xs = 0 ; xs < xsize ; xs++,offset_s++ )
  57. {
  58. int maxindex = 0;
  59. double maxvalue = - numeric_limits<double>::max();
  60. double sum = 0.0;
  61. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  62. {
  63. if ( bestComponents.find(i) == bestComponents.end() )
  64. probabilities.data[i][offset_s] = 0.0;
  65. sum += probabilities.data[i][offset_s];
  66. if ( probabilities.data[i][offset_s] > maxvalue )
  67. {
  68. maxindex = i;
  69. maxvalue = probabilities.data[i][offset_s];
  70. }
  71. }
  72. if ( sum > 1e-11 )
  73. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  74. {
  75. probabilities.data[i][offset_s] /= sum;
  76. }
  77. result.setPixel(xs,ys,maxindex);
  78. }
  79. } else if ( imagePriorMethod == IMAGE_PRIOR_PSEUDOPROB ) {
  80. int offset_s = 0;
  81. for ( int ys = 0 ; ys < ysize ; ys ++ )
  82. for ( int xs = 0 ; xs < xsize ; xs++,offset_s++ )
  83. {
  84. int maxindex = 0;
  85. double maxvalue = - numeric_limits<double>::max();
  86. double sum = 0.0;
  87. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  88. {
  89. probabilities.data[i][offset_s] *= pow ( prior[i], alphaImagePrior );
  90. sum += probabilities.data[i][offset_s];
  91. if ( probabilities.data[i][offset_s] > maxvalue )
  92. {
  93. maxindex = i;
  94. maxvalue = probabilities.data[i][offset_s];
  95. }
  96. }
  97. if ( sum > 1e-11 )
  98. for ( int i = 0 ; i < (int)probabilities.numChannels ; i++ )
  99. {
  100. probabilities.data[i][offset_s] /= sum;
  101. }
  102. result.setPixel(xs,ys,maxindex);
  103. }
  104. }
  105. }