From 11123de77a9ea7935825f8f6b3d803bd9217b783 Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Sat, 23 Mar 2013 11:34:35 -0400 Subject: [PATCH] introduced evalOutput --- openbr/core/bee.cpp | 33 +++++++++++++++++++-------------- openbr/core/bee.h | 1 + openbr/core/plot.cpp | 29 +++++++++++++++++------------ openbr/core/plot.h | 1 + openbr/plugins/output.cpp | 18 ++++++++++++++++++ 5 files changed, 56 insertions(+), 26 deletions(-) diff --git a/openbr/core/bee.cpp b/openbr/core/bee.cpp index 05143df..e0ede3f 100644 --- a/openbr/core/bee.cpp +++ b/openbr/core/bee.cpp @@ -234,22 +234,26 @@ void BEE::writeMask(const Mat &m, const QString &mask, const QString &targetSigs void BEE::makeMask(const QString &targetInput, const QString &queryInput, const QString &mask) { qDebug("Making mask from %s and %s to %s", qPrintable(targetInput), qPrintable(queryInput), qPrintable(mask)); + FileList targes = TemplateList::fromGallery(targetInput).files(); + FileList queries = (queryInput == ".") ? targes : TemplateList::fromGallery(queryInput).files(); + writeMask(makeMask(targes, queries), mask, targetInput, queryInput); +} - FileList targetFiles = TemplateList::fromGallery(targetInput).files(); - FileList queryFiles = (queryInput == ".") ? targetFiles : TemplateList::fromGallery(queryInput).files(); - QList targetLabels = targetFiles.labels(); - QList queryLabels = queryFiles.labels(); - QList targetPartitions = targetFiles.crossValidationPartitions(); - QList queryPartitions = queryFiles.crossValidationPartitions(); - - Mat vals(queryFiles.size(), targetFiles.size(), CV_8UC1); - for (int i=0; i targetLabels = targets.labels(); + QList queryLabels = queries.labels(); + QList targetPartitions = targets.crossValidationPartitions(); + QList queryPartitions = queries.crossValidationPartitions(); + + Mat mask(queries.size(), targets.size(), CV_8UC1); + for (int i=0; i(i,j) = val; + mask.at(i,j) = val; } } - writeMask(vals, mask, targetInput, queryInput); + + return mask; } void BEE::combineMasks(const QStringList &inputMasks, const QString &outputMask, const QString &method) diff --git a/openbr/core/bee.h b/openbr/core/bee.h index 6880944..3cd9fcd 100644 --- a/openbr/core/bee.h +++ b/openbr/core/bee.h @@ -46,6 +46,7 @@ namespace BEE // Write BEE files void makeMask(const QString &targetInput, const QString &queryInput, const QString &mask); + cv::Mat makeMask(const br::FileList &targets, const br::FileList &queries); void combineMasks(const QStringList &inputMasks, const QString &outputMask, const QString &method); } diff --git a/openbr/core/plot.cpp b/openbr/core/plot.cpp index d0957e7..8f77ee8 100644 --- a/openbr/core/plot.cpp +++ b/openbr/core/plot.cpp @@ -113,9 +113,6 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) { qDebug("Evaluating %s with %s", qPrintable(simmat), qPrintable(mask)); - const int Max_Points = 500; - float result = -1; - // Read files const Mat scores = BEE::readSimmat(simmat); File maskFile(mask); @@ -124,13 +121,21 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) const Mat masks = BEE::readMask(maskFile); if (scores.size() != masks.size()) qFatal("Simmat/Mask size mismatch."); + return Evaluate(scores, masks, csv); +} + +float Evaluate(const Mat &simmat, const Mat &mask, const QString &csv) +{ + const int Max_Points = 500; + float result = -1; + // Make comparisons - QList comparisons; comparisons.reserve(scores.rows*scores.cols); + QList comparisons; comparisons.reserve(simmat.rows*simmat.cols); int genuineCount = 0, impostorCount = 0, numNaNs = 0; - for (int i=0; i(i,j); - const BEE::Simmat_t simmat_val = scores.at(i,j); + for (int i=0; i(i,j); + const BEE::Simmat_t simmat_val = simmat.at(i,j); if (mask_val == BEE::DontCare) continue; if (simmat_val != simmat_val) { numNaNs++; continue; } comparisons.append(Comparison(simmat_val, j, i, mask_val == BEE::Match)); @@ -149,7 +154,7 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) double genuineSum = 0, impostorSum = 0; QList operatingPoints; QList genuines, impostors; - QVector firstGenuineReturns(scores.rows, 0); + QVector firstGenuineReturns(simmat.rows, 0); int falsePositives = 0, previousFalsePositives = 0; int truePositives = 0, previousTruePositives = 0; @@ -202,11 +207,11 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) // Write Metadata table QStringList lines; lines.append("Plot,X,Y"); - lines.append("Metadata,"+QString::number(scores.cols)+",Gallery"); - lines.append("Metadata,"+QString::number(scores.rows)+",Probe"); + lines.append("Metadata,"+QString::number(simmat.cols)+",Gallery"); + lines.append("Metadata,"+QString::number(simmat.rows)+",Probe"); lines.append("Metadata,"+QString::number(genuineCount)+",Genuine"); lines.append("Metadata,"+QString::number(impostorCount)+",Impostor"); - lines.append("Metadata,"+QString::number(scores.cols*scores.rows-(genuineCount+impostorCount))+",Ignored"); + lines.append("Metadata,"+QString::number(simmat.cols*simmat.rows-(genuineCount+impostorCount))+",Ignored"); // Write Detection Error Tradeoff (DET), PRE, REC int points = qMin(operatingPoints.size(), Max_Points); diff --git a/openbr/core/plot.h b/openbr/core/plot.h index 782de18..20486e7 100644 --- a/openbr/core/plot.h +++ b/openbr/core/plot.h @@ -27,6 +27,7 @@ namespace br void Confusion(const QString &file, float score, int &true_positives, int &false_positives, int &true_negatives, int &false_negatives); float Evaluate(const QString &simmat, const QString &mask, const QString &csv = ""); // Returns TAR @ FAR = 0.01 +float Evaluate(const cv::Mat &scores, const cv::Mat &masks, const QString &csv = ""); bool Plot(const QStringList &files, const br::File &destination, bool show = false); bool PlotMetadata(const QStringList &files, const QString &destination, bool show = false); diff --git a/openbr/plugins/output.cpp b/openbr/plugins/output.cpp index ecd9250..d431fd1 100644 --- a/openbr/plugins/output.cpp +++ b/openbr/plugins/output.cpp @@ -40,6 +40,7 @@ #include "openbr/core/bee.h" #include "openbr/core/common.h" #include "openbr/core/opencvutils.h" +#include "openbr/core/plot.h" #include "openbr/core/qtutils.h" namespace br @@ -259,6 +260,23 @@ BR_REGISTER(Output, EmptyOutput) /*! * \ingroup outputs + * \brief Evaluate the output matrix. + * \author Josh Klontz \cite jklontz + */ +class evalOutput : public MatrixOutput +{ + Q_OBJECT + + ~evalOutput() + { + Evaluate(data, BEE::makeMask(targetFiles, queryFiles), ""); + } +}; + +BR_REGISTER(Output, evalOutput) + +/*! + * \ingroup outputs * \brief Outputs highest ranked matches with scores. * \author Scott Klum \cite sklum */ -- libgit2 0.21.4