00001 /*!@file Beobot/GSNavResult.H read and summarize result files */ 00002 // //////////////////////////////////////////////////////////////////// // 00003 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00004 // University of Southern California (USC) and the iLab at USC. // 00005 // See http://iLab.usc.edu for information about this project. // 00006 // //////////////////////////////////////////////////////////////////// // 00007 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00008 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00009 // in Visual Environments, and Applications'' by Christof Koch and // 00010 // Laurent Itti, California Institute of Technology, 2001 (patent // 00011 // pending; application number 09/912,225 filed July 23, 2001; see // 00012 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00013 // //////////////////////////////////////////////////////////////////// // 00014 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00015 // // 00016 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00017 // redistribute it and/or modify it under the terms of the GNU General // 00018 // Public License as published by the Free Software Foundation; either // 00019 // version 2 of the License, or (at your option) any later version. // 00020 // // 00021 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00022 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00023 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00024 // PURPOSE. See the GNU General Public License for more details. // 00025 // // 00026 // You should have received a copy of the GNU General Public License // 00027 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00028 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00029 // Boston, MA 02111-1307 USA. // 00030 // //////////////////////////////////////////////////////////////////// // 00031 // Primary maintainer for this file: Christian Siagian <siagian@usc.edu> 00032 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Beobot/GSnavResult.H $ 00033 // $Id: GSnavResult.H 14376 2011-01-11 02:44:34Z pez $ 00034 00035 // ###################################################################### 00036 00037 #ifndef BEOBOT_GSNAV_RESULT_H_DEFINED 00038 #define BEOBOT_GSNAV_RESULT_H_DEFINED 00039 00040 #include "Image/Image.H" 00041 #include "Image/MathOps.H" // for inPlaceNormalize() 00042 00043 // ###################################################################### 00044 00045 /*! This class is to read the GSnav result file */ 00046 class GSnavResult 00047 { 00048 public: 00049 00050 // input information (on segment) 00051 std::vector<double> segError; 00052 std::vector<uint> segCount; 00053 std::vector<uint> eSegCount; 00054 00055 std::vector<uint> nSegObject; 00056 std::vector<uint> nSegObjectSearch; 00057 00058 std::vector<uint> nSegObjectFound; 00059 std::vector<uint> nSegObjectFoundSearch; 00060 00061 std::vector<uint> nSegObjectNotFound; 00062 std::vector<uint> nSegObjectNotFoundSearch; 00063 00064 // input information (on frame) 00065 std::vector<double> error; 00066 double stdevError; 00067 00068 std::vector<uint> nObject; 00069 double stdevNObject; 00070 std::vector<uint> nObjectSearch; 00071 00072 std::vector<uint> nObjectFound; 00073 double stdevNObjectFound; 00074 std::vector<uint> nObjectFoundSearch; 00075 00076 std::vector<uint> nObjectNotFound; 00077 double stdevNObjectNotFound; 00078 std::vector<uint> nObjectNotFoundSearch; 00079 00080 // file information 00081 uint nsegment; 00082 std::string savePrefix; 00083 00084 // total across segment information 00085 double terror; uint tcount; 00086 uint tfobj; uint tfsearch; 00087 uint tnfobj; uint tnfsearch; 00088 uint tobj; uint tsearch; 00089 uint itsSearchCount; 00090 00091 inline void combine(std::string inSavePrefix); 00092 inline void read(std::string inSavePrefix, uint inNsegment); 00093 inline void createSummaryResult(); 00094 inline void getSearchResult(std::vector<uint> index); 00095 }; 00096 00097 // ###################################################################### 00098 inline void GSnavResult::combine(std::string inSavePrefix) 00099 { 00100 savePrefix = inSavePrefix; 00101 00102 // open the result file 00103 std::string resFName = savePrefix + sformat("_results.txt"); 00104 std::string resGSfName = savePrefix + sformat("_GS_results.txt"); 00105 FILE *rfp; LINFO("res files: %s", resFName.c_str()); 00106 if((rfp = fopen(resFName.c_str(),"rb")) == NULL)LFATAL("not found"); 00107 FILE *gfp; LINFO("GS res files: %s", resGSfName.c_str()); 00108 if((gfp = fopen(resGSfName.c_str(),"rb")) == NULL)LFATAL("not found"); 00109 00110 // get each line from result file 00111 std::vector<std::string> rfpLines; 00112 char inLine[200]; 00113 while(fgets(inLine, 200, rfp) != NULL) 00114 { 00115 rfpLines.push_back(std::string(inLine)); 00116 } 00117 00118 // get each line from GS result file 00119 uint lind = 0; 00120 std::vector<std::string> cfpLines; 00121 00122 std::string resCfName = savePrefix + sformat("_comb_results.txt"); 00123 FILE *rFile = fopen(resCfName.c_str(), "at"); 00124 if (rFile == NULL) LFATAL("can't create res file: %s", 00125 resCfName.c_str()); 00126 00127 while(fgets(inLine, 200, gfp) != NULL) 00128 { 00129 // read the line 00130 char tLine[200]; uint cind; 00131 sscanf(inLine, "%d %s", &cind, tLine); 00132 LDEBUG("%6d <<%s>>", cind, tLine); 00133 00134 // copy the non end-search indexes 00135 for(uint i = lind; i < cind; i++) 00136 { 00137 cfpLines.push_back(rfpLines[i]); 00138 LDEBUG("%s", rfpLines[i].c_str()); 00139 fputs(rfpLines[i].c_str(), rFile); 00140 } 00141 00142 // append the two lines of the end-search index 00143 std::string temp(inLine); 00144 std::string::size_type lzpos = rfpLines[cind].find_last_of('0'); 00145 std::string::size_type pos = temp.find_first_not_of(' '); 00146 temp = temp.substr(pos); 00147 pos = temp.find_first_of(' '); 00148 temp = rfpLines[cind].substr(0, lzpos) + temp.substr(pos+1); 00149 cfpLines.push_back(temp); 00150 LDEBUG("[%d] %s", itsSearchCount, temp.c_str()); 00151 00152 fputs(temp.c_str(), rFile); 00153 00154 lind = cind+1; 00155 } 00156 fclose (rFile); 00157 } 00158 00159 // ###################################################################### 00160 inline void GSnavResult::read(std::string inSavePrefix, uint inNsegment) 00161 { 00162 savePrefix = inSavePrefix; 00163 nsegment = inNsegment; 00164 00165 // open the result file 00166 //std::string resFName = savePrefix + sformat("_comb_results.txt"); 00167 std::string resFName = savePrefix + sformat("_results.txt"); 00168 FILE *fp; LINFO("result file: %s", resFName.c_str()); 00169 if((fp = fopen(resFName.c_str(),"rb")) == NULL)LFATAL("not found"); 00170 00171 // initialize information storage 00172 segError.resize(nsegment); 00173 segCount.resize(nsegment); 00174 eSegCount.resize(nsegment); 00175 00176 nSegObject.resize(nsegment); 00177 nSegObjectSearch.resize(nsegment); 00178 00179 nSegObjectFound.resize(nsegment); 00180 nSegObjectFoundSearch.resize(nsegment); 00181 00182 nSegObjectNotFound.resize(nsegment); 00183 nSegObjectNotFoundSearch.resize(nsegment); 00184 00185 for(uint i = 0; i < nsegment; i++) segError[i] = 0.0F; 00186 for(uint i = 0; i < nsegment; i++) segCount[i] = 0; 00187 for(uint i = 0; i < nsegment; i++) eSegCount[i] = 0; 00188 00189 for(uint i = 0; i < nsegment; i++) nSegObjectFound[i] = 0; 00190 for(uint i = 0; i < nsegment; i++) nSegObjectFoundSearch[i] = 0; 00191 00192 for(uint i = 0; i < nsegment; i++) nSegObjectNotFound[i] = 0; 00193 for(uint i = 0; i < nsegment; i++) nSegObjectNotFoundSearch[i] = 0; 00194 00195 // get each line result 00196 char inLine[200]; 00197 itsSearchCount = 0; 00198 while(fgets(inLine, 200, fp) != NULL) 00199 { 00200 int index; uint ninput; 00201 uint snumGT; float ltravGT; 00202 uint snumRes; float ltravRes; float err; 00203 00204 // read the line 00205 char tLine[200]; 00206 sscanf(inLine, "%d %d %f %d %f %f %d %s", &index, 00207 &snumGT, <ravGT, &snumRes, <ravRes, &err, &ninput, tLine); 00208 LDEBUG("%6d %6d %10.6f %6d %10.6f %10.6f %6d", index, 00209 snumGT, ltravGT, snumRes, ltravRes, err, ninput); 00210 00211 if(ninput != 0) itsSearchCount++; 00212 00213 segError[snumGT] += double(err); 00214 segCount[snumGT]++; 00215 error.push_back(err); 00216 00217 if(snumGT != snumRes) eSegCount[snumGT]++; 00218 00219 // get the individual object search 00220 uint nFound = 0; uint nFoundSearch = 0; 00221 uint nNFound = 0; uint nNotFoundSearch = 0; 00222 std::string line(inLine); 00223 for(uint i = 0; i < ninput; i++) 00224 { 00225 // do it backwards 00226 int pos = line.find_last_of(' '); 00227 uint tnsearch = atoi(line.substr(pos+1).c_str()); 00228 line = line.substr(0, pos); 00229 line = line.substr(0, line.find_last_not_of(' ')+1); 00230 00231 pos = line.find_last_of(' '); 00232 bool tfound = !(line.substr(pos+1).compare("1")); 00233 line = line.substr(0, pos); 00234 line = line.substr(0, line.find_last_not_of(' ')+1); 00235 00236 LDEBUG("%d %d", tfound, tnsearch); 00237 00238 if(tfound) 00239 { 00240 nSegObjectFound[snumGT]++; 00241 nSegObjectFoundSearch[snumGT] += tnsearch; 00242 nFound++; 00243 nFoundSearch += tnsearch; 00244 } 00245 else 00246 { 00247 nSegObjectNotFound[snumGT]++; 00248 nSegObjectNotFoundSearch[snumGT] += tnsearch; 00249 nNFound++; 00250 nNotFoundSearch += tnsearch; 00251 } 00252 00253 LDEBUG("%d %d - %d %d", 00254 nSegObjectFound[snumGT], nSegObjectFoundSearch[snumGT], 00255 nSegObjectNotFound[snumGT], nSegObjectNotFoundSearch[snumGT]); 00256 } 00257 00258 // store for data of each frame 00259 nObjectFound.push_back(nFound); 00260 nObjectNotFound.push_back(nNFound); 00261 nObject.push_back(nFound + nNFound); 00262 00263 nObjectFoundSearch.push_back(nFoundSearch); 00264 nObjectNotFoundSearch.push_back(nNotFoundSearch); 00265 nObjectSearch.push_back(nFoundSearch + nNotFoundSearch); 00266 } 00267 fclose(fp); 00268 00269 // get across segment total 00270 terror = 0.0; tcount = 0; 00271 tfobj = 0; tfsearch = 0; 00272 tnfobj = 0; tnfsearch = 0; 00273 tobj = 0; tsearch = 0; 00274 for(uint i = 0; i < nsegment; i++) 00275 { 00276 terror+= segError[i]; 00277 tcount+= segCount[i]; 00278 00279 // search related numbers 00280 nSegObject[i] = nSegObjectFound[i] + nSegObjectNotFound[i]; 00281 nSegObjectSearch[i] = 00282 nSegObjectFoundSearch[i] + nSegObjectNotFoundSearch[i]; 00283 00284 tfobj += nSegObjectFound[i]; 00285 tfsearch += nSegObjectFoundSearch[i]; 00286 tnfobj += nSegObjectNotFound[i]; 00287 tnfsearch += nSegObjectNotFoundSearch[i]; 00288 tobj += nSegObject[i]; 00289 tsearch += nSegObjectSearch[i]; 00290 } 00291 00292 // get total standard deviation 00293 Image<double> t1(1,nObjectFound.size(),NO_INIT); 00294 for(uint i = 0; i < nObjectFound.size(); i++) 00295 t1.setVal(0, i, double(nObjectFound[i])); 00296 stdevNObjectFound = stdev(t1); 00297 00298 for(uint i = 0; i < nObjectNotFound.size(); i++) 00299 t1.setVal(0, i, double(nObjectNotFound[i])); 00300 stdevNObjectNotFound = stdev(t1); 00301 00302 for(uint i = 0; i < nObjectFound.size(); i++) 00303 t1.setVal(0, i, double(nObject[i])); 00304 stdevNObject = stdev(t1); 00305 00306 Image<double> t2(1,error.size(),NO_INIT); 00307 for(uint i = 0; i < error.size(); i++) t2.setVal(0, i, error[i]); 00308 stdevError = stdev(t2); 00309 } 00310 00311 // ###################################################################### 00312 inline void GSnavResult::createSummaryResult() 00313 { 00314 std::string sresFName = savePrefix + sformat("_summary_results.txt"); 00315 FILE *rfp; LINFO("result file: %s", sresFName.c_str()); 00316 if((rfp = fopen(sresFName.c_str(),"wt")) == NULL)LFATAL("not found"); 00317 00318 // segment line 00319 for(uint i = 0; i < nsegment; i++) 00320 { 00321 std::string line(sformat("[%6d]: 0 0.0 0",i)); 00322 if(segCount[i] > 0) 00323 { 00324 line = sformat 00325 ("[%6d]: %6d %10.6f %6d -- %6d %10d: %10.3f + %6d %10d: %10.3f" 00326 " = %6d %10d %10.3f", 00327 i, segCount[i], segError[i]/segCount[i], eSegCount[i], 00328 nSegObjectFound[i], nSegObjectFoundSearch[i], 00329 nSegObjectFoundSearch[i]/double(nSegObjectFound[i]), 00330 nSegObjectNotFound[i], nSegObjectNotFoundSearch[i], 00331 nSegObjectNotFoundSearch[i]/double(nSegObjectNotFound[i]), 00332 nSegObject[i], nSegObjectSearch[i], 00333 double(nSegObjectSearch[i])/nSegObject[i]); 00334 } 00335 LINFO("%s",line.c_str()); 00336 line += std::string("\n"); 00337 fputs(line.c_str(), rfp); 00338 } 00339 00340 // total line 00341 std::string lline = 00342 sformat 00343 ("total : %6d %10.6f -- %6d %10d: %10.3f + %6d %10d: %10.3f" 00344 " = %6d %10d %10.3f", 00345 tcount, terror/tcount, tfobj, tfsearch, tfsearch/double(tfobj), 00346 tnfobj, tnfsearch, tnfsearch/double(tnfobj), 00347 tobj, tsearch, tsearch/double(tobj)); 00348 LINFO("%s", lline.c_str()); 00349 LINFO("search count: %d: %f + %f = %f", 00350 itsSearchCount, double(tfobj)/itsSearchCount, 00351 double(tnfobj)/itsSearchCount, double(tobj)/itsSearchCount); 00352 lline += std::string("\n"); 00353 fputs(lline.c_str(), rfp); 00354 fclose (rfp); 00355 } 00356 00357 // ###################################################################### 00358 inline void GSnavResult::getSearchResult(std::vector<uint> index) 00359 { 00360 uint tfObj = 0; uint tfSearch = 0; 00361 uint tnfObj = 0; uint tnfSearch = 0; 00362 uint tObj = 0; uint tSearch = 0; 00363 00364 // go through the indexes in question 00365 for(uint i = 0; i < index.size(); i++) 00366 { 00367 tfObj += nObjectFound[index[i]]; 00368 tnfObj += nObjectNotFound[index[i]]; 00369 tObj += nObject[index[i]]; 00370 00371 tfSearch += nObjectFoundSearch[index[i]]; 00372 tnfSearch += nObjectNotFoundSearch[index[i]]; 00373 tSearch += nObjectSearch[index[i]]; 00374 } 00375 00376 // report the result 00377 LINFO("%6d %10d: %10.3f + %6d %10d: %10.3f = %6d %10d %10.3f| ", 00378 tfObj, tfSearch, tfSearch/float(tfObj), 00379 tnfObj, tnfSearch, tnfSearch/float(tnfObj), 00380 tObj, tSearch, tSearch/float(tObj)); 00381 } 00382 00383 // ###################################################################### 00384 00385 // ###################################################################### 00386 00387 /*! This class is to read the GSnav M_result file */ 00388 class GSnav_M_Result 00389 { 00390 public: 00391 00392 // input information 00393 std::vector<double> bbmtTime; 00394 double meanBbmtTime, minBbmtTime, maxBbmtTime, stdevBbmtTime; 00395 00396 std::vector<double> dorsalTime; 00397 double meanDorsalTime, minDorsalTime, maxDorsalTime, stdevDorsalTime; 00398 00399 std::vector<double> ventralTime; 00400 double meanVentralTime, minVentralTime, maxVentralTime, stdevVentralTime; 00401 00402 std::vector<double> inputTime; 00403 double meanInputTime, minInputTime, maxInputTime, stdevInputTime; 00404 00405 // ventral searches 00406 std::vector<uint> ventralSearchEndFrame; 00407 std::vector<uint> ventralSearchNumFrame; 00408 std::vector<double> ventralSearchTime; 00409 double meanVentralSearchTime, minVentralSearchTime, 00410 maxVentralSearchTime, stdevVentralSearchTime; 00411 00412 // file information 00413 std::string savePrefix; 00414 00415 inline void read(std::string inSavePrefix); 00416 }; 00417 00418 // ###################################################################### 00419 inline void GSnav_M_Result::read(std::string inSavePrefix) 00420 { 00421 savePrefix = inSavePrefix; 00422 00423 // open the result file 00424 std::string resFName = savePrefix + sformat("_M_results.txt"); 00425 FILE *fp; LINFO("result file: %s", resFName.c_str()); 00426 if((fp = fopen(resFName.c_str(),"rb")) == NULL)LFATAL("not found"); 00427 00428 // get each line result 00429 char inLine[200]; 00430 while(fgets(inLine, 200, fp) != NULL) 00431 { 00432 uint index; float bTime, dTime, vTime, iTime; 00433 int rCL, rNL; bool resetNL; 00434 00435 // read the line 00436 sscanf(inLine, "%d %f %d %d %f %f %f", 00437 &index, &bTime, &rCL, &rNL, &dTime, &vTime, &iTime); 00438 LDEBUG("%5d %11.5f %d %d %11.5f %11.5f %11.5f", 00439 index, bTime, rCL, rNL, dTime, vTime, iTime); 00440 if(rNL > 0) resetNL = true; else resetNL = false; 00441 00442 // store the results 00443 bbmtTime.push_back(bTime); 00444 dorsalTime.push_back(dTime); 00445 ventralTime.push_back(vTime); 00446 inputTime.push_back(iTime); 00447 00448 // store the frames at end of ventral search 00449 if(resetNL) 00450 { 00451 LDEBUG("[%4"ZU"]: %d line: %s", 00452 ventralSearchEndFrame.size(), index-1, inLine); 00453 00454 ventralSearchEndFrame.push_back(index-1); 00455 00456 if(ventralSearchNumFrame.size() == 0) 00457 ventralSearchNumFrame.push_back(0); 00458 else 00459 { 00460 uint tNum = ventralSearchNumFrame.back(); 00461 ventralSearchNumFrame.push_back(index-1 - tNum); 00462 } 00463 ventralSearchTime.push_back(vTime); 00464 } 00465 } 00466 00467 // delete the default -1.0 data entries 00468 bbmtTime.pop_back(); 00469 dorsalTime.erase(dorsalTime.begin()); 00470 ventralTime.erase(ventralTime.begin()); 00471 00472 ventralSearchEndFrame.erase(ventralSearchEndFrame.begin()); 00473 ventralSearchNumFrame.erase(ventralSearchNumFrame.begin()); 00474 ventralSearchTime.erase(ventralSearchTime.begin()); 00475 00476 // get the statistics (mean, min, max, stdev) for each vector 00477 Image<double> t1(1, bbmtTime.size(),NO_INIT); 00478 for(uint i = 0; i < bbmtTime.size(); i++) 00479 t1.setVal(0, i, double(bbmtTime[i])); 00480 meanBbmtTime = mean(t1); 00481 getMinMax(t1, minBbmtTime, maxBbmtTime); 00482 stdevBbmtTime = stdev(t1); 00483 00484 Image<double> t2(1, dorsalTime.size(),NO_INIT); 00485 for(uint i = 0; i < dorsalTime.size(); i++) 00486 t2.setVal(0, i, double(dorsalTime[i])); 00487 meanDorsalTime = mean(t2); 00488 getMinMax(t2, minDorsalTime, maxDorsalTime); 00489 stdevDorsalTime = stdev(t2); 00490 00491 Image<double> t3(1, ventralSearchTime.size(),NO_INIT); 00492 for(uint i = 0; i < ventralSearchTime.size(); i++) 00493 t3.setVal(0, i, double(ventralSearchTime[i])); 00494 meanVentralSearchTime = mean(t3); 00495 getMinMax(t3, minVentralSearchTime, maxVentralSearchTime); 00496 stdevVentralSearchTime = stdev(t3); 00497 00498 Image<double> t4(1, inputTime.size(),NO_INIT); 00499 for(uint i = 0; i < inputTime.size(); i++) 00500 t4.setVal(0, i, double(inputTime[i])); 00501 meanInputTime = mean(t4); 00502 getMinMax(t4, minInputTime, maxInputTime); 00503 stdevInputTime = stdev(t4); 00504 } 00505 00506 #endif 00507 00508 // ###################################################################### 00509 /* So things look consistent in everyone's emacs... */ 00510 /* Local Variables: */ 00511 /* indent-tabs-mode: nil */ 00512 /* End: */