Commit b573c3bb23b565df56144329f077355ed2071829

Authored by Austin Blanton
1 parent b29a6349

Store each detection as its own Template, using the file metadata Detection and Confidence

Showing 1 changed file with 77 additions and 49 deletions
openbr/plugins/slidingwindow.cpp
... ... @@ -68,32 +68,37 @@ private:
68 68  
69 69 void project(const Template &src, Template &dst) const
70 70 {
71   - dst = src;
  71 + (void)src;(void)dst;qFatal("don't do that");
  72 + }
  73 +
  74 + void project(const TemplateList &src, TemplateList &dst) const
  75 + {
72 76 // no need to slide a window over ground truth data
73   - if (src.file.getBool("Train", false)) return;
74   -
75   - dst.file.clearRects();
76   - float scale = src.file.get<float>("scale", 1);
77   - Template windowTemplate(src.file, src);
78   - QList<float> confidences = dst.file.getList<float>("Confidences", QList<float>());
79   - for (double y = 0; y + windowHeight < src.m().rows; y += stepSize) {
80   - for (double x = 0; x + windowWidth < src.m().cols; x += stepSize) {
81   - Mat windowMat(src, Rect(x, y, windowWidth, windowHeight));
82   - windowTemplate.replace(0,windowMat);
83   - Template detect;
84   - transform->project(windowTemplate, detect);
85   - float conf = detect.m().at<float>(0);
86   -
87   - // the result will be in the Label
88   - if (conf > threshold) {
89   - dst.file.appendRect(QRectF((float) x * scale, (float) y * scale, (float) windowWidth * scale, (float) windowHeight * scale));
90   - confidences.append(conf);
91   - if (takeFirst)
92   - return;
  77 + if (src.first().file.getBool("Train", false)) {
  78 + dst = src;
  79 + return;
  80 + }
  81 +
  82 + foreach (const Template &t, src) {
  83 + float scale = t.file.get<float>("scale", 1);
  84 + for (double y = 0; y + windowHeight < t.m().rows; y += stepSize) {
  85 + for (double x = 0; x + windowWidth < t.m().cols; x += stepSize) {
  86 + Mat windowMat(t.m(), Rect(x, y, windowWidth, windowHeight));
  87 + Template detect;
  88 + transform->project(Template(t.file, windowMat), detect);
  89 +
  90 + // the result will be the only value in the Mat
  91 + float conf = detect.m().at<float>(0);
  92 + if (conf > threshold) {
  93 + detect.file.set("Detection", QRectF((float) x * scale, (float) y * scale, (float) windowWidth * scale, (float) windowHeight * scale));
  94 + detect.file.set("Confidence", conf);
  95 + dst.append(detect);
  96 + if (takeFirst)
  97 + return;
  98 + }
93 99 }
94 100 }
95 101 }
96   - dst.file.setList<float>("Confidences", confidences);
97 102 }
98 103  
99 104 void store(QDataStream &stream) const
... ... @@ -174,7 +179,7 @@ static TemplateList cropTrainingSamples(const TemplateList &amp;data, const float as
174 179  
175 180 /*!
176 181 * \ingroup transforms
177   - * \brief .
  182 + * \brief Pass along images at different scales.
178 183 * \author Austin Blanton \cite imaus10
179 184 */
180 185 class BuildScalesTransform : public MetaTransform
... ... @@ -219,25 +224,38 @@ private:
219 224  
220 225 void project(const Template &src, Template &dst) const
221 226 {
222   - dst = src;
  227 + (void)src;(void)dst;qFatal("please don't");
  228 + }
  229 +
  230 + void project(const TemplateList &src, TemplateList &dst) const
  231 + {
223 232 // do not scale images during training
224   - if (src.file.getBool("Train", false)) return;
225   -
226   - int rows = src.m().rows;
227   - int cols = src.m().cols;
228   - int windowHeight = (int) qRound((float) windowWidth / aspectRatio);
229   - float startScale;
230   - if ((cols / rows) > aspectRatio)
231   - startScale = qRound((float) rows / (float) windowHeight);
232   - else
233   - startScale = qRound((float) cols / (float) windowWidth);
234   - for (float scale = startScale; scale >= minScale; scale -= (1.0 - scaleFactor)) {
235   - Template scaleImg(src.file, Mat());
236   - scaleImg.file.set("scale", scale);
237   - resize(src, scaleImg, Size(qRound(cols / scale), qRound(rows / scale)));
238   - transform->project(scaleImg, dst);
239   - if (takeLargestScale && !dst.file.rects().empty())
240   - return;
  233 + if (src.first().file.getBool("Train", false)) {
  234 + dst = src;
  235 + return;
  236 + }
  237 +
  238 + foreach(const Template &t, src) {
  239 + int rows = t.m().rows;
  240 + int cols = t.m().cols;
  241 + int windowHeight = (int) qRound((float) windowWidth / aspectRatio);
  242 + float startScale;
  243 + if ((cols / rows) > aspectRatio)
  244 + startScale = qRound((float) rows / (float) windowHeight);
  245 + else
  246 + startScale = qRound((float) cols / (float) windowWidth);
  247 + for (float scale = startScale; scale >= minScale; scale -= (1.0 - scaleFactor)) {
  248 + Template scaleImg(t.file, Mat());
  249 + scaleImg.file.set("scale", scale);
  250 + resize(t.m(), scaleImg.m(), Size(qRound(cols / scale), qRound(rows / scale)));
  251 + TemplateList results;
  252 + TemplateList input;
  253 + input.append(scaleImg);
  254 + transform->project(input, results);
  255 + dst.append(results);
  256 + if (takeLargestScale && !dst.empty())
  257 + return;
  258 + }
241 259 }
242 260 }
243 261  
... ... @@ -328,12 +346,19 @@ private:
328 346  
329 347 void project(const Template &src, Template &dst) const
330 348 {
331   - dst = src;
332   - if (!dst.file.contains("Confidences"))
333   - return;
  349 + (void)src;(void)dst;qFatal("nope");
  350 + }
334 351  
335   - //Compute overlap between rectangles and create discrete Laplacian matrix
336   - QList<Rect> rects = OpenCVUtils::toRects(src.file.rects());
  352 + void project(const TemplateList &src, TemplateList &dst) const
  353 + {
  354 + QList<Rect> rects;
  355 + QList<float> confidences;
  356 + foreach (const Template &t, src) {
  357 + rects.append(OpenCVUtils::toRect(t.file.get<QRectF>("Detection")));
  358 + confidences.append(t.file.get<float>("Confidence"));
  359 + }
  360 +
  361 + // Compute overlap between rectangles and create discrete Laplacian matrix
337 362 int n = rects.size();
338 363 if (n == 0)
339 364 return;
... ... @@ -397,7 +422,6 @@ private:
397 422 cnts[i] = 0;
398 423 }
399 424  
400   - QList<float> confidences = dst.file.getList<float>("Confidences");
401 425 for (int i = 0; i < n; i++) {
402 426 mx = 0.0;
403 427 mxIdx = -1;
... ... @@ -432,8 +456,12 @@ private:
432 456 }
433 457 }
434 458  
435   - dst.file.setRects(consolidatedRects);
436   - dst.file.setList<float>("Confidences", consolidatedConfidences);
  459 + for (int i=0; i<consolidatedRects.size(); i++) {
  460 + Template t(src.first().file);
  461 + t.file.set("Detection", OpenCVUtils::fromRect(consolidatedRects.at(i)));
  462 + t.file.set("Confidence", consolidatedConfidences.at(i));
  463 + dst.append(t);
  464 + }
437 465 }
438 466 };
439 467  
... ...