Updated a recall curve construction in descriptors evaluation
authorIlya Lysenkov <no@email>
Thu, 30 Sep 2010 15:33:40 +0000 (15:33 +0000)
committerIlya Lysenkov <no@email>
Thu, 30 Sep 2010 15:33:40 +0000 (15:33 +0000)
tests/cv/src/adetectordescriptor_evaluation.cpp

index 9e6f01e..800c57f 100644 (file)
@@ -987,54 +987,39 @@ void DescriptorQualityTest::calculatePlotData( vector<vector<DMatch> > &allMatch
 {
     vector<Point2f> recallPrecisionCurve;
     computeRecallPrecisionCurve( allMatches, allCorrectMatchesMask, recallPrecisionCurve );
-    // you have recallPrecisionCurve for all images from dataset
-    // size of recallPrecisionCurve == total matches count
-#if 0
 
-    std::sort( allMatches.begin(), allMatches.end() );
-    //calcDatasetQuality[di].resize( allMatches.size() );
     calcDatasetQuality[di].clear();
-    int correctMatchCount = 0, falseMatchCount = 0;
-    const float sparsePlotBound = 0.1;
-    const int npoints = 10000;
-    int step = 1 + allMatches.size() / npoints;
     const float resultPrecision = 0.5;
     bool isResultCalculated = false;
+    const double eps = 1e-2;
 
-    for( size_t i=0;i<allMatches.size();i++)
+    Quality initQuality;
+    initQuality.recall = 0;
+    initQuality.precision = 0;
+    calcDatasetQuality[di].push_back( initQuality );
+
+    for( size_t i=0;i<recallPrecisionCurve.size();i++ )
     {
-        if( allMatches[i].isCorrect )
-            correctMatchCount++;
-        else
-            falseMatchCount++;
+        Quality quality;
+        quality.recall = recallPrecisionCurve[i].y;
+        quality.precision = 1 - recallPrecisionCurve[i].x;
+        Quality back = calcDatasetQuality[di].back();
 
-        if( precision( correctMatchCount, falseMatchCount ) >= sparsePlotBound || (i % step == 0) )
-        {
-            Quality quality;
-            quality.recall = recall( correctMatchCount, allCorrespCount );
-            quality.precision = precision( correctMatchCount, falseMatchCount );
+        if( fabs( quality.recall - back.recall ) < eps && fabs( quality.precision - back.precision ) < eps )
+            continue;
 
-            calcDatasetQuality[di].push_back( quality );
+        calcDatasetQuality[di].push_back( quality );
 
-            if( !isResultCalculated && quality.precision < resultPrecision )
+        if( !isResultCalculated && quality.precision < resultPrecision )
+        {
+            for(int ci=0;ci<TEST_CASE_COUNT;ci++)
             {
-                for(int ci=0;ci<TEST_CASE_COUNT;ci++)
-                {
-                    calcQuality[di][ci].recall = quality.recall;
-                    calcQuality[di][ci].precision = quality.precision;
-                }
-                isResultCalculated = true;
+                calcQuality[di][ci].recall = quality.recall;
+                calcQuality[di][ci].precision = quality.precision;
             }
+            isResultCalculated = true;
         }
     }
-
-    Quality quality;
-    quality.recall = recall( correctMatchCount, allCorrespCount );
-    quality.precision = precision( correctMatchCount, falseMatchCount );
-
-    calcDatasetQuality[di].push_back( quality );
-#endif
-
 }
 
 void DescriptorQualityTest::runDatasetTest (const vector<Mat> &imgs, const vector<Mat> &Hs, int di, int &progress)