Skip to content
Snippets Groups Projects
Commit b187c9a6 authored by Cédric Traizet's avatar Cédric Traizet
Browse files

confidence map removed

parent f9580ea5
No related branches found
No related tags found
1 merge request!4Dimensionality reduction algorithms
......@@ -145,8 +145,6 @@ private:
AddParameter(ParameterType_InputImage, "in", "Input Image");
SetParameterDescription( "in", "The input image to predict.");
// TODO : use CSV input/output ?
AddParameter(ParameterType_InputImage, "mask", "Input Mask");
SetParameterDescription( "mask", "The mask allow restricting "
"classification of the input image to the area where mask pixel values "
......@@ -200,7 +198,6 @@ private:
}
m_Model->Load(GetParameterString("model"));
m_Model->SetRegressionMode(true);
otbAppLogINFO("Model loaded");
// Classify
......@@ -218,25 +215,14 @@ private:
MeasurementType meanMeasurementVector;
MeasurementType stddevMeasurementVector;
m_Rescaler = RescalerType::New();
// Load input image statistics
statisticsReader->SetFileName(GetParameterString("imstat"));
meanMeasurementVector = statisticsReader->GetStatisticVectorByName("mean");
stddevMeasurementVector = statisticsReader->GetStatisticVectorByName("stddev");
otbAppLogINFO( "mean used: " << meanMeasurementVector );
otbAppLogINFO( "standard deviation used: " << stddevMeasurementVector );
/*if (meanMeasurementVector.Size() == nbFeatures + 1)
{
double outMean = meanMeasurementVector[nbFeatures];
double outStdDev = stddevMeasurementVector[nbFeatures];
meanMeasurementVector.SetSize(nbFeatures,false);
stddevMeasurementVector.SetSize(nbFeatures,false);
m_OutRescaler = OutputRescalerType::New();
m_OutRescaler->SetInput(m_ClassificationFilter->GetOutput());
m_OutRescaler->GetFunctor().SetA(outStdDev);
m_OutRescaler->GetFunctor().SetB(outMean);
outputImage = m_OutRescaler->GetOutput();
}
else*/ if (meanMeasurementVector.Size() != nbFeatures)
if (meanMeasurementVector.Size() != nbFeatures)
{
otbAppLogFATAL("Wrong number of components in statistics file : "<<meanMeasurementVector.Size());
}
......
......@@ -23,10 +23,7 @@ public:
typedef typename Superclass::TargetValueType TargetValueType;
typedef typename Superclass::TargetSampleType TargetSampleType;
typedef typename Superclass::TargetListSampleType TargetListSampleType;
typedef typename Superclass::ConfidenceValueType ConfidenceValueType;
typedef typename Superclass::ConfidenceSampleType ConfidenceSampleType;
typedef typename Superclass::ConfidenceListSampleType ConfidenceListSampleType;
itkNewMacro(Self);
itkTypeMacro(AutoencoderModel, DimensionalityReductionModel);
......@@ -54,8 +51,8 @@ protected:
AutoencoderModel();
~AutoencoderModel() ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
virtual void DoPredictBatch(const InputListSampleType *, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType *, ConfidenceListSampleType * = ITK_NULLPTR) const ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input) const ITK_OVERRIDE;
virtual void DoPredictBatch(const InputListSampleType *, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType *) const ITK_OVERRIDE;
private:
......
......@@ -19,7 +19,7 @@ namespace otb
template <class TInputValue, class AutoencoderType>
AutoencoderModel<TInputValue,AutoencoderType>::AutoencoderModel()
{
this->m_IsRegressionSupported = true;
this->m_IsDoPredictBatchMultiThreaded = true;
}
......@@ -117,7 +117,7 @@ void AutoencoderModel<TInputValue,AutoencoderType>::Load(const std::string & fil
template <class TInputValue, class AutoencoderType>
typename AutoencoderModel<TInputValue,AutoencoderType>::TargetSampleType
AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & value, ConfidenceValueType *quality) const
AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType & value) const
{
shark::RealVector samples(value.Size());
for(size_t i = 0; i < value.Size();i++)
......@@ -143,7 +143,7 @@ AutoencoderModel<TInputValue,AutoencoderType>::DoPredict(const InputSampleType &
template <class TInputValue, class AutoencoderType>
void AutoencoderModel<TInputValue,AutoencoderType>
::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets, ConfidenceListSampleType * quality) const
::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets) const
{
std::cout << "BATCH" << std::endl;
std::vector<shark::RealVector> features;
......
......@@ -62,7 +62,7 @@ namespace otb
*
* \ingroup OTBSupervised
*/
template <class TInputValue, class TTargetValue, class TConfidenceValue = double >
template <class TInputValue, class TTargetValue>
class ITK_EXPORT DimensionalityReductionModel
: public itk::Object
{
......@@ -89,11 +89,6 @@ public:
typedef itk::Statistics::ListSample<TargetSampleType> TargetListSampleType;
//@}
/**\name Confidence value typedef */
typedef TConfidenceValue ConfidenceValueType;
typedef itk::FixedArray<ConfidenceValueType,1> ConfidenceSampleType;
typedef itk::Statistics::ListSample<ConfidenceSampleType> ConfidenceListSampleType;
/**\name Standard macros */
//@{
/** Run-time type information (and related methods). */
......@@ -109,7 +104,7 @@ public:
* quality value, or NULL
* \return The predicted label
*/
TargetSampleType Predict(const InputSampleType& input, ConfidenceValueType *quality = ITK_NULLPTR) const;
TargetSampleType Predict(const InputSampleType& input) const;
......@@ -121,7 +116,7 @@ public:
* Note that this method will be multi-threaded if OTB is built
* with OpenMP.
*/
typename TargetListSampleType::Pointer PredictBatch(const InputListSampleType * input, ConfidenceListSampleType * quality = ITK_NULLPTR) const;
typename TargetListSampleType::Pointer PredictBatch(const InputListSampleType * input) const;
/** THIS METHOD IS DEPRECATED AND SHOULD NOT BE USED. */
void PredictAll();
......@@ -147,9 +142,6 @@ public:
virtual bool CanWriteFile(const std::string &) = 0;
//@}
/** Query capacity to produce a confidence index */
bool HasConfidenceIndex() const {return m_ConfidenceIndex;}
/**\name Input list of samples accessors */
//@{
itkSetObjectMacro(InputListSample,InputListSampleType);
......@@ -165,13 +157,7 @@ public:
itkGetObjectMacro(TargetListSample,TargetListSampleType);
//@}
itkGetObjectMacro(ConfidenceListSample,ConfidenceListSampleType);
/**\name Use model in regression mode */
//@{
itkGetMacro(RegressionMode,bool);
void SetRegressionMode(bool flag);
//@}
protected:
/** Constructor */
......@@ -189,19 +175,6 @@ protected:
/** Target list sample */
typename TargetListSampleType::Pointer m_TargetListSample;
typename ConfidenceListSampleType::Pointer m_ConfidenceListSample;
/** flag to choose between classification and regression modes */
bool m_RegressionMode;
/** flag that indicates if the model supports regression, child
* classes should modify it in their constructor if they support
* regression mode */
bool m_IsRegressionSupported;
/** flag that tells if the model support confidence index output */
bool m_ConfidenceIndex;
/** Is DoPredictBatch multi-threaded ? */
bool m_IsDoPredictBatchMultiThreaded;
......@@ -225,7 +198,7 @@ private:
* Also set m_IsDoPredictBatchMultiThreaded to true if internal
* implementation allows for parallel batch prediction.
*/
virtual void DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * target, ConfidenceListSampleType * quality = ITK_NULLPTR) const;
virtual void DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * target) const;
/** Actual implementation of single sample prediction
* \param input sample to predict
......@@ -233,7 +206,7 @@ private:
* or NULL
* \return The predicted label
*/
virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType * quality= ITK_NULLPTR) const = 0;
virtual TargetSampleType DoPredict(const InputSampleType& input) const = 0;
DimensionalityReductionModel(const Self &); //purposely not implemented
void operator =(const Self&); //purposely not implemented
......
......@@ -29,40 +29,21 @@
namespace otb
{
template <class TInputValue, class TOutputValue, class TConfidenceValue>
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
::DimensionalityReductionModel() :
m_RegressionMode(false),
m_IsRegressionSupported(false),
m_ConfidenceIndex(false),
m_IsDoPredictBatchMultiThreaded(false)
{}
template <class TInputValue, class TOutputValue>
DimensionalityReductionModel<TInputValue,TOutputValue>
::DimensionalityReductionModel()
{ this->m_IsDoPredictBatchMultiThreaded=false;}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
template <class TInputValue, class TOutputValue>
DimensionalityReductionModel<TInputValue,TOutputValue>
::~DimensionalityReductionModel()
{}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
void
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
::SetRegressionMode(bool flag)
{
if (flag && !m_IsRegressionSupported)
{
itkGenericExceptionMacro(<< "Regression mode not implemented.");
}
if (m_RegressionMode != flag)
{
m_RegressionMode = flag;
this->Modified();
}
}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
template <class TInputValue, class TOutputValue>
void
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
DimensionalityReductionModel<TInputValue,TOutputValue>
::PredictAll()
{
itkWarningMacro("DimensionalityReductionModel::PredictAll() has been DEPRECATED. Use DimensionalityReductionModel::PredictBatch() instead.");
......@@ -75,36 +56,31 @@ DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
targets->Graft(tmpTargets);
}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
typename DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
template <class TInputValue, class TOutputValue>
typename DimensionalityReductionModel<TInputValue,TOutputValue>
::TargetSampleType
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
::Predict(const InputSampleType& input, ConfidenceValueType *quality) const
DimensionalityReductionModel<TInputValue,TOutputValue>
::Predict(const InputSampleType& input) const
{
// Call protected specialization entry point
return this->DoPredict(input,quality);
return this->DoPredict(input);
}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
typename DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
template <class TInputValue, class TOutputValue>
typename DimensionalityReductionModel<TInputValue,TOutputValue>
::TargetListSampleType::Pointer
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
::PredictBatch(const InputListSampleType * input, ConfidenceListSampleType * quality) const
DimensionalityReductionModel<TInputValue,TOutputValue>
::PredictBatch(const InputListSampleType * input) const
{
typename TargetListSampleType::Pointer targets = TargetListSampleType::New();
targets->Resize(input->Size());
if(quality!=ITK_NULLPTR)
{
quality->Clear();
quality->Resize(input->Size());
}
if(m_IsDoPredictBatchMultiThreaded)
{
// Simply calls DoPredictBatch
this->DoPredictBatch(input,0,input->Size(),targets,quality);
this->DoPredictBatch(input,0,input->Size(),targets);
return targets;
}
else
......@@ -131,11 +107,11 @@ DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
batch_size+=input->Size()%nb_batches;
}
this->DoPredictBatch(input,batch_start,batch_size,targets,quality);
this->DoPredictBatch(input,batch_start,batch_size,targets);
}
}
#else
this->DoPredictBatch(input,0,input->Size(),targets,quality);
this->DoPredictBatch(input,0,input->Size(),targets);
#endif
return targets;
}
......@@ -143,10 +119,10 @@ DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
template <class TInputValue, class TOutputValue, class TConfidenceValue>
template <class TInputValue, class TOutputValue>
void
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
::DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets, ConfidenceListSampleType * quality) const
DimensionalityReductionModel<TInputValue,TOutputValue>
::DoPredictBatch(const InputListSampleType * input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets) const
{
assert(input != ITK_NULLPTR);
assert(targets != ITK_NULLPTR);
......@@ -159,29 +135,18 @@ DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
itkExceptionMacro(<<"requested range ["<<startIndex<<", "<<startIndex+size<<"[ partially outside input sample list range.[0,"<<input->Size()<<"[");
}
if(quality != ITK_NULLPTR)
{
for(unsigned int id = startIndex;id<startIndex+size;++id)
{
ConfidenceValueType confidence = 0;
const TargetSampleType target = this->DoPredict(input->GetMeasurementVector(id),&confidence);
quality->SetMeasurementVector(id,confidence);
targets->SetMeasurementVector(id,target);
}
}
else
for(unsigned int id = startIndex;id<startIndex+size;++id)
{
for(unsigned int id = startIndex;id<startIndex+size;++id)
{
const TargetSampleType target = this->DoPredict(input->GetMeasurementVector(id));
targets->SetMeasurementVector(id,target);
}
const TargetSampleType target = this->DoPredict(input->GetMeasurementVector(id));
targets->SetMeasurementVector(id,target);
}
}
template <class TInputValue, class TOutputValue, class TConfidenceValue>
template <class TInputValue, class TOutputValue>
void
DimensionalityReductionModel<TInputValue,TOutputValue,TConfidenceValue>
DimensionalityReductionModel<TInputValue,TOutputValue>
::PrintSelf(std::ostream& os, itk::Indent indent) const
{
// Call superclass implementation
......
......@@ -42,6 +42,9 @@ template <class TInputValue, class TTargetValue>
using TiedAutoencoderModelFactory = AutoencoderModelFactoryBase<TInputValue, TTargetValue, shark::TiedAutoencoder< shark::TanhNeuron, shark::LinearNeuron>> ;
template <class TInputValue, class TTargetValue>
using SOM3DModelFactory = SOMModelFactory<TInputValue, TTargetValue, 2> ;
template <class TInputValue, class TOutputValue>
typename DimensionalityReductionModel<TInputValue,TOutputValue>::Pointer
DimensionalityReductionModelFactory<TInputValue,TOutputValue>
......@@ -99,7 +102,7 @@ DimensionalityReductionModelFactory<TInputValue,TOutputValue>
RegisterFactory(SOMModelFactory<TInputValue,TOutputValue>::New());
RegisterFactory(SOM3DModelFactory<TInputValue,TOutputValue>::New());
#ifdef OTB_USE_SHARK
RegisterFactory(PCAModelFactory<TInputValue,TOutputValue>::New());
......@@ -135,8 +138,8 @@ DimensionalityReductionModelFactory<TInputValue,TOutputValue>
{
// SOM
SOMModelFactory<TInputValue,TOutputValue> *somFactory =
dynamic_cast<SOMModelFactory<TInputValue,TOutputValue> *>(*itFac);
SOM3DModelFactory<TInputValue,TOutputValue> *somFactory =
dynamic_cast<SOM3DModelFactory<TInputValue,TOutputValue> *>(*itFac);
if (somFactory)
{
itk::ObjectFactoryBase::UnRegisterFactory(somFactory);
......
......@@ -144,8 +144,6 @@ ImageDimensionalityReductionFilter<TInputImage, TOutputImage, TMaskImage>
::BatchThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
{
bool computeConfidenceMap(m_UseConfidenceMap && m_Model->HasConfidenceIndex()
&& !m_Model->GetRegressionMode());
// Get the input pointers
InputImageConstPointerType inputPtr = this->GetInput();
MaskImageConstPointerType inputMaskPtr = this->GetInputMask();
......@@ -172,8 +170,7 @@ ImageDimensionalityReductionFilter<TInputImage, TOutputImage, TMaskImage>
typedef typename ModelType::TargetListSampleType TargetListSampleType;
// typedef typename ModelType::ConfidenceValueType ConfidenceValueType;
// typedef typename ModelType::ConfidenceSampleType ConfidenceSampleType;
typedef typename ModelType::ConfidenceListSampleType ConfidenceListSampleType;
typename InputListSampleType::Pointer samples = InputListSampleType::New();
unsigned int num_features = inputPtr->GetNumberOfComponentsPerPixel();
samples->SetMeasurementVectorSize(num_features);
......@@ -193,45 +190,23 @@ ImageDimensionalityReductionFilter<TInputImage, TOutputImage, TMaskImage>
}
//Make the batch prediction
typename TargetListSampleType::Pointer labels;
typename ConfidenceListSampleType::Pointer confidences;
if(computeConfidenceMap)
confidences = ConfidenceListSampleType::New();
// This call is threadsafe
//labels = m_Model->PredictBatch(samples,confidences);
labels = m_Model->PredictBatch(samples);
// Set the output values
ConfidenceMapIteratorType confidenceIt;
if (computeConfidenceMap)
{
confidenceIt = ConfidenceMapIteratorType(confidencePtr,outputRegionForThread);
confidenceIt.GoToBegin();
}
typename TargetListSampleType::ConstIterator labIt = labels->Begin();
for (outIt.GoToBegin(); !outIt.IsAtEnd(); ++outIt)
{
double confidenceIndex = 0.0;
itk::VariableLengthVector<TargetValueType> labelValue;
labelValue = labIt.GetMeasurementVector();
if(computeConfidenceMap)
{
confidenceIndex = confidences->GetMeasurementVector(labIt.GetInstanceIdentifier())[0];
}
++labIt;
outIt.Set(labelValue);
if(computeConfidenceMap)
{
confidenceIt.Set(confidenceIndex);
++confidenceIt;
}
progress.CompletedPixel();
}
}
......
......@@ -23,10 +23,7 @@ public:
typedef typename Superclass::TargetValueType TargetValueType;
typedef typename Superclass::TargetSampleType TargetSampleType;
typedef typename Superclass::TargetListSampleType TargetListSampleType;
typedef typename Superclass::ConfidenceValueType ConfidenceValueType;
typedef typename Superclass::ConfidenceSampleType ConfidenceSampleType;
typedef typename Superclass::ConfidenceListSampleType ConfidenceListSampleType;
itkNewMacro(Self);
itkTypeMacro(PCAModel, DimensionalityReductionModel);
......@@ -47,8 +44,8 @@ protected:
PCAModel();
~PCAModel() ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
virtual void DoPredictBatch(const InputListSampleType *, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType *, ConfidenceListSampleType * = ITK_NULLPTR) const ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input) const ITK_OVERRIDE;
virtual void DoPredictBatch(const InputListSampleType *, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType *) const ITK_OVERRIDE;
private:
shark::LinearModel<> m_encoder;
......
......@@ -19,7 +19,7 @@ namespace otb
template <class TInputValue>
PCAModel<TInputValue>::PCAModel()
{
this->m_IsRegressionSupported = true;
this->m_IsDoPredictBatchMultiThreaded = true;
}
......@@ -100,7 +100,7 @@ void PCAModel<TInputValue>::Load(const std::string & filename, const std::string
template <class TInputValue>
typename PCAModel<TInputValue>::TargetSampleType
PCAModel<TInputValue>::DoPredict(const InputSampleType & value, ConfidenceValueType *quality) const
PCAModel<TInputValue>::DoPredict(const InputSampleType & value) const
{
shark::RealVector samples(value.Size());
for(size_t i = 0; i < value.Size();i++)
......@@ -126,7 +126,7 @@ PCAModel<TInputValue>::DoPredict(const InputSampleType & value, ConfidenceValueT
template <class TInputValue>
void PCAModel<TInputValue>
::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets, ConfidenceListSampleType * quality) const
::DoPredictBatch(const InputListSampleType *input, const unsigned int & startIndex, const unsigned int & size, TargetListSampleType * targets) const
{
std::vector<shark::RealVector> features;
......
......@@ -15,7 +15,7 @@
namespace otb
{
template <class TInputValue>
template <class TInputValue, unsigned int MapDimension>>
class ITK_EXPORT SOMModel: public DimensionalityReductionModel<TInputValue,TInputValue>
{
......@@ -33,9 +33,6 @@ public:
typedef typename Superclass::TargetValueType TargetValueType;
typedef typename Superclass::TargetSampleType TargetSampleType;
typedef typename Superclass::TargetListSampleType TargetListSampleType;
typedef typename Superclass::ConfidenceValueType ConfidenceValueType;
typedef typename Superclass::ConfidenceSampleType ConfidenceSampleType;
typedef typename Superclass::ConfidenceListSampleType ConfidenceListSampleType;
typedef SOMMap<itk::VariableLengthVector<TInputValue>,itk::Statistics::EuclideanDistanceMetric<itk::VariableLengthVector<TInputValue>>, 3> MapType;
typedef typename MapType::SizeType SizeType;
......@@ -85,7 +82,7 @@ protected:
SOMModel();
~SOMModel() ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input, ConfidenceValueType *quality=ITK_NULLPTR) const ITK_OVERRIDE;
virtual TargetSampleType DoPredict(const InputSampleType& input) const ITK_OVERRIDE;
private:
typename MapType::Pointer m_SOMMap;
......
......@@ -14,7 +14,6 @@ namespace otb
template <class TInputValue>
SOMModel<TInputValue>::SOMModel()
{
this->m_IsRegressionSupported = true;
}
......@@ -42,6 +41,7 @@ void SOMModel<TInputValue>::Train()
estimator->Update();
m_SOMMap = estimator->GetOutput();
std::cout << "dr of the first sample : " << m_SOMMap->GetWinner(m_ListSample->GetMeasurementVector(0)) << std::endl;
}
......@@ -95,14 +95,14 @@ void SOMModel<TInputValue>::Load(const std::string & filename, const std::string
template <class TInputValue>
typename SOMModel<TInputValue>::TargetSampleType
SOMModel<TInputValue>::DoPredict(const InputSampleType & value, ConfidenceValueType *quality) const
SOMModel<TInputValue>::DoPredict(const InputSampleType & value) const
{
unsigned int dimension =MapType::ImageDimension;
TargetSampleType target;
target.SetSize(dimension);
auto winner =m_SOMMap->GetWinner(value);
// std::cout << winner << std::endl;
for (int i=0; i< dimension ;i++) {
target[i] = winner.GetElement(i);
......
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