void Signature::changeWordsRef(int oldWordId, int activeWordId) { std::list<cv::KeyPoint> kps = uValues(_words, oldWordId); if(kps.size()) { std::list<cv::Point3f> pts = uValues(_words3, oldWordId); std::list<cv::Mat> descriptors = uValues(_wordsDescriptors, oldWordId); _words.erase(oldWordId); _words3.erase(oldWordId); _wordsDescriptors.erase(oldWordId); _wordsChanged.insert(std::make_pair(oldWordId, activeWordId)); for(std::list<cv::KeyPoint>::const_iterator iter=kps.begin(); iter!=kps.end(); ++iter) { _words.insert(std::pair<int, cv::KeyPoint>(activeWordId, (*iter))); } for(std::list<cv::Point3f>::const_iterator iter=pts.begin(); iter!=pts.end(); ++iter) { _words3.insert(std::pair<int, cv::Point3f>(activeWordId, (*iter))); } for(std::list<cv::Mat>::const_iterator iter=descriptors.begin(); iter!=descriptors.end(); ++iter) { _wordsDescriptors.insert(std::pair<int, cv::Mat>(activeWordId, (*iter))); } } }
const std::map<int, float> & BayesFilter::computePosterior(const Memory * memory, const std::map<int, float> & likelihood) { ULOGGER_DEBUG(""); if(!memory) { ULOGGER_ERROR("Memory is Null!"); return _posterior; } if(!likelihood.size()) { ULOGGER_ERROR("likelihood is empty!"); return _posterior; } if(_predictionLC.size() < 2) { ULOGGER_ERROR("Prediction is not valid!"); return _posterior; } UTimer timer; timer.start(); cv::Mat prior; cv::Mat posterior; float sum = 0; int j=0; // Recursive Bayes estimation... // STEP 1 - Prediction : Prior*lastPosterior _prediction = this->generatePrediction(memory, uKeys(likelihood)); ULOGGER_DEBUG("STEP1-generate prior=%fs, rows=%d, cols=%d", timer.ticks(), _prediction.rows, _prediction.cols); //std::cout << "Prediction=" << _prediction << std::endl; // Adjust the last posterior if some images were // reactivated or removed from the working memory posterior = cv::Mat(likelihood.size(), 1, CV_32FC1); this->updatePosterior(memory, uKeys(likelihood)); j=0; for(std::map<int, float>::const_iterator i=_posterior.begin(); i!= _posterior.end(); ++i) { ((float*)posterior.data)[j++] = (*i).second; } ULOGGER_DEBUG("STEP1-update posterior=%fs, posterior=%d, _posterior size=%d", posterior.rows, _posterior.size()); //std::cout << "LastPosterior=" << posterior << std::endl; // Multiply prediction matrix with the last posterior // (m,m) X (m,1) = (m,1) prior = _prediction * posterior; ULOGGER_DEBUG("STEP1-matrix mult time=%fs", timer.ticks()); //std::cout << "ResultingPrior=" << prior << std::endl; ULOGGER_DEBUG("STEP1-matrix mult time=%fs", timer.ticks()); std::vector<float> likelihoodValues = uValues(likelihood); //std::cout << "Likelihood=" << cv::Mat(likelihoodValues) << std::endl; // STEP 2 - Update : Multiply with observations (likelihood) j=0; for(std::map<int, float>::const_iterator i=likelihood.begin(); i!= likelihood.end(); ++i) { std::map<int, float>::iterator p =_posterior.find((*i).first); if(p!= _posterior.end()) { (*p).second = (*i).second * ((float*)prior.data)[j++]; sum+=(*p).second; } else { ULOGGER_ERROR("Problem1! can't find id=%d", (*i).first); } } ULOGGER_DEBUG("STEP2-likelihood time=%fs", timer.ticks()); //std::cout << "Posterior (before normalization)=" << _posterior << std::endl; // Normalize ULOGGER_DEBUG("sum=%f", sum); if(sum != 0) { for(std::map<int, float>::iterator i=_posterior.begin(); i!= _posterior.end(); ++i) { (*i).second /= sum; } } ULOGGER_DEBUG("normalize time=%fs", timer.ticks()); //std::cout << "Posterior=" << _posterior << std::endl; return _posterior; }
void DBDriver::emptyTrashes(bool async) { if(async) { ULOGGER_DEBUG("Async emptying, start the trash thread"); this->start(); return; } UTimer totalTime; totalTime.start(); std::map<int, Signature*> signatures; std::map<int, VisualWord*> visualWords; _trashesMutex.lock(); { ULOGGER_DEBUG("signatures=%d, visualWords=%d", _trashSignatures.size(), _trashVisualWords.size()); signatures = _trashSignatures; visualWords = _trashVisualWords; _trashSignatures.clear(); _trashVisualWords.clear(); _dbSafeAccessMutex.lock(); } _trashesMutex.unlock(); if(signatures.size() || visualWords.size()) { this->beginTransaction(); UTimer timer; timer.start(); if(signatures.size()) { if(this->isConnected()) { //Only one query to the database this->saveOrUpdate(uValues(signatures)); } for(std::map<int, Signature *>::iterator iter=signatures.begin(); iter!=signatures.end(); ++iter) { delete iter->second; } signatures.clear(); ULOGGER_DEBUG("Time emptying memory signatures trash = %f...", timer.ticks()); } if(visualWords.size()) { if(this->isConnected()) { //Only one query to the database this->saveOrUpdate(uValues(visualWords)); } for(std::map<int, VisualWord *>::iterator iter=visualWords.begin(); iter!=visualWords.end(); ++iter) { delete (*iter).second; } visualWords.clear(); ULOGGER_DEBUG("Time emptying memory visualWords trash = %f...", timer.ticks()); } this->commit(); } _emptyTrashesTime = totalTime.ticks(); ULOGGER_DEBUG("Total time emptying trashes = %fs...", _emptyTrashesTime); _dbSafeAccessMutex.unlock(); }