00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 #include "Beowulf/Beowulf.H"
00114 #include "Component/ModelManager.H"
00115 #include "Raster/Raster.H"
00116 #include "Image/Image.H"
00117 #include "Image/Pixels.H"
00118 #include "GUI/XWinManaged.H"
00119 #include "Util/Timer.H"
00120
00121 #include "Beobot/BeobotControl.H"
00122
00123 #include "SIFT/VisualObject.H"
00124 #include "SIFT/VisualObjectDB.H"
00125 #include "SIFT/Histogram.H"
00126
00127 #include "Image/MathOps.H"
00128 #include "Image/CutPaste.H"
00129 #include "Image/DrawOps.H"
00130 #include "Image/ShapeOps.H"
00131 #include "Image/MatrixOps.H"
00132
00133 #include "Beobot/beobot-GSnav-def.H"
00134 #include "Beobot/GSnavResult.H"
00135 #include "Beobot/Environment.H"
00136 #include "Beobot/GSlocalizer.H"
00137
00138 #include <signal.h>
00139
00140 #include <errno.h>
00141
00142 static bool goforever = true;
00143
00144
00145
00146
00147
00148 void getSearchCommand
00149 ( TCPmessage &rmsg, int32 rframe, int32 raction, bool &resetVentralSearch,
00150 Image<PixRGB<byte> > &ima, Image<double> &cgist,
00151 std::vector<rutz::shared_ptr<VisualObject> > &inputVO,
00152 std::vector<Point2D<int> > &objOffset,
00153 std::string saveFilePath, std::string testRunFPrefix,
00154 float &dx, float &dy, uint &snumGT, float <ravGT);
00155
00156
00157 Image<PixRGB<byte> > getSalImage
00158 ( Image<PixRGB<byte> > ima,
00159 std::vector<rutz::shared_ptr<VisualObject> > inputVO,
00160 std::vector<Point2D<int> > objOffset, std::vector<bool> found);
00161
00162
00163 Image<PixRGB<byte> > processLocalizerResults
00164 ( nub::ref<GSlocalizer> gslocalizer, std::string savePrefix);
00165
00166 Image<PixRGB<byte> > getDisplayImage(nub::ref<GSlocalizer> gslocalizer);
00167
00168
00169 bool saveGist
00170 ( std::string saveFilePath, std::string testRunFPrefix,
00171 int currSegNum, int count, Image<double> cgist);
00172
00173
00174 void reportResults(std::string savePrefix, uint nsegment);
00175
00176
00177
00178 void reportTrialResults();
00179
00180
00181
00182 void terminate(int s) { LERROR("*** INTERRUPT ***"); goforever = false; }
00183
00184
00185 int main(const int argc, const char **argv)
00186 {
00187 MYLOGVERB = LOG_INFO;
00188
00189
00190 ModelManager manager("beobot Navigation using Gist & Saliency - "
00191 "Ventral");
00192
00193
00194 nub::soft_ref<Beowulf>
00195 beo(new Beowulf(manager, "Beowulf Slave", "BeowulfSlave", false));
00196 manager.addSubComponent(beo);
00197
00198 nub::ref<GSlocalizer> gslocalizer(new GSlocalizer(manager));
00199 manager.addSubComponent(gslocalizer);
00200
00201
00202 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false)
00203 return(1);
00204
00205
00206 signal(SIGHUP, terminate); signal(SIGINT, terminate);
00207 signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00208
00209 TCPmessage rmsg;
00210 TCPmessage smsg;
00211 int32 rframe, raction, rnode = -1;
00212
00213
00214 manager.start();
00215
00216
00217 while(!beo->receive(rnode, rmsg, rframe, raction, 5));
00218 LINFO("Ventral size: %d", rmsg.getSize());
00219 const int fstart = int(rmsg.getElementInt32());
00220 const int w = int(rmsg.getElementInt32());
00221 const int h = int(rmsg.getElementInt32());
00222 const int opMode = int(rmsg.getElementInt32());
00223 const int nSegment = int(rmsg.getElementInt32());
00224 int currSegNum = int(rmsg.getElementInt32());
00225 std::string envFName = rmsg.getElementString();
00226 std::string testRunFPrefix = rmsg.getElementString();
00227 std::string saveFilePath = rmsg.getElementString();
00228 std::string resultPrefix = rmsg.getElementString();
00229 int ldpos = envFName.find_last_of('.');
00230 int lspos = envFName.find_last_of('/');
00231 std::string testRunEnvFName = envFName.substr(0, ldpos) +
00232 std::string("-") + testRunFPrefix + std::string(".env");
00233 std::string envPrefix = envFName.substr(lspos+1, ldpos - lspos - 1);
00234
00235 LINFO("fstart: %d", fstart);
00236 LINFO("envFName: %s", envFName.c_str());
00237 LINFO("Where we save data: %s", saveFilePath.c_str());
00238 LINFO("envPrefix: %s", envPrefix.c_str());
00239 LINFO("testRunEnvFName: %s", testRunEnvFName.c_str());
00240 LINFO("result prefix: %s", resultPrefix.c_str());
00241 LINFO("test run prefix: %s", testRunFPrefix.c_str());
00242 LINFO("Image dimension %d by %d", w,h);
00243 switch(opMode)
00244 {
00245 case TRAIN_MODE:
00246 LINFO("number of segments: %d", nSegment);
00247 LINFO("current segment: %d", currSegNum);
00248 LINFO("TRAIN_MODE: build the landmark DB");
00249 break;
00250 case TEST_MODE:
00251 LINFO("TEST_MODE: let's roll");
00252 break;
00253 default: LERROR("Unknown operation mode");
00254 }
00255 rmsg.reset(rframe, raction);
00256
00257
00258 std::string gistFolder =
00259 saveFilePath + std::string("gist/");
00260 if (mkdir(gistFolder.c_str(), 0777) == -1 && errno != EEXIST)
00261 {
00262 LFATAL("Cannot create gist folder: %s", gistFolder.c_str());
00263 }
00264
00265
00266 std::string gistTrainFolder =
00267 saveFilePath + std::string("gistTrain/");
00268 if (mkdir(gistTrainFolder.c_str(), 0777) == -1 && errno != EEXIST)
00269 {
00270 LFATAL("Cannot create gistTrain folder: %s", gistTrainFolder.c_str());
00271 }
00272
00273
00274
00275
00276
00277 rutz::shared_ptr<XWinManaged> inputWin;
00278 inputWin.reset(new XWinManaged(Dims(w, h), 2*w+ 20, 0, "Input Window" ));
00279 rutz::shared_ptr<XWinManaged> matchWin;
00280 matchWin.reset(new XWinManaged(Dims(2*w, 2*h), 0, 0, "Result Window" ));
00281 rutz::shared_ptr<XWinManaged> mainWin;
00282
00283
00284
00285 rutz::shared_ptr<Environment> env(new Environment(envFName));
00286 env->setWindow(matchWin);
00287
00288
00289 if(opMode == TRAIN_MODE)
00290 {
00291
00292
00293 if(env->getNumSegment() == 0) env->resetNumSegment(nSegment);
00294
00295 env->setCurrentSegment(currSegNum);
00296 env->startBuild();
00297 }
00298
00299
00300
00301
00302 else if(opMode == TEST_MODE)
00303 {
00304
00305 if(env->isBlank())
00306 LFATAL("empty environment .env file may not exist");
00307
00308
00309 gslocalizer->setSavePrefix(resultPrefix);
00310
00311
00312 gslocalizer->setEnvironment(env);
00313
00314
00315
00316 std::string sBelFName = resultPrefix +
00317 sformat("_bel_%07d.txt", fstart-1);
00318 LINFO("Starting belief file: %s", sBelFName.c_str());
00319 gslocalizer->initParticles(sBelFName);
00320
00321
00322 gslocalizer->setBeoWulf(beo);
00323
00324
00325 gslocalizer->setWindow(matchWin);
00326
00327
00328 mainWin.reset
00329 (new XWinManaged(Dims(5*w, 3*h), 0, 0, "Main Window" ));
00330 }
00331 else LFATAL("invalid opmode");
00332
00333
00334 smsg.reset(rframe, INIT_DONE);
00335 beo->send(rnode, smsg);
00336
00337
00338 LINFO("MAIN LOOP"); uint fNum = 0; std::vector<float> procTime;
00339 Timer tim(1000000); uint64 t[NAVG];
00340 uint snumGT; float ltravGT;
00341 while(goforever)
00342 {
00343
00344
00345 if(beo->receive(rnode, rmsg, rframe, raction, 2))
00346 {
00347 LINFO("[%d] message rec: %d", rframe, raction);
00348 fNum = rframe;
00349
00350
00351 if(raction == ABORT)
00352 {
00353 LINFO("done: BREAK"); goforever = false;
00354
00355
00356
00357 if(gslocalizer->getInputImage().initialized())
00358 {
00359
00360
00361 gslocalizer->updateBelief();
00362
00363
00364 Image<PixRGB<byte> > dispIma =
00365 processLocalizerResults(gslocalizer, resultPrefix);
00366
00367 uint lfnum = gslocalizer->getInputFnum();
00368 mainWin->setTitle(sformat("Frame %d", lfnum).c_str());
00369 mainWin->drawImage(dispIma,0,0);
00370 }
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 if(raction == SEARCH_LM)
00385 {
00386 tim.reset();
00387 Image<PixRGB<byte> > ima; Image<double> cgist;
00388 std::vector<rutz::shared_ptr<VisualObject> > inputVO;
00389 std::vector<Point2D<int> > objOffset; std::vector<bool> found;
00390 float dx, dy; bool resetVentralSearch = false;
00391 getSearchCommand(rmsg, fNum, raction, resetVentralSearch,
00392 ima, cgist, inputVO, objOffset,
00393 saveFilePath, testRunFPrefix,
00394 dx, dy, snumGT, ltravGT);
00395 for(uint i = 0; i < inputVO.size(); i++) found.push_back(false);
00396 LDEBUG("[%d] getSearchCommand: %f", fNum, tim.get()/1000.0);
00397
00398 inputWin->drawImage
00399 (getSalImage(ima, inputVO, objOffset, found),0,0);
00400 inputWin->setTitle(sformat("fr: %d", fNum).c_str());
00401
00402
00403 switch(opMode)
00404 {
00405 case TRAIN_MODE:
00406 {
00407
00408 std::string sName(sformat("scene%07d",fNum));
00409 std::string sfName = sName + std::string(".png");
00410 rutz::shared_ptr<VisualObject>
00411 scene(new VisualObject(sName, sfName, ima));
00412
00413 for(uint i = 0; i < inputVO.size(); i++)
00414 inputVO[i]->computeKeypoints();
00415
00416
00417 env->build(inputVO, objOffset, fNum, scene);
00418
00419
00420 saveGist(gistFolder, testRunFPrefix,
00421 currSegNum, fNum, cgist);
00422
00423 smsg.reset(rframe, SEARCH_LM_RES);
00424 smsg.addInt32(int32(fNum));
00425 smsg.addInt32(int32(fNum));
00426 LINFO("DONE BUILD_LM: %d", fNum);
00427 beo->send(rnode, smsg);
00428 break;
00429 }
00430 case TEST_MODE:
00431 {
00432 uint64 tSave = 0; uint64 t0;
00433
00434
00435 if(gslocalizer->getInputImage().initialized())
00436 {
00437
00438
00439 gslocalizer->updateBelief();
00440
00441
00442 t0 = tim.get();
00443 Image<PixRGB<byte> > dispIma =
00444 processLocalizerResults
00445 (gslocalizer, resultPrefix);
00446 tSave = tim.get() - t0;
00447
00448
00449 LINFO("\n\nfNum: %d",fNum);
00450
00451
00452 uint lfnum = gslocalizer->getInputFnum();
00453 mainWin->setTitle
00454 (sformat("Frame %d", lfnum).c_str());
00455 mainWin->drawImage(dispIma,0,0);
00456
00457
00458
00459 if(resetVentralSearch)
00460 {
00461
00462
00463 LINFO("[%d] resetting ventral search", fNum);
00464 gslocalizer->stopSearch2();
00465 }
00466 }
00467
00468
00469
00470 t0 = tim.get();
00471 gslocalizer->input
00472 (ima, inputVO, objOffset, fNum, cgist, dx, dy);
00473 gslocalizer->setGroundTruth(snumGT, ltravGT);
00474 uint64 tInput = tim.get() - t0;
00475
00476 LINFO("tS = %f, tI = %f", tSave/1000.0, tInput/1000.0);
00477 }
00478 break;
00479 default:
00480 LERROR("Unknown operation mode");
00481 }
00482
00483
00484 t[fNum % NAVG] = tim.get();
00485 if (fNum % NAVG == 0 && fNum != 0)
00486 {
00487 uint64 avg = 0ULL; for(int i=0; i<NAVG; i++) avg+=t[i];
00488 }
00489 uint64 ptime = tim.get(); float ptime2 = ptime/1000.0;
00490 LINFO("[%d] ventral proc time = %f", fNum, ptime2);
00491 procTime.push_back(ptime2);
00492 }
00493 }
00494 }
00495
00496
00497 smsg.reset(rframe, raction);
00498 smsg.addInt32(int32(777));
00499 beo->send(rnode, smsg);
00500 LINFO("received ABORT signal");
00501
00502
00503 switch(opMode)
00504 {
00505 case TRAIN_MODE:
00506
00507
00508 env->finishBuild(envFName, testRunFPrefix, fNum);
00509 env->save(envFName, testRunEnvFName, envPrefix);
00510 break;
00511
00512 case TEST_MODE:
00513 {
00514
00515 gslocalizer->stopSearch();
00516
00517
00518 reportResults(resultPrefix, env->getNumSegment());
00519
00520 float min = 0.0f, max = 0.0f;
00521 if(procTime.size() > 0){ min = procTime[0]; max = procTime[0]; }
00522 for(uint i = 1; i < procTime.size(); i++)
00523 {
00524 if (min > procTime[i]) min = procTime[i];
00525 if (max < procTime[i]) max = procTime[i];
00526 }
00527 LINFO("proc Time: %f - %f", min, max);
00528 }
00529 break;
00530
00531 default: LERROR("Unknown operation mode");
00532 }
00533
00534
00535 manager.stop();
00536 Raster::waitForKey();
00537 return 0;
00538 }
00539
00540
00541 Image<PixRGB<byte> > getSalImage
00542 ( Image<PixRGB<byte> > ima,
00543 std::vector<rutz::shared_ptr<VisualObject> > inputVO,
00544 std::vector<Point2D<int> > objOffset,
00545 std::vector<bool> found)
00546 {
00547 int w = ima.getWidth(); int h = ima.getHeight();
00548 Image<PixRGB<byte> > dispIma(w,h,ZEROS);
00549 inplacePaste(dispIma,ima, Point2D<int>(0,0));
00550
00551
00552
00553 LDEBUG("number of input objects: %"ZU, inputVO.size());
00554 for(uint i = 0; i < inputVO.size(); i++)
00555 {
00556 Rectangle r(objOffset[i], inputVO[i]->getImage().getDims());
00557 Point2D<int> salpt = objOffset[i] + inputVO[i]->getSalPoint();
00558 if(!found[i])
00559 {
00560 drawRect(dispIma,r,PixRGB<byte>(255,0,0));
00561 drawDisk(dispIma, salpt, 3, PixRGB<byte>(255,0,0));
00562 }
00563 else
00564 {
00565 drawRect(dispIma,r,PixRGB<byte>(0,255,0));
00566 drawDisk(dispIma, salpt, 3, PixRGB<byte>(0,255,0));
00567 }
00568 LDEBUG("found: %d", int(found[i]));
00569
00570 std::string ntext(sformat("%d", i));
00571 writeText(dispIma, objOffset[i] + inputVO[i]->getSalPoint(),
00572 ntext.c_str());
00573 }
00574
00575 return dispIma;
00576 }
00577
00578
00579
00580 void getSearchCommand
00581 ( TCPmessage &rmsg, int32 rframe, int32 raction, bool &resetVentralSearch,
00582 Image<PixRGB<byte> > &ima, Image<double> &cgist,
00583 std::vector<rutz::shared_ptr<VisualObject> > &inputVO,
00584 std::vector<Point2D<int> > &objOffset,
00585 std::string saveFilePath, std::string testRunFPrefix,
00586 float &dx, float &dy, uint &snumGT, float <ravGT)
00587 {
00588 resetVentralSearch = (int(rmsg.getElementInt32()) > 0);
00589
00590
00591 ima = rmsg.getElementColByteIma();
00592 LDEBUG("Image size: %d %d", ima.getWidth(), ima.getHeight());
00593
00594
00595 uint gsize = uint(rmsg.getElementInt32());
00596 cgist.resize(1, gsize, NO_INIT);
00597 Image<double>::iterator aptr = cgist.beginw();
00598 for(uint i = 0; i < gsize; i++) *aptr++ = rmsg.getElementDouble();
00599
00600
00601 inputVO.clear(); objOffset.clear();
00602 uint nvo = uint(rmsg.getElementInt32());
00603 for(uint i = 0; i < nvo; i++)
00604 {
00605 int si, sj;
00606 si = int(rmsg.getElementInt32());
00607 sj = int(rmsg.getElementInt32());
00608 Point2D<int> salpt(si,sj);
00609
00610 int tin, lin, bin, rin;
00611 tin = int(rmsg.getElementInt32());
00612 lin = int(rmsg.getElementInt32());
00613 bin = int(rmsg.getElementInt32());
00614 rin = int(rmsg.getElementInt32());
00615 Rectangle rect = Rectangle::tlbrO(tin, lin, bin, rin);
00616 int fsize = int(rmsg.getElementInt32());
00617 LDEBUG("[%d] salpt:(%s) r:[%s]", i,
00618 convertToString(salpt).c_str(),
00619 convertToString(rect).c_str());
00620 Point2D<int> offset(rect.left(), rect.top());
00621
00622 objOffset.push_back(offset);
00623
00624
00625 std::vector<float> features;
00626 for(int j = 0; j < fsize; j++)
00627 features.push_back(rmsg.getElementDouble());
00628
00629
00630 Image<PixRGB<byte> > objImg = crop(ima, rect);
00631 std::string
00632 iName(sformat("%s_SAL_%07d_%02d",
00633 testRunFPrefix.c_str(), rframe, i));
00634 std::string ifName = iName + std::string(".png");
00635 ifName = saveFilePath + ifName;
00636 rutz::shared_ptr<VisualObject>
00637 vo(new VisualObject
00638 (iName, ifName, objImg, salpt - offset, features,
00639 std::vector< rutz::shared_ptr<Keypoint> >(), false, false));
00640 inputVO.push_back(vo);
00641
00642 LDEBUG("rframe[%d] image[%d]: %s sal:[%d,%d] objOffset:[%d,%d]",
00643 rframe, i, iName.c_str(),
00644 (salpt - offset).i, (salpt - offset).j,
00645 objOffset[i].i, objOffset[i].j);
00646 }
00647
00648
00649 dx = rmsg.getElementFloat();
00650 dy = rmsg.getElementFloat();
00651
00652
00653 snumGT = uint(rmsg.getElementInt32());
00654 ltravGT = rmsg.getElementFloat();
00655
00656 rmsg.reset(rframe, raction);
00657 }
00658
00659
00660 Image<PixRGB<byte> > processLocalizerResults
00661 ( nub::ref<GSlocalizer> gslocalizer, std::string savePrefix)
00662 {
00663 Timer t1(1000000); t1.reset();
00664
00665 uint index = gslocalizer->getInputFnum();
00666 uint64 tGetRes = t1.get(); t1.reset();
00667
00668
00669 rutz::shared_ptr<Environment> env = gslocalizer->getEnvironment();
00670 float xGT = -1.0F, yGT = -1.0F; float error = 0.0F;
00671 uint snumRes = 0; float ltravRes = -1.0F;
00672 uint snumGT; float ltravGT; gslocalizer->getGroundTruth(snumGT, ltravGT);
00673 if(ltravGT != -1.0F)
00674 {
00675 env->getLocationFloat(snumGT, ltravGT, xGT, yGT);
00676 snumRes = gslocalizer->getSegmentLocation();
00677 ltravRes = gslocalizer->getSegmentLengthTraveled();
00678 error = env->getTopologicalMap()->
00679 getDistance(snumGT, ltravGT, snumRes, ltravRes);
00680 LDEBUG("Ground Truth [%d %f] vs [%d %f]: error: %f",
00681 snumGT, ltravGT, snumRes, ltravRes, error);
00682 }
00683 uint64 tGetGT = t1.get();
00684
00685 Image<PixRGB<byte> > dispIma;
00686 bool saveDisplay = true;
00687 if(saveDisplay)
00688 {
00689 dispIma = getDisplayImage(gslocalizer);
00690
00691
00692 std::string saveFName = savePrefix + sformat("_RES_%07d.ppm", index);
00693 LINFO("saving: %s",saveFName.c_str());
00694 Raster::WriteRGB(dispIma,saveFName);
00695
00696
00697
00698 std::string belFName = savePrefix + sformat("_bel_%07d.txt", index);
00699 FILE *bfp; LDEBUG("belief file: %s", belFName.c_str());
00700 if((bfp = fopen(belFName.c_str(),"wt")) == NULL)LFATAL("not found");
00701 std::vector<GSparticle> belief = gslocalizer->getBeliefParticles();
00702 for(uint i = 0; i < belief.size(); i++)
00703 {
00704 std::string bel = sformat("%d %f ", belief[i].segnum,
00705 belief[i].lentrav);
00706 bel += std::string("\n");
00707 fputs(bel.c_str(), bfp);
00708 }
00709 fclose (bfp);
00710 }
00711
00712 t1.reset();
00713
00714
00715 std::string resFName = savePrefix + sformat("_results.txt");
00716 FILE *rFile = fopen(resFName.c_str(), "at");
00717 if (rFile != NULL)
00718 {
00719 LDEBUG("saving result to %s", resFName.c_str());
00720 std::string line =
00721 sformat("%5d %3d %8.5f %3d %8.5f %10.6f %d ",
00722 index, snumGT, ltravGT, snumRes, ltravRes, error, 0);
00723
00724 LINFO("%s", line.c_str());
00725 line += std::string("\n");
00726
00727 fputs(line.c_str(), rFile);
00728 fclose (rFile);
00729 }
00730 else LINFO("can't create file: %s", resFName.c_str());
00731 uint64 tSaveRes = t1.get();
00732
00733 LDEBUG("tGR = %f, tGGT = %f, tSR = %f",
00734 tGetRes/1000.0, tGetGT/1000.0,tSaveRes/1000.0);
00735
00736 return dispIma;
00737 }
00738
00739
00740 Image<PixRGB<byte> > getDisplayImage(nub::ref<GSlocalizer> gslocalizer)
00741 {
00742
00743 Image<PixRGB<byte> > ima = gslocalizer->getInputImage();
00744 uint w = ima.getWidth(); uint h = ima.getHeight();
00745 Image<PixRGB<byte> > dispIma(5*w,3*h,ZEROS);
00746
00747 uint ninput = gslocalizer->getNumInputObject();
00748 std::vector<bool> mfound(ninput);
00749 std::vector<uint> nObjSearch(ninput);
00750 std::vector<rutz::shared_ptr<VisualObject> > iObject(ninput);
00751 std::vector<Point2D<int> > iOffset(ninput);
00752 std::vector<rutz::shared_ptr<VisualObjectMatch> > cmatch(ninput);
00753 for(uint i = 0; i < ninput; i++)
00754 {
00755 mfound[i] = gslocalizer->isMatchFound(i);
00756 nObjSearch[i] = gslocalizer->getNumObjectSearch(i);
00757 iObject[i] = gslocalizer->getInputVO(i);
00758 iOffset[i] = gslocalizer->getInputObjOffset(i);
00759 cmatch[i] = gslocalizer->getVOmatch(i);
00760 }
00761
00762
00763 Image<PixRGB<byte> > salIma = getSalImage(ima, iObject, iOffset, mfound);
00764 inplacePaste(dispIma, zoomXY(salIma), Point2D<int>(0,0));
00765
00766
00767 Image<byte> gistHistImg =
00768 gslocalizer->getSegmentHistogram()->getHistogramImage(w*3, h, 0.0F, 1.0F);
00769 inplacePaste(dispIma, Image<PixRGB<byte> >(gistHistImg), Point2D<int>(0,2*h));
00770
00771
00772 int scale;
00773 Image<PixRGB<byte> > beliefImg =
00774 gslocalizer->getBeliefImage(w*2, h*3, scale);
00775
00776
00777 rutz::shared_ptr<Environment> env = gslocalizer->getEnvironment();
00778 uint snumGT; float ltravGT; gslocalizer->getGroundTruth(snumGT, ltravGT);
00779 float xGT = -1.0F, yGT = -1.0F;
00780 env->getLocationFloat(snumGT, ltravGT, xGT, yGT);
00781 if(ltravGT != -1.0F)
00782 {
00783 Point2D<int> loc(int(xGT*scale + .5), int(yGT*scale + .5));
00784 LDEBUG("Ground Truth disp %f %f -> %d %d", xGT, yGT, loc.i, loc.j);
00785 drawDisk(beliefImg,loc, 4, PixRGB<byte>(255,0,0));
00786 }
00787
00788
00789 uint numObjectFound = 0;
00790 for(uint i = 0; i < ninput; i++)
00791 {
00792 if(mfound[i])
00793 {
00794 numObjectFound++;
00795 uint snum = gslocalizer->getSegmentNumberMatch(i);
00796 float ltrav = gslocalizer->getLengthTraveledMatch(i);
00797 float x, y;
00798 env->getLocationFloat(snum, ltrav, x, y);
00799 Point2D<int> loc(int(x*scale + .5), int(y*scale + .5));
00800 LDEBUG("obj[%d] res: %f %f -> %d %d",i, x, y, loc.i, loc.j);
00801 drawDisk(beliefImg, loc, 3, PixRGB<byte>(255,255,0));
00802 }
00803 }
00804 inplacePaste(dispIma, beliefImg, Point2D<int>(3*w,0));
00805
00806
00807 uint fcount = 0;
00808 for(uint i = 0; i < ninput; i++)
00809 {
00810 if(mfound[i] && fcount == 0)
00811 {
00812 fcount++;
00813
00814
00815 Image<PixRGB<byte> >matchIma =
00816 gslocalizer->getMatchImage(i, Dims(w,h));
00817 std::string ntext(sformat("object[%d]", i));
00818 writeText(matchIma, Point2D<int>(0,0), ntext.c_str());
00819 inplacePaste(dispIma, matchIma, Point2D<int>(2*w,0));
00820 }
00821 }
00822 if(fcount == 0) writeText(dispIma, Point2D<int>(2*w,0),"no objects found");
00823
00824 return dispIma;
00825 }
00826
00827
00828 bool saveGist(std::string saveFilePath, std::string testRunFPrefix,
00829 int currSegNum, int count, Image<double> cgist)
00830 {
00831 char gName[100];
00832 sprintf(gName,"%s_%03d_%06d.gist",
00833 (saveFilePath + testRunFPrefix).c_str(), currSegNum, count);
00834 LINFO("save gist file to: %s\n", gName);
00835
00836
00837 FILE *gfp; if((gfp = fopen(gName,"wb")) != NULL)
00838 {
00839 Image<double>::iterator aptr = cgist.beginw(), stop = cgist.endw();
00840 while (aptr != stop)
00841 { double val = *aptr++; fwrite(&val, sizeof(double), 1, gfp); }
00842 fclose(gfp);
00843 }
00844 else { LINFO("can't save: %s",gName); return false; }
00845
00846 return true;
00847 }
00848
00849
00850 void reportResults(std::string savePrefix, uint nsegment)
00851 {
00852 GSnavResult r;
00853
00854
00855 r.combine(savePrefix);
00856
00857
00858 r.read(savePrefix, nsegment);
00859
00860
00861 r.createSummaryResult();
00862 }
00863
00864
00865 void reportTrialResults()
00866 {
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917 uint nsegment = 9;
00918
00919
00920
00921 std::string savePrefix
00922 ("/lab/tmpib/u/siagian/PAMI07/ACB/envComb/RES/ACB");
00923 float scale = 2.00;
00924 uint nSalReg = 29710;
00925
00926 LINFO("%s has %d sal reg", savePrefix.c_str(), nSalReg);
00927
00928
00929 uint nTrials = 6;
00930 std::vector<std::string> inputFName(nTrials);
00931 inputFName[0] = savePrefix + sformat("_T_A_rand2/ACB");
00932 inputFName[1] = savePrefix + sformat("_T_A_seg2/ACB");
00933 inputFName[2] = savePrefix + sformat("_T_A_sal2/ACB");
00934 inputFName[3] = savePrefix + sformat("_T_A_loc2/ACB");
00935 inputFName[4] = savePrefix + sformat("_T_A_nee/ACB");
00936 inputFName[5] = savePrefix + sformat("_T_A2/ACB");
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028 std::vector<GSnavResult> r(nTrials);
01029 for(uint i = 0; i < nTrials; i++)
01030 {
01031 r[i].read(inputFName[i], nsegment);
01032
01033 }
01034
01035
01036 for(uint i = 0; i < nTrials; i++)
01037 {
01038 LINFO("%6d %10d: %10.3f + %6d %10d: %10.3f = %6d %10d %10.3f| "
01039 "%6d %10.6f",
01040 r[i].tfobj, r[i].tfsearch, r[i].tfsearch/float(r[i].tfobj),
01041 r[i].tnfobj, r[i].tnfsearch, r[i].tnfsearch/float(r[i].tnfobj),
01042 r[i].tobj, r[i].tsearch, r[i].tsearch/float(r[i].tobj),
01043 r[i].tcount, r[i].terror/r[i].tcount*scale);
01044 }
01045
01046
01047 for(uint i = 0; i < nTrials; i++)
01048 {
01049 printf("& %10.2f\\%% & $%6.2f \\pm %6.2f$ "
01050 "& %10.2f\\%% & $%6.2f \\pm %6.2f$ "
01051 "& %10.2f\\%% & $%6.2f \\pm %6.2f$ & $%6.2f \\pm %6.2f$\\\\ \n",
01052 r[i].tfsearch/float(r[i].tfobj)/nSalReg*100.0,
01053 float(r[i].tfobj)/r[i].tcount, r[i].stdevNObjectFound,
01054 r[i].tnfsearch/float(r[i].tnfobj)/nSalReg*100.0,
01055 float(r[i].tnfobj)/r[i].tcount, r[i].stdevNObjectNotFound,
01056 r[i].tsearch/float(r[i].tobj)/nSalReg*100.0,
01057 float(r[i].tobj)/r[i].tcount, r[i].stdevNObject,
01058 r[i].terror/r[i].tcount*scale, r[i].stdevError*scale);
01059 }
01060 }
01061
01062
01063
01064
01065
01066