From f00e00ece30cbaeb7a872075507bf3554197a89c Mon Sep 17 00:00:00 2001 From: Scott Klum Date: Tue, 7 Jan 2014 14:42:02 -0500 Subject: [PATCH] Added ZScore distance --- openbr/plugins/quality.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+), 0 deletions(-) diff --git a/openbr/plugins/quality.cpp b/openbr/plugins/quality.cpp index 78fc093..dfa0a21 100644 --- a/openbr/plugins/quality.cpp +++ b/openbr/plugins/quality.cpp @@ -211,6 +211,65 @@ protected: BR_REGISTER(Distance, MatchProbabilityDistance) +class ZScoreDistance : public Distance +{ + Q_OBJECT + Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) + Q_PROPERTY(bool crossModality READ get_crossModality WRITE set_crossModality RESET reset_crossModality STORED false) + BR_PROPERTY(br::Distance*, distance, make("Dist(L2)")) + BR_PROPERTY(bool, crossModality, false) + + float min, max; + double mean, stddev; + + void train(const TemplateList &src) + { + distance->train(src); + + QScopedPointer matrixOutput(MatrixOutput::make(FileList(src.size()), FileList(src.size()))); + distance->compare(src, src, matrixOutput.data()); + + QList scores; + scores.reserve(src.size()*src.size()); + for (int i=0; idata.at(i, j); + if (score == -std::numeric_limits::max()) continue; + if (crossModality && src[i].file.get("MODALITY") == src[j].file.get("MODALITY")) continue; + scores.append(score); + } + } + + Common::MinMax(scores, &min, &max); + Common::MeanStdDev(scores, &mean, &stddev); + + if (stddev == 0) qFatal("Stddev is 0."); + } + + float compare(const Template &target, const Template &query) const + { + float score = distance->compare(target,query); + if (score == -std::numeric_limits::max()) score = (min - mean) / stddev; + else if (score == std::numeric_limits::max()) score = (max - mean) / stddev; + else score = (score - mean) / stddev; + return score; + } + + void store(QDataStream &stream) const + { + distance->store(stream); + stream << min << max << mean << stddev; + } + + void load(QDataStream &stream) + { + distance->load(stream); + stream >> min >> max >> mean >> stddev; + } +}; + +BR_REGISTER(Distance, ZScoreDistance) + /*! * \ingroup distances * \brief Match Probability modification for heat maps \cite klare12 -- libgit2 0.21.4