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 #include "Component/ModelManager.H"
00050 #include "Media/FrameSeries.H"
00051 #include "GUI/XWindow.H"
00052 #include "Media/MediaSimEvents.H"
00053 #include "Neuro/StdBrain.H"
00054 #include "Neuro/NeuroSimEvents.H"
00055 #include "VFAT/featureClusterVision.H"
00056 #include "VFAT/segmentImageTrackMC2.H"
00057 #include "Simulation/SimEventQueueConfigurator.H"
00058
00059
00060 #define H1_STD 2.0F
00061 #define H2_STD 2.0F
00062 #define S_STD 2.0F
00063 #define V_STD 2.0F
00064
00065
00066
00067 #define IMAGE_SIZE_X 640
00068 #define IMAGE_SIZE_Y 480
00069
00070 #define GAMMA1 0
00071 #define GAMMA2 1
00072 #define GAMMA3 2
00073
00074
00075
00076
00077 #define MOTION 3
00078
00079
00080 #define HUE1 6
00081
00082 #define HUE2 7
00083
00084 #define SAT 4
00085
00086 #define VALUE 5
00087
00088
00089
00090
00091
00092
00093
00094
00095 #define TRACKER_NUMBER 3
00096 #define USE_LOGS true
00097 #define SAVE_TRACK_DRAW true
00098
00099
00100
00101
00102
00103
00104 int main(const int argc, const char **argv)
00105 {
00106 MYLOGVERB = LOG_INFO;
00107
00108 bool use_logs = USE_LOGS;
00109 bool save_track_draw = SAVE_TRACK_DRAW;
00110
00111
00112 ModelManager manager("Attention Model");
00113
00114
00115 nub::soft_ref<SimEventQueueConfigurator>
00116 seqc(new SimEventQueueConfigurator(manager));
00117 manager.addSubComponent(seqc);
00118
00119 nub::soft_ref<InputFrameSeries> ifs(new InputFrameSeries(manager));
00120 manager.addSubComponent(ifs);
00121
00122 nub::soft_ref<OutputFrameSeries> ofs(new OutputFrameSeries(manager));
00123 manager.addSubComponent(ofs);
00124
00125 nub::soft_ref<StdBrain> brain(new StdBrain(manager));
00126 manager.addSubComponent(brain);
00127
00128
00129 const std::string name = "featureCluster";
00130 const std::string tag = "fCV";
00131 Image< PixRGB<byte> > input;
00132 Image< PixRGB<float> > finput;
00133 std::vector<covHolder<double> > covHolder;
00134
00135
00136 if (manager.parseCommandLine(argc, argv, "<image>", 1, 1) == false)
00137 return(1);
00138
00139 nub::soft_ref<featureClusterVision<float> >
00140 fCV(new featureClusterVision<float>(manager,name,tag,brain,ifs,
00141 manager.getExtraArg(0)));
00142 manager.addSubComponent(fCV);
00143 nub::soft_ref<SimEventQueue> seq = seqc->getQ();
00144
00145
00146 manager.start();
00147
00148
00149
00150
00151 Image<PixRGB<float> > fima1; Image<PixRGB<byte> > bima1;
00152 XWindow win2(Dims(IMAGE_SIZE_X, IMAGE_SIZE_Y), 0, 0, "CLASSES TEMPORAL");
00153 Image<PixRGB<float> > fima2; Image<PixRGB<byte> > bima2;
00154 XWindow win3(Dims(IMAGE_SIZE_X, IMAGE_SIZE_Y), 0, 0, "TARGETS TEMPORAL");
00155 Image<PixRGB<float> > fima3; Image<PixRGB<byte> > bima3;
00156 Image<float> fima4; Image<byte> bima4;
00157
00158
00159 XWindow wini(Dims(IMAGE_SIZE_X, IMAGE_SIZE_Y),
00160 0, 0, "Test-input window");
00161 XWindow wino(Dims(IMAGE_SIZE_X/SIT_GLOBAL_DEC,
00162 (IMAGE_SIZE_Y/SIT_GLOBAL_DEC)*TRACKER_NUMBER),
00163 0, 0, "Test-output window");
00164 XWindow winAux(Dims(500, 450),
00165 0, 0, "Channel levels");
00166 unsigned short wi = IMAGE_SIZE_X;
00167 unsigned short hi = IMAGE_SIZE_Y;
00168
00169 Image<PixH2SV2<float> > H2SVimage;
00170
00171 Image< PixRGB<byte> > display;
00172
00173
00174
00175
00176
00177
00178 std::vector<float> adapt(4,0.0F);
00179 adapt[0] = 3.5F; adapt[1] = 3.5F; adapt[2] = 3.5F; adapt[3] = 3.5F;
00180
00181
00182 std::vector<float> STDmod(4,0.0F);
00183 STDmod[0] = H1_STD; STDmod[1] = H2_STD;
00184 STDmod[2] = S_STD; STDmod[3] = V_STD;
00185
00186 std::vector<std::string> fname(4,"");
00187 fname[0] = "Hue1"; fname[1] = "Hue2";
00188 fname[2] = "Sat"; fname[3] = "Val";
00189
00190 std::vector<float> lowerBoundMod(4,0.0F);
00191 lowerBoundMod[0] = 0.45F; lowerBoundMod[1] = 0.45F;
00192 lowerBoundMod[2] = 0.45F; lowerBoundMod[3] = 0.55F;
00193
00194 std::vector<float> upperBoundMod(4,0.0F);
00195 upperBoundMod[0] = 0.45F; upperBoundMod[1] = 0.45F;
00196 upperBoundMod[2] = 0.45F; upperBoundMod[3] = 0.55F;
00197
00198
00199 std::vector<unsigned short> channelMap(4,0);
00200 channelMap[0] = HUE1; channelMap[1] = HUE2;
00201 channelMap[2] = SAT; channelMap[3] = VALUE;
00202
00203 unsigned char oc[6][6] = {
00204 {128,0,0 ,255,0,0} ,
00205 {0,128,0 ,0,255,0} ,
00206 {0,0,128 ,0,0,255} ,
00207 {128,128,0 ,255,255,0} ,
00208 {0,128,128 ,0,255,255} ,
00209 {128,0,128 ,255,0,255}
00210 };
00211
00212
00213
00214 segmentImageTrackMC<float,unsigned int,4> _segmenter(wi*hi);
00215 segHolder<float,unsigned int,4> _segHolder;
00216
00217 std::vector<segmentImageTrackMC<float,unsigned int,4> >
00218 segmenters(TRACKER_NUMBER,_segmenter);
00219 std::vector<segHolder<float,unsigned int,4> >
00220 segHolder(TRACKER_NUMBER,_segHolder);
00221
00222
00223
00224
00225
00226 for(int i = 0; i < TRACKER_NUMBER; i++)
00227 {
00228 segmenters[i].SITuseLog(true);
00229 segmenters[i].SITsetFrame(&wi,&hi);
00230 segmenters[i].SITsetCircleColor(0,255,0);
00231 segmenters[i].SITsetUseSmoothing(true,10);
00232 segmenters[i].SITsetBoxColor(oc[i][0], oc[i][1], oc[i][2],
00233 oc[i][3], oc[i][4], oc[i][5]);
00234 segHolder[i].imageSizeX = wi;
00235 segHolder[i].imageSizeY = hi;
00236 segHolder[i].baseID = i;
00237
00238 for(int j = 0; j < 4; j++)
00239 {
00240 segHolder[i].channelAdapt[j] = adapt[j];
00241 segHolder[i].STDmod[j] = STDmod[j];
00242 segHolder[i].upperBoundMod[j] = upperBoundMod[j];
00243 segHolder[i].lowerBoundMod[j] = lowerBoundMod[j];
00244 segHolder[i].channelMap[j] = channelMap[j];
00245 segHolder[i].featureName[j] = fname[j];
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254
00255 if(use_logs)
00256 {
00257 std::ofstream outfileStart1("tracker.fzvision.log",std::ios::out);
00258 outfileStart1 << "\n*************************************************\n\n";
00259 outfileStart1.close();
00260 std::ofstream outfileStart2("blobs.fzvision.log",std::ios::out);
00261 outfileStart2 << "\n*************************************************\n\n";
00262 outfileStart2.close();
00263 }
00264
00265
00266 while(1) {
00267
00268 bool shouldsave = false;
00269 bool shouldquit = false;
00270 bool gotcovert = false;
00271 if (seq->check<SimEventWTAwinner>(0)) gotcovert = true;
00272 const FrameState os = ofs->update(seq->now(), gotcovert);
00273
00274 if (os == FRAME_NEXT || os == FRAME_FINAL)
00275 shouldsave = true;
00276
00277 if (os == FRAME_FINAL)
00278 shouldquit = true;
00279
00280 if (shouldsave)
00281 {
00282 SimModuleSaveInfo sinfo(ofs, *seq);
00283 brain->save(sinfo);
00284 int foo = ifs->frame();
00285 std::string Myname;
00286 std::string a = manager.getExtraArg(0);
00287 std::string b = ".";
00288 char c[100];
00289 if(foo == 1)
00290 ;
00291 if(foo < 10)
00292 sprintf(c,"00000%d",foo);
00293 else if(foo < 100)
00294 sprintf(c,"0000%d",foo);
00295 else if(foo < 1000)
00296 sprintf(c,"000%d",foo);
00297 else if(foo < 10000)
00298 sprintf(c,"00%d",foo);
00299 else if(foo < 100000)
00300 sprintf(c,"0%d",foo);
00301 else
00302 sprintf(c,"%d",foo);
00303 Myname = a + b + c;
00304 std::cout << "******************************************************\n";
00305 std::cout << "******************************************************\n";
00306
00307
00308 std::cout << "RUNNING FRAME " << foo << "\n";
00309 std::cout << "NAME " << Myname << "\n";
00310
00311 fCV->fCVuploadImage(input,Myname);
00312
00313 fCV->fCVclusterImage();
00314 std::cout << "******************************************************\n";
00315 std::cout << "******************************************************\n";
00316
00317 fCV->fCVgetClusterImages(&fima1,&fima2,&fima3,&fima4);
00318 bima1 = fima1; bima2 = fima2; bima3 = fima3; bima4 = fima4*255.0F;
00319 bima4 = rescale(bima4,bima1.getWidth(),bima1.getHeight());
00320
00321
00322 Raster::WriteRGB(bima3,sformat("target.out.%s.ppm",c));
00323
00324
00325 win2.drawImage(bima2);
00326 win3.drawImage(bima3);
00327
00328 covHolder = fCV->fCVgetCovHolders();
00329
00330
00331
00332
00333
00334 std::ofstream outfile("tracker.fzvision.log",std::ios::app);
00335 if(use_logs)
00336 {
00337 outfile << ">>> FRAME " << foo;
00338 }
00339
00340 for(int i = 0; i < TRACKER_NUMBER; i++)
00341 {
00342 segmenters[i].SITsetFrameNumber(foo);
00343 }
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 for(int x = 0; x < (signed)fCV->fCVgetCovHolderSize(); x++)
00354 {
00355
00356 for(int i = 0; i < TRACKER_NUMBER; i++)
00357 {
00358
00359 if(segHolder[i].noTargetYet == true)
00360 {
00361
00362 if(covHolder[x].mean[MOTION] > 2.5F)
00363 {
00364 if(use_logs)
00365 outfile << "\t- (" << x
00366 << ") MASS OK " << covHolder[x].mean[MOTION];
00367 bool unique = true;
00368
00369 for(int j = 0; j < TRACKER_NUMBER; j++)
00370 {
00371
00372 if(segHolder[j].noTargetYet == false)
00373 {
00374
00375
00376
00377
00378
00379 unique = segmenters[j].
00380 SITintersection(&covHolder[x],30,30);
00381 if(use_logs)
00382 outfile << "\n\t- CHECKED " << i
00383 << " WITH " << j << " : ";
00384
00385 }
00386 }
00387
00388 if(unique == true)
00389 {
00390 if(use_logs)
00391 outfile << "\t- Samples " << covHolder[x].samples << " ... ";
00392
00393 if(covHolder[x].samples > 25)
00394 {
00395 if(use_logs)
00396 {
00397 outfile << "OK ";
00398 outfile << " Variance " << covHolder[x].STD[HUE1] * H1_STD
00399 << " " << covHolder[x].STD[HUE2] * H2_STD
00400 << " ... ";
00401 outfile << "OK\n";
00402
00403 outfile << "<<<NEW TRACKING>>> " << x << "\t"
00404 << "FRAME " << foo << "\t"
00405 << "TRACKER " << i << "\t"
00406 << "LIFE SPAN " << covHolder[x].lifeSpan << "\t"
00407 << "(" << covHolder[x].posX
00408 << "," << covHolder[x].posY << ")\t"
00409 << "Max (" << covHolder[x].maxX
00410 << "," << covHolder[x].maxY << ")\t"
00411 << "Min (" << covHolder[x].minX
00412 << "," << covHolder[x].minY << ")\n";
00413 }
00414
00415 segHolder[i].noTargetYet = false;
00416
00417 segmenters[i].SITsetTrackSignature(&covHolder[x],
00418 &segHolder[i]);
00419 }
00420 }
00421 }
00422 }
00423 }
00424 }
00425 if(use_logs)
00426 {
00427 outfile << "\n";
00428 outfile.close();
00429 }
00430 display = input;
00431 Image<PixRGB<byte> > Aux;
00432 Aux.resize(100,450,true);
00433 Image<byte> tempPaste;
00434 tempPaste.resize(IMAGE_SIZE_X/SIT_GLOBAL_DEC,
00435 (IMAGE_SIZE_Y/SIT_GLOBAL_DEC)*TRACKER_NUMBER,true);
00436
00437
00438
00439
00440
00441
00442
00443
00444 for(int i = 0; i < TRACKER_NUMBER; i++)
00445 {
00446 Image<byte> temp;
00447 temp.resize(IMAGE_SIZE_X/SIT_GLOBAL_DEC,
00448 IMAGE_SIZE_Y/SIT_GLOBAL_DEC,true);
00449
00450 if(segHolder[i].noTargetYet == false)
00451 {
00452 H2SVimage = input;
00453
00454 segmenters[i].SITtrackImage(H2SVimage,&display);
00455
00456 temp = segmenters[i].SITreturnCandidateImage();
00457
00458 segmenters[i].SITgetTrackSignature(&segHolder[i]);
00459
00460 if(use_logs)
00461 {
00462 char whynotcomeupwithacoolname[100];
00463 sprintf(whynotcomeupwithacoolname,"blobs.%d.fzvision.log",i);
00464
00465 std::ofstream outfile2(whynotcomeupwithacoolname,std::ios::app);
00466 outfile2 << "FRAME " << foo
00467 << "\t"
00468 << "TOTAL TRACK TIME " << segHolder[i].totalLifeSpan
00469 << "\t"
00470 << "TRACK TIME " << segHolder[i].lifeSpan
00471 << "\t"
00472 << "BLOBS " << segHolder[i].blobNumber
00473 << "\t"
00474 << "LOT status " << segHolder[i].LOTtypeName
00475 << "\t"
00476 << "LOT count " << segHolder[i].LOTcount
00477 << "\t"
00478 << "MASS " << segHolder[i].mass
00479 << "\n";
00480 for(unsigned int ii = 0; ii < segHolder[i].blobNumber; ii++)
00481 {
00482 outfile2 << "\tBLOB NUMBER " << ii << "\t"
00483 << segmenters[i].SITgetBlobReasonForKill(ii)
00484 << " ... \t"
00485 << segmenters[i].SITgetBlobMass(ii) << "\t"
00486 << segmenters[i].SITgetBlobPosX(ii) << "\t"
00487 << segmenters[i].SITgetBlobPosY(ii) << "\n";
00488 }
00489 outfile2 << "\n";
00490 outfile2.close();
00491 }
00492 if(use_logs)
00493 {
00494 std::ofstream outfile("tracker.fzvision.log",std::ios::app);
00495 outfile << "OVERLAP - \n";
00496 }
00497
00498 for(int j = 0; j < TRACKER_NUMBER; j++)
00499 {
00500 if(i != j)
00501 {
00502
00503 if(segHolder[j].noTargetYet == false)
00504 {
00505
00506 if(segHolder[j].LOT == false)
00507 {
00508 float overlap, thisarea, otherarea;
00509
00510 segmenters[j].SITpercentOverlap(&segHolder[i],&overlap,
00511 &thisarea,&otherarea);
00512 if(use_logs)
00513 {
00514 std::ofstream outfile("tracker.fzvision.log",std::ios::app);
00515 outfile << i << " - " << j
00516 << " : i / j = " << overlap
00517 << "\n";
00518 outfile.close();
00519 }
00520
00521
00522 if(overlap > 0.75F)
00523 {
00524
00525
00526 if(segHolder[j].lifeSpan == segHolder[i].lifeSpan)
00527 {
00528 if(thisarea > otherarea)
00529 segHolder[i].noTargetYet = true;
00530 else
00531 segHolder[j].noTargetYet = true;
00532 }
00533 else if(segHolder[j].lifeSpan > segHolder[i].lifeSpan)
00534 segHolder[i].noTargetYet = true;
00535 else
00536 segHolder[j].noTargetYet = true;
00537 if(use_logs)
00538 {
00539 std::ofstream outfile("tracker.fzvision.log",std::ios::app);
00540 outfile << i << " OVERLAPS WITH " << j << "\n";
00541 outfile.close();
00542 }
00543 }
00544 }
00545 }
00546 }
00547 }
00548
00549
00550
00551 if(segHolder[i].LOTandReset == true)
00552 {
00553 segHolder[i].noTargetYet = true;
00554 std::cout << "LOSS OF TRACK RESET" << "\n";
00555 if(use_logs)
00556 {
00557 std::ofstream outfile("tracker.fzvision.log",std::ios::app);
00558 outfile << ">>>LOSS OF TRACK " << i
00559 << " RESET AT FRAME " << foo << "\n";
00560 outfile.close();
00561 }
00562 }
00563 }
00564 pasteImage(tempPaste,temp,
00565 (byte)128,Point2D<int>(0,(IMAGE_SIZE_Y/SIT_GLOBAL_DEC)*i));
00566 }
00567
00568 wino.drawImage(tempPaste);
00569 winAux.drawImage(Aux);
00570 wini.drawImage(display);
00571 if(save_track_draw)
00572 {
00573 Raster::WriteGray(tempPaste,
00574 sformat("tracker.candidates.out.%s.pgm",c));
00575 Raster::WriteRGB(Aux,sformat("tracker.levels.out.%s.ppm",c));
00576 Raster::WriteRGB(display,sformat("tracker.out.%s.ppm",c));
00577 }
00578 }
00579
00580 if (shouldquit) break;
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591 if (ifs->shouldWait() || ofs->shouldWait())
00592 Raster::waitForKey();
00593
00594
00595 const FrameState is = ifs->update(seq->now());
00596 if (is == FRAME_COMPLETE) break;
00597 if (is == FRAME_NEXT || is == FRAME_FINAL)
00598 {
00599 input = ifs->readRGB();
00600
00601
00602 if (input.initialized())
00603 {
00604 rutz::shared_ptr<SimEventInputFrame>
00605 e(new SimEventInputFrame(brain.get(), GenericFrame(input), 0));
00606 seq->post(e);
00607
00608
00609 if (MYLOGVERB >= LOG_DEBUG)
00610 SHOWMEMORY("MEMORY USAGE: frame %d t=%.1fms", ifs->frame(),
00611 seq->now().msecs());
00612 }
00613 }
00614
00615
00616 const SimStatus status = seq->evolve();
00617
00618 if (SIM_BREAK == status)
00619 break;
00620 }
00621
00622
00623
00624
00625
00626 fCV->fCVfeaturesToFile(manager.getExtraArg(0),false);
00627 fCV->fCVICAfeaturesToFile(manager.getExtraArg(0));
00628
00629
00630 manager.stop();
00631
00632
00633 return 0;
00634 }
00635
00636
00637
00638
00639
00640