Commit 10f0beb6a8be10944ffddca8d14443415f245526

Authored by Josh Klontz
1 parent 11ea4c85

introduced static File::get that can operate on both FileList and TemplateList

openbr/core/bee.cpp
... ... @@ -268,8 +268,8 @@ cv::Mat BEE::makeMask(const br::FileList &targets, const br::FileList &queries,
268 268 {
269 269 // Would like to use indexProperty for this, but didn't make a version of that for Filelist yet
270 270 // -cao
271   - QList<QString> targetLabels = targets.get<QString>("Subject", "-1");
272   - QList<QString> queryLabels = queries.get<QString>("Subject", "-1");
  271 + QList<QString> targetLabels = File::get<QString>(targets, "Subject", "-1");
  272 + QList<QString> queryLabels = File::get<QString>(queries, "Subject", "-1");
273 273 QList<int> targetPartitions = targets.crossValidationPartitions();
274 274 QList<int> queryPartitions = queries.crossValidationPartitions();
275 275  
... ...
openbr/core/cluster.cpp
... ... @@ -280,7 +280,7 @@ void br::EvalClustering(const QString &amp;csv, const QString &amp;input)
280 280  
281 281 // We assume clustering algorithms store assigned cluster labels as integers (since the clusters are
282 282 // not named).
283   - QList<int> labels = TemplateList::fromGallery(input).files().get<int>("Subject");
  283 + QList<int> labels = File::get<int>(TemplateList::fromGallery(input), "Subject");
284 284  
285 285 QHash<int, int> labelToIndex;
286 286 int nClusters = 0;
... ...
openbr/openbr_plugin.cpp
... ... @@ -436,7 +436,7 @@ TemplateList TemplateList::fromGallery(const br::File &amp;gallery)
436 436 // stores the index values in "Label" of the output template list
437 437 TemplateList TemplateList::relabel(const TemplateList &tl, const QString & propName)
438 438 {
439   - const QList<QString> originalLabels = tl.get<QString>(propName);
  439 + const QList<QString> originalLabels = File::get<QString>(tl, propName);
440 440 QHash<QString,int> labelTable;
441 441 foreach (const QString & label, originalLabels)
442 442 if (!labelTable.contains(label))
... ... @@ -464,7 +464,7 @@ QList&lt;int&gt; TemplateList::indexProperty(const QString &amp; propName, QHash&lt;QString,
464 464 valueMap.clear();
465 465 reverseLookup.clear();
466 466  
467   - const QList<QVariant> originalLabels = values(propName);
  467 + const QList<QVariant> originalLabels = File::values(*this, propName);
468 468 foreach (const QVariant & label, originalLabels) {
469 469 QString labelString = label.toString();
470 470 if (!valueMap.contains(labelString)) {
... ... @@ -481,9 +481,9 @@ QList&lt;int&gt; TemplateList::indexProperty(const QString &amp; propName, QHash&lt;QString,
481 481 }
482 482  
483 483 // uses -1 for missing values
484   -QList<int> TemplateList::applyIndex(const QString & propName, const QHash<QString, int> & valueMap) const
  484 +QList<int> TemplateList::applyIndex(const QString &propName, const QHash<QString, int> &valueMap) const
485 485 {
486   - const QList<QString> originalLabels = get<QString>(propName);
  486 + const QList<QString> originalLabels = File::get<QString>(*this, propName);
487 487  
488 488 QList<int> result;
489 489 for (int i=0; i<originalLabels.size(); i++) {
... ...
openbr/openbr_plugin.h
... ... @@ -228,7 +228,20 @@ struct BR_EXPORT File
228 228 return variant.value<T>();
229 229 }
230 230  
231   - /*!< \brief Returns a list of type T for the key, throwing an error if the key does not exist or if the value cannot be converted to the specified type. */
  231 + /*!< \brief Returns a value for the key, returning \em defaultValue if the key does not exist or can't be converted. */
  232 + template <typename T>
  233 + T get(const QString &key, const T &defaultValue) const
  234 + {
  235 + if (!contains(key)) return defaultValue;
  236 + QVariant variant = value(key);
  237 + if (!variant.canConvert<T>()) return defaultValue;
  238 + return variant.value<T>();
  239 + }
  240 +
  241 + /*!< \brief Specialization for boolean type. */
  242 + bool getBool(const QString &key, bool defaultValue = false) const;
  243 +
  244 + /*!< \brief Specialization for list type. Returns a list of type T for the key, throwing an error if the key does not exist or if the value cannot be converted to the specified type. */
232 245 template <typename T>
233 246 QList<T> getList(const QString &key) const
234 247 {
... ... @@ -241,17 +254,31 @@ struct BR_EXPORT File
241 254 return list;
242 255 }
243 256  
244   - /*!< \brief Specialization for boolean type. */
245   - bool getBool(const QString &key, bool defaultValue = false) const;
  257 + /*!< \brief Returns the value for the specified key for every file in the list. */
  258 + template<class U>
  259 + static QList<QVariant> values(const QList<U> &fileList, const QString &key)
  260 + {
  261 + QList<QVariant> values; values.reserve(fileList.size());
  262 + foreach (const U &f, fileList) values.append(((const File&)f).value(key));
  263 + return values;
  264 + }
246 265  
247   - /*!< \brief Returns a value for the key, returning \em defaultValue if the key does not exist or can't be converted. */
248   - template <typename T>
249   - T get(const QString &key, const T &defaultValue) const
  266 + /*!< \brief Returns a value for the key for every file in the list, throwing an error if the key does not exist. */
  267 + template<class T, class U>
  268 + static QList<T> get(const QList<U> &fileList, const QString &key)
250 269 {
251   - if (!contains(key)) return defaultValue;
252   - QVariant variant = value(key);
253   - if (!variant.canConvert<T>()) return defaultValue;
254   - return variant.value<T>();
  270 + QList<T> result; result.reserve(fileList.size());
  271 + foreach (const U &f, fileList) result.append(((const File&)f).get<T>(key));
  272 + return result;
  273 + }
  274 +
  275 + /*!< \brief Returns a value for the key for every file in the list, returning \em defaultValue if the key does not exist or can't be converted. */
  276 + template<class T, class U>
  277 + static QList<T> get(const QList<U> &fileList, const QString &key, const T &defaultValue)
  278 + {
  279 + QList<T> result; result.reserve(fileList.size());
  280 + foreach (const U &f, fileList) result.append(((const File&)f).get<T>(key, defaultValue));
  281 + return result;
255 282 }
256 283  
257 284 inline bool failed() const { return getBool("FTE") || getBool("FTO"); } /*!< \brief Returns \c true if the file failed to open or enroll, \c false otherwise. */
... ... @@ -297,23 +324,6 @@ struct BR_EXPORT FileList : public QList&lt;File&gt;
297 324 QStringList flat() const; /*!< \brief Returns br::File::flat() for each file in the list. */
298 325 QStringList names() const; /*!< \brief Returns #br::File::name for each file in the list. */
299 326 void sort(const QString& key); /*!< \brief Sort the list based on metadata. */
300   - /*!< \brief Returns values associated with the input propName for each file in the list. */
301   - template<typename T>
302   - QList<T> get(const QString & propName) const
303   - {
304   - QList<T> values; values.reserve(size());
305   - foreach (const File &f, *this)
306   - values.append(f.get<T>(propName));
307   - return values;
308   - }
309   - template<typename T>
310   - QList<T> get(const QString & propName, T defaultValue) const
311   - {
312   - QList<T> values; values.reserve(size());
313   - foreach (const File &f, *this)
314   - values.append(f.contains(propName) ? f.get<T>(propName) : defaultValue);
315   - return values;
316   - }
317 327  
318 328 QList<int> crossValidationPartitions() const; /*!< \brief Returns the cross-validation partition (default=0) for each file in the list. */
319 329 int failures() const; /*!< \brief Returns the number of files with br::File::failed(). */
... ... @@ -344,6 +354,7 @@ struct Template : public QList&lt;cv::Mat&gt;
344 354 inline const cv::Mat &m() const { static const cv::Mat NullMatrix;
345 355 return isEmpty() ? qFatal("Empty template."), NullMatrix : last(); } /*!< \brief Idiom to treat the template as a matrix. */
346 356 inline cv::Mat &m() { return isEmpty() ? append(cv::Mat()), last() : last(); } /*!< \brief Idiom to treat the template as a matrix. */
  357 + inline const File &operator()() const { return file; }
347 358 inline cv::Mat &operator=(const cv::Mat &other) { return m() = other; } /*!< \brief Idiom to treat the template as a matrix. */
348 359 inline operator const cv::Mat&() const { return m(); } /*!< \brief Idiom to treat the template as a matrix. */
349 360 inline operator cv::Mat&() { return m(); } /*!< \brief Idiom to treat the template as a matrix. */
... ... @@ -406,7 +417,6 @@ struct TemplateList : public QList&lt;Template&gt;
406 417 QList<int> indexProperty(const QString & propName, QHash<QString, int> & valueMap, QHash<int, QVariant> & reverseLookup) const;
407 418 QList<int> applyIndex(const QString & propName, const QHash<QString, int> & valueMap) const;
408 419  
409   -
410 420 /*!
411 421 * \brief Returns the total number of bytes in all the templates.
412 422 */
... ... @@ -477,23 +487,6 @@ struct TemplateList : public QList&lt;Template&gt;
477 487 FileList operator()() const { return files(); }
478 488  
479 489 /*!
480   - * \brief Returns br::Template::label() for each template in the list.
481   - */
482   - template<typename T>
483   - QList<T> get(const QString & propName) const
484   - {
485   - QList<T> values; values.reserve(size());
486   - foreach (const Template &t, *this) values.append(t.file.get<T>(propName));
487   - return values;
488   - }
489   - QList<QVariant> values(const QString & propName) const
490   - {
491   - QList<QVariant> values; values.reserve(size());
492   - foreach (const Template &t, *this) values.append(t.file.value(propName));
493   - return values;
494   - }
495   -
496   - /*!
497 490 * \brief Returns the number of occurences for each label in the list.
498 491 */
499 492 template<typename T>
... ... @@ -1025,7 +1018,7 @@ public:
1025 1018 virtual TemplateList readBlock(bool *done) = 0; /*!< \brief Retrieve a portion of the stored templates. */
1026 1019 void writeBlock(const TemplateList &templates); /*!< \brief Serialize a template list. */
1027 1020 virtual void write(const Template &t) = 0; /*!< \brief Serialize a template. */
1028   - static Gallery *make(const File &file); /*!< \brief Make a gallery from a file list. */
  1021 + static Gallery *make(const File &file); /*!< \brief Make a gallery to/from a file on disk. */
1029 1022  
1030 1023 private:
1031 1024 QSharedPointer<Gallery> next;
... ...
openbr/plugins/eigen3.cpp
... ... @@ -348,7 +348,7 @@ class LDATransform : public Transform
348 348  
349 349 // OpenBR ensures that class values range from 0 to numClasses-1.
350 350 // Label exists because we created it earlier with relabel
351   - QList<int> classes = trainingSet.get<int>("Label");
  351 + QList<int> classes = File::get<int>(trainingSet, "Label");
352 352 QMap<int, int> classCounts = trainingSet.countValues<int>("Label");
353 353 const int numClasses = classCounts.size();
354 354  
... ...
openbr/plugins/independent.cpp
... ... @@ -20,7 +20,7 @@ static TemplateList Downsample(const TemplateList &amp;templates, const Transform *t
20 20 const bool atLeast = transform->instances < 0;
21 21 const int instances = abs(transform->instances);
22 22  
23   - QList<QString> allLabels = templates.get<QString>("Subject");
  23 + QList<QString> allLabels = File::get<QString>(templates, "Subject");
24 24 QList<QString> uniqueLabels = allLabels.toSet().toList();
25 25 qSort(uniqueLabels);
26 26  
... ...
openbr/plugins/output.cpp
... ... @@ -146,8 +146,8 @@ class meltOutput : public MatrixOutput
146 146 QStringList lines;
147 147 if (file.baseName() != "terminal") lines.append(QString("Query,Target,Mask,Similarity%1").arg(keys));
148 148  
149   - QList<QString> queryLabels = queryFiles.get<QString>("Subject");
150   - QList<QString> targetLabels = targetFiles.get<QString>("Subject");
  149 + QList<QString> queryLabels = File::get<QString>(queryFiles, "Subject");
  150 + QList<QString> targetLabels = File::get<QString>(targetFiles, "Subject");
151 151  
152 152 for (int i=0; i<queryFiles.size(); i++) {
153 153 for (int j=(selfSimilar ? i+1 : 0); j<targetFiles.size(); j++) {
... ...
openbr/plugins/svm.cpp
... ... @@ -130,7 +130,7 @@ private:
130 130 Mat lab;
131 131 // If we are doing regression, assume subject has float values
132 132 if (type == EPS_SVR || type == NU_SVR) {
133   - lab = OpenCVUtils::toMat(_data.get<float>("Subject"));
  133 + lab = OpenCVUtils::toMat(File::get<float>(_data, "Subject"));
134 134 }
135 135 // If we are doing classification, assume subject has discrete values, map them
136 136 // and store the mapping data
... ...