Commit 3836f4a29f23c9c93891bfd2d1f33861b673f1fc

Authored by Scott Klum
1 parent 08179e6d

Ready for groupRectangles refactor

openbr/openbr_plugin.h
@@ -1422,7 +1422,7 @@ public: @@ -1422,7 +1422,7 @@ public:
1422 static Classifier *make(QString str, QObject *parent); /*!< \brief Make a classifier from a string. */ 1422 static Classifier *make(QString str, QObject *parent); /*!< \brief Make a classifier from a string. */
1423 1423
1424 virtual void train(const QList<cv::Mat> &images, const QList<float> &labels) = 0; 1424 virtual void train(const QList<cv::Mat> &images, const QList<float> &labels) = 0;
1425 - virtual float classify(const cv::Mat &image, float *confidence = NULL) const = 0; 1425 + virtual float classify(const cv::Mat &image, bool process = true, float *confidence = NULL) const = 0;
1426 1426
1427 // Slots for representation 1427 // Slots for representation
1428 virtual cv::Mat preprocess(const cv::Mat &image) const = 0; 1428 virtual cv::Mat preprocess(const cv::Mat &image) const = 0;
openbr/plugins/classification/boostedforest.cpp
@@ -129,18 +129,24 @@ class BoostedForestClassifier : public Classifier @@ -129,18 +129,24 @@ class BoostedForestClassifier : public Classifier
129 } 129 }
130 } 130 }
131 131
132 - float classify(const Mat &image, float *confidence) const 132 + float classify(const Mat &image, bool process, float *confidence) const
133 { 133 {
  134 + Mat m;
  135 + if (process)
  136 + m = preprocess(image);
  137 + else
  138 + m = image;
  139 +
134 float sum = 0; 140 float sum = 0;
135 for (int i = 0; i < classifiers.size(); i++) { 141 for (int i = 0; i < classifiers.size(); i++) {
136 Node *node = classifiers[i]; 142 Node *node = classifiers[i];
137 143
138 while (node->left) { 144 while (node->left) {
139 if (representation->maxCatCount() > 1) { 145 if (representation->maxCatCount() > 1) {
140 - int c = (int)representation->evaluate(image, node->featureIdx); 146 + int c = (int)representation->evaluate(m, node->featureIdx);
141 node = (node->subset[c >> 5] & (1 << (c & 31))) ? node->left : node->right; 147 node = (node->subset[c >> 5] & (1 << (c & 31))) ? node->left : node->right;
142 } else { 148 } else {
143 - double val = representation->evaluate(image, node->featureIdx); 149 + double val = representation->evaluate(m, node->featureIdx);
144 node = val <= node->threshold ? node->left : node->right; 150 node = val <= node->threshold ? node->left : node->right;
145 } 151 }
146 } 152 }
openbr/plugins/classification/cascade.cpp
@@ -152,11 +152,11 @@ class CascadeClassifier : public Classifier @@ -152,11 +152,11 @@ class CascadeClassifier : public Classifier
152 } 152 }
153 } 153 }
154 154
155 - float classify(const Mat &image, float *confidence) const 155 + float classify(const Mat &image, bool process, float *confidence) const
156 { 156 {
157 float stageConf = 0.0f; 157 float stageConf = 0.0f;
158 foreach (const Classifier *stage, stages) { 158 foreach (const Classifier *stage, stages) {
159 - float result = stage->classify(image, &stageConf); 159 + float result = stage->classify(image, process, &stageConf);
160 if (result == 0.0f) { 160 if (result == 0.0f) {
161 if (confidence) 161 if (confidence)
162 *confidence += stageConf; 162 *confidence += stageConf;
@@ -219,7 +219,7 @@ private: @@ -219,7 +219,7 @@ private:
219 if (!imgHandler.getPos(pos)) 219 if (!imgHandler.getPos(pos))
220 qFatal("Cannot get another positive sample!"); 220 qFatal("Cannot get another positive sample!");
221 221
222 - if (classify(pos, &confidence) > 0.0f) { 222 + if (classify(pos, true, &confidence) > 0.0f) {
223 printf("POS current samples: %d\r", images.size()); 223 printf("POS current samples: %d\r", images.size());
224 images.append(pos); 224 images.append(pos);
225 labels.append(1.0f); 225 labels.append(1.0f);
@@ -235,7 +235,7 @@ private: @@ -235,7 +235,7 @@ private:
235 if (!imgHandler.getNeg(neg)) 235 if (!imgHandler.getNeg(neg))
236 qFatal("Cannot get another negative sample!"); 236 qFatal("Cannot get another negative sample!");
237 237
238 - if (classify(neg, &confidence) > 0.0f) { 238 + if (classify(neg, true, &confidence) > 0.0f) {
239 printf("NEG current samples: %d\r", images.size() - posCount); 239 printf("NEG current samples: %d\r", images.size() - posCount);
240 images.append(neg); 240 images.append(neg);
241 labels.append(0.0f); 241 labels.append(0.0f);
openbr/plugins/imgproc/slidingwindow.cpp
@@ -53,12 +53,6 @@ class SlidingWindowTransform : public MetaTransform @@ -53,12 +53,6 @@ class SlidingWindowTransform : public MetaTransform
53 53
54 BR_PROPERTY(QString, model, "") 54 BR_PROPERTY(QString, model, "")
55 55
56 - void init()  
57 - {  
58 - QDataStream stream;  
59 - load(stream);  
60 - }  
61 -  
62 void train(const TemplateList &data) 56 void train(const TemplateList &data)
63 { 57 {
64 classifier->train(data.data(), File::get<float>(data, "Label", -1)); 58 classifier->train(data.data(), File::get<float>(data, "Label", -1));
@@ -90,8 +84,7 @@ class SlidingWindowTransform : public MetaTransform @@ -90,8 +84,7 @@ class SlidingWindowTransform : public MetaTransform
90 Mat m; 84 Mat m;
91 OpenCVUtils::cvtUChar(t[i], m); 85 OpenCVUtils::cvtUChar(t[i], m);
92 std::vector<Rect> rects; 86 std::vector<Rect> rects;
93 - std::vector<int> rejectLevels;  
94 - std::vector<double> levelWeights; 87 + std::vector<float> confidences;
95 88
96 if (maxObjectSize.height == 0 || maxObjectSize.width == 0) 89 if (maxObjectSize.height == 0 || maxObjectSize.width == 0)
97 maxObjectSize = m.size(); 90 maxObjectSize = m.size();
@@ -123,21 +116,23 @@ class SlidingWindowTransform : public MetaTransform @@ -123,21 +116,23 @@ class SlidingWindowTransform : public MetaTransform
123 for (int x = 0; x < processingRectSize.width; x += step) { 116 for (int x = 0; x < processingRectSize.width; x += step) {
124 Mat window = repImage(Rect(Point(x, y), Size(originalWindowSize.width + dx, originalWindowSize.height + dy))).clone(); 117 Mat window = repImage(Rect(Point(x, y), Size(originalWindowSize.width + dx, originalWindowSize.height + dy))).clone();
125 118
126 - float gypWeight;  
127 - int result = classifier->classify(window, &gypWeight); 119 + float confidence;
  120 + int result = classifier->classify(window, false, &confidence);
128 121
129 - if (12 - result < 4) { 122 + if (result == 1) {
130 rects.push_back(Rect(cvRound(x*factor), cvRound(y*factor), windowSize.width, windowSize.height)); 123 rects.push_back(Rect(cvRound(x*factor), cvRound(y*factor), windowSize.width, windowSize.height));
131 - rejectLevels.push_back(result);  
132 - levelWeights.push_back(gypWeight); 124 + confidences.push_back(confidence);
133 } 125 }
134 126
  127 + // Add ROC mode
  128 +
135 if (result == 0) 129 if (result == 0)
136 x += step; 130 x += step;
137 } 131 }
138 } 132 }
139 } 133 }
140 134
  135 + // groupRectangles(rects, confidences, eps);
141 groupRectangles(rects, rejectLevels, levelWeights, minNeighbors, eps); 136 groupRectangles(rects, rejectLevels, levelWeights, minNeighbors, eps);
142 137
143 if (!enrollAll && rects.empty()) 138 if (!enrollAll && rects.empty())