Commit ccc72f61 authored by Ilya Lysenkov's avatar Ilya Lysenkov

Updated a recall curve construction in descriptors evaluation

parent 13b535ac
...@@ -987,54 +987,39 @@ void DescriptorQualityTest::calculatePlotData( vector<vector<DMatch> > &allMatch ...@@ -987,54 +987,39 @@ void DescriptorQualityTest::calculatePlotData( vector<vector<DMatch> > &allMatch
{ {
vector<Point2f> recallPrecisionCurve; vector<Point2f> recallPrecisionCurve;
computeRecallPrecisionCurve( allMatches, allCorrectMatchesMask, 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(); 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; const float resultPrecision = 0.5;
bool isResultCalculated = false; 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 ) Quality quality;
correctMatchCount++; quality.recall = recallPrecisionCurve[i].y;
else quality.precision = 1 - recallPrecisionCurve[i].x;
falseMatchCount++; Quality back = calcDatasetQuality[di].back();
if( precision( correctMatchCount, falseMatchCount ) >= sparsePlotBound || (i % step == 0) ) if( fabs( quality.recall - back.recall ) < eps && fabs( quality.precision - back.precision ) < eps )
{ continue;
Quality quality;
quality.recall = recall( correctMatchCount, allCorrespCount );
quality.precision = precision( correctMatchCount, falseMatchCount );
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;
calcQuality[di][ci].recall = quality.recall;
calcQuality[di][ci].precision = quality.precision;
}
isResultCalculated = true;
} }
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) void DescriptorQualityTest::runDatasetTest (const vector<Mat> &imgs, const vector<Mat> &Hs, int di, int &progress)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment