From f3c26934f88d4f6ece51b65a42a2bf628b693346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= <traizetc@cesbio.cnes.fr> Date: Thu, 27 Apr 2017 16:42:02 +0200 Subject: [PATCH] Dimensionality reduction app created (dummy), encode filter .h and .txx added --- app/cbDimensionalityReduction.cxx | 31 ++++++ include/encode_filter.h | 53 ++++++++++ include/encode_filter.txx | 160 ++++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 app/cbDimensionalityReduction.cxx create mode 100644 include/encode_filter.h create mode 100644 include/encode_filter.txx diff --git a/app/cbDimensionalityReduction.cxx b/app/cbDimensionalityReduction.cxx new file mode 100644 index 0000000000..5986fd3a74 --- /dev/null +++ b/app/cbDimensionalityReduction.cxx @@ -0,0 +1,31 @@ +#include "otbWrapperApplication.h" +#include "otbWrapperApplicationFactory.h" + +class CbDimensionalityReduction : public otb::Wrapper::Application +{ +public: + typedef CbDimensionalityReduction Self; + typedef itk::SmartPointer<Self> Pointer; + itkNewMacro(Self); + itkTypeMacro(CbDimensionalityReduction, otb::Wrapper::Application); +private: + void DoInit() + { + SetName("CbDimensionalityReduction"); + SetDescription("Perform dimensionality reduction on the input image"); + AddRAMParameter(); + } + + void DoUpdateParameters() + { + } + + void DoExecute() + { + std::cout << "Appli !" << std::endl; + int ThisDoesNothing = 0; + } + +}; + +OTB_APPLICATION_EXPORT(CbDimensionalityReduction) diff --git a/include/encode_filter.h b/include/encode_filter.h new file mode 100644 index 0000000000..9a6b70c117 --- /dev/null +++ b/include/encode_filter.h @@ -0,0 +1,53 @@ +#ifndef __encode_Filter_h +#define __encode_Filter_h + +#include "itkImageToImageFilter.h" +#include "itkMacro.h" + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +class ITK_EXPORT EncodeFilter:public itk::ImageToImageFilter< TImage, TImage > +{ + public: + /** Standard class typedefs. */ + typedef EncodeFilter Self; + typedef itk::ImageToImageFilter< TImage, TImage > Superclass; + typedef itk::SmartPointer< Self > Pointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(EncodeFilter, ImageToImageFilter); + + //void SetInputImage(const TImage* image); + void SetAutoencoderModel(const std::string encoderPath); + void SetNormalizerModel(const std::string NormalizerPath); + void SetModels( const AutoencoderModel net, const NormalizerModel normalizer); + + protected: + EncodeFilter(); + ~EncodeFilter(){} + + typename TImage::ConstPointer GetInputImage(); + AutoencoderModel GetAutoencoderModel(); + NormalizerModel GetNormalizerModel(); + + /** Does the real work. */ + + virtual void BeforeThreadedGenerateData(); + void ThreadedGenerateData(const typename TImage::RegionType &outputRegionForThread, unsigned int threadId) ITK_OVERRIDE; + + private: + EncodeFilter(const Self &); //purposely not implemented + void operator=(const Self &); //purposely not implemented + AutoencoderModel m_net; + NormalizerModel m_normalizer; +}; + +#ifndef ITK_MANUAL_INSTANTIATION +#include "encode_filter.txx" +#endif + + +#endif // __encode_Filter_h diff --git a/include/encode_filter.txx b/include/encode_filter.txx new file mode 100644 index 0000000000..adb071854f --- /dev/null +++ b/include/encode_filter.txx @@ -0,0 +1,160 @@ +#ifndef __encode_filter_txx +#define __encode_filter_txx + +#include "encode_filter.h" +#include <fstream> + + +#include "itkObjectFactory.h" +#include "itkImageRegionIterator.h" +#include "itkImageRegionConstIterator.h" +#include "otbVectorImage.h" + + +#include <shark/Data/Csv.h> +#include <shark/Data/Pgm.h> //for exporting the learned filters +#include <shark/Data/SparseData.h>//for reading in the images as sparseData/Libsvm format +#include <shark/Models/Autoencoder.h>//normal autoencoder model +#include <shark/Models/TiedAutoencoder.h>//autoencoder with tied weights +#include <shark/Models/Normalizer.h> +#include <shark/Algorithms/Trainers/NormalizeComponentsUnitVariance.h> + + +//using namespace shark; + +template< class TImage, class AutoencoderModel, class NormalizerModel> +EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::EncodeFilter() +{ + this->SetNumberOfRequiredInputs(1); +} + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::SetAutoencoderModel(const std::string encoderPath) +{ + //m_net = net; + std::ifstream ifs(encoderPath); + boost::archive::polymorphic_text_iarchive ia(ifs); + m_net.read(ia); + ifs.close(); +} + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::SetNormalizerModel(const std::string NormalizerPath) +{ + //m_normalizer = normalizer; + std::ifstream ifs(NormalizerPath); + boost::archive::polymorphic_text_iarchive ia(ifs); + m_normalizer.read(ia); + ifs.close(); +} + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::SetModels(const AutoencoderModel net, const NormalizerModel normalizer) +{ + m_net = net; + m_normalizer = normalizer; +} + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +typename TImage::ConstPointer EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::GetInputImage() +{ + return static_cast< const TImage * > + ( this->itk::ProcessObject::GetInput(0) ); +} + + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +AutoencoderModel EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::GetAutoencoderModel() +{ + return m_net; +} + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +NormalizerModel EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::GetNormalizerModel() +{ + return m_normalizer; +} + + + +struct Data_with_info { + shark::Data<shark::RealVector> data; // This file format can be used to do Machine Learning with the Shark ML library + otb::VectorImage<double, 2>::RegionType region; + otb::VectorImage<double, 2>::PointType origin; + otb::VectorImage<double, 2>::SpacingType spacing; +}; + + +template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::BeforeThreadedGenerateData() +{ +#ifdef _OPENMP +// OpenMP will take care of threading +this->SetNumberOfThreads(1); +#endif +} + + +/*template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::GenerateData()*/ +template< class TImage, class AutoencoderModel, class NormalizerModel> +void EncodeFilter<TImage, AutoencoderModel, NormalizerModel>::ThreadedGenerateData(const typename TImage::RegionType &outputRegionForThread, unsigned int threadId) +{ + //Data_with_info info; + typename TImage::ConstPointer input = this->GetInput(); + typename TImage::Pointer output = this->GetOutput(); + + // Image to vector + const unsigned int img_bands = input->GetNumberOfComponentsPerPixel(); + + itk::ImageRegionConstIterator<TImage> inputIterator(input,outputRegionForThread); + + std::vector<shark::RealVector> image_vect; + + typename TImage::PixelType pixelValue; + while(!inputIterator.IsAtEnd()){ + shark::RealVector vect; + pixelValue = inputIterator.Get(); + for(unsigned int a = 0; a < img_bands; ++a){ + vect.push_back(pixelValue[a]); + } + image_vect.push_back(vect); + ++inputIterator; + } + shark::Data<shark::RealVector> data = shark::createDataFromRange(image_vect); + image_vect.clear(); + + /** Normalize the data */ + + data= transform(data, m_normalizer); + /** Encode the data */ + + data = m_net.encode(data); + + /** vector to image */ + + std::size_t numHidden = data.element(1).size(); + output->SetVectorLength(numHidden); + itk::ImageRegionIterator<TImage> imageIteratorOut(output,outputRegionForThread); + auto vect_it = data.elements().begin(); + while(!imageIteratorOut.IsAtEnd() && vect_it!=data.elements().end()){ + pixelValue.SetSize(numHidden); + shark::RealVector vect_out=(*vect_it); + for(unsigned int a = 0; a < numHidden; ++a){ + pixelValue[a]=vect_out[a]; + } + + imageIteratorOut.Set(pixelValue); + ++imageIteratorOut; + ++vect_it; + } +} + + +#endif -- GitLab