Commit b085d2aafa9ff2582cae841d094849a2728dee80

Authored by bhklein
1 parent c48c08d1

score interpolation bug fix

Showing 1 changed file with 10 additions and 7 deletions
openbr/core/eval.cpp
... ... @@ -75,18 +75,22 @@ static OperatingPoint getOperatingPoint(const QList<OperatingPoint> &operatingPo
75 75 }
76 76 }
77 77  
78   - const float FAR1 = (index == 0 ? 0 : operatingPoints[index-1].FAR);
79   - const float TAR1 = (index == 0 ? 0 : operatingPoints[index-1].TAR);
80   - const float score1 = (index == 0 ? operatingPoints[index].score : operatingPoints[index-1].score);
  78 + const int index2 = (key == "Score" ? std::min(index+1, operatingPoints.size()-1) : index-1);
  79 + const float FAR1 = (index == 0 ? 0 : operatingPoints[index2].FAR);
  80 + const float TAR1 = (index == 0 ? 0 : operatingPoints[index2].TAR);
  81 + const float score1 = (index == 0 ? operatingPoints[index].score : operatingPoints[index2].score);
81 82 const float FAR2 = operatingPoints[index].FAR;
82 83 const float TAR2 = operatingPoints[index].TAR;
83 84 const float score2 = operatingPoints[index].score;
84 85  
85   - const float mFAR = (FAR2 - FAR1) / (score2 - score1);
  86 + const float denFAR = (FAR1 == FAR2 ? std::numeric_limits<float>::max() : (FAR2 - FAR1));
  87 + const float denScore = (score1 == score2 ? std::numeric_limits<float>::max() : (score2 - score1));
  88 +
  89 + const float mFAR = (FAR2 - FAR1) / denScore;
86 90 const float bFAR = FAR1 - mFAR*score1;
87   - const float mTAR = (TAR2 - TAR1) / (key == "Score" ? (score2 - score1) : (FAR2 - FAR1));
  91 + const float mTAR = (TAR2 - TAR1) / (key == "Score" ? denScore : denFAR);
88 92 const float bTAR = TAR1 - mTAR*(key == "Score" ? score1 : FAR1);
89   - const float mScore = (score2 - score1) / (FAR2 - FAR1);
  93 + const float mScore = (score2 - score1) / denFAR;
90 94 const float bScore = score1 - mScore*FAR1;
91 95  
92 96 if (key == "Score")
... ... @@ -352,7 +356,6 @@ float Evaluate(const Mat &amp;simmat, const Mat &amp;mask, const File &amp;csv, const QStrin
352 356 float FRRstep = expFRR / (float)(Max_Points - 1);
353 357 float FPIRstep = expFPIR / (float)(Max_Points - 1);
354 358  
355   - getOperatingPoint(operatingPoints, "Score", 0.5);
356 359 for (int i=0; i<Max_Points; i++) {
357 360 float FAR = pow(10, -expFAR + i*FARstep);
358 361 float FRR = pow(10, -expFRR + i*FRRstep);
... ...