diff --git a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
index 121ed2b588e3a292140643a04ca305dbed1e5e00..934e2d480ae6437846280be21c23aa476054a9b7 100644
--- a/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
+++ b/Modules/Learning/Sampling/src/otbSamplingRateCalculator.cxx
@@ -50,15 +50,23 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    if (smallestNbofSamples > it->second.Tot)
+    if (it->second.Tot)
       {
-      smallestNbofSamples = it->second.Tot;
+      if (smallestNbofSamples > it->second.Tot)
+        {
+        smallestNbofSamples = it->second.Tot;
+        }
+      }
+    else
+      {
+      otbWarningMacro("Ignoring empty class " << it->first);
       }
     }
-  // Check if there is an empty class
-  if (smallestNbofSamples == 0UL)
+  // Check if there is at least one non-empty class
+  if (smallestNbofSamples == itk::NumericTraits<unsigned long>::max())
     {
-    otbWarningMacro("There is an empty class, sample size is set to zero!");
+    otbWarningMacro("There are only empty classes, sample size is set to zero!");
+    smallestNbofSamples = 0UL;
     }
   this->SetNbOfSamplesAllClasses( smallestNbofSamples );
 }
@@ -70,7 +78,15 @@ SamplingRateCalculator
   MapRateType::iterator it = m_RatesByClass.begin();
   for (; it != m_RatesByClass.end() ; ++it)
     {
-    it->second.Required = dRequiredNbSamples;
+    if (it->second.Tot)
+      {
+      it->second.Required = dRequiredNbSamples;
+      }
+    else
+      {
+      // ignore empty classes
+      it->second.Required = 0UL;
+      }
     this->UpdateRate(it->first);
     }
 }