Commit 6e96c4e040676d007cfc3fbea5f2cf3160054107

Authored by Scott Klum
1 parent d29e2df1

CrossValidation with same training across all splits

openbr/core/core.cpp
@@ -248,9 +248,8 @@ struct AlgorithmCore @@ -248,9 +248,8 @@ struct AlgorithmCore
248 if (!partitionSizes.empty()) targetPartitions = targets.partition(partitionSizes); 248 if (!partitionSizes.empty()) targetPartitions = targets.partition(partitionSizes);
249 else targetPartitions.append(targets); 249 else targetPartitions.append(targets);
250 250
251 - if (queryPartitions[i].first().size() != targetPartitions[i].first().size()) qFatal("Query and target templates have different number of matrices.");  
252 -  
253 outputs[i]->setBlock(queryBlock, targetBlock); 251 outputs[i]->setBlock(queryBlock, targetBlock);
  252 +
254 distance->compare(targetPartitions[i], queryPartitions[i], outputs[i]); 253 distance->compare(targetPartitions[i], queryPartitions[i], outputs[i]);
255 254
256 Globals->currentStep += double(targets.size()) * double(queries.size()); 255 Globals->currentStep += double(targets.size()) * double(queries.size());
openbr/core/plot.cpp
@@ -268,7 +268,7 @@ float Evaluate(const Mat &simmat, const Mat &mask, const QString &csv) @@ -268,7 +268,7 @@ float Evaluate(const Mat &simmat, const Mat &mask, const QString &csv)
268 } 268 }
269 269
270 // Write Cumulative Match Characteristic (CMC) curve 270 // Write Cumulative Match Characteristic (CMC) curve
271 - const int Max_Retrieval = 100; 271 + const int Max_Retrieval = 200;
272 const int Report_Retrieval = 5; 272 const int Report_Retrieval = 5;
273 273
274 float reportRetrievalRate = -1; 274 float reportRetrievalRate = -1;
@@ -472,6 +472,8 @@ struct RPlot @@ -472,6 +472,8 @@ struct RPlot
472 } 472 }
473 }; 473 };
474 474
  475 +// Does not work if dataset folder starts with a number
  476 +
