/** * @file SemanticSegmentation.cpp * @brief abstract interface for semantic segmentation algorithms * @author Erik Rodner and Sven Sickert * @date 03/19/2009 */ #include #include "SemanticSegmentation.h" #include "vislearning/baselib/Preprocess.h" #include "vislearning/baselib/Globals.h" #include "core/image/MultiChannelImage3DT.h" #include "core/basics/StringTools.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 >::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 ( 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 >::iterator iter = lvec.begin(); iter != lvec.end(); ++iter ) { for ( int j = 0; j < ( int ) iter->second.size(); j++ ) { NICE::Vector *vec = new NICE::Vector ( * ( iter->second[j] ) ); Example ex ( vec ); examples.push_back ( pair ( 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 &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 &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 ( 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", "gray" ); 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::getDepthVector ( const LabeledSet *Files, vector & depthVec ) { std::string oldName; int zsize = 0; bool isInit = false; for (LabeledSet::const_iterator it = Files->begin(); it != Files->end(); it++) { for (std::vector::const_iterator jt = it->second.begin(); jt != it->second.end(); jt++) { ImageInfo & info = *(*jt); std::string file = info.img(); std::vector< std::string > list; StringTools::split ( file, '/', list ); std::string filename = list.back(); uint found = filename.find_last_of ( "_" ); if (found < filename.size() ) { std::string curName = filename.substr ( found-3,3 ); if ( !isInit ) { oldName = curName; isInit = true; } if ( curName.compare ( oldName ) == 0 ) { zsize++; } else { depthVec.push_back ( zsize ); zsize = 1; oldName = curName; } } else { zsize = 1; depthVec.push_back ( zsize ); } } } depthVec.push_back ( zsize ); } void SemanticSegmentation::make3DImage ( const std::vector & filelist, NICE::MultiChannelImage3DT & imgData ) { bool isInit = false; for ( int it = 0; it < ( int ) filelist.size(); it++ ) { if ( imagetype == IMAGETYPE_RGB ) { NICE::ColorImage img; try { img.read ( filelist[it] ); } catch ( ImageException iE ) { fprintf ( stderr, "Failed to open color image file: %s\n", filelist[it].c_str() ); fprintf ( stderr, "%s\n", iE.what() ); exit ( -1 ); } if ( !isInit ) { imgData.reInit ( img.width(),img.height(),filelist.size(),3 ); isInit = true; } for ( int y = 0; y < img.height(); y++ ) { for ( int x = 0; x < img.width(); x++ ) { for ( int r = 0; r < 3; r++ ) { imgData.set ( x, y, it, img.getPixel ( x,y,r ), r ); } } } } else { NICE::Image img; try { img.read ( filelist[it] ); } catch ( ImageException iE ) { fprintf ( stderr, "Failed to open image file: %s\n", filelist[it].c_str() ); fprintf ( stderr, "%s\n", iE.what() ); exit ( -1 ); } if ( !isInit ) { imgData.reInit ( img.width(),img.height(),filelist.size(),1 ); isInit = true; } for ( int y = 0; y < img.height(); y++ ) { for ( int x = 0; x < img.width(); x++ ) { imgData.set ( x, y, it, img.getPixel ( x,y ), 0 ); } } } } if ( imagetype == IMAGETYPE_GRAY ) { imgData.correctShading( 0 ); } }