From 09dc49393895dc48a7fee6e3f6070af72b49f117 Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Sat, 23 Feb 2013 21:03:15 -0500 Subject: [PATCH] FaceRecognition now uses MatchProbabilityDistance --- CHANGELOG.md | 4 +++- app/examples/face_recognition.cpp | 5 +++-- sdk/plugins/algorithms.cpp | 2 +- sdk/plugins/format.cpp | 1 - sdk/plugins/quality.cpp | 25 ++++++++++++------------- share/openbr/models | 2 +- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9d6ad5..abcd3cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ -0.2.0 - ??/??/?? +0.2.0 - 2/23/13 ================ +* FaceRecognition new distance metric + - 0 to 1 range indicating match probability * Qt 4.8 -> Qt 5.0 * Cleaner plots generated with 'br -plot' * Stasm and FLandmark wrappers diff --git a/app/examples/face_recognition.cpp b/app/examples/face_recognition.cpp index 23c4bf4..48b0c4b 100644 --- a/app/examples/face_recognition.cpp +++ b/app/examples/face_recognition.cpp @@ -62,8 +62,9 @@ int main(int argc, char *argv[]) float comparisonA = distance->compare(target, queryA); float comparisonB = distance->compare(target, queryB); - printf("Genuine match score: %.3f\n", comparisonA); // Scores above 1 are strong matches - printf("Impostor match score: %.3f\n", comparisonB); // Scores below 0.5 are strong non-matches + // Scores range from 0 to 1 and represent match probability + printf("Genuine match score: %.3f\n", comparisonA); + printf("Impostor match score: %.3f\n", comparisonB); br::Context::finalize(); return 0; diff --git a/sdk/plugins/algorithms.cpp b/sdk/plugins/algorithms.cpp index 37b491d..018ba0a 100644 --- a/sdk/plugins/algorithms.cpp +++ b/sdk/plugins/algorithms.cpp @@ -31,7 +31,7 @@ class AlgorithmsInitializer : public Initializer void initialize() const { // Face - Globals->abbreviations.insert("FaceRecognition", "FaceDetection!!++:UCharL1"); + Globals->abbreviations.insert("FaceRecognition", "FaceDetection!!++:MatchProbability(ByteL1)"); Globals->abbreviations.insert("FaceRecognitionNoTraining", "FaceDetection!ASEFEyes+Affine(86,86,0.25,0.35)!Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+Mask+LBP(1,2)+RectRegions(8,8,6,6)+Hist(59)+Cat:ChiSquared"); Globals->abbreviations.insert("GenderClassification", "FaceDetection!!++Discard"); Globals->abbreviations.insert("AgeRegression", "FaceDetection!!++Discard"); diff --git a/sdk/plugins/format.cpp b/sdk/plugins/format.cpp index 58fc2d6..a0106c6 100644 --- a/sdk/plugins/format.cpp +++ b/sdk/plugins/format.cpp @@ -222,7 +222,6 @@ class DefaultFormat : public Format fileName = file.fileName(); if (!QFileInfo(fileName).exists()) { fileName = file.getString("path") + "/" + file.fileName(); - qDebug() << fileName; if (!QFileInfo(fileName).exists()) return t; } } diff --git a/sdk/plugins/quality.cpp b/sdk/plugins/quality.cpp index a9a42ee..553e59c 100644 --- a/sdk/plugins/quality.cpp +++ b/sdk/plugins/quality.cpp @@ -147,13 +147,11 @@ class MatchProbabilityDistance : public Distance { Q_OBJECT Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) - Q_PROPERTY(QString binKey READ get_binKey WRITE set_binKey RESET reset_binKey STORED false) Q_PROPERTY(bool gaussian READ get_gaussian WRITE set_gaussian RESET reset_gaussian STORED false) BR_PROPERTY(br::Distance*, distance, make("Dist(L2)")) - BR_PROPERTY(QString, binKey, "") BR_PROPERTY(bool, gaussian, true) - QHash mps; + MP mp; void train(const TemplateList &src) { @@ -163,37 +161,38 @@ class MatchProbabilityDistance : public Distance QScopedPointer memoryOutput(dynamic_cast(Output::make(".Matrix", FileList(src.size()), FileList(src.size())))); distance->compare(src, src, memoryOutput.data()); - QHash< QString, QList > genuineScores, impostorScores; - for (int i=0; i genuineScores, impostorScores; + genuineScores.reserve(labels.size()); + impostorScores.reserve(labels.size()*labels.size()); + for (int i=0; idata.at(i, j); if (score == -std::numeric_limits::max()) continue; - const QString bin = src[i].file.getString(binKey, ""); - if (labels[i] == labels[j]) genuineScores[bin].append(score); - else impostorScores[bin].append(score); + if (labels[i] == labels[j]) genuineScores.append(score); + else impostorScores.append(score); } + } - foreach (const QString &key, genuineScores.keys()) - mps.insert(key, MP(genuineScores[key], impostorScores[key])); + mp = MP(genuineScores, impostorScores); } float compare(const Template &target, const Template &query) const { float rawScore = distance->compare(target, query); if (rawScore == -std::numeric_limits::max()) return rawScore; - return mps[query.file.getString(binKey, "")](rawScore, gaussian); + return mp(rawScore, gaussian); } void store(QDataStream &stream) const { distance->store(stream); - stream << mps; + stream << mp; } void load(QDataStream &stream) { distance->load(stream); - stream >> mps; + stream >> mp; } }; diff --git a/share/openbr/models b/share/openbr/models index b560a33..3ab0a43 160000 --- a/share/openbr/models +++ b/share/openbr/models @@ -1 +1 @@ -Subproject commit b560a337e5b47770234d4ab554c563b5043e3595 +Subproject commit 3ab0a438e4d93ead1a7db346d221bbb4ae81ccf1 -- libgit2 0.21.4