Commit e4df71435b705282a7dc8e8d4b11cd3afc6b6c1c

Authored by Charles Otto
1 parent fa9cbd42

Preliminary version of an alternate enroll implementation based on stream

Instead of processing things in blocks, this version wraps the transform in
a stream, with the input transform as 1 stage, and the other stage having
transforms that estimate time to completion, nad output templates to a gallery
Showing 1 changed file with 18 additions and 59 deletions
openbr/core/core.cpp
... ... @@ -19,6 +19,7 @@
19 19 #include "bee.h"
20 20 #include "common.h"
21 21 #include "qtutils.h"
  22 +#include "../plugins/openbr_internal.h"
22 23  
23 24 using namespace br;
24 25  
... ... @@ -46,6 +47,7 @@ struct AlgorithmCore
46 47  
47 48 TemplateList data(TemplateList::fromGallery(input));
48 49  
  50 +
49 51 // set the Train bool metadata, in case a Transform's project
50 52 // needs to know if it's called during train or enroll
51 53 for (int i=0; i<data.size(); i++)
... ... @@ -123,65 +125,24 @@ struct AlgorithmCore
123 125 else gallery = getMemoryGallery(input);
124 126 }
125 127  
126   - QScopedPointer<Gallery> g(Gallery::make(gallery));
127   - if (g.isNull()) qFatal("Null gallery!");
128   -
129   - do {
130   - fileList.clear();
131   -
132   - if (gallery.contains("read") || gallery.contains("cache"))
133   - fileList = g->files();
134   -
135   - if (!fileList.isEmpty() && gallery.contains("cache"))
136   - return fileList;
137   -
138   - const TemplateList i(TemplateList::fromGallery(input));
139   - if (i.isEmpty()) return fileList; // Nothing to enroll
140   -
141   - if (transform.isNull()) qFatal("Null transform.");
142   - const int blocks = Globals->blocks(i.size());
143   - Globals->currentStep = 0;
144   - Globals->totalSteps = i.size();
145   - Globals->startTime.start();
146   -
147   - const bool noDuplicates = gallery.contains("noDuplicates");
148   - QStringList fileNames = noDuplicates ? fileList.names() : QStringList();
149   - const int subBlockSize = 4*std::max(1, Globals->parallelism);
150   - const int numSubBlocks = ceil(1.0*Globals->blockSize/subBlockSize);
151   - int totalCount = 0, failureCount = 0;
152   - double totalBytes = 0;
153   - for (int block=0; block<blocks; block++) {
154   - for (int subBlock = 0; subBlock<numSubBlocks; subBlock++) {
155   - TemplateList data = i.mid(block*Globals->blockSize + subBlock*subBlockSize, subBlockSize);
156   - if (data.isEmpty()) break;
157   - if (noDuplicates)
158   - for (int i=data.size()-1; i>=0; i--)
159   - if (fileNames.contains(data[i].file.name))
160   - data.removeAt(i);
161   - const int numFiles = data.size();
162   -
163   - data >> *transform;
164   -
165   - g->writeBlock(data);
166   - const FileList newFiles = data.files();
167   - fileList.append(newFiles);
168   -
169   - totalCount += newFiles.size();
170   - failureCount += newFiles.failures();
171   - totalBytes += data.bytes<double>();
172   - Globals->currentStep += numFiles;
173   - Globals->printStatus();
174   - }
175   - }
  128 + TemplateList i(TemplateList::fromGallery(input));
  129 +
  130 + QString shellDescription = "DirectStream([Identity,ProgressCounter("+QString::number(i.length())+")+GalleryOutput("+gallery.flat()+")+Discard],readMode=DistributeFrames)";
  131 + qDebug("built shell string %s", qPrintable(shellDescription));
  132 + // Make a stream with a placeholder first transform, and our progress counter/gallery output.
  133 + QScopedPointer<Transform> enrollJob(Transform::make(shellDescription, NULL));
  134 +
  135 + CompositeTransform * downcast = dynamic_cast<CompositeTransform *>(enrollJob.data());
  136 + if (downcast == NULL)
  137 + qFatal("downcast failed?");
  138 +
  139 + downcast->transforms[0] = this->transform.data();
  140 + downcast->init();
  141 +
176 142  
177   - const float speed = 1000 * Globals->totalSteps / Globals->startTime.elapsed() / std::max(1, abs(Globals->parallelism));
178   - if (!Globals->quiet && (Globals->totalSteps > 1))
179   - fprintf(stderr, "\rSPEED=%.1e SIZE=%.4g FAILURES=%d/%d \n",
180   - speed, totalBytes/totalCount, failureCount, totalCount);
181   - Globals->totalSteps = 0;
182   - } while (input.getBool("infinite"));
  143 + downcast->projectUpdate(i,i);
183 144  
184   - return fileList;
  145 + return i.files();
185 146 }
186 147  
187 148 void retrieveOrEnroll(const File &file, QScopedPointer<Gallery> &gallery, FileList &galleryFiles)
... ... @@ -306,8 +267,6 @@ private:
306 267 if ((words.size() < 1) || (words.size() > 2)) qFatal("Invalid algorithm format.");
307 268 //! [Parsing the algorithm description]
308 269  
309   - if (description.getBool("distribute", true))
310   - words[0] = "DistributeTemplate(" + words[0] + ")";
311 270  
312 271 //! [Creating the template generation and comparison methods]
313 272 transform = QSharedPointer<Transform>(Transform::make(words[0], NULL));
... ...