[pktools] 30/375: added OptFactory.h and pkopt_svm.cc
Bas Couwenberg
sebastic at xs4all.nl
Wed Dec 3 21:53:55 UTC 2014
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 e6a281f310bf2dab0196022607103b169530687a
Author: Pieter Kempeneers <kempenep at gmail.com>
Date: Wed Jan 16 15:55:31 2013 +0100
added OptFactory.h and pkopt_svm.cc
---
ChangeLog | 14 +++++++++-----
src/algorithms/Makefile.am | 2 +-
src/algorithms/Makefile.in | 8 ++++----
src/apps/Makefile.am | 8 +++++---
src/apps/Makefile.in | 32 ++++++++++++++++++++++++--------
src/apps/pkfs_svm.cc | 18 ++++++------------
src/apps/pksensormodel.cc | 5 ++++-
7 files changed, 53 insertions(+), 34 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index de06614..6e3148c 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -40,6 +40,8 @@ version 2.4
--enable-fann (when FANN is installed, needed for pkclassify_nn)
--enable-las (when LIBLAS is installed, needed for pklas2img)
--enable-nlopt (when NLOPT is installed, needed for pksensormodel and pkgetchandelier)
+ - OptFactory.h (added)
+ factory class for nlopt::opt (selecting algorithm via string)
- ImgReaderGdal.cc
in addition to internal setNoData member variable, also support GDALSetNoData
- ImgWriterGdal.cc
@@ -64,13 +66,15 @@ version 2.4
update of header information
- pkclassify_nn
support of cross validation
- - pkfs_svm
- feature selection tool for svm classification (added)
- - pkfs_nn
- feature selection tool for nn classification (added)
+ - pkfs_svm (added)
+ feature selection tool for svm classification
+ - pkfs_nn (added)
+ feature selection tool for nn classification
+ - pkopt_svm (added)
+ optimization tool for svm classification (optimize ccost and gamma using NLOPT)
- pkascii2ogr
tool to create simple vector files from coordinates in ASCII file (points or polygon)
- pksensormodel
- tool to model pushbroom sensor
+ tool to model pushbroom sensor (with optimization of boresight angles using NLOPT)
- pkascii2ogr
support csv input file
diff --git a/src/algorithms/Makefile.am b/src/algorithms/Makefile.am
index 9f0bafa..b00098e 100644
--- a/src/algorithms/Makefile.am
+++ b/src/algorithms/Makefile.am
@@ -19,7 +19,7 @@ libalgorithms_a_HEADERS += myfann_cpp.h
endif
if USE_NLOPT
-libalgorithms_a_HEADERS += SensorModel.h
+libalgorithms_a_HEADERS += SensorModel.h OptFactory.h
endif
# the sources to add to the library and to add to the source distribution
diff --git a/src/algorithms/Makefile.in b/src/algorithms/Makefile.in
index a0c6645..bb2bb97 100644
--- a/src/algorithms/Makefile.in
+++ b/src/algorithms/Makefile.in
@@ -34,7 +34,7 @@ NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
@USE_FANN_TRUE at am__append_1 = myfann_cpp.h
- at USE_NLOPT_TRUE@am__append_2 = SensorModel.h
+ at USE_NLOPT_TRUE@am__append_2 = SensorModel.h OptFactory.h
subdir = src/algorithms
DIST_COMMON = $(am__libalgorithms_a_HEADERS_DIST) \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in
@@ -54,8 +54,8 @@ libalgorithms_a_AR = $(AR) $(ARFLAGS)
libalgorithms_a_LIBADD =
am__libalgorithms_a_SOURCES_DIST = Egcs.h Filter2d.h Filter.h \
Histogram.h ConfusionMatrix.h svm.h FeatureSelector.h \
- myfann_cpp.h SensorModel.h Egcs.cc Filter2d.cc Filter.cc \
- Histogram.cc ConfusionMatrix.cc svm.cpp
+ myfann_cpp.h SensorModel.h OptFactory.h Egcs.cc Filter2d.cc \
+ Filter.cc Histogram.cc ConfusionMatrix.cc svm.cpp
am__objects_1 =
am__objects_2 = $(am__objects_1) $(am__objects_1)
am_libalgorithms_a_OBJECTS = $(am__objects_2) Egcs.$(OBJEXT) \
@@ -79,7 +79,7 @@ SOURCES = $(libalgorithms_a_SOURCES)
DIST_SOURCES = $(am__libalgorithms_a_SOURCES_DIST)
am__libalgorithms_a_HEADERS_DIST = Egcs.h Filter2d.h Filter.h \
Histogram.h ConfusionMatrix.h svm.h FeatureSelector.h \
- myfann_cpp.h SensorModel.h
+ myfann_cpp.h SensorModel.h OptFactory.h
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
diff --git a/src/apps/Makefile.am b/src/apps/Makefile.am
index aa0421f..5fe6484 100644
--- a/src/apps/Makefile.am
+++ b/src/apps/Makefile.am
@@ -23,9 +23,11 @@ pklas2img_SOURCES = pklas2img.cc
pklas2img_LDADD = -L$(top_builddir)/src/fileclasses -lfileClasses -llas $(AM_LDFLAGS)
endif
if USE_NLOPT
-bin_PROGRAMS += pksensormodel
+bin_PROGRAMS += pksensormodel pkopt_svm
pksensormodel_SOURCES = $(top_srcdir)/src/algorithms/SensorModel.h pksensormodel.h pksensormodel.cc
pksensormodel_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt -lm -lgslwrap
+pkopt_svm_SOURCES = $(top_srcdir)/src/algorithms/OptFactory.h pkclassify_nn.h pkopt_svm.cc
+pkopt_svm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt
endif
# list of sources for the binaries
pkinfo_SOURCES = pkinfo.cc
@@ -51,8 +53,8 @@ pkmosaic_SOURCES = pkmosaic.cc
pkndvi_SOURCES = pkndvi.cc
pkpolygonize_SOURCES = pkpolygonize.cc
pkdiff_SOURCES = pkdiff.cc
-pkclassify_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_svm.cc
-pkfs_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkfs_svm.cc
+pkclassify_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_nn.h pkclassify_svm.cc
+pkfs_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_nn.h pkfs_svm.cc
pkfs_svm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS)
pkascii2img_SOURCES = pkascii2img.cc
pkascii2ogr_SOURCES = pkascii2ogr.cc
diff --git a/src/apps/Makefile.in b/src/apps/Makefile.in
index d708c55..926267c 100644
--- a/src/apps/Makefile.in
+++ b/src/apps/Makefile.in
@@ -43,7 +43,7 @@ bin_PROGRAMS = pkinfo$(EXEEXT) pkcrop$(EXEEXT) pkreclass$(EXEEXT) \
$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
@USE_FANN_TRUE at am__append_1 = pkclassify_nn pkfs_nn
@USE_LAS_TRUE at am__append_2 = pklas2img
- at USE_NLOPT_TRUE@am__append_3 = pksensormodel
+ at USE_NLOPT_TRUE@am__append_3 = pksensormodel pkopt_svm
subdir = src/apps
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -57,7 +57,8 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
@USE_FANN_TRUE at am__EXEEXT_1 = pkclassify_nn$(EXEEXT) pkfs_nn$(EXEEXT)
@USE_LAS_TRUE at am__EXEEXT_2 = pklas2img$(EXEEXT)
- at USE_NLOPT_TRUE@am__EXEEXT_3 = pksensormodel$(EXEEXT)
+ at USE_NLOPT_TRUE@am__EXEEXT_3 = pksensormodel$(EXEEXT) \
+ at USE_NLOPT_TRUE@ pkopt_svm$(EXEEXT)
am__installdirs = "$(DESTDIR)$(bindir)"
PROGRAMS = $(bin_PROGRAMS)
am_pkascii2img_OBJECTS = pkascii2img.$(OBJEXT)
@@ -189,6 +190,13 @@ pkndvi_LDADD = $(LDADD)
pkndvi_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(top_builddir)/src/algorithms/libalgorithms.a \
$(top_builddir)/src/imageclasses/libimageClasses.a
+am__pkopt_svm_SOURCES_DIST = \
+ $(top_srcdir)/src/algorithms/OptFactory.h pkclassify_nn.h \
+ pkopt_svm.cc
+ at USE_NLOPT_TRUE@am_pkopt_svm_OBJECTS = pkopt_svm.$(OBJEXT)
+pkopt_svm_OBJECTS = $(am_pkopt_svm_OBJECTS)
+ at USE_NLOPT_TRUE@pkopt_svm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ at USE_NLOPT_TRUE@ $(am__DEPENDENCIES_2)
am_pkpolygonize_OBJECTS = pkpolygonize.$(OBJEXT)
pkpolygonize_OBJECTS = $(am_pkpolygonize_OBJECTS)
pkpolygonize_LDADD = $(LDADD)
@@ -250,9 +258,10 @@ SOURCES = $(pkascii2img_SOURCES) $(pkascii2ogr_SOURCES) \
$(pkfillnodata_SOURCES) $(pkfilter_SOURCES) $(pkfs_nn_SOURCES) \
$(pkfs_svm_SOURCES) $(pkgetmask_SOURCES) $(pkinfo_SOURCES) \
$(pklas2img_SOURCES) $(pkmosaic_SOURCES) $(pkndvi_SOURCES) \
- $(pkpolygonize_SOURCES) $(pkreclass_SOURCES) \
- $(pksensormodel_SOURCES) $(pksetmask_SOURCES) \
- $(pksieve_SOURCES) $(pkstat_SOURCES) $(pkstatogr_SOURCES)
+ $(pkopt_svm_SOURCES) $(pkpolygonize_SOURCES) \
+ $(pkreclass_SOURCES) $(pksensormodel_SOURCES) \
+ $(pksetmask_SOURCES) $(pksieve_SOURCES) $(pkstat_SOURCES) \
+ $(pkstatogr_SOURCES)
DIST_SOURCES = $(pkascii2img_SOURCES) $(pkascii2ogr_SOURCES) \
$(am__pkclassify_nn_SOURCES_DIST) $(pkclassify_svm_SOURCES) \
$(pkcreatect_SOURCES) $(pkcrop_SOURCES) $(pkdiff_SOURCES) \
@@ -262,7 +271,8 @@ DIST_SOURCES = $(pkascii2img_SOURCES) $(pkascii2ogr_SOURCES) \
$(am__pkfs_nn_SOURCES_DIST) $(pkfs_svm_SOURCES) \
$(pkgetmask_SOURCES) $(pkinfo_SOURCES) \
$(am__pklas2img_SOURCES_DIST) $(pkmosaic_SOURCES) \
- $(pkndvi_SOURCES) $(pkpolygonize_SOURCES) $(pkreclass_SOURCES) \
+ $(pkndvi_SOURCES) $(am__pkopt_svm_SOURCES_DIST) \
+ $(pkpolygonize_SOURCES) $(pkreclass_SOURCES) \
$(am__pksensormodel_SOURCES_DIST) $(pksetmask_SOURCES) \
$(pksieve_SOURCES) $(pkstat_SOURCES) $(pkstatogr_SOURCES)
ETAGS = etags
@@ -389,6 +399,8 @@ LDADD = $(GDAL_LDFLAGS) $(top_builddir)/src/algorithms/libalgorithms.a $(top_bui
@USE_LAS_TRUE at pklas2img_LDADD = -L$(top_builddir)/src/fileclasses -lfileClasses -llas $(AM_LDFLAGS)
@USE_NLOPT_TRUE at pksensormodel_SOURCES = $(top_srcdir)/src/algorithms/SensorModel.h pksensormodel.h pksensormodel.cc
@USE_NLOPT_TRUE at pksensormodel_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt -lm -lgslwrap
+ at USE_NLOPT_TRUE@pkopt_svm_SOURCES = $(top_srcdir)/src/algorithms/OptFactory.h pkclassify_nn.h pkopt_svm.cc
+ at USE_NLOPT_TRUE@pkopt_svm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS) -lnlopt
# list of sources for the binaries
pkinfo_SOURCES = pkinfo.cc
pkcrop_SOURCES = pkcrop.cc
@@ -413,8 +425,8 @@ pkmosaic_SOURCES = pkmosaic.cc
pkndvi_SOURCES = pkndvi.cc
pkpolygonize_SOURCES = pkpolygonize.cc
pkdiff_SOURCES = pkdiff.cc
-pkclassify_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_svm.cc
-pkfs_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkfs_svm.cc
+pkclassify_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_nn.h pkclassify_svm.cc
+pkfs_svm_SOURCES = $(top_srcdir)/src/algorithms/svm.h $(top_srcdir)/src/algorithms/svm.cpp pkclassify_nn.h pkfs_svm.cc
pkfs_svm_LDADD = $(GSL_LIBS) $(AM_LDFLAGS)
pkascii2img_SOURCES = pkascii2img.cc
pkascii2ogr_SOURCES = pkascii2ogr.cc
@@ -552,6 +564,9 @@ pkmosaic$(EXEEXT): $(pkmosaic_OBJECTS) $(pkmosaic_DEPENDENCIES)
pkndvi$(EXEEXT): $(pkndvi_OBJECTS) $(pkndvi_DEPENDENCIES)
@rm -f pkndvi$(EXEEXT)
$(CXXLINK) $(pkndvi_OBJECTS) $(pkndvi_LDADD) $(LIBS)
+pkopt_svm$(EXEEXT): $(pkopt_svm_OBJECTS) $(pkopt_svm_DEPENDENCIES)
+ @rm -f pkopt_svm$(EXEEXT)
+ $(CXXLINK) $(pkopt_svm_OBJECTS) $(pkopt_svm_LDADD) $(LIBS)
pkpolygonize$(EXEEXT): $(pkpolygonize_OBJECTS) $(pkpolygonize_DEPENDENCIES)
@rm -f pkpolygonize$(EXEEXT)
$(CXXLINK) $(pkpolygonize_OBJECTS) $(pkpolygonize_LDADD) $(LIBS)
@@ -601,6 +616,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pklas2img.Po at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkmosaic.Po at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkndvi.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkopt_svm.Po at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkpolygonize.Po at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pkreclass.Po at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pksensormodel.Po at am__quote@
diff --git a/src/apps/pkfs_svm.cc b/src/apps/pkfs_svm.cc
index e7d799f..24c4969 100644
--- a/src/apps/pkfs_svm.cc
+++ b/src/apps/pkfs_svm.cc
@@ -21,10 +21,6 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>.
#include <string>
#include <map>
#include <algorithm>
-#include "imageclasses/ImgReaderGdal.h"
-#include "imageclasses/ImgWriterGdal.h"
-#include "imageclasses/ImgReaderOgr.h"
-#include "imageclasses/ImgWriterOgr.h"
#include "base/Optionpk.h"
#include "algorithms/ConfusionMatrix.h"
#include "algorithms/FeatureSelector.h"
@@ -37,7 +33,6 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>.
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
- //static enum SelectorValue { NA, SFFS, SFS, SBS, BFS };
enum SelectorValue { NA=0, SFFS=1, SFS=2, SBS=3, BFS=4 };
//global parameters used in cost function getCost
@@ -107,13 +102,13 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
}
assert(lIndex==prob.l);
- if(verbose_opt[0]>1)
+ if(verbose_opt[0]>2)
std::cout << "checking parameters" << std::endl;
svm_check_parameter(&prob,¶m);
- if(verbose_opt[0]>1)
+ if(verbose_opt[0]>2)
std::cout << "parameters ok, training" << std::endl;
svm=svm_train(&prob,¶m);
- if(verbose_opt[0]>1)
+ if(verbose_opt[0]>2)
std::cout << "SVM is now trained" << std::endl;
ConfusionMatrix cm(nclass);
@@ -124,6 +119,8 @@ double getCost(const vector<Vector2d<float> > &trainingFeatures)
for(int i=0;i<prob.l;i++)
cm.incrementResult(cm.getClass(prob.y[i]),cm.getClass(target[i]),1);
assert(cm.nReference());
+ if(verbose_opt[0]>1)
+ std::cout << cm << std::endl;
// std::cout << "Kappa: " << cm.kappa() << std::endl;
// double se95_oa=0;
// double doa=0;
@@ -159,7 +156,7 @@ int main(int argc, char *argv[])
Optionpk<bool> license_opt("lic","license","show license information",false);
Optionpk<bool> help_opt("h","help","shows this help info",false);
Optionpk<bool> todo_opt("\0","todo","",false);
- Optionpk<string> training_opt("t", "training", "training shape file. A single shape file contains all training features (must be set as: B0, B1, B2,...) for all classes (class numbers identified by label option). Use multiple training files for bootstrap aggregation (alternative to the bag and bsize options, where a random subset is taken from a single training file)");
+ Optionpk<string> training_opt("t", "training", "training shape file. A single shape file contains all training features (must be set as: B0, B1, B2,...) for all classes (class numbers identified by label option).");
Optionpk<string> label_opt("\0", "label", "identifier for class label in training shape file.","label");
Optionpk<unsigned short> maxFeatures_opt("n", "nf", "number of features to select (0 to select optimal number, see also ecost option)", 0);
Optionpk<unsigned short> reclass_opt("\0", "rc", "reclass code (e.g. --rc=12 --rc=23 to reclass first two classes to 12 and 23 resp.).", 0);
@@ -170,8 +167,6 @@ int main(int argc, char *argv[])
Optionpk<short> band_opt("b", "band", "band index (starting from 0, either use band option or use start to end)");
Optionpk<double> offset_opt("\0", "offset", "offset value for each spectral band input features: refl[band]=(DN[band]-offset[band])/scale[band]", 0.0);
Optionpk<double> scale_opt("\0", "scale", "scale value for each spectral band input features: refl=(DN[band]-offset[band])/scale[band] (use 0 if scale min and max in each band to -1.0 and 1.0)", 0.0);
- Optionpk<unsigned short> aggreg_opt("a", "aggreg", "how to combine aggregated classifiers, see also rc option (0: no aggregation, 1: sum rule, 2: max rule).",0);
- // Optionpk<double> priors_opt("p", "prior", "prior probabilities for each class (e.g., -p 0.3 -p 0.3 -p 0.2 )", 0.0);
Optionpk<string> selector_opt("sm", "sm", "feature selection method (sffs=sequential floating forward search,sfs=sequential forward search, sbs, sequential backward search ,bfs=brute force search)","sffs");
Optionpk<float> epsilon_cost_opt("ecost", "ecost", "epsilon for stopping criterion in cost function to determine optimal number of features",0.001);
@@ -190,7 +185,6 @@ int main(int argc, char *argv[])
band_opt.retrieveOption(argc,argv);
offset_opt.retrieveOption(argc,argv);
scale_opt.retrieveOption(argc,argv);
- aggreg_opt.retrieveOption(argc,argv);
// priors_opt.retrieveOption(argc,argv);
svm_type_opt.retrieveOption(argc,argv);
kernel_type_opt.retrieveOption(argc,argv);
diff --git a/src/apps/pksensormodel.cc b/src/apps/pksensormodel.cc
index d7a44d3..90e3f38 100644
--- a/src/apps/pksensormodel.cc
+++ b/src/apps/pksensormodel.cc
@@ -24,6 +24,7 @@ along with pktools. If not, see <http://www.gnu.org/licenses/>.
#include <math.h>
#include <nlopt.hpp>
#include "base/Optionpk.h"
+#include "algorithms/OptFactory.h"
#include "algorithms/Histogram.h"
#include "pksensormodel.h"
@@ -103,6 +104,7 @@ int main(int argc, char *argv[])
Optionpk<bool> aplrad_opt("arad","arad","platform attitude angles",false);
Optionpk<bool> bcrad_opt("brad","brad","boresight attitude angles",false);
Optionpk<bool> getzenith_opt("gz","getzenith","get zenith angle from platform",false);
+ Optionpk<string> algorithm_opt("a", "algorithm", "optimization algorithm (see http://ab-initio.mit.edu/wiki/index.php/NLopt_Algorithms)","LN_COBYLA");
Optionpk<short> verbose_opt("v", "verbose", "verbose mode when > 0", 0);
version_opt.retrieveOption(argc,argv);
@@ -152,6 +154,7 @@ int main(int argc, char *argv[])
aplrad_opt.retrieveOption(argc,argv);
bcrad_opt.retrieveOption(argc,argv);
getzenith_opt.retrieveOption(argc,argv);
+ algorithm_opt.retrieveOption(argc,argv);
verbose_opt.retrieveOption(argc,argv);
if(version_opt[0]){
@@ -570,7 +573,7 @@ int main(int argc, char *argv[])
init_opt.push_back(init_opt[0]);
//todo: make nlopt::LN_COBYLA as a command line option
//nlopt::opt opt(nlopt::LN_COBYLA,4*input_opt.size());//k,e,a,haze
- nlopt::opt optimizer(nlopt::LN_SBPLX,3);//bore sight angles
+ nlopt::opt optimizer=OptFactory::getOptimizer(algorithm_opt[0],3);//bore sight angles
optimizer.set_min_objective(objFunction, &theDataModel);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git
More information about the Pkg-grass-devel
mailing list