diff --git a/app/examples/face_recognition_evaluation.cpp b/app/examples/face_recognition_evaluation.cpp index e861b7b..4e309fe 100644 --- a/app/examples/face_recognition_evaluation.cpp +++ b/app/examples/face_recognition_evaluation.cpp @@ -41,21 +41,21 @@ int main(int argc, char *argv[]) br_set_property("algorithm", "FaceRecognition"); // Equivalent to 'Globals->path = "../data/MEDS/img/";' in C++ API - br_set_property("path", "../data/MEDS/img/"); + //br_set_property("path", "../data/MEDS/img/"); // Enroll galleries, don't re-enroll if they already exist (cache) - br_enroll("../data/MEDS/sigset/MEDS_frontal_target.xml", "target.gal[cache]"); - br_enroll("../data/MEDS/sigset/MEDS_frontal_query.xml", "query.gal[cache]"); + //br_enroll("../data/MEDS/sigset/MEDS_frontal_target.xml", "target.gal[cache]"); + //br_enroll("../data/MEDS/sigset/MEDS_frontal_query.xml", "query.gal[cache]"); // Compare galleries and store result in a binary similarity matrix br_compare("target.gal", "query.gal", "FaceRecognition_MEDS.mtx"); // Make a ground truth "mask" matrix from the sigsets. - br_make_mask("../data/MEDS/sigset/MEDS_frontal_target.xml", "../data/MEDS/sigset/MEDS_frontal_query.xml", "MEDS.mask"); + //br_make_mask("../data/MEDS/sigset/MEDS_frontal_target.xml", "../data/MEDS/sigset/MEDS_frontal_query.xml", "MEDS.mask"); // Evaluate the performance of OpenBR's FaceRecognition and a COTS face recognition system. - br_eval("FaceRecognition_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/FaceRecognition_MEDS.csv"); - br_eval("../data/MEDS/simmat/COTS_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/COTS_MEDS.csv"); + //br_eval("FaceRecognition_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/FaceRecognition_MEDS.csv"); + //br_eval("../data/MEDS/simmat/COTS_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/COTS_MEDS.csv"); // The '_' character has special significance and is used to populate plot legends. // Requires R installation, see documentation of br_plot for details. @@ -63,6 +63,9 @@ int main(int argc, char *argv[]) files[0] = "Algorithm_Dataset/FaceRecognition_MEDS.csv"; files[1] = "Algorithm_Dataset/COTS_MEDS.csv"; br_plot(2, files, "MEDS", true); + br_plot(2, files, "MEDS", true); + br_plot(2, files, "MEDS", true); + br_plot(2, files, "MEDS", true); br_finalize(); return 0; diff --git a/sdk/core/qtutils.h b/sdk/core/qtutils.h index 807ef43..4333cba 100644 --- a/sdk/core/qtutils.h +++ b/sdk/core/qtutils.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,14 @@ namespace QtUtils bool runRScript(const QString &file); bool runDot(const QString &file); void showFile(const QString &file); + + /**** Thread Utilities ****/ + template + static inline void waitForFinished(const QList< QFuture > &futures) + { + foreach (QFuture future, futures) + future.waitForFinished(); + } } #endif // __QTUTILS_H diff --git a/sdk/openbr_plugin.cpp b/sdk/openbr_plugin.cpp index 15474ca..9f5445e 100644 --- a/sdk/openbr_plugin.cpp +++ b/sdk/openbr_plugin.cpp @@ -781,14 +781,6 @@ int br::Context::timeRemaining() const return std::max(0, int((1 - p) / p * startTime.elapsed())) / 1000; } -void br::Context::trackFutures(QList< QFuture > &futures) -{ - foreach (QFuture future, futures) { - QCoreApplication::processEvents(); - future.waitForFinished(); - } -} - bool br::Context::checkSDKPath(const QString &sdkPath) { return QFileInfo(sdkPath + "/share/openbr/openbr.bib").exists(); @@ -1171,13 +1163,11 @@ private: templatesList[i] = Downsample(templatesList[i], transforms[i]); QList< QFuture > futures; - const bool threaded = Globals->parallelism && (templatesList.size() > 1); for (int i=0; iparallelism) futures.append(QtConcurrent::run(_train, transforms[i], &templatesList[i])); + else _train (transforms[i], &templatesList[i]); } - - if (threaded) Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); } void project(const Template &src, Template &dst) const @@ -1317,11 +1307,10 @@ void Transform::backProject(const TemplateList &dst, TemplateList &src) const for (int i=0; i > futures; - if (Globals->parallelism) futures.reserve(dst.size()); for (int i=0; iparallelism) futures.append(QtConcurrent::run(_backProject, this, &dst[i], &src[i])); - else _backProject (this, &dst[i], &src[i]); - if (Globals->parallelism) Globals->trackFutures(futures); + else _backProject (this, &dst[i], &src[i]); + QtUtils::waitForFinished(futures); } /* Distance - public methods */ @@ -1358,7 +1347,7 @@ void Distance::compare(const TemplateList &target, const TemplateList &query, Ou if (Globals->parallelism) futures.append(QtConcurrent::run(this, &Distance::compareBlock, targets, queries, output, targetOffset, queryOffset)); else compareBlock (targets, queries, output, targetOffset, queryOffset); } - if (Globals->parallelism) Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); } QList Distance::compare(const TemplateList &targets, const Template &query) const diff --git a/sdk/openbr_plugin.h b/sdk/openbr_plugin.h index 606b6f8..b3dc99c 100644 --- a/sdk/openbr_plugin.h +++ b/sdk/openbr_plugin.h @@ -622,12 +622,6 @@ public: int timeRemaining() const; /*! - * \brief Continues to print the progress of the futures until they are completed. - * \param futures The list of futures to track. - */ - void trackFutures(QList< QFuture > &futures); - - /*! * \brief Returns \c true if \em sdkPath is valid, \c false otherwise. * \param sdkPath The path to share/openbr/openbr.bib */ diff --git a/sdk/plugins/distance.cpp b/sdk/plugins/distance.cpp index 734dd95..4781f04 100644 --- a/sdk/plugins/distance.cpp +++ b/sdk/plugins/distance.cpp @@ -19,6 +19,7 @@ #include #include "core/distance_sse.h" +#include "core/qtutils.h" using namespace cv; @@ -158,7 +159,7 @@ class PipeDistance : public Distance foreach (br::Distance *distance, distances) if (Globals->parallelism) futures.append(QtConcurrent::run(distance, &Distance::train, data)); else distance->train(data); - Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); } float compare(const Template &a, const Template &b) const diff --git a/sdk/plugins/meta.cpp b/sdk/plugins/meta.cpp index d3ee31b..c693452 100644 --- a/sdk/plugins/meta.cpp +++ b/sdk/plugins/meta.cpp @@ -285,12 +285,11 @@ class ForkTransform : public CompositeTransform void train(const TemplateList &data) { QList< QFuture > futures; - const bool threaded = Globals->parallelism && (transforms.size() > 1); for (int i=0; iparallelism) futures.append(QtConcurrent::run(_train, transforms[i], &data)); + else _train (transforms[i], &data); } - if (threaded) Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); } void backProject(const Template &dst, Template &src) const {Transform::backProject(dst, src);} @@ -644,9 +643,7 @@ public: else _projectList(transform, &input_buffer[i], &output_buffer[i]); } - - if (Globals->parallelism) - Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); for (int i=0; i > futures; futures.reserve(dims); + QList< QFuture > futures; const bool parallel = (data.size() > 1000) && Globals->parallelism; - for (size_t c = 0; c < mv.size(); c++) { for (int i=0; itrackFutures(futures); + QtUtils::waitForFinished(futures); merge(av, a); merge(bv, b); diff --git a/sdk/plugins/validate.cpp b/sdk/plugins/validate.cpp index e372858..80a5b70 100644 --- a/sdk/plugins/validate.cpp +++ b/sdk/plugins/validate.cpp @@ -1,6 +1,8 @@ #include #include +#include "core/qtutils.h" + namespace br { @@ -41,9 +43,9 @@ class CrossValidateTransform : public MetaTransform if (partitions[j] == i) partitionedData.removeAt(j); if (Globals->parallelism) futures.append(QtConcurrent::run(transforms[i], &Transform::train, partitionedData)); - else transforms[i]->train(partitionedData); + else transforms[i]->train(partitionedData); } - Globals->trackFutures(futures); + QtUtils::waitForFinished(futures); } void project(const Template &src, Template &dst) const