IL_NewExamples.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. /**
  2. * @file IL_NewExamples.cpp
  3. * @brief Large GP-IL-Testsetup
  4. * @author Alexander Freytag
  5. * @date 09-05-2012
  6. */
  7. #include <vector>
  8. #include <stdlib.h>
  9. #include <time.h>
  10. #include <set>
  11. #include <core/basics/Config.h>
  12. #include <core/basics/StringTools.h>
  13. #include <core/vector/SparseVectorT.h>
  14. #include <core/vector/VectorT.h>
  15. //----------
  16. #include "vislearning/baselib/ProgressBar.h"
  17. #include <vislearning/classifier/kernelclassifier/KCGPRegOneVsAll.h>
  18. #include "vislearning/cbaselib/MultiDataset.h"
  19. #include <vislearning/cbaselib/LabeledSet.h>
  20. #include "vislearning/cbaselib/ClassificationResults.h"
  21. #include <vislearning/baselib/Globals.h>
  22. #include <vislearning/math/kernels/KernelData.h>
  23. //----------
  24. #include "gp-hik-exp/progs/datatools.h"
  25. #include "gp-hik-exp/GPHIKClassifierNICE.h"
  26. //----------
  27. // #include <incrementallearning/IL_Framework_Generic.h>
  28. //
  29. using namespace std;
  30. using namespace NICE;
  31. using namespace OBJREC;
  32. enum verbose_level {NONE = 0, LOW = 1, MEDIUM = 2, EVERYTHING = 3};
  33. /**
  34. Computes from randomly or deterministically choosen trainimages kernelmatrizes and evaluates their performance, using ROI-optimization
  35. */
  36. int main ( int argc, char **argv )
  37. {
  38. std::cout.precision ( 5 );
  39. std::cerr.precision ( 5 );
  40. NICE::Config conf ( argc, argv );
  41. int trainExPerClass = conf.gI ( "GP_IL", "trainExPerClass", 10 );
  42. int incrementalAddSize = conf.gI("GP_IL", "incrementalAddSize", 1);
  43. int nrOfIncrements = conf.gI("GP_IL", "nrOfIncrements", 9);
  44. int num_runs = conf.gI ( "GP_IL", "num_runs", 10 );
  45. bool do_classification = conf.gB ( "GP_IL", "do_classification", true );
  46. bool incrementalNotBatch = conf.gB( "GP_IL", "incrementalNotBatch", true );
  47. string featureLocation = conf.gS( "GP_IL", "featureLocation", "toyExampleLargeLargeScale.data");
  48. int verbose_int = conf.gI ( "GP_IL", "verbose", 0 );
  49. verbose_level verbose ( NONE );
  50. switch ( verbose_int )
  51. {
  52. case 0:
  53. verbose = NONE;
  54. break;
  55. case 1:
  56. verbose = LOW;
  57. break;
  58. case 2:
  59. verbose = MEDIUM;
  60. break;
  61. case 3:
  62. verbose = EVERYTHING;
  63. break;
  64. }
  65. /* initialize random seed: */
  66. srand ( time ( NULL ) ); //with 0 for reproductive results
  67. // srand ( 0 ); //with 0 for reproductive results
  68. // =========================== INIT ===========================
  69. //these classes are the basic knowledge we have at the beginning
  70. set<int> classesForTraining;
  71. classesForTraining.insert(0);
  72. classesForTraining.insert(1);
  73. classesForTraining.insert(2);
  74. classesForTraining.insert(3);
  75. classesForTraining.insert(4);
  76. classesForTraining.insert(5);
  77. classesForTraining.insert(6);
  78. classesForTraining.insert(7);
  79. classesForTraining.insert(8);
  80. classesForTraining.insert(9);
  81. classesForTraining.insert(10);
  82. classesForTraining.insert(11);
  83. classesForTraining.insert(12);
  84. classesForTraining.insert(13);
  85. classesForTraining.insert(14);
  86. // //these classes will be added iteratively to our training set
  87. // std::set<int> classesForIncrementalTraining;
  88. std::vector<std::vector<double> > recognitions_rates(nrOfIncrements+1);
  89. std::vector<std::vector<float> > classification_times(nrOfIncrements+1);
  90. std::vector<std::vector<float> > IL_training_times(nrOfIncrements);
  91. for ( int run = 0; run < num_runs; run++ )
  92. {
  93. std::cerr << "run: " << run << std::endl;
  94. //15-scenes settings
  95. std::string ext = conf.gS("main", "ext", ".txt");
  96. std::cerr << "Using cache extension: " << ext << std::endl;
  97. OBJREC::MultiDataset md ( &conf );
  98. const ClassNames & classNamesTrain = md.getClassNames("train");
  99. // read training set
  100. vector< NICE::Vector > trainDataOrig;
  101. Vector y;
  102. const LabeledSet *train = md["train"];
  103. readData< std::vector< NICE::Vector >, NICE::Vector > ( conf, *train, trainDataOrig, y, ext );
  104. std::vector<double> labelsStd;
  105. int datasize_all ( trainDataOrig.size() );
  106. std::set<int> classesAvailable;
  107. for ( uint i = 0; i < y.size(); i++)
  108. {
  109. //automatically check for duplicates
  110. classesAvailable.insert(y[i]);
  111. }
  112. int numberOfClasses = classesAvailable.size();
  113. std::map<int,int> nrExamplesPerClassInDataset;
  114. std::map<int,std::vector<int> > examplesPerClassInDataset;
  115. for (std::set<int>::const_iterator it = classesAvailable.begin(); it != classesAvailable.end(); it++)
  116. {
  117. nrExamplesPerClassInDataset.insert(std::pair<int,int>(*it,0));
  118. examplesPerClassInDataset.insert(std::pair<int,std::vector<int> >(*it,std::vector<int>(0)));
  119. }
  120. for ( uint i = 0; i < y.size(); i++ )
  121. {
  122. (examplesPerClassInDataset.find(y[i])->second).push_back(i);
  123. }
  124. for (std::map<int,std::vector<int> >::const_iterator it = examplesPerClassInDataset.begin(); it != examplesPerClassInDataset.end(); it++)
  125. {
  126. nrExamplesPerClassInDataset.find(it->first)->second = it->second.size();
  127. }
  128. for ( std::map<int,int>::const_iterator it = nrExamplesPerClassInDataset.begin(); it != nrExamplesPerClassInDataset.end(); it++)
  129. {
  130. cerr << it->first << ": " << it->second << endl;
  131. }
  132. Examples examples;
  133. std::map<int,std::vector<int> > examplesPerClassInDatasetTmp (examplesPerClassInDataset);
  134. //chose examples for every class used for training
  135. for (std::set<int>::const_iterator clIt = classesForTraining.begin(); clIt != classesForTraining.end(); clIt++)
  136. {
  137. std::map<int,std::vector<int> >::iterator exIt = examplesPerClassInDatasetTmp.find(*clIt);
  138. std::cerr << "pick training examples for class " << *clIt << std::endl;
  139. for (int i = 0; i < trainExPerClass; i++)
  140. {
  141. std::cerr << "i: " << i << std::endl;
  142. int exampleIndex ( rand() % ( exIt->second.size() ) );
  143. std::cerr << "exampleIndex: " << exampleIndex << std::endl;
  144. Example example;
  145. NICE::Vector & xTrain = trainDataOrig[exIt->second[exampleIndex]];
  146. example.svec = new SparseVector(xTrain);
  147. examples.push_back ( pair<int, Example> ( y[exIt->second[exampleIndex] ], example ) );
  148. exIt->second.erase(exIt->second.begin()+exampleIndex);
  149. }
  150. }
  151. std::cerr << "start training " << std::endl;
  152. time_t prep_start_time = clock();
  153. GPHIKClassifierNICE * classifier = new GPHIKClassifierNICE( &conf );
  154. FeaturePool fp; // will be ignored
  155. classifier->train ( fp, examples );
  156. float time_preparation = ( float ) ( clock() - prep_start_time ) ;
  157. int classesUsed(classesForTraining.size());
  158. std::cerr << "training done " << std::endl;
  159. // ------------------ TESTING
  160. const LabeledSet *test = md["test"];
  161. VVector testData;
  162. Vector yTest;
  163. readData< VVector, Vector > ( conf, *test, testData, yTest, ext );
  164. NICE::Matrix confusionMatrix ( numberOfClasses, numberOfClasses );
  165. confusionMatrix.set ( 0.0 );
  166. time_t start_time = clock();
  167. std::vector<int> chosen_examples_per_class ( numberOfClasses );
  168. if ( do_classification )
  169. {
  170. for ( uint i = 0 ; i < testData.size(); i++ )
  171. {
  172. Example example;
  173. const Vector & xstar = testData[i];
  174. SparseVector xstar_sparse ( xstar );
  175. OBJREC::ClassificationResult result;
  176. example.svec = &xstar_sparse;
  177. result = classifier->classify( example );
  178. cerr << "[" << i << " / " << testData.size() << "] " << result.classno << " " << yTest[i] << std::endl;
  179. result.classno_groundtruth = yTest[i];
  180. confusionMatrix ( result.classno_groundtruth , result.classno ) ++;
  181. }
  182. float time_classification = ( float ) ( clock() - start_time ) ;
  183. if ( verbose >= LOW )
  184. cerr << "Time for Classification with " << classesUsed*trainExPerClass << " training-examples: " << time_classification / CLOCKS_PER_SEC << " [s]" << endl;
  185. ( classification_times[0] ).push_back ( time_classification / CLOCKS_PER_SEC );
  186. confusionMatrix.normalizeRowsL1();
  187. double avg_recognition_rate = 0.0;
  188. for ( int i = 0 ; i < ( int ) confusionMatrix.rows(); i++ )
  189. {
  190. if ( verbose >= MEDIUM )
  191. {
  192. cerr << "Class no: " << i << " : " << confusionMatrix ( i, i ) << endl;
  193. }
  194. avg_recognition_rate += confusionMatrix ( i, i );
  195. }
  196. avg_recognition_rate /= confusionMatrix.rows();
  197. cerr << confusionMatrix << endl;
  198. cerr << "avg recognition rate " << avg_recognition_rate*100 << " %" << endl;
  199. recognitions_rates[0].push_back ( avg_recognition_rate*100 );
  200. }
  201. //Now start the Incremental-Learning-Part
  202. for (int incrementationStep = 0; incrementationStep < nrOfIncrements; incrementationStep++)
  203. {
  204. //iteratively add 1 example
  205. if (incrementalNotBatch)
  206. {
  207. uint oldSize = examples.size();
  208. //chose examples for every class used for training
  209. int cnt(0);
  210. Examples newExamples;
  211. for (std::set<int>::const_iterator clIt = classesForTraining.begin(); clIt != classesForTraining.end(); clIt++)
  212. {
  213. std::map<int,std::vector<int> >::iterator exIt = examplesPerClassInDatasetTmp.find(*clIt);
  214. for (int i = 0; i < incrementalAddSize; i++)
  215. {
  216. std::cerr << "i: " << cnt << std::endl;
  217. Example example;
  218. int exampleIndex ( rand() % ( exIt->second.size() ) );
  219. NICE::Vector & xTrain = trainDataOrig[exIt->second[exampleIndex] ];
  220. example.svec = new SparseVector(xTrain);
  221. // examples.push_back ( pair<int, Example> ( y[exIt->second[exampleIndex] ], example ) );
  222. newExamples.push_back ( pair<int, Example> ( y[exIt->second[exampleIndex] ], example ) );
  223. exIt->second.erase(exIt->second.begin()+exampleIndex);
  224. cnt++;
  225. }
  226. }
  227. std::cerr << "Incremental, but not batch" << std::endl;
  228. time_t IL_add_start_time = clock();
  229. classifier->addMultipleExamples( newExamples );
  230. float time_IL_add = ( float ) ( clock() - IL_add_start_time ) ;
  231. std::cerr << "Time for IL-adding of " << incrementalAddSize*classesForTraining.size() << " examples to already " << classesUsed*trainExPerClass+classesUsed*incrementalAddSize*incrementationStep << " training-examples: " << time_IL_add / CLOCKS_PER_SEC << " [s]" << std::endl;
  232. IL_training_times[incrementationStep].push_back(time_IL_add / CLOCKS_PER_SEC);
  233. }
  234. else
  235. {
  236. std::cerr << "batch retraining -- add new data to currently known training examples" << std::endl;
  237. //chose examples for every class used for training
  238. int cnt(0);
  239. for (std::set<int>::const_iterator clIt = classesForTraining.begin(); clIt != classesForTraining.end(); clIt++)
  240. {
  241. std::map<int,std::vector<int> >::iterator exIt = examplesPerClassInDatasetTmp.find(*clIt);
  242. for (int i = 0; i < incrementalAddSize; i++)
  243. {
  244. std::cerr << "i: " << cnt << std::endl;
  245. Example example;
  246. int exampleIndex ( rand() % ( exIt->second.size() ) );
  247. NICE::Vector & xTrain = trainDataOrig[exIt->second[exampleIndex] ];
  248. example.svec = new SparseVector(xTrain);
  249. examples.push_back ( pair<int, Example> ( y[exIt->second[exampleIndex] ], example ) );
  250. exIt->second.erase(exIt->second.begin()+exampleIndex);
  251. cnt++;
  252. }
  253. }
  254. std::cerr << "start batch retraining" << std::endl;
  255. time_t batch_add_start_time = clock();
  256. //
  257. if (classifier != NULL)
  258. delete classifier;
  259. classifier = new GPHIKClassifierNICE( &conf );
  260. classifier->train( fp, examples );
  261. //
  262. float time_batch_add = ( float ) ( clock() - batch_add_start_time ) ;
  263. std::cerr << "Time for batch relearning after adding of " << incrementalAddSize*classesForTraining.size() << " examples to already " << classesUsed*trainExPerClass+classesUsed*incrementalAddSize*incrementationStep << " training-examples: " << time_batch_add / CLOCKS_PER_SEC << " [s]" << std::endl;
  264. IL_training_times[incrementationStep].push_back(time_batch_add / CLOCKS_PER_SEC);
  265. }
  266. //do the classification for evaluating the benefit of new examples
  267. if ( do_classification )
  268. {
  269. std::cerr << "do classification" << std::endl;
  270. for ( uint i = 0 ; i < testData.size(); i++ )
  271. {
  272. Example example;
  273. const Vector & xstar = testData[i];
  274. SparseVector xstar_sparse ( xstar );
  275. example.svec = &xstar_sparse;
  276. OBJREC::ClassificationResult result;
  277. result = classifier->classify( example );
  278. std::cerr << "[" << i << " / " << testData.size() << "] " << result.classno << " " << yTest[i] << std::endl;
  279. result.classno_groundtruth = yTest[i];
  280. confusionMatrix ( result.classno_groundtruth , result.classno ) ++;
  281. }
  282. float time_classification = ( float ) ( clock() - start_time ) ;
  283. if ( verbose >= LOW )
  284. std::cerr << "Time for Classification with " << classesUsed*trainExPerClass+classesUsed*incrementalAddSize*(incrementationStep+1) << " training-examples: " << time_classification / CLOCKS_PER_SEC << " [s]" << std::endl;
  285. ( classification_times[incrementationStep+1] ).push_back ( time_classification / CLOCKS_PER_SEC );
  286. confusionMatrix.normalizeRowsL1();
  287. double avg_recognition_rate = 0.0;
  288. for ( int i = 0 ; i < ( int ) confusionMatrix.rows(); i++ )
  289. {
  290. if ( verbose >= MEDIUM )
  291. {
  292. std::cerr << "Class no: " << i << " : " << confusionMatrix ( i, i ) << std::endl;
  293. }
  294. avg_recognition_rate += confusionMatrix ( i, i );
  295. }
  296. avg_recognition_rate /= confusionMatrix.rows();
  297. cerr << confusionMatrix << endl;
  298. cerr << "avg recognition rate " << avg_recognition_rate*100 << " %" << endl;
  299. recognitions_rates[incrementationStep+1].push_back ( avg_recognition_rate*100 );
  300. } //classification after IL adding
  301. } //IL adding of different classes
  302. }//runs
  303. int classesUsed(classesForTraining.size());
  304. std::cerr << "classes used: " << classesUsed << " incrementalAddSize: " << incrementalAddSize << std::endl;
  305. if ( do_classification )
  306. {
  307. std::cerr << "========================" << std::endl;
  308. std::cerr << "content of classification_times: " << std::endl;
  309. for ( std::vector<std::vector<float> >::const_iterator it = classification_times.begin(); it != classification_times.end(); it++ )
  310. {
  311. for ( std::vector<float> ::const_iterator jt = ( *it ).begin(); jt != ( *it ).end(); jt++ )
  312. {
  313. std::cerr << *jt << " ";
  314. }
  315. std::cerr << std::endl;
  316. }
  317. std::vector<float> mean_classification_times;
  318. std::vector<float> std_dev_classification_times;
  319. for ( std::vector<std::vector<float> >::const_iterator it = classification_times.begin(); it != classification_times.end(); it++ )
  320. {
  321. float mean_classification_time ( 0.0 );
  322. for ( std::vector<float>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  323. {
  324. mean_classification_time += *itRun;
  325. }
  326. mean_classification_time /= it->size();
  327. mean_classification_times.push_back ( mean_classification_time );
  328. double std_dev_classification_time ( 0.0 );
  329. for ( std::vector<float>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  330. {
  331. std_dev_classification_time += pow ( *itRun - mean_classification_time, 2 );
  332. }
  333. std_dev_classification_time /= it->size();
  334. std_dev_classification_time = sqrt ( std_dev_classification_time );
  335. std_dev_classification_times.push_back ( std_dev_classification_time );
  336. }
  337. int datasize ( classesUsed*trainExPerClass );
  338. for ( uint i = 0; i < mean_classification_times.size(); i++)
  339. {
  340. std::cerr << "size: " << datasize << " mean classification time: " << mean_classification_times[i] << " std_dev classification time: " << std_dev_classification_times[i] << std::endl;
  341. datasize += classesUsed*incrementalAddSize ;
  342. }
  343. }
  344. else
  345. {
  346. std::cerr << "========================" << std::endl;
  347. std::cerr << "No classification done therefor no classification times available." << std::endl;
  348. }
  349. std::cerr << "========================" << std::endl;
  350. std::cerr << "content of IL_training_times: " << std::endl;
  351. for ( std::vector<std::vector<float> >::const_iterator it = IL_training_times.begin(); it != IL_training_times.end(); it++ )
  352. {
  353. for ( std::vector<float> ::const_iterator jt = ( *it ).begin(); jt != ( *it ).end(); jt++ )
  354. {
  355. std::cerr << *jt << " ";
  356. }
  357. std::cerr << std::endl;
  358. }
  359. std::vector<float> mean_IL_training_times;
  360. std::vector<float> std_dev_IL_training_times;
  361. for ( std::vector<std::vector<float> >::const_iterator it = IL_training_times.begin(); it != IL_training_times.end(); it++ )
  362. {
  363. float mean_IL_training_time ( 0.0 );
  364. for ( std::vector<float>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  365. {
  366. mean_IL_training_time += *itRun;
  367. }
  368. mean_IL_training_time /= it->size();
  369. mean_IL_training_times.push_back ( mean_IL_training_time );
  370. double std_dev_IL_training_time ( 0.0 );
  371. for ( std::vector<float>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  372. {
  373. std_dev_IL_training_time += pow ( *itRun - mean_IL_training_time, 2 );
  374. }
  375. std_dev_IL_training_time /= it->size();
  376. std_dev_IL_training_time = sqrt ( std_dev_IL_training_time );
  377. std_dev_IL_training_times.push_back ( std_dev_IL_training_time );
  378. }
  379. int datasize ( classesUsed*trainExPerClass );
  380. for ( uint i = 0; i < mean_IL_training_times.size(); i++)
  381. {
  382. cerr << "size: " << datasize << " and adding " << classesUsed*incrementalAddSize << " mean IL_training time: " << mean_IL_training_times[i] << " std_dev IL_training time: " << std_dev_IL_training_times[i] << endl;
  383. datasize += classesUsed*incrementalAddSize ;
  384. }
  385. if ( do_classification )
  386. {
  387. std::cerr << "========================" << std::endl;
  388. std::cerr << "content of recognition_rates: " << std::endl;
  389. for ( std::vector<std::vector<double> >::const_iterator it = recognitions_rates.begin(); it != recognitions_rates.end(); it++ )
  390. {
  391. for ( std::vector<double> ::const_iterator jt = ( *it ).begin(); jt != ( *it ).end(); jt++ )
  392. {
  393. std::cerr << *jt << " ";
  394. }
  395. std::cerr << std::endl;
  396. }
  397. std::cerr << "calculating final results " << std::endl;
  398. std::vector<double> mean_recs;
  399. std::vector<double> std_dev_recs;
  400. for (std::vector<std::vector<double> >::const_iterator it = recognitions_rates.begin(); it != recognitions_rates.end(); it++ )
  401. {
  402. double mean_rec ( 0.0 );
  403. for ( std::vector<double>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  404. {
  405. mean_rec += *itRun;
  406. }
  407. mean_rec /= it->size();
  408. mean_recs.push_back ( mean_rec );
  409. double std_dev_rec ( 0.0 );
  410. for ( std::vector<double>::const_iterator itRun = it->begin(); itRun != it->end(); itRun++ )
  411. {
  412. std_dev_rec += pow ( *itRun - mean_rec, 2 );
  413. }
  414. std_dev_rec /= it->size();
  415. std_dev_rec = sqrt ( std_dev_rec );
  416. std_dev_recs.push_back ( std_dev_rec );
  417. }
  418. int datasize ( classesUsed*trainExPerClass + classesUsed*incrementalAddSize);
  419. for ( uint i = 0; i < recognitions_rates.size(); i++)
  420. {
  421. std::cerr << "size: " << datasize << " mean_IL: " << mean_recs[i] << " std_dev_IL: " << std_dev_recs[i] << std::endl;
  422. datasize += classesUsed*incrementalAddSize ;
  423. }
  424. }
  425. else
  426. {
  427. std::cerr << "========================" << std::endl;
  428. std::cerr << "No classification done therefor no classification times available." << std::endl;
  429. }
  430. return 0;
  431. }