This is an automated email from the git hooks/post-receive script. sebastic-guest pushed a commit to branch upstream-master in repository pktools.
commit d8c43962e6d4bd47ac3577c5facbc49d3aea8cd9 Author: Pieter Kempeneers <kempe...@gmail.com> Date: Thu May 29 09:54:31 2014 +0200 ConfusionMatix: must find exact match in getClassIndex, pkfssvm and pkfsann: confusion matrix global for class names --- ChangeLog | 2 + doc/mainpage.dox | 18 ++++--- src/algorithms/ConfusionMatrix.h | 2 +- src/algorithms/Filter2d.cc | 8 +-- src/algorithms/Filter2d.h | 1 + src/apps/pkdiff.cc | 36 ++++++------- src/apps/pkfsann.cc | 106 +++++++++++++++++++++++++-------------- src/apps/pkfssvm.cc | 106 +++++++++++++++++++++++---------------- src/apps/pklas2img.cc | 3 +- src/apps/pksvm.cc | 2 +- 10 files changed, 173 insertions(+), 111 deletions(-) diff --git a/ChangeLog b/ChangeLog index 73e020a..159086e 100755 --- a/ChangeLog +++ b/ChangeLog @@ -267,6 +267,8 @@ version 2.5.2 - configure script: GDAL>=1.10.0 is required for pkdiff - programs ported to windows and GUI with Qt removed underscore for QProcess in Windows + - algorithms + ConfusionMatrix.h: must find exact match in getClassIndex - pkinfo distinct long options - pkclassify_svm -> pksvm diff --git a/doc/mainpage.dox b/doc/mainpage.dox index e2125a3..dba08e2 100644 --- a/doc/mainpage.dox +++ b/doc/mainpage.dox @@ -41,20 +41,26 @@ Please refer to pktools as: http://pktools.nongnu.org (Pieter Kempeneers) contact: kempenep at gmail.com \section pktools_installation Installation -Download the latest release from http://download.savannah.gnu.org/releases/pktools/ (e.g., pktools-2.4.3.tar.gz) +Download the latest release from http://download.savannah.gnu.org/releases/pktools/ (pktools-latest.tar.gz) Optionally: check the release md5sum to ensure originality. \code -md5sum pktools-2.5.2.tar.gz +md5sum pktools-latest.tar.gz \endcode -The result should be identical to the content of the corresponding md5 file +The result should be identical to the content of the corresponding md5 file you can also download. -Then unpack the release +Ubuntu users can download and run the installation script install_pktools.sh: + +\code +sudo bash install_pktools.sh +\endcode + +For a manual installation, download and unpack the latest release \code -tar xzvf pktools-2.5.2.tar.gz -cd pktools-2.5.2 +tar xzvf pktools-latest.tar.gz +cd pktools-* \endcode Basic installation (please refer to INSTALL file for more advanced configuration) diff --git a/src/algorithms/ConfusionMatrix.h b/src/algorithms/ConfusionMatrix.h index 4a2b22d..db11864 100644 --- a/src/algorithms/ConfusionMatrix.h +++ b/src/algorithms/ConfusionMatrix.h @@ -48,7 +48,7 @@ public: int getClassIndex(std::string className) const { int index=0; for(index=0;index<m_classes.size();++index){ - if(m_classes[index].find(className)!=std::string::npos) + if(m_classes[index]==className) break; } if(index>=m_classes.size()) diff --git a/src/algorithms/Filter2d.cc b/src/algorithms/Filter2d.cc index e2e95eb..0fc643a 100644 --- a/src/algorithms/Filter2d.cc +++ b/src/algorithms/Filter2d.cc @@ -407,7 +407,7 @@ void filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, continue; outBuffer[x/down]=0; std::vector<double> windowBuffer; - std::map<int,int> occurrence; + std::map<long int,int> occurrence; int centre=dimX*(dimY-1)/2+(dimX-1)/2; for(int j=-(dimY-1)/2;j<=dimY/2;++j){ for(int i=-(dimX-1)/2;i<=dimX/2;++i){ @@ -576,15 +576,15 @@ void filter2d::Filter2d::doit(const ImgReaderGdal& input, ImgWriterGdal& output, } case(filter2d::countid):{ if(windowBuffer.size()) - outBuffer[x/down]+=occurrence.size(); + outBuffer[x/down]=occurrence.size(); else outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0; break; } case(filter2d::majority):{ if(occurrence.size()){ - std::map<int,int>::const_iterator maxit=occurrence.begin(); - for(std::map<int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){ + std::map<long int,int>::const_iterator maxit=occurrence.begin(); + for(std::map<long int,int>::const_iterator mit=occurrence.begin();mit!=occurrence.end();++mit){ if(mit->second>maxit->second) maxit=mit; } diff --git a/src/algorithms/Filter2d.h b/src/algorithms/Filter2d.h index 30ef9da..dec5a32 100644 --- a/src/algorithms/Filter2d.h +++ b/src/algorithms/Filter2d.h @@ -165,6 +165,7 @@ private: m_filterMap["scramble"]=filter2d::scramble; m_filterMap["shift"]=filter2d::shift; m_filterMap["linearfeature"]=filter2d::linearfeature; + m_filterMap["countid"]=filter2d::countid; } Vector2d<double> m_taps; diff --git a/src/apps/pkdiff.cc b/src/apps/pkdiff.cc index 84ff21c..f07d617 100644 --- a/src/apps/pkdiff.cc +++ b/src/apps/pkdiff.cc @@ -29,28 +29,28 @@ using namespace std; int main(int argc, char *argv[]) { - Optionpk<string> input_opt("i", "input", "Input image file."); - Optionpk<string> reference_opt("ref", "reference", "Reference image file"); - Optionpk<string> layer_opt("ln", "ln", "layer name(s) in sample (leave empty to select all)"); - Optionpk<string> output_opt("o", "output", "Output image file. Default is empty: no output image, only report difference or identical."); - Optionpk<string> ogrformat_opt("f", "f", "Output sample file format","SQLite"); + Optionpk<string> input_opt("i", "input", "Input raster dataset."); + Optionpk<string> reference_opt("ref", "reference", "Reference (raster or vector) dataset"); + Optionpk<string> layer_opt("ln", "ln", "layer name(s) in sample. Leave empty to select all (for vector reference datasets only)"); + Optionpk<string> output_opt("o", "output", "Output dataset (optional)"); + Optionpk<string> ogrformat_opt("f", "f", "OGR format for output vector (for vector reference datasets only)","SQLite"); Optionpk<string> mask_opt("m", "mask", "Mask image file. A single mask is supported only, but several mask values can be used. See also msknodata option. (default is empty)"); Optionpk<int> masknodata_opt("msknodata", "msknodata", "Mask value(s) where image is invalid. Use negative value for valid data (example: use -t -1: if only -1 is valid value)", 0); - Optionpk<string> colorTable_opt("ct", "ct", "color table (file with 5 columns: id R G B ALFA (0: transparent, 255: solid)"); Optionpk<short> valueE_opt("\0", "correct", "Value for correct pixels", 0,2); Optionpk<short> valueO_opt("\0", "omission", "Value for omission errors: input label > reference label", 1,2); Optionpk<short> valueC_opt("\0", "commission", "Value for commission errors: input label < reference label", 2,1); Optionpk<short> nodata_opt("nodata", "nodata", "No data value(s) in input or reference dataset are ignored"); - Optionpk<short> band_opt("b", "band", "Input band", 0); + Optionpk<short> band_opt("b", "band", "Input raster band", 0); Optionpk<bool> confusion_opt("cm", "confusion", "create confusion matrix (to std out)", false); - Optionpk<string> labelref_opt("lr", "lref", "attribute name of the reference label in case reference is OGR vector file", "label"); - Optionpk<string> labelclass_opt("lc", "lclass", "attribute name of the classified label in case output is OGR vector file", "class"); - Optionpk<short> boundary_opt("bnd", "boundary", "boundary for selecting the sample", 1,1); - Optionpk<bool> disc_opt("circ", "circular", "use circular disc kernel boundary)", false,1); - Optionpk<bool> homogeneous_opt("hom", "homogeneous", "only take homogeneous regions into account", false,1); - Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified."); + Optionpk<string> labelref_opt("lr", "lref", "attribute name of the reference label (for vector reference datasets only)", "label"); + Optionpk<string> labelclass_opt("lc", "lclass", "attribute name of the classified label (for vector reference datasets only)", "class"); + Optionpk<short> boundary_opt("bnd", "boundary", "boundary for selecting the sample (for vector reference datasets only)", 1,1); + Optionpk<bool> homogeneous_opt("hom", "homogeneous", "only take regions with homogeneous boundary into account (for reference datasets only)", false,1); + Optionpk<bool> disc_opt("circ", "circular", "use circular boundary (for vector reference datasets only)", false,1); Optionpk<string> classname_opt("c", "class", "list of class names."); Optionpk<short> classvalue_opt("r", "reclass", "list of class values (use same order as in classname opt."); + Optionpk<string> colorTable_opt("ct", "ct", "color table in ascii format having 5 columns: id R G B ALFA (0: transparent, 255: solid)."); + Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified."); Optionpk<short> verbose_opt("v", "verbose", "verbose", 0); bool doProcess;//stop process when program was invoked with help option (-h --help) @@ -58,6 +58,7 @@ int main(int argc, char *argv[]) doProcess=input_opt.retrieveOption(argc,argv); reference_opt.retrieveOption(argc,argv); layer_opt.retrieveOption(argc,argv); + band_opt.retrieveOption(argc,argv); confusion_opt.retrieveOption(argc,argv); labelref_opt.retrieveOption(argc,argv); classname_opt.retrieveOption(argc,argv); @@ -68,16 +69,15 @@ int main(int argc, char *argv[]) output_opt.retrieveOption(argc,argv); ogrformat_opt.retrieveOption(argc,argv); labelclass_opt.retrieveOption(argc,argv); - colorTable_opt.retrieveOption(argc,argv); valueE_opt.retrieveOption(argc,argv); valueO_opt.retrieveOption(argc,argv); valueC_opt.retrieveOption(argc,argv); - band_opt.retrieveOption(argc,argv); - option_opt.retrieveOption(argc,argv); - // class_opt.retrieveOption(argc,argv); boundary_opt.retrieveOption(argc,argv); - disc_opt.retrieveOption(argc,argv); homogeneous_opt.retrieveOption(argc,argv); + disc_opt.retrieveOption(argc,argv); + colorTable_opt.retrieveOption(argc,argv); + option_opt.retrieveOption(argc,argv); + // class_opt.retrieveOption(argc,argv); verbose_opt.retrieveOption(argc,argv); } catch(string predefinedString){ diff --git a/src/apps/pkfsann.cc b/src/apps/pkfsann.cc index 94fbd3c..51d8b98 100644 --- a/src/apps/pkfsann.cc +++ b/src/apps/pkfsann.cc @@ -41,6 +41,7 @@ using namespace std; //global parameters used in cost function getCost +ConfusionMatrix cm; map<string,short> classValueMap; vector<std::string> nameVector; vector<unsigned int> nctraining; @@ -120,14 +121,14 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures) vector<unsigned short> referenceVector; vector<unsigned short> outputVector; float rmse=0; - ConfusionMatrix cm; - //set names in confusion matrix using nameVector - for(int iname=0;iname<nameVector.size();++iname){ - if(classValueMap.empty()) - cm.pushBackClassName(nameVector[iname]); - else if(cm.getClassIndex(type2string<short>(classValueMap[nameVector[iname]]))<0) - cm.pushBackClassName(type2string<short>(classValueMap[nameVector[iname]])); - } + // ConfusionMatrix cm; + // //set names in confusion matrix using nameVector + // for(int iname=0;iname<nameVector.size();++iname){ + // if(classValueMap.empty()) + // cm.pushBackClassName(nameVector[iname]); + // else if(cm.getClassIndex(type2string<short>(classValueMap[nameVector[iname]]))<0) + // cm.pushBackClassName(type2string<short>(classValueMap[nameVector[iname]])); + // } vector<Vector2d<float> > tmpFeatures(nclass); for(int iclass=0;iclass<nclass;++iclass){ tmpFeatures[iclass].resize(trainingFeatures[iclass].size(),nFeatures); @@ -272,11 +273,6 @@ int main(int argc, char *argv[]) int nband=0; int startBand=2;//first two bands represent X and Y pos - vector<double> offset; - vector<double> scale; - vector< Vector2d<float> > trainingPixels;//[class][sample][band] - vector< Vector2d<float> > testPixels;//[class][sample][band] - // if(priors_opt.size()>1){//priors from argument list // priors.resize(priors_opt.size()); // double normPrior=0; @@ -300,11 +296,16 @@ int main(int argc, char *argv[]) classValueMap[classname_opt[iclass]]=classvalue_opt[iclass]; } //----------------------------------- Training ------------------------------- + vector<double> offset; + vector<double> scale; + vector< Vector2d<float> > trainingPixels;//[class][sample][band] + vector< Vector2d<float> > testPixels;//[class][sample][band] + map<string,Vector2d<float> > trainingMap; + map<string,Vector2d<float> > testMap; vector<string> fields; + //organize training data trainingPixels.clear(); - map<string,Vector2d<float> > trainingMap; - map<string,Vector2d<float> > testMap; if(verbose_opt[0]>=1) std::cout << "reading imageVector file " << training_opt[0] << std::endl; try{ @@ -339,6 +340,12 @@ int main(int argc, char *argv[]) cerr << error << std::endl; exit(1); } + catch(std::exception& e){ + std::cerr << "Error: "; + std::cerr << e.what() << std::endl; + std::cerr << CPLGetLastErrorMsg() << std::endl; + exit(1); + } catch(...){ cerr << "error catched" << std::endl; exit(1); @@ -354,23 +361,22 @@ int main(int argc, char *argv[]) std::cout << "training pixels: " << std::endl; map<string,Vector2d<float> >::iterator mapit=trainingMap.begin(); while(mapit!=trainingMap.end()){ - if(classValueMap.size()){ - //check if name in training is covered by classname_opt (values can not be 0) - if(classValueMap[mapit->first]>0){ - if(verbose_opt[0]) - std::cout << mapit->first << " -> " << classValueMap[mapit->first] << std::endl; - } - else{ - std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl; - exit(1); - } - } + // if(classValueMap.size()){ + // //check if name in training is covered by classname_opt (values can not be 0) + // if(classValueMap[mapit->first]>0){ + // if(verbose_opt[0]) + // std::cout << mapit->first << " -> " << classValueMap[mapit->first] << std::endl; + // } + // else{ + // std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl; + // exit(1); + // } + // } //delete small classes if((mapit->second).size()<minSize_opt[0]){ trainingMap.erase(mapit); continue; } - nameVector.push_back(mapit->first); trainingPixels.push_back(mapit->second); if(verbose_opt[0]>1) std::cout << mapit->first << ": " << (mapit->second).size() << " samples" << std::endl; @@ -383,16 +389,6 @@ int main(int argc, char *argv[]) mapit=testMap.begin(); while(mapit!=testMap.end()){ - if(classValueMap.size()){ - //check if name in test is covered by classname_opt (values can not be 0) - if(classValueMap[mapit->first]>0){ - ;//ok, no need to print to std::cout - } - else{ - std::cerr << "Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0" << std::endl; - exit(1); - } - } //no need to delete small classes for test sample testPixels.push_back(mapit->second); if(verbose_opt[0]>1) @@ -480,6 +476,42 @@ int main(int argc, char *argv[]) // std::cout << std::endl; } + //new + mapit=trainingMap.begin(); + bool doSort=true; + try{ + while(mapit!=trainingMap.end()){ + nameVector.push_back(mapit->first); + if(classValueMap.size()){ + //check if name in training is covered by classname_opt (values can not be 0) + if(classValueMap[mapit->first]>0){ + if(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){ + cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort); + } + } + else{ + std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl; + exit(1); + } + } + else + cm.pushBackClassName(mapit->first,doSort); + ++mapit; + } + } + catch(BadConversion conversionString){ + std::cerr << "Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?" << std::endl; + exit(1); + } + if(classname_opt.empty()){ + //std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl; + for(int iclass=0;iclass<nclass;++iclass){ + if(verbose_opt[0]) + std::cout << iclass << " " << cm.getClass(iclass) << " -> " << string2type<short>(cm.getClass(iclass)) << std::endl; + classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass)); + } + } + //Calculate features of trainig set nctraining.resize(nclass); nctest.resize(nclass); diff --git a/src/apps/pkfssvm.cc b/src/apps/pkfssvm.cc index a314c76..5dfccf6 100644 --- a/src/apps/pkfssvm.cc +++ b/src/apps/pkfssvm.cc @@ -44,6 +44,7 @@ using namespace std; #define Malloc(type,n) (type *)malloc((n)*sizeof(type)) //global parameters used in cost function getCost +ConfusionMatrix cm; map<string,short> classValueMap; vector<std::string> nameVector; vector<unsigned int> nctraining; @@ -51,9 +52,9 @@ vector<unsigned int> nctest; Optionpk<std::string> svm_type_opt("svmt", "svmtype", "type of SVM (C_SVC, nu_SVC,one_class, epsilon_SVR, nu_SVR)","C_SVC"); Optionpk<std::string> kernel_type_opt("kt", "kerneltype", "type of kernel function (linear,polynomial,radial,sigmoid) ","radial"); Optionpk<unsigned short> kernel_degree_opt("kd", "kd", "degree in kernel function",3); -Optionpk<float> gamma_opt("g", "gamma", "gamma in kernel function",0); +Optionpk<float> gamma_opt("g", "gamma", "gamma in kernel function",1.0); Optionpk<float> coef0_opt("c0", "coef0", "coef0 in kernel function",0); -Optionpk<float> ccost_opt("cc", "ccost", "the parameter C of C-SVC, epsilon-SVR, and nu-SVR",1); +Optionpk<float> ccost_opt("cc", "ccost", "the parameter C of C-SVC, epsilon-SVR, and nu-SVR",1000); Optionpk<float> nu_opt("nu", "nu", "the parameter nu of nu-SVC, one-class SVM, and nu-SVR",0.5); Optionpk<float> epsilon_loss_opt("eloss", "eloss", "the epsilon in loss function of epsilon-SVR",0.1); Optionpk<int> cache_opt("cache", "cache", "cache memory size in MB",100); @@ -148,14 +149,6 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures) if(verbose_opt[0]>2) std::cout << "SVM is now trained" << std::endl; - ConfusionMatrix cm; - //set names in confusion matrix using nameVector - for(int iname=0;iname<nameVector.size();++iname){ - if(classValueMap.empty()) - cm.pushBackClassName(nameVector[iname]); - else if(cm.getClassIndex(type2string<short>(classValueMap[nameVector[iname]]))<0) - cm.pushBackClassName(type2string<short>(classValueMap[nameVector[iname]])); - } if(cv_opt[0]>1){ double *target = Malloc(double,prob.l); svm_cross_validation(&prob,¶m,cv_opt[0],target); @@ -172,6 +165,7 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures) } else{ struct svm_node *x_test; + vector<double> result(nclass); x_test = Malloc(struct svm_node,(nFeatures+1)); for(int iclass=0;iclass<nclass;++iclass){ for(int isample=0;isample<nctest[iclass];++isample){ @@ -182,7 +176,8 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures) x_test[nFeatures].index=-1; double predict_label=0; //todo: make distinction between svm_predict and svm_predict_probability? - predict_label = svm_predict(svm,x_test); + assert(svm_check_probability_model(svm)); + predict_label = svm_predict_probability(svm,x_test,&(result[0])); string refClassName=nameVector[iclass]; string className=nameVector[static_cast<short>(predict_label)]; if(classValueMap.size()) @@ -212,6 +207,7 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures) free(prob.x); free(x_space); svm_free_and_destroy_model(&(svm)); + return(cm.kappa()); } @@ -307,11 +303,6 @@ int main(int argc, char *argv[]) int nband=0; int startBand=2;//first two bands represent X and Y pos - vector<double> offset; - vector<double> scale; - vector< Vector2d<float> > trainingPixels;//[class][sample][band] - vector< Vector2d<float> > testPixels;//[class][sample][band] - // if(priors_opt.size()>1){//priors from argument list // priors.resize(priors_opt.size()); // double normPrior=0; @@ -329,6 +320,8 @@ int main(int argc, char *argv[]) std::sort(band_opt.begin(),band_opt.end()); // map<string,short> classValueMap;//global variable for now (due to getCost) + // vector<std::string> nameVector;//global variable for now (due to getCost) + if(classname_opt.size()){ assert(classname_opt.size()==classvalue_opt.size()); for(int iclass=0;iclass<classname_opt.size();++iclass) @@ -336,13 +329,18 @@ int main(int argc, char *argv[]) } //----------------------------------- Training ------------------------------- - struct svm_problem prob; - vector<string> fields; - //organize training data - trainingPixels.clear(); - testPixels.clear(); + vector<double> offset; + vector<double> scale; + vector< Vector2d<float> > trainingPixels;//[class][sample][band] + vector< Vector2d<float> > testPixels;//[class][sample][band] map<string,Vector2d<float> > trainingMap; map<string,Vector2d<float> > testMap; + vector<string> fields; + + struct svm_problem prob; + //organize training data + // trainingPixels.clear(); + // testPixels.clear(); if(verbose_opt[0]>=1) std::cout << "reading training file " << training_opt[0] << std::endl; try{ @@ -377,6 +375,12 @@ int main(int argc, char *argv[]) cerr << error << std::endl; exit(1); } + catch(std::exception& e){ + std::cerr << "Error: "; + std::cerr << e.what() << std::endl; + std::cerr << CPLGetLastErrorMsg() << std::endl; + exit(1); + } catch(...){ cerr << "error catched" << std::endl; exit(1); @@ -391,23 +395,11 @@ int main(int argc, char *argv[]) std::cout << "training pixels: " << std::endl; map<string,Vector2d<float> >::iterator mapit=trainingMap.begin(); while(mapit!=trainingMap.end()){ - if(classValueMap.size()){ - //check if name in training is covered by classname_opt (values can not be 0) - if(classValueMap[mapit->first]>0){ - if(verbose_opt[0]) - std::cout << mapit->first << " -> " << classValueMap[mapit->first] << std::endl; - } - else{ - std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl; - exit(1); - } - } //delete small classes if((mapit->second).size()<minSize_opt[0]){ trainingMap.erase(mapit); continue; } - nameVector.push_back(mapit->first); trainingPixels.push_back(mapit->second); if(verbose_opt[0]>1) std::cout << mapit->first << ": " << (mapit->second).size() << " samples" << std::endl; @@ -420,16 +412,6 @@ int main(int argc, char *argv[]) mapit=testMap.begin(); while(mapit!=testMap.end()){ - if(classValueMap.size()){ - //check if name in test is covered by classname_opt (values can not be 0) - if(classValueMap[mapit->first]>0){ - ;//ok, no need to print to std::cout - } - else{ - std::cerr << "Error: names in classname option are not complete, please check names in test vector and make sure classvalue is > 0" << std::endl; - exit(1); - } - } //no need to delete small classes for test sample testPixels.push_back(mapit->second); if(verbose_opt[0]>1) @@ -518,6 +500,44 @@ int main(int argc, char *argv[]) // std::cout << std::endl; } + + //new + // map<string,Vector2d<float> >::iterator mapit=trainingMap.begin(); + mapit=trainingMap.begin(); + bool doSort=true; + try{ + while(mapit!=trainingMap.end()){ + nameVector.push_back(mapit->first); + if(classValueMap.size()){ + //check if name in training is covered by classname_opt (values can not be 0) + if(classValueMap[mapit->first]>0){ + if(cm.getClassIndex(type2string<short>(classValueMap[mapit->first]))<0){ + cm.pushBackClassName(type2string<short>(classValueMap[mapit->first]),doSort); + } + } + else{ + std::cerr << "Error: names in classname option are not complete, please check names in training vector and make sure classvalue is > 0" << std::endl; + exit(1); + } + } + else + cm.pushBackClassName(mapit->first,doSort); + ++mapit; + } + } + catch(BadConversion conversionString){ + std::cerr << "Error: did you provide class pairs names (-c) and integer values (-r) for each class in training vector?" << std::endl; + exit(1); + } + if(classname_opt.empty()){ + //std::cerr << "Warning: no class name and value pair provided for all " << nclass << " classes, using string2type<int> instead!" << std::endl; + for(int iclass=0;iclass<nclass;++iclass){ + if(verbose_opt[0]) + std::cout << iclass << " " << cm.getClass(iclass) << " -> " << string2type<short>(cm.getClass(iclass)) << std::endl; + classValueMap[cm.getClass(iclass)]=string2type<short>(cm.getClass(iclass)); + } + } + //Calculate features of training (and test) set nctraining.resize(nclass); nctest.resize(nclass); diff --git a/src/apps/pklas2img.cc b/src/apps/pklas2img.cc index dad94b0..1f50a53 100644 --- a/src/apps/pklas2img.cc +++ b/src/apps/pklas2img.cc @@ -146,10 +146,11 @@ int main(int argc,char **argv) { lasReader.open(input_opt[iinput]); } catch(string errorString){ - cout << errorString << endl; + cerr << errorString << endl; exit(1); } catch(...){ + cerr << "Error opening input " << input_opt[iinput] << endl; exit(2); } nPoints=lasReader.getPointCount(); diff --git a/src/apps/pksvm.cc b/src/apps/pksvm.cc index fa0918a..23a2e0c 100644 --- a/src/apps/pksvm.cc +++ b/src/apps/pksvm.cc @@ -86,7 +86,7 @@ int main(int argc, char *argv[]) Optionpk<string> output_opt("o", "output", "output classification image"); Optionpk<string> oformat_opt("of", "oformat", "Output image format (see also gdal_translate). Empty string: inherit from input image"); Optionpk<string> option_opt("co", "co", "Creation option for output file. Multiple options can be specified."); - Optionpk<string> colorTable_opt("ct", "ct", "colour table in ascii format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"); + Optionpk<string> colorTable_opt("ct", "ct", "color table in ascii format having 5 columns: id R G B ALFA (0: transparent, 255: solid)"); Optionpk<string> prob_opt("prob", "prob", "probability image."); Optionpk<string> entropy_opt("entropy", "entropy", "entropy image (measure for uncertainty of classifier output","",2); Optionpk<string> active_opt("active", "active", "ogr output for active training sample.","",2); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel