diff --git a/Modules/Applications/AppClassification/app/otbTrainImagesRegression.cxx b/Modules/Applications/AppClassification/app/otbTrainImagesRegression.cxx index 199043becc66d2952c0203e019d6c5e28320595f..268cc23eca51a8a681abdfa8ff071c2f74ea9725 100644 --- a/Modules/Applications/AppClassification/app/otbTrainImagesRegression.cxx +++ b/Modules/Applications/AppClassification/app/otbTrainImagesRegression.cxx @@ -32,143 +32,140 @@ class TrainImagesRegression : public CompositeApplication { public: /** Standard class typedefs. */ - typedef TrainImagesRegression Self; - typedef CompositeApplication Superclass; - typedef itk::SmartPointer<Self> Pointer; + typedef TrainImagesRegression Self; + typedef CompositeApplication Superclass; + typedef itk::SmartPointer<Self> Pointer; typedef itk::SmartPointer<const Self> ConstPointer; /** Standard macro */ itkNewMacro(Self); /** Standard macro */ - itkTypeMacro( TrainImagesRegression, Superclass ); - -private: + itkTypeMacro(TrainImagesRegression, Superclass); +private: void DoInit() override { SetName("TrainImagesRegression"); - SetDescription("Train a regression model from multiple triplets of feature images, predictor images " - "and training vector data."); + SetDescription( + "Train a regression model from multiple triplets of feature images, predictor images " + "and training vector data."); SetDocLongDescription( "Train a classifier from multiple triplets of feature images, predictor images and training vector data. \n\n" - + "The training vector data must contain polygons corresponding to the input sampling positions. This data " "is used to extract samples using pixel values in each band of the feature image and the corresponding " "ground truth extracted from the predictor image.\n\n" - + "At the end of the application, the mean square error between groundtruth and predicted values is computed using " "the output model and the validation vector data. Note that if no validation data is given, the training data " "will be used for validation.\n\n" - + "The number of training and validation samples can be specified with parameters. If no size is given, all samples will " "be used. \n\n" - + "This application is based on LibSVM, OpenCV Machine Learning, and Shark ML. " "The output of this application is a text model file, whose format corresponds to the " "ML model type chosen. There is no image nor vector data output."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); - SetDocSeeAlso("TrainVectorRegression \n" - "TrainImagesClassifier"); - + SetDocSeeAlso( + "TrainVectorRegression \n" + "TrainImagesClassifier"); + AddDocTag(Tags::Learning); - + ClearApplications(); - + InitIO(); InitSampling(); InitLearning(); - - AddParameter( ParameterType_Bool, "cleanup", "Temporary files cleaning" ); - SetParameterDescription( "cleanup", - "If activated, the application will try to clean all temporary files it created" ); - SetParameterInt( "cleanup", 1); - + + AddParameter(ParameterType_Bool, "cleanup", "Temporary files cleaning"); + SetParameterDescription("cleanup", "If activated, the application will try to clean all temporary files it created"); + SetParameterInt("cleanup", 1); + // Doc example parameter settings - SetDocExampleParameterValue( "io.il", "inputFeatureImage.tif" ); - SetDocExampleParameterValue( "io.ip", "inputPredictorImage.tif" ); - SetDocExampleParameterValue( "io.vd", "trainingData.shp" ); - SetDocExampleParameterValue( "io.valid", "validationData.shp" ); - SetDocExampleParameterValue( "sample.nt", "500"); - SetDocExampleParameterValue( "sample.nv", "100"); - SetDocExampleParameterValue( "io.imstat", "imageStats.xml" ); - SetDocExampleParameterValue( "classifier", "rf" ); - SetDocExampleParameterValue( "io.out", "model.txt" ); - + SetDocExampleParameterValue("io.il", "inputFeatureImage.tif"); + SetDocExampleParameterValue("io.ip", "inputPredictorImage.tif"); + SetDocExampleParameterValue("io.vd", "trainingData.shp"); + SetDocExampleParameterValue("io.valid", "validationData.shp"); + SetDocExampleParameterValue("sample.nt", "500"); + SetDocExampleParameterValue("sample.nv", "100"); + SetDocExampleParameterValue("io.imstat", "imageStats.xml"); + SetDocExampleParameterValue("classifier", "rf"); + SetDocExampleParameterValue("io.out", "model.txt"); + SetOfficialDocLink(); } - -protected: +protected: /** Holds sampling parameters specific to training or validation */ struct SamplingParameters { std::vector<std::string> inputVectorList; - unsigned int numberOfSamples = 0; - std::string filePrefix = ""; + unsigned int numberOfSamples = 0; + std::string filePrefix = ""; }; /** Adds a class field to the input vectors, this is needed to perform sampling operations */ - void AddRegressionField(const std::vector<std::string> & inputFileNames, - const std::string & filePrefix) + void AddRegressionField(const std::vector<std::string>& inputFileNames, const std::string& filePrefix) { - auto setFieldAppli = GetInternalApplication("setfield"); - auto& outputFileNames = m_FileHandler[ filePrefix+"inputWithClassField" ]; - + auto setFieldAppli = GetInternalApplication("setfield"); + auto& outputFileNames = m_FileHandler[filePrefix + "inputWithClassField"]; + setFieldAppli->SetParameterString("fn", m_ClassFieldName); setFieldAppli->SetParameterString("fv", "0"); - - for (unsigned int i =0; i < inputFileNames.size(); i++) + + for (unsigned int i = 0; i < inputFileNames.size(); i++) { - outputFileNames.push_back(GetParameterString("io.out")+"_"+filePrefix+"Withfield"+ std::to_string(i) +".shp"); + outputFileNames.push_back(GetParameterString("io.out") + "_" + filePrefix + "Withfield" + std::to_string(i) + ".shp"); setFieldAppli->SetParameterString("in", inputFileNames[i]); setFieldAppli->SetParameterString("out", outputFileNames[i]); - + // Call ExecuteAndWriteOutput because VectorDataSetField's ExecuteInternal() does not write vector data. setFieldAppli->ExecuteAndWriteOutput(); } } /** Prepare and execute polygonClassStatistics on each input vector data file */ - void ComputePolygonStatistics(const std::string & filePrefix) + void ComputePolygonStatistics(const std::string& filePrefix) { - auto polygonClassAppli = GetInternalApplication("polystat"); - auto& input = m_FileHandler[ filePrefix+"inputWithClassField" ]; - auto& output = m_FileHandler[ filePrefix+"statsFiles" ]; - FloatVectorImageListType* inputImageList = GetParameterImageList( "io.il" ); - - for (unsigned int i =0; i < input.size(); i++) + auto polygonClassAppli = GetInternalApplication("polystat"); + auto& input = m_FileHandler[filePrefix + "inputWithClassField"]; + auto& output = m_FileHandler[filePrefix + "statsFiles"]; + FloatVectorImageListType* inputImageList = GetParameterImageList("io.il"); + + for (unsigned int i = 0; i < input.size(); i++) { - output.push_back(GetParameterString("io.out")+"_"+filePrefix+"PolygonStats"+ std::to_string(i) +".xml"); - - polygonClassAppli->SetParameterInputImage( "in", inputImageList->GetNthElement(i) ); - polygonClassAppli->SetParameterString( "vec", input[i]); - polygonClassAppli->SetParameterString( "out", output[i]); - + output.push_back(GetParameterString("io.out") + "_" + filePrefix + "PolygonStats" + std::to_string(i) + ".xml"); + + polygonClassAppli->SetParameterInputImage("in", inputImageList->GetNthElement(i)); + polygonClassAppli->SetParameterString("vec", input[i]); + polygonClassAppli->SetParameterString("out", output[i]); + polygonClassAppli->UpdateParameters(); - polygonClassAppli->SetParameterString( "field", m_ClassFieldName); - - ExecuteInternal( "polystat" ); + polygonClassAppli->SetParameterString("field", m_ClassFieldName); + + ExecuteInternal("polystat"); } - } /** Compute the sampling rates using the computed statistics */ - void ComputeSamplingRate(const std::string & filePrefix, unsigned int numberOfSamples) + void ComputeSamplingRate(const std::string& filePrefix, unsigned int numberOfSamples) { auto samplingRateAppli = GetInternalApplication("rates"); - - samplingRateAppli->SetParameterStringList( "il", m_FileHandler[ filePrefix+"statsFiles" ]); - - std::string outputFileName = GetParameterString("io.out")+"_"+filePrefix+"rates.csv"; + + samplingRateAppli->SetParameterStringList("il", m_FileHandler[filePrefix + "statsFiles"]); + + std::string outputFileName = GetParameterString("io.out") + "_" + filePrefix + "rates.csv"; samplingRateAppli->SetParameterString("out", outputFileName); - + if (numberOfSamples) { samplingRateAppli->SetParameterString("strategy", "constant"); - + // Convert the integer number to string for the MultiImageSamplingRate application samplingRateAppli->SetParameterString("strategy.constant.nb", std::to_string(GetParameterInt("sample.nt"))); } @@ -176,259 +173,255 @@ protected: { samplingRateAppli->SetParameterString("strategy", "all"); } - - ExecuteInternal( "rates"); - - auto& rateFiles = m_FileHandler[filePrefix+"rateFiles"]; - for (unsigned int i = 0; i< m_FileHandler[filePrefix+"statsFiles"].size(); i++) + + ExecuteInternal("rates"); + + auto& rateFiles = m_FileHandler[filePrefix + "rateFiles"]; + for (unsigned int i = 0; i < m_FileHandler[filePrefix + "statsFiles"].size(); i++) { - rateFiles.push_back(GetParameterString("io.out")+"_"+filePrefix+"rates_"+std::to_string(i+1)+".csv"); + rateFiles.push_back(GetParameterString("io.out") + "_" + filePrefix + "rates_" + std::to_string(i + 1) + ".csv"); } - } /** Configure and execute Sample Selection on each vector using the computed rates and statistic files. */ - void SelectSamples(const std::string & filePrefix) + void SelectSamples(const std::string& filePrefix) { auto sampleSelection = GetInternalApplication("select"); - - FloatVectorImageListType* inputImageList = GetParameterImageList( "io.il" ); - auto& inputVectorFiles = m_FileHandler[ filePrefix+"inputWithClassField" ]; - auto& outputVectorFiles = m_FileHandler[ filePrefix+"samples" ]; - auto& rateFiles = m_FileHandler [filePrefix+"rateFiles"]; - auto& statFiles = m_FileHandler [filePrefix+"statsFiles"]; - - for (unsigned int i =0; i < inputVectorFiles.size(); i++) + + FloatVectorImageListType* inputImageList = GetParameterImageList("io.il"); + auto& inputVectorFiles = m_FileHandler[filePrefix + "inputWithClassField"]; + auto& outputVectorFiles = m_FileHandler[filePrefix + "samples"]; + auto& rateFiles = m_FileHandler[filePrefix + "rateFiles"]; + auto& statFiles = m_FileHandler[filePrefix + "statsFiles"]; + + for (unsigned int i = 0; i < inputVectorFiles.size(); i++) { - outputVectorFiles.push_back(GetParameterString("io.out")+"_"+filePrefix+"samples"+std::to_string(i)+".shp"); + outputVectorFiles.push_back(GetParameterString("io.out") + "_" + filePrefix + "samples" + std::to_string(i) + ".shp"); sampleSelection->SetParameterInputImage("in", inputImageList->GetNthElement(i)); sampleSelection->SetParameterString("vec", inputVectorFiles[i]); sampleSelection->SetParameterString("instats", statFiles[i]); sampleSelection->SetParameterString("strategy", "byclass"); sampleSelection->SetParameterString("strategy.byclass.in", rateFiles[i]); sampleSelection->SetParameterString("out", outputVectorFiles[i]); - + sampleSelection->UpdateParameters(); sampleSelection->SetParameterString("field", m_ClassFieldName); - + ExecuteInternal("select"); } } - - /** Configure and execute sampleExtraction. The application is called twice by input vector - * first values are extracted from the feature image and then the groundtruth is extracted + + /** Configure and execute sampleExtraction. The application is called twice by input vector + * first values are extracted from the feature image and then the groundtruth is extracted * from the predictor image.*/ - void ExtractSamples(const std::string & filePrefix) + void ExtractSamples(const std::string& filePrefix) { auto sampleExtraction = GetInternalApplication("extraction"); - - FloatVectorImageListType* featureImageList = GetParameterImageList( "io.il" ); + + FloatVectorImageListType* featureImageList = GetParameterImageList("io.il"); FloatVectorImageListType* predictorImageList = GetParameterImageList("io.ip"); - auto& vectorFiles = m_FileHandler[ filePrefix+"samples" ]; - - for (unsigned int i =0; i < vectorFiles.size(); i++) + auto& vectorFiles = m_FileHandler[filePrefix + "samples"]; + + for (unsigned int i = 0; i < vectorFiles.size(); i++) { sampleExtraction->SetParameterString("vec", vectorFiles[i]); sampleExtraction->UpdateParameters(); sampleExtraction->SetParameterString("field", m_ClassFieldName); - - //First Extraction : Values from the feature image. + + // First Extraction : Values from the feature image. sampleExtraction->SetParameterInputImage("in", featureImageList->GetNthElement(i)); sampleExtraction->SetParameterString("outfield", "prefix"); sampleExtraction->SetParameterString("outfield.prefix.name", m_FeaturePrefix); ExecuteInternal("extraction"); - - //Second Extraction : groundtruth from the predictor image. + + // Second Extraction : groundtruth from the predictor image. sampleExtraction->SetParameterInputImage("in", predictorImageList->GetNthElement(i)); sampleExtraction->SetParameterString("outfield", "list"); sampleExtraction->SetParameterStringList("outfield.list.names", {m_PredictionFieldName}); ExecuteInternal("extraction"); } } - + /** Configure and execute TrainVectorClassifier. Note that many parameters of TrainVectorClassifier * are shared with the main application during initialization. */ void TrainModel() { auto trainVectorRegression = GetInternalApplication("training"); - - auto& trainSampleFileNameList = m_FileHandler["trainsamples"]; + + auto& trainSampleFileNameList = m_FileHandler["trainsamples"]; std::vector<std::string> featureNames; - for (unsigned int i = 0; i< GetParameterStringList("io.vd").size(); i++) + for (unsigned int i = 0; i < GetParameterStringList("io.vd").size(); i++) { - featureNames.push_back(m_FeaturePrefix+std::to_string(i)); + featureNames.push_back(m_FeaturePrefix + std::to_string(i)); } - + trainVectorRegression->SetParameterStringList("io.vd", trainSampleFileNameList); trainVectorRegression->UpdateParameters(); trainVectorRegression->SetParameterString("cfield", m_PredictionFieldName); trainVectorRegression->SetParameterStringList("feat", featureNames); - - if( IsParameterEnabled( "io.valid" ) && HasValue( "io.valid" ) ) + + if (IsParameterEnabled("io.valid") && HasValue("io.valid")) { trainVectorRegression->SetParameterStringList("valid.vd", m_FileHandler["validsamples"]); } - + ExecuteInternal("training"); } - + /** Init input/output parameters */ void InitIO() { - AddParameter( ParameterType_Group, "io", "Input and output data" ); - SetParameterDescription( "io", "This group of parameters allows setting input and output data." ); - - AddParameter( ParameterType_InputImageList, "io.il", "Input Image List" ); - SetParameterDescription( "io.il", "A list of input images." ); - MandatoryOn( "io.il" ); - - AddParameter( ParameterType_InputImageList, "io.ip", "Input Predictor Image List" ); - SetParameterDescription( "io.ip", "A list of input images." ); - MandatoryOn( "io.ip" ); - - AddParameter( ParameterType_InputVectorDataList, "io.vd", "Input Vector Data List" ); - SetParameterDescription( "io.vd", "A list of vector data to select the training samples." ); - MandatoryOn( "io.vd" ); - - AddParameter( ParameterType_InputVectorDataList, "io.valid", "Validation Vector Data List" ); - SetParameterDescription( "io.valid", "A list of vector data to select the validation samples." ); - MandatoryOff( "io.valid" ); + AddParameter(ParameterType_Group, "io", "Input and output data"); + SetParameterDescription("io", "This group of parameters allows setting input and output data."); + + AddParameter(ParameterType_InputImageList, "io.il", "Input Image List"); + SetParameterDescription("io.il", "A list of input images."); + MandatoryOn("io.il"); + + AddParameter(ParameterType_InputImageList, "io.ip", "Input Predictor Image List"); + SetParameterDescription("io.ip", "A list of input images."); + MandatoryOn("io.ip"); + + AddParameter(ParameterType_InputVectorDataList, "io.vd", "Input Vector Data List"); + SetParameterDescription("io.vd", "A list of vector data to select the training samples."); + MandatoryOn("io.vd"); + + AddParameter(ParameterType_InputVectorDataList, "io.valid", "Validation Vector Data List"); + SetParameterDescription("io.valid", "A list of vector data to select the validation samples."); + MandatoryOff("io.valid"); } - + /** Init sampling parameters and applications */ void InitSampling() - { - AddApplication( "VectorDataSetField", "setfield", "Set additional vector field"); - AddApplication( "PolygonClassStatistics", "polystat", "Polygon analysis" ); - AddApplication( "MultiImageSamplingRate", "rates", "Sampling rates" ); - - AddParameter( ParameterType_Group, "sample", "Sampling parameters" ); - SetParameterDescription( "sample", "This group of parameters allows setting sampling parameters" ); - - AddParameter( ParameterType_Int, "sample.nt", "Number of training samples" ); - SetParameterDescription( "sample.nt", "Number of training samples." ); - MandatoryOff( "sample.nt" ); - - AddParameter( ParameterType_Int, "sample.nv", "Number of validation samples" ); - SetParameterDescription( "sample.nv", "Number of validation samples." ); - MandatoryOff( "sample.nv" ); - - AddApplication( "SampleSelection", "select", "Sample selection" ); - AddApplication( "SampleExtraction", "extraction", "Sample extraction" ); - + { + AddApplication("VectorDataSetField", "setfield", "Set additional vector field"); + AddApplication("PolygonClassStatistics", "polystat", "Polygon analysis"); + AddApplication("MultiImageSamplingRate", "rates", "Sampling rates"); + + AddParameter(ParameterType_Group, "sample", "Sampling parameters"); + SetParameterDescription("sample", "This group of parameters allows setting sampling parameters"); + + AddParameter(ParameterType_Int, "sample.nt", "Number of training samples"); + SetParameterDescription("sample.nt", "Number of training samples."); + MandatoryOff("sample.nt"); + + AddParameter(ParameterType_Int, "sample.nv", "Number of validation samples"); + SetParameterDescription("sample.nv", "Number of validation samples."); + MandatoryOff("sample.nv"); + + AddApplication("SampleSelection", "select", "Sample selection"); + AddApplication("SampleExtraction", "extraction", "Sample extraction"); } - + /** Init Learning applications and share learning parameters */ void InitLearning() { - AddApplication( "TrainVectorRegression", "training", "Train vector regression"); - - ShareParameter( "io.imstat", "training.io.stats" ); - ShareParameter( "io.out", "training.io.out" ); + AddApplication("TrainVectorRegression", "training", "Train vector regression"); + + ShareParameter("io.imstat", "training.io.stats"); + ShareParameter("io.out", "training.io.out"); - ShareParameter( "classifier", "training.classifier" ); - ShareParameter( "rand", "training.rand" ); + ShareParameter("classifier", "training.classifier"); + ShareParameter("rand", "training.rand"); - ShareParameter( "io.mse", "training.io.mse" ); + ShareParameter("io.mse", "training.io.mse"); } private: - void DoUpdateParameters() override { } - /** remove all file in the fileHandler std::map and clear the fileHandler std::map. + /** remove all file in the fileHandler std::map and clear the fileHandler std::map. * For .shp file, this method also removes .shx, .dbf and .prj associated files.*/ bool ClearFileHandler() { bool res = true; - for (const auto & fileNameList : m_FileHandler) + for (const auto& fileNameList : m_FileHandler) { - for (const auto & filename : fileNameList.second) + for (const auto& filename : fileNameList.second) { res = true; - if( itksys::SystemTools::FileExists( filename ) ) + if (itksys::SystemTools::FileExists(filename)) { - size_t posExt = filename.rfind( '.' ); - if( posExt != std::string::npos && filename.compare( posExt, std::string::npos, ".shp" ) == 0 ) + size_t posExt = filename.rfind('.'); + if (posExt != std::string::npos && filename.compare(posExt, std::string::npos, ".shp") == 0) { - std::string shxPath = filename.substr( 0, posExt ) + std::string( ".shx" ); - std::string dbfPath = filename.substr( 0, posExt ) + std::string( ".dbf" ); - std::string prjPath = filename.substr( 0, posExt ) + std::string( ".prj" ); - itksys::SystemTools::RemoveFile( shxPath ); - itksys::SystemTools::RemoveFile( dbfPath ); - itksys::SystemTools::RemoveFile( prjPath ); + std::string shxPath = filename.substr(0, posExt) + std::string(".shx"); + std::string dbfPath = filename.substr(0, posExt) + std::string(".dbf"); + std::string prjPath = filename.substr(0, posExt) + std::string(".prj"); + itksys::SystemTools::RemoveFile(shxPath); + itksys::SystemTools::RemoveFile(dbfPath); + itksys::SystemTools::RemoveFile(prjPath); } - res = itksys::SystemTools::RemoveFile( filename ); + res = itksys::SystemTools::RemoveFile(filename); } } } m_FileHandler.clear(); return res; } - - void PerformSampling(const SamplingParameters & params) + + void PerformSampling(const SamplingParameters& params) { - std::vector<std::string> vectorData = params.inputVectorList; - std::string filePrefix = params.filePrefix; - unsigned int numberOfSamples = params.numberOfSamples; - + std::vector<std::string> vectorData = params.inputVectorList; + std::string filePrefix = params.filePrefix; + unsigned int numberOfSamples = params.numberOfSamples; + AddRegressionField(vectorData, filePrefix); ComputePolygonStatistics(filePrefix); ComputeSamplingRate(filePrefix, numberOfSamples); SelectSamples(filePrefix); ExtractSamples(filePrefix); } - - + + void DoExecute() override { SamplingParameters trainParams; trainParams.inputVectorList = GetParameterStringList("io.vd"); - trainParams.filePrefix="train"; + trainParams.filePrefix = "train"; if (HasValue("sample.nt")) trainParams.numberOfSamples = GetParameterInt("sample.nt"); - + PerformSampling(trainParams); - - if( IsParameterEnabled( "io.valid" ) && HasValue( "io.valid" ) ) + + if (IsParameterEnabled("io.valid") && HasValue("io.valid")) { SamplingParameters validParams; validParams.inputVectorList = GetParameterStringList("io.valid"); - validParams.filePrefix="valid"; + validParams.filePrefix = "valid"; if (HasValue("sample.nv")) validParams.numberOfSamples = GetParameterInt("sample.nv"); - + PerformSampling(validParams); } - otbAppLogINFO( "Sampling Done." ); - + otbAppLogINFO("Sampling Done."); + TrainModel(); - + if (GetParameterInt("cleanup")) { - otbAppLogINFO( "Cleaning temporary files ..." ); + otbAppLogINFO("Cleaning temporary files ..."); ClearFileHandler(); } } - + /** Field used for sampling operations. */ std::string m_ClassFieldName = "regclass"; - + /** field containg the extracted regression groundtruth */ std::string m_PredictionFieldName = "prediction"; - + /** field containing the extracted pixel values for regression */ std::string m_FeaturePrefix = "value_"; - + /** Container containing the list of temporary files created during the execution*/ - std::map< std::string, std::vector<std::string>> m_FileHandler; - + std::map<std::string, std::vector<std::string>> m_FileHandler; }; -} //end namespace Wrapper -} //end namespace otb +} // end namespace Wrapper +} // end namespace otb OTB_APPLICATION_EXPORT(otb::Wrapper::TrainImagesRegression) diff --git a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx index 4d20e591569b703a80c6e04498560f327ddde4e5..18047e3ff3f254fe26cdded4131ce4b21c23eca0 100644 --- a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx +++ b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx @@ -1,22 +1,22 @@ -c/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +c /* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include "otbLearningApplicationBase.h" #include "otbWrapperApplicationFactory.h" @@ -45,7 +45,7 @@ c/* // Elevation handler #include "otbWrapperElevationParametersHandler.h" -namespace otb + namespace otb { namespace Wrapper { @@ -125,9 +125,9 @@ void DoInit() override SetDocAuthors("OTB-Team"); SetDocSeeAlso("OpenCV documentation for machine learning " "http://docs.opencv.org/modules/ml/doc/ml.html "); - + AddDocTag(Tags::Deprecated); - + //Group IO AddParameter( ParameterType_Group , "io" , "Input and output data" ); SetParameterDescription("io" ,