From cc33a4ef4e309c2e352f7ac225069217d065c98c Mon Sep 17 00:00:00 2001 From: bhklein Date: Thu, 21 Aug 2014 18:10:38 -0400 Subject: [PATCH] Added CMC table to plot.cpp, factored out CMC code to getCMC() in eval.cpp --- openbr/core/eval.cpp | 35 +++++++++++++++++++++++------------ openbr/core/plot.cpp | 14 ++++++++++++-- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/openbr/core/eval.cpp b/openbr/core/eval.cpp index 317a9ee..98ffe97 100755 --- a/openbr/core/eval.cpp +++ b/openbr/core/eval.cpp @@ -66,6 +66,19 @@ static float getTAR(const QList &operatingPoints, float FAR) return m * FAR + b; } +static float getCMC(const QVector &firstGenuineReturns, int rank) +{ + int realizedReturns = 0, possibleReturns = 0; + foreach (int firstGenuineReturn, firstGenuineReturns) { + if (firstGenuineReturn > 0) { + possibleReturns++; + if (firstGenuineReturn <= rank) realizedReturns++; + } + } + const float retrievalRate = float(realizedReturns)/possibleReturns; + return retrievalRate; +} + // Decide whether to construct a normal mask matrix, or a pairwise mask by comparing the dimensions of // scores with the size of the target and query lists static cv::Mat constructMatchingMask(const cv::Mat &scores, const FileList &target, const FileList &query, int partition=0) @@ -240,6 +253,14 @@ float Evaluate(const Mat &simmat, const Mat &mask, const QString &csv) lines.append(qPrintable(QString("FT,0.01,%1").arg(QString::number(getTAR(operatingPoints, 0.01), 'f', 3)))); lines.append(qPrintable(QString("FT,0.1,%1").arg(QString::number(getTAR(operatingPoints, 0.1), 'f', 3)))); + //Write CMC Table (CT) + lines.append(qPrintable(QString("CT,1,%1").arg(QString::number(getCMC(firstGenuineReturns, 1), 'f', 3)))); + lines.append(qPrintable(QString("CT,5,%1").arg(QString::number(getCMC(firstGenuineReturns, 5), 'f', 3)))); + lines.append(qPrintable(QString("CT,10,%1").arg(QString::number(getCMC(firstGenuineReturns, 10), 'f', 3)))); + lines.append(qPrintable(QString("CT,20,%1").arg(QString::number(getCMC(firstGenuineReturns, 20), 'f', 3)))); + lines.append(qPrintable(QString("CT,50,%1").arg(QString::number(getCMC(firstGenuineReturns, 50), 'f', 3)))); + lines.append(qPrintable(QString("CT,100,%1").arg(QString::number(getCMC(firstGenuineReturns, 100), 'f', 3)))); + // Write FAR/TAR Bar Chart (BC) lines.append(qPrintable(QString("BC,0.001,%1").arg(QString::number(getTAR(operatingPoints, 0.001), 'f', 3)))); lines.append(qPrintable(QString("BC,0.01,%1").arg(QString::number(result = getTAR(operatingPoints, 0.01), 'f', 3)))); @@ -265,23 +286,13 @@ float Evaluate(const Mat &simmat, const Mat &mask, const QString &csv) // Write Cumulative Match Characteristic (CMC) curve const int Max_Retrieval = 200; const int Report_Retrieval = 5; - - float reportRetrievalRate = -1; for (int i=1; i<=Max_Retrieval; i++) { - int realizedReturns = 0, possibleReturns = 0; - foreach (int firstGenuineReturn, firstGenuineReturns) { - if (firstGenuineReturn > 0) { - possibleReturns++; - if (firstGenuineReturn <= i) realizedReturns++; - } - } - const float retrievalRate = float(realizedReturns)/possibleReturns; + const float retrievalRate = getCMC(firstGenuineReturns, i); lines.append(qPrintable(QString("CMC,%1,%2").arg(QString::number(i), QString::number(retrievalRate)))); - if (i == Report_Retrieval) reportRetrievalRate = retrievalRate; } QtUtils::writeFile(csv, lines); - qDebug("TAR @ FAR = 0.01: %.3f\nRetrieval Rate @ Rank = %d: %.3f", result, Report_Retrieval, reportRetrievalRate); + qDebug("TAR @ FAR = 0.01: %.3f\nRetrieval Rate @ Rank = %d: %.3f", result, Report_Retrieval, getCMC(firstGenuineReturns, Report_Retrieval)); return result; } diff --git a/openbr/core/plot.cpp b/openbr/core/plot.cpp index 6fa33db..4d2c6fc 100644 --- a/openbr/core/plot.cpp +++ b/openbr/core/plot.cpp @@ -135,6 +135,7 @@ struct RPlot "FRR <- data[grep(\"FRR\",data$Plot),-c(1)]\n" "SD <- data[grep(\"SD\",data$Plot),-c(1)]\n" "FT <- data[grep(\"FT\",data$Plot),-c(1)]\n" + "CT <- data[grep(\"CT\",data$Plot),-c(1)]\n" "BC <- data[grep(\"BC\",data$Plot),-c(1)]\n" "CMC <- data[grep(\"CMC\",data$Plot),-c(1)]\n" "FAR$Error <- \"FAR\"\n" @@ -148,6 +149,7 @@ struct RPlot "ERR$Y <- as.numeric(as.character(ERR$Y))\n" "SD$Y <- as.factor(unique(as.character(SD$Y)))\n" "FT$Y <- as.numeric(as.character(FT$Y))\n" + "CT$Y <- as.numeric(as.character(CT$Y))\n" "BC$Y <- as.numeric(as.character(BC$Y))\n" "CMC$Y <- as.numeric(as.character(CMC$Y))\n" "\n" @@ -161,7 +163,13 @@ struct RPlot "mat <- matrix(FT$Y,nrow=6,ncol=length(algs),byrow=FALSE)\n" "colnames(mat) <- algs \n" "rownames(mat) <- c(\"FAR = 1e-06\", \"FAR = 1e-05\", \"FAR = 1e-04\", \"FAR = 1e-03\", \"FAR = 1e-02\", \"FAR = 1e-01\")\n" - "table <- as.table(mat)\n"); + "FTtable <- as.table(mat)\n" + "\n" + "# Code to format CMC Table\n" + "mat <- matrix(CT$Y,nrow=6,ncol=length(algs),byrow=FALSE)\n" + "colnames(mat) <- algs \n" + "rownames(mat) <- c(\" Rank 1\", \"Rank 5\", \"Rank 10\", \"Rank 20\", \"Rank 50\", \"Rank 100\")\n" + "CMCtable <- as.table(mat)\n"); // Open output device file.write(qPrintable(QString("\n" @@ -189,8 +197,10 @@ struct RPlot "plot.new()\n" "print(title(\"Gallery * Probe = Genuine + Impostor + Ignored\"))\n" "plot.new()\n" + "print(textplot(FTtable,cex=1))\n" "print(title(\"Table of True Accept Rates at various False Accept Rates\"))\n" - "print(textplot(table,valign=\"top\",cex=1))\n"; + "print(textplot(CMCtable,cex=1))\n" + "print(title(\"Table of retrieval rate at various ranks\"))\n"; file.write(qPrintable(textplot.arg(PRODUCT_NAME, PRODUCT_VERSION))); } -- libgit2 0.21.4