Commit 952f60e635d270b138a31061a48e2f3d104e0698
1 parent
521999f4
refactored future waiting
Showing
8 changed files
with
37 additions
and
43 deletions
app/examples/face_recognition_evaluation.cpp
| @@ -41,21 +41,21 @@ int main(int argc, char *argv[]) | @@ -41,21 +41,21 @@ int main(int argc, char *argv[]) | ||
| 41 | br_set_property("algorithm", "FaceRecognition"); | 41 | br_set_property("algorithm", "FaceRecognition"); |
| 42 | 42 | ||
| 43 | // Equivalent to 'Globals->path = "../data/MEDS/img/";' in C++ API | 43 | // Equivalent to 'Globals->path = "../data/MEDS/img/";' in C++ API |
| 44 | - br_set_property("path", "../data/MEDS/img/"); | 44 | + //br_set_property("path", "../data/MEDS/img/"); |
| 45 | 45 | ||
| 46 | // Enroll galleries, don't re-enroll if they already exist (cache) | 46 | // Enroll galleries, don't re-enroll if they already exist (cache) |
| 47 | - br_enroll("../data/MEDS/sigset/MEDS_frontal_target.xml", "target.gal[cache]"); | ||
| 48 | - br_enroll("../data/MEDS/sigset/MEDS_frontal_query.xml", "query.gal[cache]"); | 47 | + //br_enroll("../data/MEDS/sigset/MEDS_frontal_target.xml", "target.gal[cache]"); |
| 48 | + //br_enroll("../data/MEDS/sigset/MEDS_frontal_query.xml", "query.gal[cache]"); | ||
| 49 | 49 | ||
| 50 | // Compare galleries and store result in a binary similarity matrix | 50 | // Compare galleries and store result in a binary similarity matrix |
| 51 | br_compare("target.gal", "query.gal", "FaceRecognition_MEDS.mtx"); | 51 | br_compare("target.gal", "query.gal", "FaceRecognition_MEDS.mtx"); |
| 52 | 52 | ||
| 53 | // Make a ground truth "mask" matrix from the sigsets. | 53 | // Make a ground truth "mask" matrix from the sigsets. |
| 54 | - br_make_mask("../data/MEDS/sigset/MEDS_frontal_target.xml", "../data/MEDS/sigset/MEDS_frontal_query.xml", "MEDS.mask"); | 54 | + //br_make_mask("../data/MEDS/sigset/MEDS_frontal_target.xml", "../data/MEDS/sigset/MEDS_frontal_query.xml", "MEDS.mask"); |
| 55 | 55 | ||
| 56 | // Evaluate the performance of OpenBR's FaceRecognition and a COTS face recognition system. | 56 | // Evaluate the performance of OpenBR's FaceRecognition and a COTS face recognition system. |
| 57 | - br_eval("FaceRecognition_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/FaceRecognition_MEDS.csv"); | ||
| 58 | - br_eval("../data/MEDS/simmat/COTS_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/COTS_MEDS.csv"); | 57 | + //br_eval("FaceRecognition_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/FaceRecognition_MEDS.csv"); |
| 58 | + //br_eval("../data/MEDS/simmat/COTS_MEDS.mtx", "MEDS.mask", "Algorithm_Dataset/COTS_MEDS.csv"); | ||
| 59 | 59 | ||
| 60 | // The '_' character has special significance and is used to populate plot legends. | 60 | // The '_' character has special significance and is used to populate plot legends. |
| 61 | // Requires R installation, see documentation of br_plot for details. | 61 | // Requires R installation, see documentation of br_plot for details. |
| @@ -63,6 +63,9 @@ int main(int argc, char *argv[]) | @@ -63,6 +63,9 @@ int main(int argc, char *argv[]) | ||
| 63 | files[0] = "Algorithm_Dataset/FaceRecognition_MEDS.csv"; | 63 | files[0] = "Algorithm_Dataset/FaceRecognition_MEDS.csv"; |
| 64 | files[1] = "Algorithm_Dataset/COTS_MEDS.csv"; | 64 | files[1] = "Algorithm_Dataset/COTS_MEDS.csv"; |
| 65 | br_plot(2, files, "MEDS", true); | 65 | br_plot(2, files, "MEDS", true); |
| 66 | + br_plot(2, files, "MEDS", true); | ||
| 67 | + br_plot(2, files, "MEDS", true); | ||
| 68 | + br_plot(2, files, "MEDS", true); | ||
| 66 | 69 | ||
| 67 | br_finalize(); | 70 | br_finalize(); |
| 68 | return 0; | 71 | return 0; |
sdk/core/qtutils.h
| @@ -21,6 +21,7 @@ | @@ -21,6 +21,7 @@ | ||
| 21 | #include <QDir> | 21 | #include <QDir> |
| 22 | #include <QFile> | 22 | #include <QFile> |
| 23 | #include <QFileInfo> | 23 | #include <QFileInfo> |
| 24 | +#include <QFuture> | ||
| 24 | #include <QMap> | 25 | #include <QMap> |
| 25 | #include <QString> | 26 | #include <QString> |
| 26 | #include <QStringList> | 27 | #include <QStringList> |
| @@ -62,6 +63,14 @@ namespace QtUtils | @@ -62,6 +63,14 @@ namespace QtUtils | ||
| 62 | bool runRScript(const QString &file); | 63 | bool runRScript(const QString &file); |
| 63 | bool runDot(const QString &file); | 64 | bool runDot(const QString &file); |
| 64 | void showFile(const QString &file); | 65 | void showFile(const QString &file); |
| 66 | + | ||
| 67 | + /**** Thread Utilities ****/ | ||
| 68 | + template <typename T> | ||
| 69 | + static inline void waitForFinished(const QList< QFuture<T> > &futures) | ||
| 70 | + { | ||
| 71 | + foreach (QFuture<T> future, futures) | ||
| 72 | + future.waitForFinished(); | ||
| 73 | + } | ||
| 65 | } | 74 | } |
| 66 | 75 | ||
| 67 | #endif // __QTUTILS_H | 76 | #endif // __QTUTILS_H |
sdk/openbr_plugin.cpp
| @@ -781,14 +781,6 @@ int br::Context::timeRemaining() const | @@ -781,14 +781,6 @@ int br::Context::timeRemaining() const | ||
| 781 | return std::max(0, int((1 - p) / p * startTime.elapsed())) / 1000; | 781 | return std::max(0, int((1 - p) / p * startTime.elapsed())) / 1000; |
| 782 | } | 782 | } |
| 783 | 783 | ||
| 784 | -void br::Context::trackFutures(QList< QFuture<void> > &futures) | ||
| 785 | -{ | ||
| 786 | - foreach (QFuture<void> future, futures) { | ||
| 787 | - QCoreApplication::processEvents(); | ||
| 788 | - future.waitForFinished(); | ||
| 789 | - } | ||
| 790 | -} | ||
| 791 | - | ||
| 792 | bool br::Context::checkSDKPath(const QString &sdkPath) | 784 | bool br::Context::checkSDKPath(const QString &sdkPath) |
| 793 | { | 785 | { |
| 794 | return QFileInfo(sdkPath + "/share/openbr/openbr.bib").exists(); | 786 | return QFileInfo(sdkPath + "/share/openbr/openbr.bib").exists(); |
| @@ -1171,13 +1163,11 @@ private: | @@ -1171,13 +1163,11 @@ private: | ||
| 1171 | templatesList[i] = Downsample(templatesList[i], transforms[i]); | 1163 | templatesList[i] = Downsample(templatesList[i], transforms[i]); |
| 1172 | 1164 | ||
| 1173 | QList< QFuture<void> > futures; | 1165 | QList< QFuture<void> > futures; |
| 1174 | - const bool threaded = Globals->parallelism && (templatesList.size() > 1); | ||
| 1175 | for (int i=0; i<templatesList.size(); i++) { | 1166 | for (int i=0; i<templatesList.size(); i++) { |
| 1176 | - if (threaded) futures.append(QtConcurrent::run(_train, transforms[i], &templatesList[i])); | ||
| 1177 | - else _train (transforms[i], &templatesList[i]); | 1167 | + if (Globals->parallelism) futures.append(QtConcurrent::run(_train, transforms[i], &templatesList[i])); |
| 1168 | + else _train (transforms[i], &templatesList[i]); | ||
| 1178 | } | 1169 | } |
| 1179 | - | ||
| 1180 | - if (threaded) Globals->trackFutures(futures); | 1170 | + QtUtils::waitForFinished(futures); |
| 1181 | } | 1171 | } |
| 1182 | 1172 | ||
| 1183 | void project(const Template &src, Template &dst) const | 1173 | void project(const Template &src, Template &dst) const |
| @@ -1317,11 +1307,10 @@ void Transform::backProject(const TemplateList &dst, TemplateList &src) const | @@ -1317,11 +1307,10 @@ void Transform::backProject(const TemplateList &dst, TemplateList &src) const | ||
| 1317 | for (int i=0; i<dst.size(); i++) src.append(Template()); | 1307 | for (int i=0; i<dst.size(); i++) src.append(Template()); |
| 1318 | 1308 | ||
| 1319 | QList< QFuture<void> > futures; | 1309 | QList< QFuture<void> > futures; |
| 1320 | - if (Globals->parallelism) futures.reserve(dst.size()); | ||
| 1321 | for (int i=0; i<dst.size(); i++) | 1310 | for (int i=0; i<dst.size(); i++) |
| 1322 | if (Globals->parallelism) futures.append(QtConcurrent::run(_backProject, this, &dst[i], &src[i])); | 1311 | if (Globals->parallelism) futures.append(QtConcurrent::run(_backProject, this, &dst[i], &src[i])); |
| 1323 | - else _backProject (this, &dst[i], &src[i]); | ||
| 1324 | - if (Globals->parallelism) Globals->trackFutures(futures); | 1312 | + else _backProject (this, &dst[i], &src[i]); |
| 1313 | + QtUtils::waitForFinished(futures); | ||
| 1325 | } | 1314 | } |
| 1326 | 1315 | ||
| 1327 | /* Distance - public methods */ | 1316 | /* Distance - public methods */ |
| @@ -1358,7 +1347,7 @@ void Distance::compare(const TemplateList &target, const TemplateList &query, Ou | @@ -1358,7 +1347,7 @@ void Distance::compare(const TemplateList &target, const TemplateList &query, Ou | ||
| 1358 | if (Globals->parallelism) futures.append(QtConcurrent::run(this, &Distance::compareBlock, targets, queries, output, targetOffset, queryOffset)); | 1347 | if (Globals->parallelism) futures.append(QtConcurrent::run(this, &Distance::compareBlock, targets, queries, output, targetOffset, queryOffset)); |
| 1359 | else compareBlock (targets, queries, output, targetOffset, queryOffset); | 1348 | else compareBlock (targets, queries, output, targetOffset, queryOffset); |
| 1360 | } | 1349 | } |
| 1361 | - if (Globals->parallelism) Globals->trackFutures(futures); | 1350 | + QtUtils::waitForFinished(futures); |
| 1362 | } | 1351 | } |
| 1363 | 1352 | ||
| 1364 | QList<float> Distance::compare(const TemplateList &targets, const Template &query) const | 1353 | QList<float> Distance::compare(const TemplateList &targets, const Template &query) const |
sdk/openbr_plugin.h
| @@ -622,12 +622,6 @@ public: | @@ -622,12 +622,6 @@ public: | ||
| 622 | int timeRemaining() const; | 622 | int timeRemaining() const; |
| 623 | 623 | ||
| 624 | /*! | 624 | /*! |
| 625 | - * \brief Continues to print the progress of the futures until they are completed. | ||
| 626 | - * \param futures The list of futures to track. | ||
| 627 | - */ | ||
| 628 | - void trackFutures(QList< QFuture<void> > &futures); | ||
| 629 | - | ||
| 630 | - /*! | ||
| 631 | * \brief Returns \c true if \em sdkPath is valid, \c false otherwise. | 625 | * \brief Returns \c true if \em sdkPath is valid, \c false otherwise. |
| 632 | * \param sdkPath The path to <tt>share/openbr/openbr.bib</tt> | 626 | * \param sdkPath The path to <tt>share/openbr/openbr.bib</tt> |
| 633 | */ | 627 | */ |
sdk/plugins/distance.cpp
| @@ -19,6 +19,7 @@ | @@ -19,6 +19,7 @@ | ||
| 19 | #include <openbr_plugin.h> | 19 | #include <openbr_plugin.h> |
| 20 | 20 | ||
| 21 | #include "core/distance_sse.h" | 21 | #include "core/distance_sse.h" |
| 22 | +#include "core/qtutils.h" | ||
| 22 | 23 | ||
| 23 | using namespace cv; | 24 | using namespace cv; |
| 24 | 25 | ||
| @@ -158,7 +159,7 @@ class PipeDistance : public Distance | @@ -158,7 +159,7 @@ class PipeDistance : public Distance | ||
| 158 | foreach (br::Distance *distance, distances) | 159 | foreach (br::Distance *distance, distances) |
| 159 | if (Globals->parallelism) futures.append(QtConcurrent::run(distance, &Distance::train, data)); | 160 | if (Globals->parallelism) futures.append(QtConcurrent::run(distance, &Distance::train, data)); |
| 160 | else distance->train(data); | 161 | else distance->train(data); |
| 161 | - Globals->trackFutures(futures); | 162 | + QtUtils::waitForFinished(futures); |
| 162 | } | 163 | } |
| 163 | 164 | ||
| 164 | float compare(const Template &a, const Template &b) const | 165 | float compare(const Template &a, const Template &b) const |
sdk/plugins/meta.cpp
| @@ -285,12 +285,11 @@ class ForkTransform : public CompositeTransform | @@ -285,12 +285,11 @@ class ForkTransform : public CompositeTransform | ||
| 285 | void train(const TemplateList &data) | 285 | void train(const TemplateList &data) |
| 286 | { | 286 | { |
| 287 | QList< QFuture<void> > futures; | 287 | QList< QFuture<void> > futures; |
| 288 | - const bool threaded = Globals->parallelism && (transforms.size() > 1); | ||
| 289 | for (int i=0; i<transforms.size(); i++) { | 288 | for (int i=0; i<transforms.size(); i++) { |
| 290 | - if (threaded) futures.append(QtConcurrent::run(_train, transforms[i], &data)); | ||
| 291 | - else _train (transforms[i], &data); | 289 | + if (Globals->parallelism) futures.append(QtConcurrent::run(_train, transforms[i], &data)); |
| 290 | + else _train (transforms[i], &data); | ||
| 292 | } | 291 | } |
| 293 | - if (threaded) Globals->trackFutures(futures); | 292 | + QtUtils::waitForFinished(futures); |
| 294 | } | 293 | } |
| 295 | 294 | ||
| 296 | void backProject(const Template &dst, Template &src) const {Transform::backProject(dst, src);} | 295 | void backProject(const Template &dst, Template &src) const {Transform::backProject(dst, src);} |
| @@ -644,9 +643,7 @@ public: | @@ -644,9 +643,7 @@ public: | ||
| 644 | else | 643 | else |
| 645 | _projectList(transform, &input_buffer[i], &output_buffer[i]); | 644 | _projectList(transform, &input_buffer[i], &output_buffer[i]); |
| 646 | } | 645 | } |
| 647 | - | ||
| 648 | - if (Globals->parallelism) | ||
| 649 | - Globals->trackFutures(futures); | 646 | + QtUtils::waitForFinished(futures); |
| 650 | 647 | ||
| 651 | for (int i=0; i<src.size(); i++) dst.append(output_buffer[i]); | 648 | for (int i=0; i<src.size(); i++) dst.append(output_buffer[i]); |
| 652 | } | 649 | } |
sdk/plugins/normalize.cpp
| @@ -22,6 +22,7 @@ | @@ -22,6 +22,7 @@ | ||
| 22 | 22 | ||
| 23 | #include "core/common.h" | 23 | #include "core/common.h" |
| 24 | #include "core/opencvutils.h" | 24 | #include "core/opencvutils.h" |
| 25 | +#include "core/qtutils.h" | ||
| 25 | 26 | ||
| 26 | using namespace cv; | 27 | using namespace cv; |
| 27 | 28 | ||
| @@ -119,9 +120,8 @@ private: | @@ -119,9 +120,8 @@ private: | ||
| 119 | bv.push_back(Mat(1, dims, CV_64FC1)); | 120 | bv.push_back(Mat(1, dims, CV_64FC1)); |
| 120 | } | 121 | } |
| 121 | 122 | ||
| 122 | - QList< QFuture<void> > futures; futures.reserve(dims); | 123 | + QList< QFuture<void> > futures; |
| 123 | const bool parallel = (data.size() > 1000) && Globals->parallelism; | 124 | const bool parallel = (data.size() > 1000) && Globals->parallelism; |
| 124 | - | ||
| 125 | for (size_t c = 0; c < mv.size(); c++) { | 125 | for (size_t c = 0; c < mv.size(); c++) { |
| 126 | for (int i=0; i<dims; i++) | 126 | for (int i=0; i<dims; i++) |
| 127 | if (parallel) futures.append(QtConcurrent::run(_train, method, mv[c], &av[c], &bv[c], i)); | 127 | if (parallel) futures.append(QtConcurrent::run(_train, method, mv[c], &av[c], &bv[c], i)); |
| @@ -129,8 +129,7 @@ private: | @@ -129,8 +129,7 @@ private: | ||
| 129 | av[c] = av[c].reshape(1, data.first().m().rows); | 129 | av[c] = av[c].reshape(1, data.first().m().rows); |
| 130 | bv[c] = bv[c].reshape(1, data.first().m().rows); | 130 | bv[c] = bv[c].reshape(1, data.first().m().rows); |
| 131 | } | 131 | } |
| 132 | - | ||
| 133 | - if (parallel) Globals->trackFutures(futures); | 132 | + QtUtils::waitForFinished(futures); |
| 134 | 133 | ||
| 135 | merge(av, a); | 134 | merge(av, a); |
| 136 | merge(bv, b); | 135 | merge(bv, b); |
sdk/plugins/validate.cpp
| 1 | #include <QtConcurrentRun> | 1 | #include <QtConcurrentRun> |
| 2 | #include <openbr_plugin.h> | 2 | #include <openbr_plugin.h> |
| 3 | 3 | ||
| 4 | +#include "core/qtutils.h" | ||
| 5 | + | ||
| 4 | namespace br | 6 | namespace br |
| 5 | { | 7 | { |
| 6 | 8 | ||
| @@ -41,9 +43,9 @@ class CrossValidateTransform : public MetaTransform | @@ -41,9 +43,9 @@ class CrossValidateTransform : public MetaTransform | ||
| 41 | if (partitions[j] == i) | 43 | if (partitions[j] == i) |
| 42 | partitionedData.removeAt(j); | 44 | partitionedData.removeAt(j); |
| 43 | if (Globals->parallelism) futures.append(QtConcurrent::run(transforms[i], &Transform::train, partitionedData)); | 45 | if (Globals->parallelism) futures.append(QtConcurrent::run(transforms[i], &Transform::train, partitionedData)); |
| 44 | - else transforms[i]->train(partitionedData); | 46 | + else transforms[i]->train(partitionedData); |
| 45 | } | 47 | } |
| 46 | - Globals->trackFutures(futures); | 48 | + QtUtils::waitForFinished(futures); |
| 47 | } | 49 | } |
| 48 | 50 | ||
| 49 | void project(const Template &src, Template &dst) const | 51 | void project(const Template &src, Template &dst) const |