Commit c9a0e83fc9ad652d650ca66cfcaf91920461d041

Authored by sklum
1 parent 95911ac6

Fixed conflicts

openbr/plugins/independent.cpp
@@ -11,17 +11,21 @@ namespace br @@ -11,17 +11,21 @@ namespace br
11 11
12 static TemplateList Downsample(const TemplateList &templates, int classes, int instances, float fraction, const QString & inputVariable, const QStringList &gallery) 12 static TemplateList Downsample(const TemplateList &templates, int classes, int instances, float fraction, const QString & inputVariable, const QStringList &gallery)
13 { 13 {
  14 + QString keepKey = "baggy";
  15 +
14 // Return early when no downsampling is required 16 // Return early when no downsampling is required
15 if ((classes == std::numeric_limits<int>::max()) && 17 if ((classes == std::numeric_limits<int>::max()) &&
16 (instances == std::numeric_limits<int>::max()) && 18 (instances == std::numeric_limits<int>::max()) &&
17 (fraction >= 1) && 19 (fraction >= 1) &&
18 - (gallery.isEmpty())) 20 + (gallery.isEmpty()) &&
  21 + (keepKey.isEmpty()))
19 return templates; 22 return templates;
20 23
21 const bool atLeast = instances < 0; 24 const bool atLeast = instances < 0;
22 instances = abs(instances); 25 instances = abs(instances);
23 26
24 QList<QString> allLabels = File::get<QString>(templates, inputVariable); 27 QList<QString> allLabels = File::get<QString>(templates, inputVariable);
  28 +
25 QList<QString> uniqueLabels = allLabels.toSet().toList(); 29 QList<QString> uniqueLabels = allLabels.toSet().toList();
26 qSort(uniqueLabels); 30 qSort(uniqueLabels);
27 31
openbr/plugins/template.cpp
@@ -103,9 +103,13 @@ class MTurkTransform : public UntrainableTransform @@ -103,9 +103,13 @@ class MTurkTransform : public UntrainableTransform
103 Q_OBJECT 103 Q_OBJECT
104 Q_PROPERTY(QString inputVariable READ get_inputVariable WRITE set_inputVariable RESET reset_inputVariable STORED false) 104 Q_PROPERTY(QString inputVariable READ get_inputVariable WRITE set_inputVariable RESET reset_inputVariable STORED false)
105 Q_PROPERTY(float maxVotes READ get_maxVotes WRITE set_maxVotes RESET reset_maxVotes STORED false) 105 Q_PROPERTY(float maxVotes READ get_maxVotes WRITE set_maxVotes RESET reset_maxVotes STORED false)
  106 + Q_PROPERTY(bool classify READ get_classify WRITE set_classify RESET reset_classify STORED false)
  107 + Q_PROPERTY(bool consensusOnly READ get_consensusOnly WRITE set_consensusOnly RESET reset_consensusOnly STORED false)
106 BR_PROPERTY(QString, inputVariable, QString()) 108 BR_PROPERTY(QString, inputVariable, QString())
107 BR_PROPERTY(float, maxVotes, 1.) 109 BR_PROPERTY(float, maxVotes, 1.)
108 -; 110 + BR_PROPERTY(bool, classify, false)
  111 + BR_PROPERTY(bool, consensusOnly, false)
  112 +
109 void project(const Template &src, Template &dst) const 113 void project(const Template &src, Template &dst) const
110 { 114 {
111 dst = src; 115 dst = src;
@@ -117,8 +121,11 @@ class MTurkTransform : public UntrainableTransform @@ -117,8 +121,11 @@ class MTurkTransform : public UntrainableTransform
117 QMapIterator<QString, QVariant> i(map); 121 QMapIterator<QString, QVariant> i(map);
118 while (i.hasNext()) { 122 while (i.hasNext()) {
119 i.next(); 123 i.next();
120 - float value = i.value().toFloat(&ok)/maxVotes;  
121 - dst.file.set(i.key(), value); 124 + // Normalize to [-1,1]
  125 + float value = i.value().toFloat(&ok)/maxVotes;//* 2./maxVotes - 1;
  126 + if (classify) (value > 0) ? value = 1 : value = -1;
  127 + else if (consensusOnly && (value != 1 && value != -1)) continue;
  128 + dst.file.set(i.key(),value);
122 } 129 }
123 } 130 }
124 }; 131 };
openbr/plugins/validate.cpp
@@ -142,9 +142,42 @@ BR_REGISTER(Transform, CrossValidateTransform) @@ -142,9 +142,42 @@ BR_REGISTER(Transform, CrossValidateTransform)
142 class CrossValidateDistance : public Distance 142 class CrossValidateDistance : public Distance
143 { 143 {
144 Q_OBJECT 144 Q_OBJECT
145 - 145 +;
146 float compare(const Template &a, const Template &b) const 146 float compare(const Template &a, const Template &b) const
147 { 147 {
  148 + QStringList filters;
  149 + //filters << "Age" << "GENDER" << "RACE";
  150 + foreach (const QString &key, filters) {
  151 + QString aValue = a.file.get<QString>(key, QString());
  152 + QString bValue = b.file.get<QString>(key, QString());
  153 +
  154 + // The query value may be a range. Let's check.
  155 + if (bValue.isEmpty()) bValue = QtUtils::toString(b.file.get<QPointF>(key, QPointF()));
  156 +
  157 + if (aValue.isEmpty() || bValue.isEmpty()) continue;
  158 +
  159 + bool keep = false;
  160 + bool ok;
  161 +
  162 + QPointF range = QtUtils::toPoint(bValue,&ok);
  163 +
  164 + if (ok) /* Range */ {
  165 + int value = range.x();
  166 + int upperBound = range.y();
  167 +
  168 + while (value <= upperBound) {
  169 + if (aValue == QString::number(value)) {
  170 + keep = true;
  171 + break;
  172 + }
  173 + value++;
  174 + }
  175 + }
  176 + else if (aValue == bValue) keep = true;
  177 +
  178 + if (!keep) return -std::numeric_limits<float>::max();
  179 + }
  180 +
148 static const QString key("Partition"); // More efficient to preallocate this 181 static const QString key("Partition"); // More efficient to preallocate this
149 const int partitionA = a.file.get<int>(key, 0); 182 const int partitionA = a.file.get<int>(key, 0);
150 const int partitionB = b.file.get<int>(key, 0); 183 const int partitionB = b.file.get<int>(key, 0);