Commit f4a9384b392cea2ed836ce1851f8d93b72803a08

Authored by Josh Klontz
1 parent 303a0d8a

introduced Distance::compare(cv::Mat, cv::Mat)

openbr/openbr_plugin.h
@@ -1324,7 +1324,8 @@ public: @@ -1324,7 +1324,8 @@ public:
1324 virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */ 1324 virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */
1325 virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */ 1325 virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */
1326 virtual QList<float> compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */ 1326 virtual QList<float> compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */
1327 - virtual float compare(const Template &a, const Template &b) const = 0; /*!< \brief Compute the distance between two templates. */ 1327 + virtual float compare(const Template &a, const Template &b) const { return compare(a.m(), b.m()); } /*!< \brief Compute the distance between two templates. */
  1328 + virtual float compare(const cv::Mat &a, const cv::Mat &b) const = 0;
1328 1329
1329 protected: 1330 protected:
1330 inline Distance *make(const QString &description) { return make(description, this); } /*!< \brief Make a subdistance. */ 1331 inline Distance *make(const QString &description) { return make(description, this); } /*!< \brief Make a subdistance. */
openbr/plugins/distance.cpp
@@ -58,10 +58,10 @@ private: @@ -58,10 +58,10 @@ private:
58 BR_PROPERTY(Metric, metric, L2) 58 BR_PROPERTY(Metric, metric, L2)
59 BR_PROPERTY(bool, negLogPlusOne, true) 59 BR_PROPERTY(bool, negLogPlusOne, true)
60 60
61 - float compare(const Template &a, const Template &b) const 61 + float compare(const Mat &a, const Mat &b) const
62 { 62 {
63 - if ((a.m().size != b.m().size) ||  
64 - (a.m().type() != b.m().type())) 63 + if ((a.size != b.size) ||
  64 + (a.type() != b.type()))
65 return -std::numeric_limits<float>::max(); 65 return -std::numeric_limits<float>::max();
66 66
67 // TODO: this max value is never returned based on the switch / default 67 // TODO: this max value is never returned based on the switch / default
@@ -90,7 +90,7 @@ private: @@ -90,7 +90,7 @@ private:
90 case Cosine: 90 case Cosine:
91 return cosine(a, b); 91 return cosine(a, b);
92 case Dot: 92 case Dot:
93 - return a.m().dot(b); 93 + return a.dot(b);
94 default: 94 default:
95 qFatal("Invalid metric"); 95 qFatal("Invalid metric");
96 } 96 }
@@ -138,7 +138,7 @@ class DefaultDistance : public Distance @@ -138,7 +138,7 @@ class DefaultDistance : public Distance
138 distance = Distance::make("Dist("+file.suffix()+")"); 138 distance = Distance::make("Dist("+file.suffix()+")");
139 } 139 }
140 140
141 - float compare(const Template &a, const Template &b) const 141 + float compare(const cv::Mat &a, const cv::Mat &b) const
142 { 142 {
143 return distance->compare(a, b); 143 return distance->compare(a, b);
144 } 144 }
@@ -169,7 +169,7 @@ class PipeDistance : public Distance @@ -169,7 +169,7 @@ class PipeDistance : public Distance
169 futures.waitForFinished(); 169 futures.waitForFinished();
170 } 170 }
171 171
172 - float compare(const Template &a, const Template &b) const 172 + float compare(const Mat &a, const Mat &b) const
173 { 173 {
174 float result = -std::numeric_limits<float>::max(); 174 float result = -std::numeric_limits<float>::max();
175 foreach (br::Distance *distance, distances) { 175 foreach (br::Distance *distance, distances) {
@@ -224,6 +224,11 @@ private: @@ -224,6 +224,11 @@ private:
224 distances[i]->train(partitionedSrc[i]); 224 distances[i]->train(partitionedSrc[i]);
225 } 225 }
226 226
  227 + float compare(const Mat &a, const Mat &b) const
  228 + {
  229 + return distances.first()->compare(a, b);
  230 + }
  231 +
227 float compare(const Template &a, const Template &b) const 232 float compare(const Template &a, const Template &b) const
228 { 233 {
229 if (a.size() != b.size()) qFatal("Comparison size mismatch"); 234 if (a.size() != b.size()) qFatal("Comparison size mismatch");
@@ -232,7 +237,7 @@ private: @@ -232,7 +237,7 @@ private:
232 for (int i=0; i<distances.size(); i++) { 237 for (int i=0; i<distances.size(); i++) {
233 float weight; 238 float weight;
234 weights.isEmpty() ? weight = 1. : weight = weights[i]; 239 weights.isEmpty() ? weight = 1. : weight = weights[i];
235 - scores.append(weight*distances[i]->compare(Template(a.file, a[i]),Template(b.file, b[i]))); 240 + scores.append(weight*distances[i]->compare(a[i], b[i]));
236 } 241 }
237 242
238 switch (operation) { 243 switch (operation) {
@@ -282,9 +287,9 @@ class ByteL1Distance : public Distance @@ -282,9 +287,9 @@ class ByteL1Distance : public Distance
282 { 287 {
283 Q_OBJECT 288 Q_OBJECT
284 289
285 - float compare(const Template &a, const Template &b) const 290 + float compare(const Mat &a, const Mat &b) const
286 { 291 {
287 - return l1(a.m().data, b.m().data, a.m().total()); 292 + return l1(a.data, b.data, a.total());
288 } 293 }
289 }; 294 };
290 295
@@ -299,9 +304,9 @@ class HalfByteL1Distance : public Distance @@ -299,9 +304,9 @@ class HalfByteL1Distance : public Distance
299 { 304 {
300 Q_OBJECT 305 Q_OBJECT
301 306
302 - float compare(const Template &a, const Template &b) const 307 + float compare(const Mat &a, const Mat &b) const
303 { 308 {
304 - return packed_l1(a.m().data, b.m().data, a.m().total()); 309 + return packed_l1(a.data, b.data, a.total());
305 } 310 }
306 }; 311 };
307 312
@@ -323,6 +328,11 @@ class NegativeLogPlusOneDistance : public Distance @@ -323,6 +328,11 @@ class NegativeLogPlusOneDistance : public Distance
323 distance->train(src); 328 distance->train(src);
324 } 329 }
325 330
  331 + float compare(const cv::Mat &a, const cv::Mat &b) const
  332 + {
  333 + return compare(Template(a), Template(b));
  334 + }
  335 +
326 float compare(const Template &a, const Template &b) const 336 float compare(const Template &a, const Template &b) const
327 { 337 {
328 return -log(distance->compare(a,b)+1); 338 return -log(distance->compare(a,b)+1);
@@ -350,21 +360,18 @@ class IdenticalDistance : public Distance @@ -350,21 +360,18 @@ class IdenticalDistance : public Distance
350 { 360 {
351 Q_OBJECT 361 Q_OBJECT
352 362
353 - float compare(const Template &a, const Template &b) const 363 + float compare(const Mat &a, const Mat &b) const
354 { 364 {
355 - const Mat &am = a.m();  
356 - const Mat &bm = b.m();  
357 - const size_t size = am.total() * am.elemSize();  
358 - if (size != bm.total() * bm.elemSize()) return 0; 365 + const size_t size = a.total() * a.elemSize();
  366 + if (size != b.total() * b.elemSize()) return 0;
359 for (size_t i=0; i<size; i++) 367 for (size_t i=0; i<size; i++)
360 - if (am.data[i] != bm.data[i]) return 0; 368 + if (a.data[i] != b.data[i]) return 0;
361 return 1; 369 return 1;
362 } 370 }
363 }; 371 };
364 372
365 BR_REGISTER(Distance, IdenticalDistance) 373 BR_REGISTER(Distance, IdenticalDistance)
366 374
367 -  
368 /*! 375 /*!
369 * \ingroup distances 376 * \ingroup distances
370 * \brief Online distance metric to attenuate match scores across multiple frames 377 * \brief Online distance metric to attenuate match scores across multiple frames
@@ -381,6 +388,11 @@ class OnlineDistance : public Distance @@ -381,6 +388,11 @@ class OnlineDistance : public Distance
381 mutable QHash<QString,float> scoreHash; 388 mutable QHash<QString,float> scoreHash;
382 mutable QMutex mutex; 389 mutable QMutex mutex;
383 390
  391 + float compare(const Mat &a, const Mat &b) const
  392 + {
  393 + return compare(Template(a), Template(b));
  394 + }
  395 +
384 float compare(const Template &target, const Template &query) const 396 float compare(const Template &target, const Template &query) const
385 { 397 {
386 float currentScore = distance->compare(target, query); 398 float currentScore = distance->compare(target, query);
@@ -403,6 +415,12 @@ class AttributeDistance : public Distance @@ -403,6 +415,12 @@ class AttributeDistance : public Distance
403 Q_PROPERTY(QString attribute READ get_attribute WRITE set_attribute RESET reset_attribute STORED false) 415 Q_PROPERTY(QString attribute READ get_attribute WRITE set_attribute RESET reset_attribute STORED false)
404 BR_PROPERTY(QString, attribute, QString()) 416 BR_PROPERTY(QString, attribute, QString())
405 417
  418 + float compare(const cv::Mat &, const cv::Mat &) const
  419 + {
  420 + qFatal("Logic error.");
  421 + return 0;
  422 + }
  423 +
406 float compare(const Template &target, const Template &query) const 424 float compare(const Template &target, const Template &query) const
407 { 425 {
408 float queryValue = query.file.get<float>(attribute); 426 float queryValue = query.file.get<float>(attribute);
@@ -437,6 +455,11 @@ class SumDistance : public Distance @@ -437,6 +455,11 @@ class SumDistance : public Distance
437 futures.waitForFinished(); 455 futures.waitForFinished();
438 } 456 }
439 457
  458 + float compare(const Mat &a, const Mat &b) const
  459 + {
  460 + return compare(Template(a), Template(b));
  461 + }
  462 +
440 float compare(const Template &target, const Template &query) const 463 float compare(const Template &target, const Template &query) const
441 { 464 {
442 float result = 0; 465 float result = 0;
openbr/plugins/eigen3.cpp
@@ -659,11 +659,11 @@ class L1Distance : public Distance @@ -659,11 +659,11 @@ class L1Distance : public Distance
659 { 659 {
660 Q_OBJECT 660 Q_OBJECT
661 661
662 - float compare(const Template &a, const Template &b) const 662 + float compare(const cv::Mat &a, const cv::Mat &b) const
663 { 663 {
664 - const int size = a.m().rows * a.m().cols;  
665 - Eigen::Map<Eigen::VectorXf> aMap((float*)a.m().data, size);  
666 - Eigen::Map<Eigen::VectorXf> bMap((float*)b.m().data, size); 664 + const int size = a.rows * a.cols;
  665 + Eigen::Map<Eigen::VectorXf> aMap((float*)a.data, size);
  666 + Eigen::Map<Eigen::VectorXf> bMap((float*)b.data, size);
667 return (aMap-bMap).cwiseAbs().sum(); 667 return (aMap-bMap).cwiseAbs().sum();
668 } 668 }
669 }; 669 };
@@ -679,11 +679,11 @@ class L2Distance : public Distance @@ -679,11 +679,11 @@ class L2Distance : public Distance
679 { 679 {
680 Q_OBJECT 680 Q_OBJECT
681 681
682 - float compare(const Template &a, const Template &b) const 682 + float compare(const cv::Mat &a, const cv::Mat &b) const
683 { 683 {
684 - const int size = a.m().rows * a.m().cols;  
685 - Eigen::Map<Eigen::VectorXf> aMap((float*)a.m().data, size);  
686 - Eigen::Map<Eigen::VectorXf> bMap((float*)b.m().data, size); 684 + const int size = a.rows * a.cols;
  685 + Eigen::Map<Eigen::VectorXf> aMap((float*)a.data, size);
  686 + Eigen::Map<Eigen::VectorXf> bMap((float*)b.data, size);
687 return (aMap-bMap).squaredNorm(); 687 return (aMap-bMap).squaredNorm();
688 } 688 }
689 }; 689 };
openbr/plugins/keypoint.cpp
@@ -126,13 +126,13 @@ class KeyPointMatcherDistance : public Distance @@ -126,13 +126,13 @@ class KeyPointMatcherDistance : public Distance
126 qFatal("Failed to create DescriptorMatcher: %s", qPrintable(matcher)); 126 qFatal("Failed to create DescriptorMatcher: %s", qPrintable(matcher));
127 } 127 }
128 128
129 - float compare(const Template &a, const Template &b) const 129 + float compare(const Mat &a, const Mat &b) const
130 { 130 {
131 - if ((a.m().rows < 2) || (b.m().rows < 2)) return 0; 131 + if ((a.rows < 2) || (b.rows < 2)) return 0;
132 132
133 std::vector< std::vector<DMatch> > matches; 133 std::vector< std::vector<DMatch> > matches;
134 - if (a.m().rows < b.m().rows) descriptorMatcher->knnMatch(a, b, matches, 2);  
135 - else descriptorMatcher->knnMatch(b, a, matches, 2); 134 + if (a.rows < b.rows) descriptorMatcher->knnMatch(a, b, matches, 2);
  135 + else descriptorMatcher->knnMatch(b, a, matches, 2);
136 136
137 QList<float> distances; 137 QList<float> distances;
138 foreach (const std::vector<DMatch> &match, matches) { 138 foreach (const std::vector<DMatch> &match, matches) {
openbr/plugins/pp5.cpp
@@ -322,7 +322,7 @@ class PP5CompareDistance : public Distance @@ -322,7 +322,7 @@ class PP5CompareDistance : public Distance
322 ppr_free_gallery(gallery.gallery); 322 ppr_free_gallery(gallery.gallery);
323 } 323 }
324 324
325 - float compare(const Template &target, const Template &query) const 325 + float compare(const cv::Mat &target, const cv::Mat &query) const
326 { 326 {
327 TemplateList targetList; 327 TemplateList targetList;
328 targetList.append(target); 328 targetList.append(target);
openbr/plugins/quality.cpp
@@ -182,7 +182,7 @@ class MatchProbabilityDistance : public Distance @@ -182,7 +182,7 @@ class MatchProbabilityDistance : public Distance
182 mp = MP(genuineScores, impostorScores); 182 mp = MP(genuineScores, impostorScores);
183 } 183 }
184 184
185 - float compare(const Template &target, const Template &query) const 185 + float compare(const cv::Mat &target, const cv::Mat &query) const
186 { 186 {
187 const float rawScore = distance->compare(target, query); 187 const float rawScore = distance->compare(target, query);
188 if (rawScore == -std::numeric_limits<float>::max()) return rawScore; 188 if (rawScore == -std::numeric_limits<float>::max()) return rawScore;
@@ -246,6 +246,11 @@ class ZScoreDistance : public Distance @@ -246,6 +246,11 @@ class ZScoreDistance : public Distance
246 if (stddev == 0) qFatal("Stddev is 0."); 246 if (stddev == 0) qFatal("Stddev is 0.");
247 } 247 }
248 248
  249 + float compare(const cv::Mat &a, const cv::Mat &b) const
  250 + {
  251 + return compare(Template(a), Template(b));
  252 + }
  253 +
249 float compare(const Template &target, const Template &query) const 254 float compare(const Template &target, const Template &query) const
250 { 255 {
251 float score = distance->compare(target,query); 256 float score = distance->compare(target,query);
@@ -308,7 +313,7 @@ class HeatMapDistance : public Distance @@ -308,7 +313,7 @@ class HeatMapDistance : public Distance
308 distances[i]->train(patches[i]); 313 distances[i]->train(patches[i]);
309 } 314 }
310 315
311 - float compare(const Template &target, const Template &query) const 316 + float compare(const cv::Mat &target, const cv::Mat &query) const
312 { 317 {
313 (void) target; 318 (void) target;
314 (void) query; 319 (void) query;
@@ -401,6 +406,11 @@ class UnitDistance : public Distance @@ -401,6 +406,11 @@ class UnitDistance : public Distance
401 qDebug("a = %f, b = %f", a, b); 406 qDebug("a = %f, b = %f", a, b);
402 } 407 }
403 408
  409 + float compare(const cv::Mat &a, const cv::Mat &b) const
  410 + {
  411 + return compare(Template(a), Template(b));
  412 + }
  413 +
404 float compare(const Template &target, const Template &query) const 414 float compare(const Template &target, const Template &query) const
405 { 415 {
406 return a * (distance->compare(target, query) - b); 416 return a * (distance->compare(target, query) - b);
openbr/plugins/quantize.cpp
@@ -163,11 +163,11 @@ class BayesianQuantizationDistance : public Distance @@ -163,11 +163,11 @@ class BayesianQuantizationDistance : public Distance
163 futures.waitForFinished(); 163 futures.waitForFinished();
164 } 164 }
165 165
166 - float compare(const Template &a, const Template &b) const 166 + float compare(const cv::Mat &a, const cv::Mat &b) const
167 { 167 {
168 - const uchar *aData = a.m().data;  
169 - const uchar *bData = b.m().data;  
170 - const int size = a.m().rows * a.m().cols; 168 + const uchar *aData = a.data;
  169 + const uchar *bData = b.data;
  170 + const int size = a.rows * a.cols;
171 float likelihood = 0; 171 float likelihood = 0;
172 for (int i=0; i<size; i++) 172 for (int i=0; i<size; i++)
173 likelihood += loglikelihoods[i*256+abs(aData[i]-bData[i])]; 173 likelihood += loglikelihoods[i*256+abs(aData[i]-bData[i])];
@@ -257,6 +257,12 @@ class ProductQuantizationDistance : public Distance @@ -257,6 +257,12 @@ class ProductQuantizationDistance : public Distance
257 Q_PROPERTY(bool bayesian READ get_bayesian WRITE set_bayesian RESET reset_bayesian STORED false) 257 Q_PROPERTY(bool bayesian READ get_bayesian WRITE set_bayesian RESET reset_bayesian STORED false)
258 BR_PROPERTY(bool, bayesian, false) 258 BR_PROPERTY(bool, bayesian, false)
259 259
  260 + float compare(const cv::Mat &, const cv::Mat &) const
  261 + {
  262 + qFatal("Logic error.");
  263 + return 0;
  264 + }
  265 +
260 float compare(const Template &a, const Template &b) const 266 float compare(const Template &a, const Template &b) const
261 { 267 {
262 float distance = 0; 268 float distance = 0;
@@ -297,6 +303,12 @@ class RecursiveProductQuantizationDistance : public Distance @@ -297,6 +303,12 @@ class RecursiveProductQuantizationDistance : public Distance
297 Q_PROPERTY(float t READ get_t WRITE set_t RESET reset_t STORED false) 303 Q_PROPERTY(float t READ get_t WRITE set_t RESET reset_t STORED false)
298 BR_PROPERTY(float, t, -std::numeric_limits<float>::max()) 304 BR_PROPERTY(float, t, -std::numeric_limits<float>::max())
299 305
  306 + float compare(const cv::Mat &, const cv::Mat &) const
  307 + {
  308 + qFatal("Logic error.");
  309 + return 0;
  310 + }
  311 +
300 float compare(const Template &a, const Template &b) const 312 float compare(const Template &a, const Template &b) const
301 { 313 {
302 return compareRecursive(a, b, 0, a.size(), 0); 314 return compareRecursive(a, b, 0, a.size(), 0);
openbr/plugins/sentence.cpp
@@ -43,12 +43,12 @@ class SentenceSimilarityDistance : public Distance @@ -43,12 +43,12 @@ class SentenceSimilarityDistance : public Distance
43 { 43 {
44 Q_OBJECT 44 Q_OBJECT
45 45
46 - float compare(const Template &a, const Template &b) const 46 + float compare(const Mat &a, const Mat &b) const
47 { 47 {
48 - uchar *aBuffer = a.m().data;  
49 - uchar *bBuffer = b.m().data;  
50 - const uchar *aEnd = aBuffer + a.m().cols;  
51 - const uchar *bEnd = bBuffer + b.m().cols; 48 + uchar *aBuffer = a.data;
  49 + uchar *bBuffer = b.data;
  50 + const uchar *aEnd = aBuffer + a.cols;
  51 + const uchar *bEnd = bBuffer + b.cols;
52 52
53 int32_t aWord, bWord, aRows, bRows, aColumns, bColumns; 53 int32_t aWord, bWord, aRows, bRows, aColumns, bColumns;
54 float *aData, *bData; 54 float *aData, *bData;
openbr/plugins/svm.cpp
@@ -260,10 +260,10 @@ private: @@ -260,10 +260,10 @@ private:
260 trainSVM(svm, deltaData, deltaLab, kernel, type, -1, -1); 260 trainSVM(svm, deltaData, deltaLab, kernel, type, -1, -1);
261 } 261 }
262 262
263 - float compare(const Template &ta, const Template &tb) const 263 + float compare(const Mat &a, const Mat &b) const
264 { 264 {
265 Mat delta; 265 Mat delta;
266 - absdiff(ta, tb, delta); 266 + absdiff(a, b, delta);
267 return svm.predict(delta.reshape(1, 1)); 267 return svm.predict(delta.reshape(1, 1));
268 } 268 }
269 269
openbr/plugins/validate.cpp
@@ -143,6 +143,12 @@ class CrossValidateDistance : public Distance @@ -143,6 +143,12 @@ class CrossValidateDistance : public Distance
143 { 143 {
144 Q_OBJECT 144 Q_OBJECT
145 145
  146 + float compare(const cv::Mat &, const cv::Mat &) const
  147 + {
  148 + qFatal("Logic error");
  149 + return 0;
  150 + }
  151 +
146 float compare(const Template &a, const Template &b) const 152 float compare(const Template &a, const Template &b) const
147 { 153 {
148 static const QString key("Partition"); // More efficient to preallocate this 154 static const QString key("Partition"); // More efficient to preallocate this
@@ -163,6 +169,12 @@ class FilterDistance : public Distance @@ -163,6 +169,12 @@ class FilterDistance : public Distance
163 { 169 {
164 Q_OBJECT 170 Q_OBJECT
165 171
  172 + float compare(const cv::Mat &, const cv::Mat &) const
  173 + {
  174 + qFatal("Logic error.");
  175 + return 0;
  176 + }
  177 +
166 float compare(const Template &a, const Template &b) const 178 float compare(const Template &a, const Template &b) const
167 { 179 {
168 (void) b; // Query template isn't checked 180 (void) b; // Query template isn't checked
@@ -197,6 +209,12 @@ class MetadataDistance : public Distance @@ -197,6 +209,12 @@ class MetadataDistance : public Distance
197 Q_PROPERTY(QStringList filters READ get_filters WRITE set_filters RESET reset_filters STORED false) 209 Q_PROPERTY(QStringList filters READ get_filters WRITE set_filters RESET reset_filters STORED false)
198 BR_PROPERTY(QStringList, filters, QStringList()) 210 BR_PROPERTY(QStringList, filters, QStringList())
199 211
  212 + float compare(const cv::Mat &, const cv::Mat &) const
  213 + {
  214 + qFatal("Logic error.");
  215 + return 0;
  216 + }
  217 +
200 float compare(const Template &a, const Template &b) const 218 float compare(const Template &a, const Template &b) const
201 { 219 {
202 foreach (const QString &key, filters) { 220 foreach (const QString &key, filters) {
@@ -250,6 +268,12 @@ class RejectDistance : public Distance @@ -250,6 +268,12 @@ class RejectDistance : public Distance
250 Q_PROPERTY(bool rejectIfContains READ get_rejectIfContains WRITE set_rejectIfContains RESET reset_rejectIfContains STORED false) 268 Q_PROPERTY(bool rejectIfContains READ get_rejectIfContains WRITE set_rejectIfContains RESET reset_rejectIfContains STORED false)
251 BR_PROPERTY(bool, rejectIfContains, false) 269 BR_PROPERTY(bool, rejectIfContains, false)
252 270
  271 + float compare(const cv::Mat &, const cv::Mat &) const
  272 + {
  273 + qFatal("Logic error.");
  274 + return 0;
  275 + }
  276 +
253 float compare(const Template &a, const Template &b) const 277 float compare(const Template &a, const Template &b) const
254 { 278 {
255 // We don't look at the query 279 // We don't look at the query