475 bool Plot(const QStringList &files, const br::File &destination, bool show) 477 bool Plot(const QStringList &files, const br::File &destination, bool show)
476 { 478 {
477 qDebug("Plotting %d file(s) to %s", files.size(), qPrintable(destination)); 479 qDebug("Plotting %d file(s) to %s", files.size(), qPrintable(destination));
openbr/openbr_plugin.cpp
@@ -137,7 +137,7 @@ QVariant File::value(const QString &key) const @@ -137,7 +137,7 @@ QVariant File::value(const QString &key) const
137 137
138 QVariant File::parse(const QString &value) 138 QVariant File::parse(const QString &value)
139 { 139 {
140 - bool ok; 140 + bool ok = false;
141 const QPointF point = QtUtils::toPoint(value, &ok); 141 const QPointF point = QtUtils::toPoint(value, &ok);
142 if (ok) return point; 142 if (ok) return point;
143 const QRectF rect = QtUtils::toRect(value, &ok); 143 const QRectF rect = QtUtils::toRect(value, &ok);
@@ -1003,7 +1003,7 @@ void Output::reformat(const FileList &targetFiles, const FileList &queryFiles, c @@ -1003,7 +1003,7 @@ void Output::reformat(const FileList &targetFiles, const FileList &queryFiles, c
1003 const int columns = targetFiles.size(); 1003 const int columns = targetFiles.size();
1004 for (int i=0; i<rows; i++) 1004 for (int i=0; i<rows; i++)
1005 for (int j=0; j<columns; j++) 1005 for (int j=0; j<columns; j++)
1006 - o->setRelative(m.at<float>(i,i), i, j); 1006 + o->setRelative(m.at<float>(i,j), i, j);
1007 } 1007 }
1008 1008
1009 /* Output - protected methods */ 1009 /* Output - protected methods */
openbr/openbr_plugin.h
@@ -410,7 +410,7 @@ struct TemplateList : public QList&lt;Template&gt; @@ -410,7 +410,7 @@ struct TemplateList : public QList&lt;Template&gt;
410 sum+=partitionSizes[i]; 410 sum+=partitionSizes[i];
411 } 411 }
412 412
413 - if (sum != first().size()) qFatal("Partition sizes do not span template matrices properly"); 413 + if (sum != first().size()) qFatal("Partition sizes %i do not span template matrices %i properly", sum, first().size());
414 414
415 foreach (const Template &t, *this) { 415 foreach (const Template &t, *this) {
416 int index = 0; 416 int index = 0;
openbr/plugins/eigen3.cpp
@@ -330,6 +330,7 @@ class LDATransform : public Transform @@ -330,6 +330,7 @@ class LDATransform : public Transform
330 void train(const TemplateList &_trainingSet) 330 void train(const TemplateList &_trainingSet)
331 { 331 {
332 TemplateList trainingSet = TemplateList::relabel(_trainingSet); 332 TemplateList trainingSet = TemplateList::relabel(_trainingSet);
  333 +
333 int instances = trainingSet.size(); 334 int instances = trainingSet.size();
334 335
335 // Perform PCA dimensionality reduction 336 // Perform PCA dimensionality reduction
openbr/plugins/format.cpp
@@ -317,6 +317,7 @@ BR_REGISTER(Format, maskFormat) @@ -317,6 +317,7 @@ BR_REGISTER(Format, maskFormat)
317 * \brief MATLAB <tt>.mat</tt> format. 317 * \brief MATLAB <tt>.mat</tt> format.
318 * \author Josh Klontz \cite jklontz 318 * \author Josh Klontz \cite jklontz
319 * http://www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf 319 * http://www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf
  320 + * \note matFormat is known not to work with compressed matrices
320 */ 321 */
321 class matFormat : public Format 322 class matFormat : public Format
322 { 323 {
@@ -324,12 +325,18 @@ class matFormat : public Format @@ -324,12 +325,18 @@ class matFormat : public Format
324 325
325 struct Element 326 struct Element
326 { 327 {
  328 + // It is always best to cast integers to a Qt integer type, such as qint16 or quint32, when reading and writing.
  329 + // This ensures that you always know exactly what size integers you are reading and writing, no matter what the
  330 + // underlying platform and architecture the application happens to be running on.
  331 + // http://qt-project.org/doc/qt-4.8/datastreamformat.html
327 quint32 type, bytes; 332 quint32 type, bytes;
328 QByteArray data; 333 QByteArray data;
329 Element() : type(0), bytes(0) {} 334 Element() : type(0), bytes(0) {}
330 Element(QDataStream &stream) 335 Element(QDataStream &stream)
331 : type(0), bytes(0) 336 : type(0), bytes(0)
332 { 337 {
  338 + // Read first 4 bytes into type (32 bit integer),
  339 + // specifying the type of data used
333 if (stream.readRawData((char*)&type, 4) != 4) 340 if (stream.readRawData((char*)&type, 4) != 4)
334 qFatal("Unexpected end of file."); 341 qFatal("Unexpected end of file.");
335 342
@@ -340,11 +347,16 @@ class matFormat : public Format @@ -340,11 +347,16 @@ class matFormat : public Format
340 bytes = bytes >> 16; 347 bytes = bytes >> 16;
341 } else { 348 } else {
342 // Regular format 349 // Regular format
  350 + // Read 4 bytes into bytes (32 bit integer),
  351 + // specifying the size of the element
343 if (stream.readRawData((char*)&bytes, 4) != 4) 352 if (stream.readRawData((char*)&bytes, 4) != 4)
344 qFatal("Unexpected end of file."); 353 qFatal("Unexpected end of file.");
345 } 354 }
346 355
  356 + // Set the size of data to bytes
347 data.resize(bytes); 357 data.resize(bytes);
  358 +
  359 + // Read bytes amount of data from the file into data
348 if (int(bytes) != stream.readRawData(data.data(), bytes)) 360 if (int(bytes) != stream.readRawData(data.data(), bytes))
349 qFatal("Unexpected end of file."); 361 qFatal("Unexpected end of file.");
350 362
@@ -372,8 +384,9 @@ class matFormat : public Format @@ -372,8 +384,9 @@ class matFormat : public Format
372 while (!f.atEnd()) { 384 while (!f.atEnd()) {
373 Element element(f); 385 Element element(f);
374 386
375 - // miCOMPRESS 387 + // miCOMPRESSED
376 if (element.type == 15) { 388 if (element.type == 15) {
  389 + // Prepend the number of bytes to element.data
377 element.data.prepend((char*)&element.bytes, 4); // Qt zlib wrapper requires this to preallocate the buffer 390 element.data.prepend((char*)&element.bytes, 4); // Qt zlib wrapper requires this to preallocate the buffer
378 QDataStream uncompressed(qUncompress(element.data)); 391 QDataStream uncompressed(qUncompress(element.data));
379 element = Element(uncompressed); 392 element = Element(uncompressed);
openbr/plugins/stasm.cpp
@@ -34,7 +34,7 @@ BR_REGISTER(Initializer, StasmInitializer) @@ -34,7 +34,7 @@ BR_REGISTER(Initializer, StasmInitializer)
34 * \author Scott Klum \cite sklum 34 * \author Scott Klum \cite sklum
35 */ 35 */
36 // TODO: Use a global mutex to prevent concurrent calls to AsmSearchDll 36 // TODO: Use a global mutex to prevent concurrent calls to AsmSearchDll
37 -#if 0 37 +
38 class StasmTransform : public UntrainableTransform 38 class StasmTransform : public UntrainableTransform
39 { 39 {
40 Q_OBJECT 40 Q_OBJECT
@@ -46,6 +46,9 @@ class StasmTransform : public UntrainableTransform @@ -46,6 +46,9 @@ class StasmTransform : public UntrainableTransform
46 46
47 void project(const Template &src, Template &dst) const 47 void project(const Template &src, Template &dst) const
48 { 48 {
  49 + static QMutex mutex;
  50 + QMutexLocker locker(&mutex);
  51 +
49 int nlandmarks; 52 int nlandmarks;
50 int landmarks[500]; 53 int landmarks[500];
51 54
@@ -68,7 +71,6 @@ class StasmTransform : public UntrainableTransform @@ -68,7 +71,6 @@ class StasmTransform : public UntrainableTransform
68 }; 71 };
69 72
70 BR_REGISTER(Transform, StasmTransform) 73 BR_REGISTER(Transform, StasmTransform)
71 -#endif  
72 74
73 } // namespace br 75 } // namespace br
74 76
openbr/plugins/validate.cpp
@@ -52,8 +52,13 @@ class CrossValidateTransform : public MetaTransform @@ -52,8 +52,13 @@ class CrossValidateTransform : public MetaTransform
52 } 52 }
53 53
54 void project(const Template &src, Template &dst) const 54 void project(const Template &src, Template &dst) const
55 - {  
56 - transforms[src.file.get<int>("Partition", 0)]->project(src, dst); 55 + {
  56 + // If the src partition is greater than the number of training partitions,
  57 + // assume that projection should be done using the same training data for all partitions.
  58 + int partition = src.file.get<int>("Partition", 0);
  59 + if (partition >= transforms.size()-1) partition = 0;
  60 +
  61 + transforms[partition]->project(src, dst);
57 } 62 }
58 63
59 void store(QDataStream &stream) const 64 void store(QDataStream &stream) const