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);
}