From e69f6ae399efcec931cc7b217d05b66a881117c0 Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Wed, 31 Jul 2013 11:03:11 -0400 Subject: [PATCH] refactored CascadeTransform to support ROC confidence values --- openbr/plugins/cascade.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/openbr/plugins/cascade.cpp b/openbr/plugins/cascade.cpp index 0c00523..30b886b 100644 --- a/openbr/plugins/cascade.cpp +++ b/openbr/plugins/cascade.cpp @@ -49,19 +49,20 @@ private: } }; - /*! * \ingroup transforms * \brief Wraps OpenCV cascade classifier * \author Josh Klontz \cite jklontz */ -class CascadeTransform : public UntrainableTransform +class CascadeTransform : public UntrainableMetaTransform { Q_OBJECT Q_PROPERTY(QString model READ get_model WRITE set_model RESET reset_model STORED false) Q_PROPERTY(int minSize READ get_minSize WRITE set_minSize RESET reset_minSize STORED false) + Q_PROPERTY(bool ROCMode READ get_ROCMode WRITE set_ROCMode RESET reset_ROCMode STORED false) BR_PROPERTY(QString, model, "FrontalFace") BR_PROPERTY(int, minSize, 64) + BR_PROPERTY(bool, ROCMode, false) Resource cascadeResource; @@ -72,18 +73,55 @@ class CascadeTransform : public UntrainableTransform void project(const Template &src, Template &dst) const { + TemplateList temp; + project(TemplateList() << src, temp); + if (!temp.isEmpty()) dst = temp.first(); + } + + void project(const TemplateList &src, TemplateList &dst) const + { + static const int rejectLevelWeight = 1000.0; + static const int stageSumWeight = 1.0; + CascadeClassifier *cascade = cascadeResource.acquire(); - vector rects; - cascade->detectMultiScale(src, rects, 1.2, 5, src.file.get("enrollAll", false) ? 0 : CV_HAAR_FIND_BIGGEST_OBJECT, Size(minSize, minSize)); + + foreach (const Template &t, src) { + const bool enrollAll = t.file.getBool("enrollAll"); + + for (int i=0; i rects; + vector rejectLevels; + vector levelWeights; + if (ROCMode) cascade->detectMultiScale(m, rects, rejectLevels, levelWeights, 1.2, 5, (enrollAll ? 0 : CV_HAAR_FIND_BIGGEST_OBJECT) | CV_HAAR_SCALE_IMAGE, Size(minSize, minSize), Size(), true); + else cascade->detectMultiScale(m, rects, 1.2, 5, enrollAll ? 0 : CV_HAAR_FIND_BIGGEST_OBJECT, Size(minSize, minSize)); + + if (!enrollAll && rects.empty()) + rects.push_back(Rect(0, 0, m.cols, m.rows)); + + for (size_t j=0; j j) + dst.last().file.set("Confidence", rejectLevels[j]*rejectLevelWeight + levelWeights[j]*stageSumWeight); + dst.last().file.appendRect(OpenCVUtils::fromRect(rects[j])); + } + } + } + cascadeResource.release(cascade); + } - if (!src.file.get("enrollAll", false) && rects.empty()) - rects.push_back(Rect(0, 0, src.m().cols, src.m().rows)); + // TODO: Remove this code when ready to break binary compatibility + void store(QDataStream &stream) const + { + int size = 1; + stream << size; + } - foreach (const Rect &rect, rects) { - dst += src; - dst.file.appendRect(OpenCVUtils::fromRect(rect)); - } + void load(QDataStream &stream) + { + int size; + stream >> size; } }; -- libgit2 0.21.4