VCOneVsOne.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /**
  2. * @file VCOneVsOne.cpp
  3. * @author Erik Rodner
  4. * @date 10/25/2007
  5. */
  6. #ifdef NOVISUAL
  7. #include <vislearning/nice_nonvis.h>
  8. #else
  9. #include <vislearning/nice.h>
  10. #endif
  11. #include <iostream>
  12. #include "core/basics/StringTools.h"
  13. #include "vislearning/classifier/vclassifier/VCOneVsOne.h"
  14. using namespace OBJREC;
  15. using namespace std;
  16. using namespace NICE;
  17. VCOneVsOne::VCOneVsOne ( const Config *conf, VecClassifier *_prototype )
  18. : VecClassifier ( conf ), prototype ( _prototype )
  19. {
  20. use_weighted_voting = conf->gB("VCOneVsOne", "use_weighted_voting", false);
  21. }
  22. VCOneVsOne::~VCOneVsOne()
  23. {
  24. }
  25. ClassificationResult VCOneVsOne::classify ( const NICE::Vector & x ) const
  26. {
  27. FullVector scores ( maxClassNo+1 );
  28. scores.set(0);
  29. for ( vector< triplet<int, int, VecClassifier *> >::const_iterator i =
  30. classifiers.begin(); i != classifiers.end(); i++ )
  31. {
  32. VecClassifier *classifier = i->third;
  33. ClassificationResult r = classifier->classify(x);
  34. int classi = i->first;
  35. int classj = i->second;
  36. if ( use_weighted_voting )
  37. {
  38. if ( r.classno == 0 )
  39. scores[classi]-=r.scores[1];
  40. else
  41. scores[classj]+=r.scores[1];
  42. } else {
  43. if ( r.classno == 0 )
  44. scores[classi]++;
  45. else
  46. scores[classj]++;
  47. }
  48. }
  49. scores.normalize();
  50. return ClassificationResult ( scores.maxElement(), scores );
  51. }
  52. void VCOneVsOne::teach ( const LabeledSetVector & _teachSet )
  53. {
  54. maxClassNo = _teachSet.getMaxClassno();
  55. classifiers.clear();
  56. assert ( maxClassNo+1 == _teachSet.numClasses() );
  57. for ( int i = 0 ; i <= maxClassNo ; i++ )
  58. {
  59. for ( int j = i+1 ; j <= maxClassNo ; j++ )
  60. {
  61. LabeledSetVector binarySubSet (true);
  62. LabeledSetVector::const_iterator exiv = _teachSet.find(i);
  63. for ( vector<Vector *>::const_iterator exi = exiv->second.begin();
  64. exi != exiv->second.end(); exi++ )
  65. binarySubSet.add_reference ( 0, *exi );
  66. LabeledSetVector::const_iterator exjv = _teachSet.find(j);
  67. for ( vector<Vector *>::const_iterator exj = exjv->second.begin();
  68. exj != exjv->second.end(); exj++ )
  69. binarySubSet.add_reference ( 1, *exj );
  70. VecClassifier *classifier;
  71. classifier = prototype->clone();
  72. fprintf (stderr, "Training classifier: class %d <-> class %d\n", i, j );
  73. classifier->teach ( binarySubSet );
  74. classifier->finishTeaching();
  75. classifiers.push_back ( triplet<int, int, VecClassifier*> (i,j,classifier) );
  76. }
  77. }
  78. }
  79. void VCOneVsOne::finishTeaching()
  80. {
  81. }
  82. void VCOneVsOne::read (const string& s, int format)
  83. {
  84. ifstream ifs ( s.c_str(), ios::in );
  85. ifs >> maxClassNo;
  86. ifs.close();
  87. for ( int i = 0 ; i <= maxClassNo ; i++ )
  88. {
  89. for ( int j = i+1 ; j <= maxClassNo ; j++ )
  90. {
  91. VecClassifier *classifier;
  92. classifier = prototype->clone();
  93. string classifiercache = s + ".onevsone." + StringTools::convertToString<int> ( i ) + "." + StringTools::convertToString<int> ( j );
  94. fprintf (stderr, "Loading classifier: class %d <-> class %d\n", i, j );
  95. classifier->read ( classifiercache, format );
  96. classifiers.push_back ( triplet<int, int, VecClassifier*> (i,j,classifier) );
  97. }
  98. }
  99. }
  100. void VCOneVsOne::save (const string& s, int format) const
  101. {
  102. ofstream ofs ( s.c_str(), ios::out );
  103. ofs << maxClassNo << endl;
  104. ofs.close();
  105. for ( vector< triplet<int, int, VecClassifier *> >::const_iterator i =
  106. classifiers.begin(); i != classifiers.end(); i++ )
  107. {
  108. int classi = i->first;
  109. int classj = i->second;
  110. VecClassifier *classifier = i->third;
  111. string classifiercache = s + ".onevsone." + StringTools::convertToString<int> ( classi ) + "." + StringTools::convertToString<int> ( classj );
  112. classifier->save ( classifiercache, format );
  113. }
  114. }
  115. void VCOneVsOne::store ( std::ostream & os, int format ) const
  116. {
  117. fprintf (stderr, "VCOneVsOne: unable to write to stream! please use read()\n");
  118. }
  119. void VCOneVsOne::restore ( std::istream & is, int format )
  120. {
  121. fprintf (stderr, "VCOneVsOne: unable to read from stream! please use save()\n");
  122. exit (-1);
  123. }