diff --git a/openbr/core/bee.cpp b/openbr/core/bee.cpp index a429f92..a5a0030 100644 --- a/openbr/core/bee.cpp +++ b/openbr/core/bee.cpp @@ -111,25 +111,27 @@ void BEE::writeSigset(const QString &sigset, const br::FileList &files, bool ign lines.append(""); lines.append(""); foreach (const File &file, files) { - QStringList metadata; - if (!ignoreMetadata) { - foreach (const QString &key, file.localKeys()) { - if ((key == "Index") || (key == "Label") || (key == "Points") || (key == "Rects")) continue; - metadata.append(key+"=\""+QtUtils::toString(file.value(key))+"\""); - } - QStringList landmarks; - if (!file.points().isEmpty()) { - foreach (const QPointF &point, file.points()) landmarks.append(QtUtils::toString(point)); - metadata.append("Points=\"["+landmarks.join(",")+"]\""); landmarks.clear(); - } - if (!file.rects().isEmpty()) { - foreach (const QRectF &rect, file.rects()) landmarks.append(QtUtils::toString(rect)); - metadata.append("Rects=\"["+landmarks.join(",")+"]\""); + if (!file.isNull()) { + QStringList metadata; + if (!ignoreMetadata) { + foreach (const QString &key, file.localKeys()) { + if ((key == "Index") || (key == "Label") || (key == "Points") || (key == "Rects")) continue; + metadata.append(key+"=\""+QtUtils::toString(file.value(key))+"\""); + } + QStringList landmarks; + if (!file.points().isEmpty()) { + foreach (const QPointF &point, file.points()) landmarks.append(QtUtils::toString(point)); + metadata.append("Points=\"["+landmarks.join(",")+"]\""); landmarks.clear(); + } + if (!file.rects().isEmpty()) { + foreach (const QRectF &rect, file.rects()) landmarks.append(QtUtils::toString(rect)); + metadata.append("Rects=\"["+landmarks.join(",")+"]\""); + } } + lines.append("\t("Label",file.baseName()) +"\">"); + lines.append("\t\t"); + lines.append("\t"); } - lines.append("\t("Label",file.baseName()) +"\">"); - lines.append("\t\t"); - lines.append("\t"); } lines.append(""); QtUtils::writeFile(sigset, lines); diff --git a/openbr/plugins/eigen3.cpp b/openbr/plugins/eigen3.cpp index 73fd678..4965d2f 100644 --- a/openbr/plugins/eigen3.cpp +++ b/openbr/plugins/eigen3.cpp @@ -15,6 +15,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include + #include "openbr_internal.h" #include "openbr/core/common.h" @@ -25,6 +26,24 @@ namespace br { /*! + * \ingroup initializers + * \brief Initialize Eigen + * http://eigen.tuxfamily.org/dox/TopicMultiThreading.html + * \author Scott Klum \cite sklum + */ +class EigenInitializer : public Initializer +{ + Q_OBJECT + + void initialize() const + { + Eigen::initParallel(); + } +}; + +BR_REGISTER(Initializer, EigenInitializer) + +/*! * \ingroup transforms * \brief Projects input into learned Principal Component Analysis subspace. * \author Brendan Klare \cite bklare @@ -508,6 +527,7 @@ class LDATransform : public Transform void store(QDataStream &stream) const { + stream << pcaKeep; stream << directLDA; stream << directDrop; stream << dimsOut; @@ -519,6 +539,7 @@ class LDATransform : public Transform void load(QDataStream &stream) { + stream >> pcaKeep; stream >> directLDA; stream >> directDrop; stream >> dimsOut; diff --git a/openbr/plugins/gui.cpp b/openbr/plugins/gui.cpp index 557ac9c..2e614a2 100644 --- a/openbr/plugins/gui.cpp +++ b/openbr/plugins/gui.cpp @@ -413,13 +413,13 @@ private: }; -class DisplayGUI : public QMainWindow +class GUIWindow : public QMainWindow { Q_OBJECT public: - DisplayGUI(QWidget * parent = NULL) : QMainWindow(parent) + GUIWindow(QWidget * parent = NULL) : QMainWindow(parent) { centralWidget = new QWidget(); layout = new QHBoxLayout(); @@ -592,8 +592,10 @@ public: template void initActual() { - if (!Globals->useGui) + if (!Globals->useGui) { + qWarning("GUI transform %s created without enabling GUI support.\nRun \"br -gui ...\" to enable GUI support from the command line, or set\nGlobals->useGui to true.", this->metaObject()->className()); return; + } if (displayBuffer) delete displayBuffer; @@ -795,7 +797,7 @@ class ElicitTransform : public ShowTransform Q_OBJECT - DisplayGUI *gui; + GUIWindow *gui; public: ElicitTransform() : ShowTransform() @@ -835,14 +837,16 @@ public: void init() { - initActual(); + initActual(); } template void initActual() { - if (!Globals->useGui) + if (!Globals->useGui) { + qWarning("GUI transform %s created without enabling GUI support.\nRun \"br -gui ...\" to enable GUI support from the command line, or set\nGlobals->useGui to true.", this->metaObject()->className()); return; + } TimeVaryingTransform::init(); diff --git a/openbr/plugins/independent.cpp b/openbr/plugins/independent.cpp index 7781b74..59c7fb5 100644 --- a/openbr/plugins/independent.cpp +++ b/openbr/plugins/independent.cpp @@ -9,13 +9,14 @@ using namespace cv; namespace br { -static TemplateList Downsample(const TemplateList &templates, int classes, int instances, float fraction, const QString & inputVariable, const QStringList &gallery) +static TemplateList Downsample(const TemplateList &templates, int classes, int instances, float fraction, const QString & inputVariable, const QStringList &gallery, const QStringList &subjects) { // Return early when no downsampling is required if ((classes == std::numeric_limits::max()) && (instances == std::numeric_limits::max()) && (fraction >= 1) && - (gallery.isEmpty())) + (gallery.isEmpty()) && + (subjects.isEmpty())) return templates; const bool atLeast = instances < 0; @@ -66,6 +67,11 @@ static TemplateList Downsample(const TemplateList &templates, int classes, int i if (!gallery.contains(downsample[i].file.get("Gallery"))) downsample.removeAt(i); + if (!subjects.isEmpty()) + for (int i=downsample.size()-1; i>=0; i--) + if (subjects.contains(downsample[i].file.get(inputVariable))) + downsample.removeAt(i); + return downsample; } @@ -78,12 +84,15 @@ class DownsampleTrainingTransform : public Transform Q_PROPERTY(float fraction READ get_fraction WRITE set_fraction RESET reset_fraction STORED false) Q_PROPERTY(QString inputVariable READ get_inputVariable WRITE set_inputVariable RESET reset_inputVariable STORED false) Q_PROPERTY(QStringList gallery READ get_gallery WRITE set_gallery RESET reset_gallery STORED false) + Q_PROPERTY(QStringList subjects READ get_subjects WRITE set_subjects RESET reset_subjects STORED false) BR_PROPERTY(br::Transform*, transform, NULL) BR_PROPERTY(int, classes, std::numeric_limits::max()) BR_PROPERTY(int, instances, std::numeric_limits::max()) BR_PROPERTY(float, fraction, 1) BR_PROPERTY(QString, inputVariable, "Label") BR_PROPERTY(QStringList, gallery, QStringList()) + BR_PROPERTY(QStringList, subjects, QStringList()) + void project(const Template & src, Template & dst) const { @@ -96,7 +105,7 @@ class DownsampleTrainingTransform : public Transform if (!transform || !transform->trainable) return; - TemplateList downsampled = Downsample(data, classes, instances, fraction, inputVariable, gallery); + TemplateList downsampled = Downsample(data, classes, instances, fraction, inputVariable, gallery, subjects); transform->train(downsampled); }