From 333a8f821778992698cdf6113484c1320e47b7d9 Mon Sep 17 00:00:00 2001
From: Ludovic Hussonnois <ludovic.hussonnois@c-s.fr>
Date: Fri, 24 Feb 2017 11:42:38 +0100
Subject: [PATCH] BUG: Correct order of use of internal application and
 parameter updates.

---
 .../app/otbTrainImagesClustering.cxx          | 20 ++++++++++----
 .../include/otbTrainImagesBase.h              | 27 +++++++++++++------
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/Modules/Applications/AppClassification/app/otbTrainImagesClustering.cxx b/Modules/Applications/AppClassification/app/otbTrainImagesClustering.cxx
index e4ffd3b5db..9d819e01ec 100644
--- a/Modules/Applications/AppClassification/app/otbTrainImagesClustering.cxx
+++ b/Modules/Applications/AppClassification/app/otbTrainImagesClustering.cxx
@@ -38,9 +38,9 @@ public:
             "training and validation when only images are provided." );
     SetParameterDescription( "sample.percent", "Percentage of samples extract in images for "
             "training and validation when only images are provided. This parameter is disable when vector data are provided" );
-    SetDefaultParameterFloat( "sample.percent", 100.0 );
+    SetDefaultParameterFloat( "sample.percent", 1.0 );
     SetMinimumParameterFloatValue( "sample.percent", 0.0 );
-    SetMaximumParameterFloatValue( "sample.percent", 100.0 );
+    SetMaximumParameterFloatValue( "sample.percent", 1.0 );
 
     // Doc example parameter settings
     SetDocExampleParameterValue( "io.il", "QB_1_ortho.tif" );
@@ -111,18 +111,28 @@ public:
       }
     else
       {
-      SelectAndExtractTrainSamples( fileNames, imageList, vectorFileList, SamplingStrategy::GEOMETRIC );
+      SelectAndExtractTrainSamples( fileNames, imageList, vectorFileList, SamplingStrategy::GEOMETRIC, "fid" );
       }
 
-    // Select and Extract samples for validation with computed statistics and rates
+    // Select and Extract samples for validation with computed statistics and rates.
     // Validation samples could be empty if sample.vrt == 0 and if no dedicated validation are provided
+    // If no dedicated validation is provided the training is split corresponding to the sample.vtr parameter
+    // In this case if no vector data have been provided, the training rates and statistics are computed
+    // on the selection and extraction training result.
     if( dedicatedValidation )
       {
       ComputePolygonStatistics( imageList, validationVectorFileList, fileNames.polyStatValidOutputs );
       ComputeSamplingRate( fileNames.polyStatValidOutputs, fileNames.rateValidOut, rates.fmv );
       }
-    SelectAndExtractValidationSamples( fileNames, imageList, validationVectorFileList );
+    else if(!HasInputVector)
+      {
+      ComputePolygonStatistics( imageList, fileNames.sampleOutputs, fileNames.polyStatTrainOutputs );
+      ComputeSamplingRate( fileNames.polyStatTrainOutputs, fileNames.rateTrainOut, rates.fmt );
+      }
+
 
+    // Extract or split validation vector data.
+    SelectAndExtractValidationSamples( fileNames, imageList, validationVectorFileList );
 
     // Then train the model with extracted samples
     TrainModel( imageList, fileNames.sampleTrainOutputs, fileNames.sampleValidOutputs );
diff --git a/Modules/Applications/AppClassification/include/otbTrainImagesBase.h b/Modules/Applications/AppClassification/include/otbTrainImagesBase.h
index 4e9a0cf220..0921696cbb 100644
--- a/Modules/Applications/AppClassification/include/otbTrainImagesBase.h
+++ b/Modules/Applications/AppClassification/include/otbTrainImagesBase.h
@@ -57,6 +57,7 @@ protected:
   };
 
   struct SamplingRates;
+
   class TrainFileNamesHandler;
 
   void InitIO()
@@ -324,21 +325,20 @@ protected:
    * \param strategy
    */
   void SelectAndExtractSamples(FloatVectorImageType *image, std::string vectorFileName, std::string sampleFileName,
-                               std::string statisticsFileName, std::string ratesFileName, SamplingStrategy strategy)
+                               std::string statisticsFileName, std::string ratesFileName, SamplingStrategy strategy,
+                               std::string selectedField = "")
   {
     GetInternalApplication( "select" )->SetParameterInputImage( "in", image );
     GetInternalApplication( "select" )->SetParameterString( "out", sampleFileName, false );
 
-    GetInternalApplication( "extraction" )->SetParameterString( "outfield", "prefix", false );
-    GetInternalApplication( "extraction" )->SetParameterString( "outfield.prefix.name", "value_", false );
-
     // Change the selection strategy based on selected sampling strategy
     switch( strategy )
       {
       case GEOMETRIC:
         GetInternalApplication( "select" )->SetParameterString( "sampler", "random", false );
         GetInternalApplication( "select" )->SetParameterString( "strategy", "percent", false );
-        GetInternalApplication( "select" )->SetParameterFloat("strategy.percent.p", GetParameterFloat("sample.percent"), false);
+        GetInternalApplication( "select" )->SetParameterFloat( "strategy.percent.p",
+                                                               GetParameterFloat( "sample.percent" ), false );
         break;
       case CLASS:
       default:
@@ -353,6 +353,15 @@ protected:
 
     // select sample positions
     ExecuteInternal( "select" );
+
+    GetInternalApplication( "extraction" )->SetParameterString( "vec", sampleFileName, false );
+    UpdateInternalParameters( "extraction" );
+    if( !selectedField.empty() )
+      GetInternalApplication( "extraction" )->SetParameterString( "field", selectedField, false );
+
+    GetInternalApplication( "extraction" )->SetParameterString( "outfield", "prefix", false );
+    GetInternalApplication( "extraction" )->SetParameterString( "outfield.prefix.name", "value_", false );
+
     // extract sample descriptors
     ExecuteInternal( "extraction" );
   }
@@ -361,20 +370,22 @@ protected:
    * Select and extract samples with the SampleSelection and SampleExtraction application.
    */
   void SelectAndExtractTrainSamples(const TrainFileNamesHandler &fileNames, FloatVectorImageListType *imageList,
-                                    std::vector<std::string> vectorFileNames, SamplingStrategy strategy)
+                                    std::vector<std::string> vectorFileNames, SamplingStrategy strategy,
+                                    std::string selectedFieldName = "")
   {
 
     for( unsigned int i = 0; i < imageList->Size(); ++i )
       {
       std::string vectorFileName = vectorFileNames.empty() ? "" : vectorFileNames[i];
       SelectAndExtractSamples( imageList->GetNthElement( i ), vectorFileName, fileNames.sampleOutputs[i],
-                               fileNames.polyStatTrainOutputs[i], fileNames.ratesTrainOutputs[i], strategy );
+                               fileNames.polyStatTrainOutputs[i], fileNames.ratesTrainOutputs[i], strategy,
+                               selectedFieldName );
       }
   }
 
 
   void SelectAndExtractValidationSamples(const TrainFileNamesHandler &fileNames, FloatVectorImageListType *imageList,
-                                         const std::vector<std::string> &validationVectorFileList)
+                                         const std::vector<std::string> &validationVectorFileList = std::vector<std::string>())
   {
     // In dedicated validation mode the by class sampling strategy and statistics are used.
     // Otherwise simply split training to validation samples corresponding to sample.vtr percentage.
-- 
GitLab