00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Channels/SubmapAlgorithmBiased.H"
00020
00021 void SceneUnderstandingForm::init( ModelManager & manager )
00022 {
00023
00024 itsMgr = &manager;
00025
00026
00027 nub::ref<StdBrain> brain = dynCastWeak<StdBrain>(itsMgr->subComponent("Brain"));
00028
00029
00030
00031 itsSceneUnderstanding = new SceneUnderstanding(itsMgr, brain);
00032
00033 itsDescriptorVec = itsSceneUnderstanding->getDescriptorVecPtr();
00034 itsBayesNetwork = itsSceneUnderstanding->getBayesPtr();
00035 itsProlog = itsSceneUnderstanding->getPrologPtr();
00036
00037 itsDescriptorVecDialog.init(*itsDescriptorVec);
00038
00039
00040 itsTrainScene = new SceneGenerator(SceneGenerator::ALOI_OBJECTS, 500, 500);
00041 itsTestScene = new SceneGenerator(SceneGenerator::ALOI_OBJECTS, 500, 500);
00042
00043 }
00044
00045 void SceneUnderstandingForm::fileOpen()
00046 {
00047
00048 static QString prevFilename("/home/lior/scenes/satellite/images/set1");
00049
00050 QString file = QFileDialog::getOpenFileName( prevFilename,
00051 "Images (*.pgm *.ppm *.pnm *.jpeg *.png *.jpg)",
00052 this, "OpenImageDialog",
00053 "Choose Image" );
00054 if( !file.isEmpty() ) {
00055 prevFilename = file;
00056 itsImg = Raster::ReadRGB( file );
00057 printf("File: %s \n", file.ascii());
00058
00059 itsSceneUnderstanding->setImage(itsImg);
00060 evolveBrain();
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 imgDisp->setImage(itsImg);
00072 updateDisplay();
00073 }
00074 }
00075
00076 void SceneUnderstandingForm::fileOpenWorkspace()
00077 {
00078
00079 QString KBFile("/home/lior/scenes/satellite/scenes/scene");
00080 QString bayesFile("/home/lior/scenes/satellite/scenes/scene.net");
00081
00082 LINFO("Consulting with %s", KBFile.ascii());
00083 if( itsProlog->consult((char*)KBFile.ascii()) )
00084 {
00085 msgLabel->setText(QString("KB Loaded: ") + KBFile);
00086 } else {
00087 msgLabel->setText(QString("Can not load KB: ") + KBFile);
00088 }
00089
00090 itsBayesNetwork->load(bayesFile.ascii());
00091
00092 }
00093
00094 void SceneUnderstandingForm::updateDisplay()
00095 {
00096 nub::ref<StdBrain> brain = itsSceneUnderstanding->getBrainPtr();
00097 if (true) showTraj(brain);
00098 if (true) showSMap(brain);
00099 if (true) showChannels(brain);
00100
00101 }
00102
00103 void SceneUnderstandingForm::fileSave()
00104 {
00105
00106 }
00107
00108
00109 void SceneUnderstandingForm::fileExit()
00110 {
00111 }
00112
00113
00114 void SceneUnderstandingForm::showBiasSettings()
00115 {
00116 itsBiasSettingsDialog.init(*itsMgr);
00117 itsBiasSettingsDialog.show();
00118
00119 }
00120
00121
00122 void SceneUnderstandingForm::evolveBrain()
00123 {
00124
00125 float interestLevel = itsSceneUnderstanding->evolveBrain();
00126 updateDisplay();
00127 LINFO("Interest Level %f", interestLevel);
00128 if (interestLevel > 1.0F)
00129 {
00130 msgLabel->setText(QString("Found something interesting %L1").arg(interestLevel));
00131 Point2D<int> foveaLoc = itsSceneUnderstanding->getFoveaLoc();
00132 classifyFovea(foveaLoc.i, foveaLoc.j);
00133 } else {
00134 msgLabel->setText(QString("Boring"));
00135 }
00136
00137 }
00138
00139 void SceneUnderstandingForm::showTraj(nub::ref<StdBrain>& brain){
00140 static bool setupTab = true;
00141 static ImageCanvas* disp = NULL;
00142
00143
00144 nub::ref<SimEventQueueConfigurator> seqc =
00145 dynCastWeak<SimEventQueueConfigurator>(itsMgr->subComponent("SimEventQueueConfigurator"));
00146 nub::ref<SimEventQueue> itsSEQ = seqc->getQ();
00147
00148 itsOutputImg = brain->getSV()->getTraj(itsSEQ->now());
00149
00150 if (setupTab){
00151
00152 QWidget* tab = new QWidget(tabDisp);
00153 QHBoxLayout* tabLayout = new QHBoxLayout(tab, 11, 6);
00154 disp = new ImageCanvas(tab);
00155 tabLayout->addWidget(disp);
00156 tabDisp->insertTab(tab, "Trajectory" );
00157 setupTab = false;
00158
00159
00160 connect(disp, SIGNAL(mousePressed(int,int) ),
00161 this, SLOT( getDescriptor(int,int) ) );
00162
00163 }
00164
00165 if (disp)
00166 disp->setImage(itsOutputImg);
00167
00168 }
00169
00170
00171 void SceneUnderstandingForm::showSMap( nub::ref<StdBrain> & brain )
00172 {
00173 static bool setupTab = true;
00174 static ImageCanvas* disp = NULL;
00175
00176 if (setupTab){
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, "SMap" );
00182 setupTab = false;
00183 }
00184
00185 if (disp) {
00186 Image<float> img = brain->getSM()->getV(false);
00187 disp->setImage(img);
00188 }
00189
00190 }
00191
00192
00193 void SceneUnderstandingForm::showChannels( nub::ref<StdBrain> & brain )
00194 {
00195 static bool setupTab = true;
00196 static ImageCanvas* disp[10];
00197 int numChans = brain->getVC()->numChans();
00198
00199 if (setupTab){
00200 for (int i=0; i<numChans; i++)
00201 {
00202 QWidget* tab = new QWidget(tabDisp);
00203 QHBoxLayout* tabLayout = new QHBoxLayout(tab, 11, 6);
00204 disp[i] = new ImageCanvas(tab);
00205 tabLayout->addWidget(disp[i]);
00206 tabDisp->insertTab(tab,
00207 brain->getVC()->subChan(i)->descriptiveName());
00208 setupTab = false;
00209 }
00210 }
00211
00212 if (disp)
00213 {
00214 for( int i=0; i<numChans; i++){
00215 Image<float> img = brain->getVC()->subChan(i)->getOutput();
00216 disp[i]->setImage(img);
00217 }
00218 }
00219
00220 }
00221
00222
00223 void SceneUnderstandingForm::configureView( QAction * action )
00224 {
00225 LINFO("Configure view %i %i %i", itsViewTraj, itsViewSMap, itsViewChannels);
00226 if (viewTrajAction->isOn()) itsViewTraj = true; else itsViewTraj = false;
00227 if (viewSMapAction->isOn()) itsViewSMap = true; else itsViewSMap = false;
00228 if (viewChannelsAction->isOn()) itsViewChannels = true; else itsViewChannels = false;
00229 }
00230
00231
00232 void SceneUnderstandingForm::setBias( int x, int y )
00233 {
00234
00235 }
00236
00237
00238 void SceneUnderstandingForm::getDescriptor( int x, int y )
00239 {
00240 printf("%i,%i\n", x, y);
00241 nub::ref<StdBrain> brain = dynCastWeak<StdBrain>(itsMgr->subComponent("Brain"));
00242 ComplexChannel* cc = &*dynCastWeak<ComplexChannel>(brain->getVC());
00243 itsCurrentAttention = Point2D<int>(x,y);
00244
00245 if (!cc->hasInput())
00246 evolveBrain();
00247
00248
00249 if (cc->hasInput())
00250 {
00251 classifyFovea(x, y);
00252 }
00253 }
00254
00255
00256
00257
00258 void SceneUnderstandingForm::showDescriptorVec()
00259 {
00260 itsDescriptorVecDialog.show();
00261 }
00262
00263
00264 void SceneUnderstandingForm::genScene()
00265 {
00266
00267 if (!editConfigureTestAction->isOn())
00268 itsImg = itsTrainScene->getScene(9);
00269 else
00270 itsImg = itsTestScene->getScene(9);
00271
00272 imgDisp->setImage(itsImg);
00273
00274
00275 }
00276
00277 void SceneUnderstandingForm::classifyFovea(int x, int y)
00278 {
00279
00280 double prob;
00281 int cls = itsSceneUnderstanding->classifyFovea(Point2D<int>(x,y), &prob);
00282 itsDescriptorVecDialog.update();
00283
00284 if (cls == -1)
00285 {
00286 msgLabel->setText(QString("Can you tell me what this is?"));
00287 itsCurrentObject = -1;
00288 } else {
00289 LINFO("Class name is %s (%f)", itsBayesNetwork->getClassName(cls), prob);
00290 msgLabel->setText(QString("This is %L1 (%L2)")
00291 .arg(itsBayesNetwork->getClassName(cls))
00292 .arg(prob));
00293 itsCurrentObject = cls;
00294 }
00295
00296
00297 }
00298
00299
00300
00301
00302 void SceneUnderstandingForm::run()
00303 {
00304 for (int i=0; i<timesSpinBox->value(); i++){
00305 genScene();
00306 evolveBrain();
00307 }
00308
00309 }
00310
00311
00312 void SceneUnderstandingForm::loadBayesNetwork()
00313 {
00314 QString file = QFileDialog::getOpenFileName( QString::null,
00315 "Bayes network (*.net)",
00316 this, "OpenImageDialog",
00317 "Choose Bayes Network" );
00318 if( !file.isEmpty() )
00319 itsBayesNetwork->load(file.ascii());
00320
00321 }
00322
00323
00324 void SceneUnderstandingForm::saveBayesNetwork()
00325 {
00326 QString file = QFileDialog::getSaveFileName( QString::null,
00327 "Bayes network (*.net)",
00328 this, "SaveImageDialog",
00329 "Choose Bayes Network" );
00330 if( !file.isEmpty() )
00331 itsBayesNetwork->save(file.ascii());
00332
00333
00334 }
00335
00336
00337 void SceneUnderstandingForm::viewBayesNetwork()
00338 {
00339 itsBayesNetworkDialog.show();
00340 itsBayesNetworkDialog.init(*itsBayesNetwork);
00341
00342 }
00343
00344
00345 void SceneUnderstandingForm::setBiasImage( bool biasVal )
00346 {
00347 nub::ref<StdBrain> brain = dynCastWeak<StdBrain>(itsMgr->subComponent("Brain"));
00348 ComplexChannel* cc = &*dynCastWeak<ComplexChannel>(brain->getVC());
00349
00350
00351 setSubmapAlgorithmBiased(*cc);
00352 }
00353
00354
00355 void SceneUnderstandingForm::showSceneSettings()
00356 {
00357 itsSceneSettingsDialog.init(itsTrainScene, itsTestScene);
00358 itsSceneSettingsDialog.show();
00359
00360 }
00361
00362
00363 void SceneUnderstandingForm::submitDialog()
00364 {
00365
00366 QString str = dialogText->text().lower();
00367 LINFO("You said: %s", str.ascii());
00368
00369 if (str.startsWith("this is "))
00370 {
00371 QString obj = str.section(' ', 2, 2);
00372 msgLabel->setText(QString("Learning ") + obj);
00373
00374
00375 LINFO("Learning object from %ix%i", itsCurrentAttention.i, itsCurrentAttention.j);
00376
00377 itsSceneUnderstanding->learn(itsCurrentAttention, obj.ascii());
00378 itsDescriptorVecDialog.update();
00379 updateDisplay();
00380
00381 return;
00382 }
00383
00384 if (str.startsWith("where is "))
00385 {
00386
00387 QString obj = str.section(' ', 2, 2);
00388 bool objKnown = itsSceneUnderstanding->biasFor(obj.ascii());
00389
00390 if (objKnown )
00391 {
00392 msgLabel->setText(QString("Finding ") + obj);
00393 LINFO("Biasing for %s", obj.ascii());
00394 evolveBrain();
00395 } else {
00396 msgLabel->setText(QString("I am sorry, but I dont know anything about ") + obj);
00397 }
00398 updateDisplay();
00399 return ;
00400
00401 }
00402
00403
00404 if (str.startsWith("consult "))
00405 {
00406 QString KBFile = str.section(' ', 1, 1);
00407 msgLabel->setText(QString("Loading KB: ") + KBFile);
00408
00409 LINFO("Consulting with %s", KBFile.ascii());
00410 if( itsProlog->consult((char*)KBFile.ascii()) )
00411 {
00412 msgLabel->setText(QString("KB Loaded: ") + KBFile);
00413 } else {
00414 msgLabel->setText(QString("Can not load KB: ") + KBFile);
00415 }
00416
00417 return;
00418 }
00419
00420
00421 if (str.startsWith("go"))
00422 {
00423
00424 std::string sceneType = itsSceneUnderstanding->highOrderRec();
00425 updateDisplay();
00426
00427 QString msg;
00428 msg = QString("Scene is: ") + sceneType;
00429 msgLabel->setText(msg);
00430
00431 return;
00432
00433 }
00434
00435 msgLabel->setText(QString("I did not understand!"));
00436
00437
00438 }
00439
00440
00441
00442