From 21673bb46d8d7d46466a42ca3585083e40701cf9 Mon Sep 17 00:00:00 2001 From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org> Date: Tue, 29 Apr 2008 15:30:33 +0000 Subject: [PATCH] Ajout d'un optimizer et modif du passage des parametres en generique --- Code/Markov/otbMRFOptimizer.h | 30 ++++++++++- Code/Markov/otbMRFOptimizerICM.h | 54 +++++++++++++++++++ Code/Markov/otbMRFOptimizerMetropolis.h | 20 +++++-- .../Markov/MarkovClassification1Example.cxx | 3 +- .../Markov/MarkovClassification2Example.cxx | 6 +-- 5 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 Code/Markov/otbMRFOptimizerICM.h diff --git a/Code/Markov/otbMRFOptimizer.h b/Code/Markov/otbMRFOptimizer.h index f98f17a5b5..35411a505c 100644 --- a/Code/Markov/otbMRFOptimizer.h +++ b/Code/Markov/otbMRFOptimizer.h @@ -35,11 +35,37 @@ class ITK_EXPORT MRFOptimizer : public itk::Object typedef itk::Object Superclass; typedef itk::SmartPointer<Self> Pointer; typedef itk::SmartPointer<const Self> ConstPointer; - + typedef itk::Array< double > ParametersType; + itkNewMacro(Self); itkTypeMacro(MRFOptimizer, itk::Object); + unsigned int GetNumberOfParameters(void) const + { return m_NumberOfParameters; } + + // Get the parameters + const ParametersType& GetParameters( void ) const + { + return this->m_Parameters; + } + + void SetParameters( const ParametersType & parameters ) + { + bool modified = false; + for( unsigned int i=0; i<m_NumberOfParameters; i++ ) + { + if (m_Parameters[i] != parameters[i]) + { + m_Parameters[i] = parameters[i]; + modified = true; + } + } + if (modified) + { + this->Modified(); + } + } virtual bool Compute(double deltaEnergy) { @@ -49,6 +75,8 @@ class ITK_EXPORT MRFOptimizer : public itk::Object protected: MRFOptimizer() {} virtual ~MRFOptimizer() {} + unsigned int m_NumberOfParameters; + ParametersType m_Parameters; }; } diff --git a/Code/Markov/otbMRFOptimizerICM.h b/Code/Markov/otbMRFOptimizerICM.h new file mode 100644 index 0000000000..4bec79732c --- /dev/null +++ b/Code/Markov/otbMRFOptimizerICM.h @@ -0,0 +1,54 @@ + + +#ifndef _MRFOptimizerICM_h +#define _MRFOptimizerICM_h + +#include "otbMRFOptimizer.h" + +namespace otb +{ + /** + * \class MRFOptimizerICM + * \brief This is the optimizer class implementing the ICM algorithm + * + * This is one optimizer to be used in the MRF framework. This optimizer + * follows the ICM algorithm to accept of reject the value proposed by the sampler + */ + class ITK_EXPORT MRFOptimizerICM : + public MRFOptimizer + { + public: + + typedef MRFOptimizerICM Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + itkNewMacro(Self); + + itkTypeMacro(MRFOptimizerICM,Object); + + + inline bool operator()(double deltaEnergy) + { + if (deltaEnergy < 0) + { + return true; + } + else + { + return false; + } + } + + + protected: + MRFOptimizerICM() {} + virtual ~MRFOptimizerICM() {} + + }; + +} + +#endif + diff --git a/Code/Markov/otbMRFOptimizerMetropolis.h b/Code/Markov/otbMRFOptimizerMetropolis.h index b2726536fc..a9954cd7c5 100644 --- a/Code/Markov/otbMRFOptimizerMetropolis.h +++ b/Code/Markov/otbMRFOptimizerMetropolis.h @@ -23,6 +23,14 @@ namespace otb { + /** + * \class MRFOptimizerMetropolis + * \brief This is the optimizer class implementing the Metropolis algorithm + * + * This is one optimizer to be used in the MRF framework. This optimizer + * follows the metropolis algorithm to accept of reject the value proposed by the sampler + */ + class ITK_EXPORT MRFOptimizerMetropolis : public MRFOptimizer { public: @@ -36,8 +44,8 @@ class ITK_EXPORT MRFOptimizerMetropolis : public MRFOptimizer itkTypeMacro(MRFOptimizerMetropolis,MRFOptimizer); - itkSetMacro(Temperature, double); - itkGetMacro(Temperature, double); +// itkSetMacro(Temperature, double); +// itkGetMacro(Temperature, double); inline bool Compute(double deltaEnergy) { @@ -51,7 +59,7 @@ class ITK_EXPORT MRFOptimizerMetropolis : public MRFOptimizer } else { - double proba = vcl_exp(-(deltaEnergy)/m_Temperature); + double proba = vcl_exp(-(deltaEnergy)/this->m_Parameters[0]); if ( (rand() % 10000) < proba*10000) { return true; @@ -62,7 +70,11 @@ class ITK_EXPORT MRFOptimizerMetropolis : public MRFOptimizer protected: - MRFOptimizerMetropolis() {} + MRFOptimizerMetropolis() { + this->m_NumberOfParameters = 1; + this->m_Parameters.SetSize(this->m_NumberOfParameters); + this->m_Parameters[0]=1.0; + } virtual ~MRFOptimizerMetropolis() {} double m_Temperature; }; diff --git a/Examples/Markov/MarkovClassification1Example.cxx b/Examples/Markov/MarkovClassification1Example.cxx index 01e831faad..497b880d8a 100644 --- a/Examples/Markov/MarkovClassification1Example.cxx +++ b/Examples/Markov/MarkovClassification1Example.cxx @@ -261,7 +261,8 @@ int main(int argc, char* argv[] ) parameters[6]=220.0;//Class 3 mean parameters[7]=10.0; //Class 3 stde energyFidelity->SetParameters(parameters); - optimizer->SetTemperature(atof(argv[6])); +// optimizer->SetTemperature(atof(argv[6])); + optimizer->SetParameters(atof(argv[6])); markovFilter->SetNumberOfClasses(nClass); markovFilter->SetMaximumNumberOfIterations(atoi(argv[5])); markovFilter->SetErrorTolerance(-1.0); diff --git a/Examples/Markov/MarkovClassification2Example.cxx b/Examples/Markov/MarkovClassification2Example.cxx index 02b9b266d5..7c25c723a9 100644 --- a/Examples/Markov/MarkovClassification2Example.cxx +++ b/Examples/Markov/MarkovClassification2Example.cxx @@ -68,7 +68,7 @@ // #include "otbMRFOptimizerICM.h" #include "otbMRFSamplerMAP.h" // #include "otbMRFSamplerRandomMAP.h" -#include "otbMRFOptimizerMetropolis.h" +#include "otbMRFOptimizerICM.h" // #include "otbMRFSamplerRandom.h" // Software Guide : EndCodeSnippet @@ -178,7 +178,7 @@ int main(int argc, char* argv[] ) // Software Guide : BeginCodeSnippet - typedef otb::MRFOptimizerMetropolis OptimizerType; + typedef otb::MRFOptimizerICM OptimizerType; // Software Guide : EndCodeSnippet @@ -262,7 +262,7 @@ int main(int argc, char* argv[] ) parameters[6]=220.0;//Class 3 mean parameters[7]=10.0; //Class 3 stde energyFidelity->SetParameters(parameters); - optimizer->SetTemperature(atof(argv[6])); + markovFilter->SetNumberOfClasses(nClass); markovFilter->SetMaximumNumberOfIterations(atoi(argv[5])); markovFilter->SetErrorTolerance(-1.0); -- GitLab