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 }