diff --git a/sdk/openbr_plugin.h b/sdk/openbr_plugin.h index 548288f..84baad1 100644 --- a/sdk/openbr_plugin.h +++ b/sdk/openbr_plugin.h @@ -971,7 +971,6 @@ public: protected: Transform(bool independent = true); /*!< \brief Construct a transform. */ inline Transform *make(const QString &description) { return make(description, this); } /*!< \brief Make a subtransform. */ - }; /*! @@ -1075,6 +1074,9 @@ public: float compare(const Template &target, const Template &query) const; /*!< \brief Compute the normalized distance between two templates. */ QList compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */ +protected: + inline Distance *make(const QString &description) { return make(description, this); } /*!< \brief Make a subdistance. */ + private: virtual void compareBlock(const TemplateList &target, const TemplateList &query, Output *output, int targetOffset, int queryOffset) const; virtual float _compare(const Template &a, const Template &b) const = 0; /*!< \brief Compute the distance between two templates. */ diff --git a/sdk/plugins/quality.cpp b/sdk/plugins/quality.cpp index 769ffde..fb071a9 100644 --- a/sdk/plugins/quality.cpp +++ b/sdk/plugins/quality.cpp @@ -18,14 +18,20 @@ class IUMTransform : public Transform Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) Q_PROPERTY(double mean READ get_mean WRITE set_mean RESET reset_mean) Q_PROPERTY(double stddev READ get_stddev WRITE set_stddev RESET reset_stddev) - BR_PROPERTY(br::Distance*, distance, Factory::make(".Dist(L2)")) + BR_PROPERTY(br::Distance*, distance, Distance::make("Dist(L2)", this)) BR_PROPERTY(double, mean, 0) BR_PROPERTY(double, stddev, 1) br::TemplateList impostors; float calculateIUM(const Template &probe, const TemplateList &gallery) const { - QList scores = distance->compare(gallery, probe); + const int probeLabel = probe.file.label(); + TemplateList subset = gallery; + for (int j=subset.size()-1; j>=0; j--) + if (subset[j].file.label() == probeLabel) + subset.removeAt(j); + + QList scores = distance->compare(subset, probe); float min, max; Common::MinMax(scores, &min, &max); double mean; @@ -39,14 +45,8 @@ class IUMTransform : public Transform impostors = data; QList iums; iums.reserve(impostors.size()); - QList labels = impostors.labels(); - for (int i=0; i=0; j--) - if (labels[j] == labels[i]) - subset.removeAt(j); - iums.append(calculateIUM(impostors[i], subset)); - } + for (int i=0; i>(QDataStream &stream, NMP &nmp) /*! * \ingroup distances - * \brief Impostor Uniqueness Distance \cite klare12 + * \brief Non-match Probability Distance \cite klare12 * \author Josh Klontz \cite jklontz */ -class IUMDistance : public Distance +class NMPDistance : public Distance { Q_OBJECT Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) - BR_PROPERTY(br::Distance*, distance, Factory::make(".Dist(L2)")) + Q_PROPERTY(QString binKey READ get_binKey WRITE set_binKey RESET reset_binKey STORED false) + BR_PROPERTY(br::Distance*, distance, make("Dist(L2)")) + BR_PROPERTY(QString, binKey, "") - QList nmps; + QHash nmps; void train(const TemplateList &src) { distance->train(src); - const QList labels = src.labels(); + const QList labels = src.labels(); QScopedPointer memoryOutput(dynamic_cast(Output::make(".Matrix", FileList(src.size()), FileList(src.size())))); distance->compare(src, src, memoryOutput.data()); - const int IUM_Bins = 3; - QVector< QList > genuineScores(IUM_Bins), impostorScores(IUM_Bins); + QHash< QString, QList > genuineScores, impostorScores; for (int i=0; idata.at(i, j); - const int bin = src[i].file.getInt("IUM_Bin"); + const QString bin = src[i].file.getString(binKey, ""); if (labels[i] == labels[j]) genuineScores[bin].append(score); else impostorScores[bin].append(score); } - for (int i=0; icompare(target, query)); + return nmps[query.file.getString(binKey, "")](distance->compare(target, query)); } void store(QDataStream &stream) const @@ -185,7 +186,7 @@ class IUMDistance : public Distance } }; -BR_REGISTER(Distance, IUMDistance) +BR_REGISTER(Distance, NMPDistance) } // namespace br