123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /**
- * @file SemanticSegmentation.cpp
- * @brief abstract interface for semantic segmentation algorithms
- * @author Erik Rodner
- * @date 03/19/2009
- */
- #include <iostream>
- #include "SemanticSegmentation.h"
- #include "objrec/baselib/Preprocess.h"
- #include "objrec/baselib/Globals.h"
- using namespace OBJREC;
- using namespace std;
- using namespace NICE;
- void SemanticSegmentation::convertLSetToSparseExamples(Examples &examples, LabeledSetVector &lvec)
- {
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertLSetToExamples starts" << endl;
- #endif
- for( map< int, vector<NICE::Vector *> >::iterator iter = lvec.begin(); iter != lvec.end(); ++iter )
- {
- for(int j = 0; j < (int)iter->second.size(); j++)
- {
- Vector &tmp = *(iter->second[j]);
- int dim = tmp.size();
- SparseVector *vec = new SparseVector(dim);
- for(int j = 0; j < dim; j++)
- {
- if(tmp[j] != 0.0)
- {
- (*vec)[j] = tmp[j];
- }
- }
- Example ex;
- ex.svec = vec;
- examples.push_back(pair<int, Example> ( iter->first, ex));
- }
- }
- lvec.clear();
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertLSetToExamples finished" << endl;
- #endif
- }
- void SemanticSegmentation::convertLSetToExamples(Examples &examples, LabeledSetVector &lvec)
- {
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertLSetToExamples starts" << endl;
- #endif
- for( map< int, vector<NICE::Vector *> >::iterator iter = lvec.begin(); iter != lvec.end(); ++iter )
- {
- for(int j = 0; j < iter->second.size(); j++)
- {
- NICE::Vector *vec = new NICE::Vector(*(iter->second[j]));
- Example ex(vec);
- examples.push_back(pair<int, Example> ( iter->first, ex));
- }
- }
- lvec.clear();
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertLSetToExamples finished" << endl;
- #endif
- }
- void SemanticSegmentation::convertExamplesToLSet(Examples &examples, LabeledSetVector &lvec)
- {
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertExamplesToLSet starts" << endl;
- #endif
- lvec.clear();
- for(int i = 0; i < (int)examples.size(); i++)
- {
- if(examples[i].second.vec != NULL)
- {
- lvec.add(examples[i].first, *examples[i].second.vec);
- delete examples[i].second.vec;
- examples[i].second.vec = NULL;
- }
- else
- {
- if(examples[i].second.svec != NULL)
- {
- throw("Transform SVEC to VEC not yet implemented");
- }
- else
- {
- throw("no features for LabeledSet");
- }
- }
- }
- examples.clear();
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertExamplesToLSet finished" << endl;
- #endif
- }
- void SemanticSegmentation::convertExamplesToVVector(VVector &feats,Examples &examples, vector<int> &label)
- {
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertExamplesToVVector starts" << endl;
- #endif
- feats.clear();
- label.clear();
- for(int i = 0; i < (int)examples.size(); i++)
- {
- label.push_back(examples[i].first);
- feats.push_back(*examples[i].second.vec);
- delete examples[i].second.vec;
- examples[i].second.vec = NULL;
- }
- examples.clear();
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertExamplesToVVector finished" << endl;
- #endif
- }
- void SemanticSegmentation::convertVVectorToExamples(VVector &feats,Examples &examples, vector<int> &label)
- {
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertVVectorToExamples starts" << endl;
- #endif
- for(int i = 0; i < (int)feats.size(); i++)
- {
- NICE::Vector *v = new NICE::Vector(feats[i]);
- Example ex(v);
- ex.position = 0; //TODO: hier mal was besseres überlegen, damit Klassifikator wieder Bildspezifisch lernt
- examples.push_back (pair<int, Example> ( label[i], ex));
- feats[i].clear();
- }
- feats.clear();
- label.clear();
- #ifdef DEBUG_PRINTS
- cout << "SemSegRegionBased::convertVVectorToExamples finished" << endl;
- #endif
- }
- SemanticSegmentation::SemanticSegmentation( const Config *conf,
- const ClassNames *classNames )
- {
- this->classNames = classNames;
- Preprocess::Init ( conf );
- std::string imagetype_s = conf->gS("main", "imagetype", "rgb");
- if (imagetype_s == "rgb")
- imagetype = IMAGETYPE_RGB;
- else if ( imagetype_s == "gray" )
- imagetype = IMAGETYPE_GRAY;
- else {
- fprintf (stderr, "SemanticSegmentation:: unknown image type option\n");
- exit(-1);
- }
- }
- SemanticSegmentation::~SemanticSegmentation()
- {
- }
- void SemanticSegmentation::semanticseg ( const std::string & filename,
- NICE::Image & segresult,
- GenericImage<double> & probabilities)
- {
- Globals::setCurrentImgFN(filename);
- CachedExample *ce;
- if ( imagetype == IMAGETYPE_RGB )
- {
- NICE::ColorImage img = Preprocess::ReadImgAdvRGB ( filename );
- ce = new CachedExample ( img );
- } else {
- NICE::Image img = Preprocess::ReadImgAdv ( filename );
- ce = new CachedExample ( img );
- }
- fprintf (stderr, "Starting Semantic Segmentation !\n");
- semanticseg ( ce, segresult, probabilities);
- delete ce;
- }
|