Skip to content
Snippets Groups Projects
Commit 391b6eec authored by Aurélien Bricier's avatar Aurélien Bricier
Browse files

ENH: added new class StandardDSCostFunction

parent 66b1018c
No related branches found
No related tags found
No related merge requests found
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbStandardDSCostFunction_h
#define __otbStandardDSCostFunction_h
#include "itkSingleValuedCostFunction.h"
#include "otbVectorDataToDSValidatedVectorDataFilter.h"
#include "otbParser.h"
#include "otbFuzzyDescriptorsModelManager.h"
namespace otb
{
/** \class StandardDSCostFunction
* \brief Standard Cost Function used to estimate the fuzzy model parameters
* in the Dempster-Shafer framework
*
* This class has been developed to estimate, with the help of the Amoeba
* optimizer, the fuzzy model parameters to be used in the class
* otb::VectorDataToDSValidatedVectorDataFilter. The cost value compute the
* cost according to:
* - an enriched ground truth vector data (using VectorDataToRoadDescription)
* - an enriched negative sample VectorData or at least random samples
* - an hypothesis (the same as the considered DSValidationFilter)
* (by default (NDVI, RADIOM))
* - a weight between 0 and 1 (0.5 by default) corresponding to the situation
* policy regarding under detection/false detection (1 no under detection
* 0 no false detection)
* For now the cost function use the NDVI Feature and the RADIOM Feature.
* For each evolution of the VectorDataToDSValidatedVectorDataFilter,
* this cost function must be adapted.
*
* Limitation: the use of a custom criterion is to be implemented.
* For now, it uses (Belief+Plausibility)/2.0 so it can be used only to
* parameter the DSValidetionFilter considering the same criterion
*
* \ingroup CostFunction
* \sa VectorDataToDSValidatedVectorDataFilter
* \sa AmoebaOptimizer
*/
template <class TDSValidationFilter>
class ITK_EXPORT StandardDSCostFunction :
public itk::SingleValuedCostFunction
{
public:
/** Standard class typedefs. */
typedef StandardDSCostFunction Self;
typedef itk::SingleValuedCostFunction Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Run-time type information (and related methods). */
itkTypeMacro(StandardDSCostFunction, itk::SingleValuedCostFunction);
typedef Superclass::MeasureType MeasureType; //double
typedef Superclass::DerivativeType DerivativeType;//Array<double>
typedef Superclass::ParametersType ParametersType;//Array<double>
typedef TDSValidationFilter DSValidationFilterType;
typedef typename DSValidationFilterType::VectorDataType
VectorDataType;
typedef typename DSValidationFilterType::TreeIteratorType
TreeIteratorType;
typedef typename DSValidationFilterType::LabelSetType
LabelSetType;
typedef FuzzyDescriptorsModelManager FuzzyDescriptorsModelManagerType;
typedef Parser ParserType;
/** This method returns the value of the cost function corresponding
* to the specified parameters. */
virtual MeasureType GetValue( const ParametersType & parameters ) const;
/** This method returns the derivative of the cost function corresponding
* to the specified parameters. */
virtual void GetDerivative( const ParametersType & parameters,
DerivativeType & derivative ) const;
virtual unsigned int GetNumberOfParameters(void) const;
itkSetMacro(Weight, double);
itkGetConstMacro(Weight, double);
itkSetObjectMacro(GTVectorData, VectorDataType);
itkGetConstObjectMacro(GTVectorData, VectorDataType);
itkSetObjectMacro(NSVectorData, VectorDataType);
itkGetConstObjectMacro(NSVectorData, VectorDataType);
LabelSetType GetHypothesis()
{
return m_Hypothesis;
}
void SetHypothesis(LabelSetType hypothesis)
{
m_Hypothesis = hypothesis;
}
protected:
/** Constructor */
StandardDSCostFunction();
/** Destructor */
virtual ~StandardDSCostFunction() {}
/**PrintSelf method */
virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
private:
StandardDSCostFunction(const Self &); //purposely not implemented
void operator =(const Self&); //purposely not implemented
typename VectorDataType::Pointer m_GTVectorData;//Ground Truth
typename VectorDataType::Pointer m_NSVectorData;//Negative Samples
typename ParserType::Pointer m_Parser;
std::string m_CriterionFormula;
double m_Weight; //range ]0; 1[
LabelSetType m_Hypothesis;
const unsigned int m_NumberOfParameters;
};
} // end namespace otb
#ifndef OTB_MANUAL_INSTANTIATION
#include "otbStandardDSCostFunction.txx"
#endif
#endif
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbStandardDSCostFunction_txx
#define __otbStandardDSCostFunction_txx
#include "otbStandardDSCostFunction.h"
namespace otb
{
// Constructor
template <class TDSValidationFilter>
StandardDSCostFunction<TDSValidationFilter>
::StandardDSCostFunction() :
m_CriterionFormula("((Belief + Plausibility)/2)"),
m_Weight(0.5),
m_NumberOfParameters(8)
{
m_GTVectorData = VectorDataType::New();
m_NSVectorData = VectorDataType::New();
m_Parser = ParserType::New();
m_Hypothesis.insert("NDVI");
m_Hypothesis.insert("RADIOM");
}
template <class TDSValidationFilter>
unsigned int
StandardDSCostFunction<TDSValidationFilter>
::GetNumberOfParameters() const
{
return m_NumberOfParameters;
}
template <class TDSValidationFilter>
typename StandardDSCostFunction<TDSValidationFilter>
::MeasureType
StandardDSCostFunction<TDSValidationFilter>
::GetValue(const ParametersType & parameters) const
{
//Initialize parser
m_Parser->SetExpr(m_CriterionFormula);
unsigned int nbParam = this->GetNumberOfParameters();
std::vector<double> ndvi, radiom;
for (unsigned int i=0; i<4; i++)
{
ndvi.push_back(parameters[i]);
}
for (unsigned int i=0; i<4; i++)
{
radiom.push_back(parameters[i+4]);
}
typename DSValidationFilterType::Pointer internalFunctionGT
= DSValidationFilterType::New();
internalFunctionGT->SetCriterionFormula("1");
internalFunctionGT->SetInput(m_GTVectorData);
internalFunctionGT->SetHypothesis(m_Hypothesis);
try
{
internalFunctionGT->SetFuzzyModel("NDVI", ndvi);
internalFunctionGT->SetFuzzyModel("RADIOM", radiom);
}
catch (itk::ExceptionObject & err)
{
return (m_Weight*m_GTVectorData->Size() + (1-m_Weight)*m_NSVectorData->Size());;
}
internalFunctionGT->Update();
typename DSValidationFilterType::Pointer internalFunctionNS
= DSValidationFilterType::New();
internalFunctionNS->SetCriterionFormula("1");
internalFunctionNS->SetInput(m_NSVectorData);
internalFunctionNS->SetHypothesis(m_Hypothesis);
try
{
internalFunctionNS->SetFuzzyModel("NDVI", ndvi);
internalFunctionNS->SetFuzzyModel("RADIOM", radiom);
}
catch (itk::ExceptionObject & err)
{
return (m_Weight*m_GTVectorData->Size() + (1-m_Weight)*m_NSVectorData->Size());;
}
internalFunctionNS->Update();
double accGT, accNS, belief, plausibility;
accGT = 0.0;
accNS = 0.0;
TreeIteratorType itVectorGT(internalFunctionGT->GetOutput()->GetDataTree());
itVectorGT.GoToBegin();
while (!itVectorGT.IsAtEnd())
{
if (!itVectorGT.Get()->IsRoot() && !itVectorGT.Get()->IsDocument() && !itVectorGT.Get()->IsFolder())
{
belief = itVectorGT.Get()->GetFieldAsDouble("Belief");
plausibility = itVectorGT.Get()->GetFieldAsDouble("Plausi");
m_Parser->DefineVar("Belief", &belief);
m_Parser->DefineVar("Plausibility", &plausibility);
accGT += (1 - m_Parser->Eval()) * (1 - m_Parser->Eval());
m_Parser->ClearVar();
}
itVectorGT++;
}
TreeIteratorType itVectorNS(internalFunctionNS->GetOutput()->GetDataTree());
itVectorNS.GoToBegin();
while (!itVectorNS.IsAtEnd())
{
if (!itVectorNS.Get()->IsRoot() && !itVectorNS.Get()->IsDocument() && !itVectorNS.Get()->IsFolder())
{
belief = itVectorNS.Get()->GetFieldAsDouble("Belief");
plausibility = itVectorNS.Get()->GetFieldAsDouble("Plausi");
m_Parser->DefineVar("Belief", &belief);
m_Parser->DefineVar("Plausibility", &plausibility);
accNS += m_Parser->Eval() * m_Parser->Eval();
m_Parser->ClearVar();
}
itVectorNS++;
}
return (m_Weight*accGT + (1-m_Weight)*accNS);
}
template <class TDSValidationFilter>
void
StandardDSCostFunction<TDSValidationFilter>
::GetDerivative(const ParametersType & parameters, DerivativeType & derivative) const
{
//Not necessary for Amoeba Optimizer
itkExceptionMacro(<< "Not Supposed to be used when using Amoeba Optimizer!")
}
// PrintSelf Method
template <class TDSValidationFilter>
void
StandardDSCostFunction<TDSValidationFilter>
::PrintSelf(std::ostream& os, itk::Indent indent) const
{
Superclass::PrintSelf(os, indent);
}
}// end namespace otb
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment