00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Channels/OptimalGains.H"
00019 #include "Channels/SubmapAlgorithmBiased.H"
00020 #include "ObjRec/BayesianBiaser.H"
00021 #include "Neuro/NeuroSimEvents.H"
00022 #include "Media/MediaSimEvents.H"
00023 #include "ObjRec/MaskBiaser.H"
00024 #include "GUI/DebugWin.H"
00025 #include "Image/MathOps.H"
00026
00027 void BiasImageForm::fileOpen()
00028 {
00029
00030 QString file = QFileDialog::getOpenFileName( "xmlFiles/all.xml",
00031 "ImageSet (*.xml)",
00032 this, "OpenImageDialog",
00033 "Choose Image" );
00034 if( !file.isEmpty() ) {
00035 itsTestScenes = new TestImages(file.ascii(), TestImages::XMLFILE );
00036 itsCurrentScene = 0;
00037 itsImg = itsTestScenes->getScene(itsCurrentScene);
00038 itsSceneNumber->setMaxValue(itsTestScenes->getNumScenes());
00039 imgDisp->setImage(itsImg);
00040
00041
00042 itsSelectObject->clear();
00043 for (uint obj=0; obj<itsTestScenes->getNumObj(itsCurrentScene); obj++)
00044 {
00045 TestImages::ObjData objData = itsTestScenes->getObjectData(itsCurrentScene, obj, true);
00046
00047 itsSelectObject->insertItem(QString(objData.description));
00048 }
00049
00050
00051 itsNewImage = true;
00052 }
00053 }
00054
00055
00056 void BiasImageForm::fileSave()
00057 {
00058
00059 }
00060
00061
00062 void BiasImageForm::fileExit()
00063 {
00064 }
00065
00066
00067 void BiasImageForm::init( ModelManager & manager, nub::ref<Brain> brain,
00068 nub::ref<SimEventQueue> seq)
00069 {
00070
00071 itsMgr = &manager;
00072
00073
00074 itsBrain = brain;
00075 itsSEQ = seq;
00076
00077
00078
00079
00080
00081 LFATAL("descriptor vecs should be handled via a SimReq to VisualCortex, which will then propagate to the channels");
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 clickClass = -1;
00105
00106 }
00107
00108
00109 void BiasImageForm::showBiasSettings()
00110 {
00111 itsBiasSettingsDialog.init(*itsMgr);
00112 itsBiasSettingsDialog.show();
00113
00114 }
00115
00116
00117 void BiasImageForm::evolveBrain()
00118 {
00119 if (itsMgr->started()){
00120
00121 if (itsImg.initialized() && itsNewImage)
00122 {
00123 rutz::shared_ptr<SimEventInputFrame>
00124 e(new SimEventInputFrame(itsBrain.get(), GenericFrame(itsImg), 0));
00125 itsSEQ->post(e);
00126 itsDescriptorVec->setInputImg(itsImg);
00127 itsNewImage = false;
00128 }
00129
00130
00131 SimTime end_time = itsSEQ->now() + SimTime::MSECS(3.0);
00132
00133 while (itsSEQ->now() < end_time)
00134 {
00135
00136 if (SeC<SimEventWTAwinner> e = itsSEQ->check<SimEventWTAwinner>(itsBrain.get()))
00137 {
00138 const Point2D<int> winner = e->winner().p;
00139 itsCurrentWinner = winner;
00140 LINFO("winner\n");
00141 classifyFovea(winner.i, winner.j,-1);
00142
00143
00144 if (true) showSMap();
00145 if (true) showTraj();
00146
00147
00148 itsSEQ->evolve();
00149 return;
00150
00151 }
00152
00153
00154 itsSEQ->evolve();
00155
00156 }
00157 }
00158
00159 }
00160
00161 void BiasImageForm::showTraj(){
00162 static bool setupTab = true;
00163 static ImageCanvas* disp = NULL;
00164 static Point2D<int> lastWinner = itsCurrentWinner;
00165
00166 if (!itsOutputImg.initialized())
00167 itsOutputImg = itsImg;
00168
00169
00170 drawCircle(itsOutputImg, itsCurrentWinner, 50, PixRGB<byte>(255,0,0));
00171 drawCircle(itsOutputImg, itsCurrentWinner, 3, PixRGB<byte>(255,0,0),3);
00172 drawLine(itsOutputImg, lastWinner, itsCurrentWinner, PixRGB<byte>(255,0,0),1);
00173 lastWinner = itsCurrentWinner;
00174
00175 if (setupTab){
00176
00177 QWidget* tab = new QWidget(tabDisp);
00178 QHBoxLayout* tabLayout = new QHBoxLayout(tab, 11, 6);
00179 disp = new ImageCanvas(tab);
00180 tabLayout->addWidget(disp);
00181 tabDisp->insertTab(tab, "Trajectory" );
00182 setupTab = false;
00183
00184
00185 connect(disp, SIGNAL(mousePressed(int,int) ),
00186 this, SLOT( getDescriptor(int,int) ) );
00187
00188 }
00189
00190 if (disp)
00191 disp->setImage(itsOutputImg);
00192
00193 }
00194
00195
00196 void BiasImageForm::showSMap()
00197 {
00198 static bool setupTab = true;
00199 static ImageCanvas* disp = NULL;
00200
00201 if (setupTab){
00202 QWidget* tab = new QWidget(tabDisp);
00203 QHBoxLayout* tabLayout = new QHBoxLayout(tab, 11, 6);
00204 disp = new ImageCanvas(tab);
00205 tabLayout->addWidget(disp);
00206 tabDisp->insertTab(tab, "SMap" );
00207 setupTab = false;
00208 }
00209
00210 if (disp) {
00211 Image<PixRGB<byte> > img;
00212
00213 LINFO("Show SMap\n");
00214 if (SeC<SimEventSaliencyMapOutput> smo =
00215 itsSEQ->check<SimEventSaliencyMapOutput>(itsBrain.get(), SEQ_ANY))
00216 {
00217 Image<float> tmp = smo->sm();
00218 inplaceNormalize(tmp, 0.0F, 255.0F);
00219 img = toRGB(rescale(tmp, tmp.getWidth()*16, tmp.getHeight()*16));
00220 }
00221
00222 disp->setImage(img);
00223 }
00224
00225 }
00226
00227
00228 void BiasImageForm::showChannels()
00229 {
00230 LFATAL("update to use a SimReq for ChannelMaps -- see SimulationViewerStd");
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 }
00255
00256
00257 void BiasImageForm::configureView( QAction * action )
00258 {
00259 LINFO("Configure view %i %i %i", itsViewTraj, itsViewSMap, itsViewChannels);
00260 if (viewTrajAction->isOn()) itsViewTraj = true; else itsViewTraj = false;
00261 if (viewSMapAction->isOn()) itsViewSMap = true; else itsViewSMap = false;
00262 if (viewChannelsAction->isOn()) itsViewChannels = true; else itsViewChannels = false;
00263 }
00264
00265
00266 void BiasImageForm::getDescriptor( int x, int y, int button )
00267 {
00268 LFATAL("fixme");
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 }
00283
00284 void BiasImageForm::showDescriptorVec()
00285 {
00286 itsDescriptorVecDialog.show();
00287 }
00288
00289
00290 void BiasImageForm::classifyFovea(int x, int y, int button)
00291 {
00292
00293 itsDescriptorVec->setFovea(Point2D<int>(x,y));
00294 itsDescriptorVec->buildRawDV();
00295 LINFO("Update Descriptior %i\n", button);
00296 itsDescriptorVecDialog.update();
00297
00298
00299 std::vector<double> FV = itsDescriptorVec->getFV();
00300
00301
00302
00303
00304 int cls = itsBayesNetwork->classify(FV);
00305
00306 if (cls != -1)
00307 {
00308 std::string clsName(itsBayesNetwork->getClassName(cls));
00309 msgLabel->setText(QString("Object is %L1").arg(clsName));
00310 LINFO("Object belong to class %i %s", cls,clsName.c_str());
00311 if (1)
00312 logFixation(clsName.c_str(), x, y, FV);
00313 } else {
00314 LINFO("Unknown Object");
00315 }
00316
00317
00318 if (!editConfigureTestAction->isOn()) {
00319
00320 if (button == 4)
00321 {
00322 QString objName = itsObjectName->text().lower();
00323 LINFO("Learning %s\n", objName.ascii());
00324 msgLabel->setText(QString("Learning %L1").arg(objName));
00325 itsBayesNetwork->learn(FV, objName.ascii());
00326
00327 if (1)
00328 logFixation(objName.ascii(), x, y, FV);
00329 }
00330
00331 } else {
00332 }
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 }
00347
00348
00349
00350
00351 void BiasImageForm::run()
00352 {
00353 for (int i=0; i<timesSpinBox->value(); i++){
00354 }
00355
00356 }
00357
00358
00359 void BiasImageForm::loadBayesNetwork()
00360 {
00361 QString file = QFileDialog::getOpenFileName( QString::null,
00362 "Bayes network (*.net)",
00363 this, "OpenImageDialog",
00364 "Choose Bayes Network" );
00365 if( !file.isEmpty() )
00366 itsBayesNetwork->load(file.ascii());
00367
00368 }
00369
00370
00371 void BiasImageForm::saveBayesNetwork()
00372 {
00373 QString file = QFileDialog::getSaveFileName( QString::null,
00374 "Bayes network (*.net)",
00375 this, "SaveImageDialog",
00376 "Choose Bayes Network" );
00377 if( !file.isEmpty() )
00378 itsBayesNetwork->save(file.ascii());
00379
00380
00381 }
00382
00383
00384 void BiasImageForm::viewBayesNetwork()
00385 {
00386 itsBayesNetworkDialog.show();
00387 itsBayesNetworkDialog.init(*itsBayesNetwork);
00388
00389 }
00390
00391
00392 void BiasImageForm::setBiasImage( bool biasVal )
00393 {
00394 LFATAL("fixme");
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430 }
00431
00432
00433 void BiasImageForm::showSceneSettings()
00434 {
00435
00436
00437
00438 }
00439
00440
00441 void BiasImageForm::getScene( int scene )
00442 {
00443
00444
00445 if (itsOutputImg.initialized())
00446 {
00447 char filename[255];
00448 TestImages::SceneData sceneData = itsTestScenes->getSceneData(itsCurrentScene);
00449 sprintf(filename, "%s.fix.ppm", sceneData.filename.c_str());
00450 Raster::WriteRGB(itsOutputImg, filename);
00451 }
00452
00453
00454 LINFO("get Scene\n");
00455 itsCurrentScene = scene;
00456 itsImg = itsTestScenes->getScene(itsCurrentScene);
00457 itsSceneNumber->setMaxValue(itsTestScenes->getNumScenes());
00458 Image<PixRGB<byte> > tmp = itsImg;
00459 if (viewShow_LabelsAction->isOn())
00460 itsTestScenes->labelScene(scene, tmp);
00461 imgDisp->setImage(tmp);
00462 itsNewImage = true;
00463
00464
00465 itsSelectObject->clear();
00466 for (uint obj=0; obj<itsTestScenes->getNumObj(itsCurrentScene); obj++)
00467 {
00468 TestImages::ObjData objData = itsTestScenes->getObjectData(itsCurrentScene, obj, true);
00469
00470 itsSelectObject->insertItem(QString(objData.description));
00471 }
00472 itsOutputImg = tmp;
00473
00474 evolveBrain();
00475 }
00476
00477
00478 void BiasImageForm::showLabels( bool show )
00479 {
00480 itsImg = itsTestScenes->getScene(itsCurrentScene);
00481 itsSceneNumber->setMaxValue(itsTestScenes->getNumScenes());
00482 Image<PixRGB<byte> > tmp = itsImg;
00483 if (viewShow_LabelsAction->isOn())
00484 itsTestScenes->labelScene(itsCurrentScene, tmp);
00485 imgDisp->setImage(tmp);
00486
00487 }
00488
00489
00490 void BiasImageForm::biasForObject( int obj )
00491 {
00492 LFATAL("fixme");
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503 }
00504
00505
00506 void BiasImageForm::showObjectLabel( bool show )
00507 {
00508 int lineWidth = int(itsImg.getWidth()*0.005);
00509
00510 itsImg = itsTestScenes->getScene(itsCurrentScene);
00511 Image<PixRGB<byte> > tmp = itsImg;
00512 if (viewShow_Object_LabelAction->isOn())
00513 {
00514 TestImages::ObjData objData = itsTestScenes->getObjectData(itsCurrentScene, itsSelectObject->currentItem());
00515 std::vector<Point2D<int> > objPoly = objData.polygon;
00516 Point2D<int> p1 = objPoly[0];
00517 for(uint i=1; i<objPoly.size(); i++)
00518 {
00519 drawLine(tmp, p1, objPoly[i], PixRGB<byte>(255, 0, 0), lineWidth);
00520 p1 = objPoly[i];
00521 }
00522 drawLine(tmp, p1, objPoly[0], PixRGB<byte>(255, 0, 0), lineWidth);
00523
00524 }
00525 imgDisp->setImage(tmp);
00526
00527 }
00528
00529 void BiasImageForm::logFixation(const char *name, const int x, const int y, const std::vector<double> &FV)
00530 {
00531 FILE *fp = fopen("fixation.log", "a");
00532
00533 TestImages::SceneData sceneData = itsTestScenes->getSceneData(itsCurrentScene);
00534
00535 fprintf(fp, "T: %s %s %i %i ", sceneData.filename.c_str(), name, x, y);
00536 for(uint i=0; i<FV.size(); i++)
00537 {
00538 fprintf(fp, "%f ", FV[i]);
00539 printf( "%f ", FV[i]);
00540 }
00541 fprintf(fp, "\n");
00542 printf("\n");
00543
00544 fclose(fp);
00545 }