Commit a7fbfd50b1b964c88a5aa8b1c277ba680dafe1af
Merge SlidingWindowTransform conflicts
Conflicts: openbr/plugins/slidingwindow.cpp
Showing
5 changed files
with
45 additions
and
20 deletions
openbr/openbr_plugin.cpp
| ... | ... | @@ -476,13 +476,18 @@ TemplateList TemplateList::fromGallery(const br::File &gallery) |
| 476 | 476 | |
| 477 | 477 | // indexes some property, assigns an integer id to each unique value of propName |
| 478 | 478 | // stores the index values in "Label" of the output template list |
| 479 | -TemplateList TemplateList::relabel(const TemplateList &tl, const QString & propName) | |
| 479 | +TemplateList TemplateList::relabel(const TemplateList &tl, const QString &propName, bool preserveIntegers) | |
| 480 | 480 | { |
| 481 | 481 | const QList<QString> originalLabels = File::get<QString>(tl, propName); |
| 482 | 482 | QHash<QString,int> labelTable; |
| 483 | - foreach (const QString & label, originalLabels) | |
| 484 | - if (!labelTable.contains(label)) | |
| 485 | - labelTable.insert(label, labelTable.size()); | |
| 483 | + foreach (const QString &label, originalLabels) | |
| 484 | + if (!labelTable.contains(label)) { | |
| 485 | + int value; bool ok; | |
| 486 | + value = label.toInt(&ok); | |
| 487 | + // If the label is already an integer value we don't want to change it. | |
| 488 | + if (ok && preserveIntegers) labelTable.insert(label, value); | |
| 489 | + else labelTable.insert(label, labelTable.size()); | |
| 490 | + } | |
| 486 | 491 | |
| 487 | 492 | TemplateList result = tl; |
| 488 | 493 | for (int i=0; i<result.size(); i++) | ... | ... |
openbr/openbr_plugin.h
| ... | ... | @@ -438,7 +438,7 @@ struct TemplateList : public QList<Template> |
| 438 | 438 | BR_EXPORT static TemplateList fromGallery(const File &gallery); /*!< \brief Create a template list from a br::Gallery. */ |
| 439 | 439 | |
| 440 | 440 | /*!< \brief Ensure labels are in the range [0,numClasses-1]. */ |
| 441 | - BR_EXPORT static TemplateList relabel(const TemplateList & tl, const QString & propName); | |
| 441 | + BR_EXPORT static TemplateList relabel(const TemplateList &tl, const QString &propName, bool preserveIntegers); | |
| 442 | 442 | |
| 443 | 443 | QList<int> indexProperty(const QString & propName, QHash<QString, int> * valueMap=NULL,QHash<int, QVariant> * reverseLookup = NULL) const; |
| 444 | 444 | QList<int> indexProperty(const QString & propName, QHash<QString, int> & valueMap, QHash<int, QVariant> & reverseLookup) const; | ... | ... |
openbr/plugins/eigen3.cpp
| ... | ... | @@ -317,7 +317,7 @@ class LDATransform : public Transform |
| 317 | 317 | void train(const TemplateList &_trainingSet) |
| 318 | 318 | { |
| 319 | 319 | // creates "Label" |
| 320 | - TemplateList trainingSet = TemplateList::relabel(_trainingSet, inputVariable); | |
| 320 | + TemplateList trainingSet = TemplateList::relabel(_trainingSet, inputVariable, isBinary); | |
| 321 | 321 | int instances = trainingSet.size(); |
| 322 | 322 | |
| 323 | 323 | // Perform PCA dimensionality reduction | ... | ... |
openbr/plugins/slidingwindow.cpp
| ... | ... | @@ -42,15 +42,15 @@ class SlidingWindowTransform : public MetaTransform |
| 42 | 42 | { |
| 43 | 43 | Q_OBJECT |
| 44 | 44 | Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false) |
| 45 | - Q_PROPERTY(int stepSize READ get_stepSize WRITE set_stepSize RESET reset_stepSize STORED false) | |
| 46 | - Q_PROPERTY(bool takeFirst READ get_takeFirst WRITE set_takeFirst RESET reset_takeFirst STORED false) | |
| 47 | 45 | Q_PROPERTY(int windowWidth READ get_windowWidth WRITE set_windowWidth RESET reset_windowWidth STORED false) |
| 46 | + Q_PROPERTY(bool takeFirst READ get_takeFirst WRITE set_takeFirst RESET reset_takeFirst STORED false) | |
| 48 | 47 | Q_PROPERTY(float threshold READ get_threshold WRITE set_threshold RESET reset_threshold STORED false) |
| 48 | + Q_PROPERTY(float stepFraction READ get_stepFraction WRITE set_stepFraction RESET reset_stepFraction STORED false) | |
| 49 | 49 | BR_PROPERTY(br::Transform *, transform, NULL) |
| 50 | - BR_PROPERTY(int, stepSize, 1) | |
| 51 | - BR_PROPERTY(bool, takeFirst, false) | |
| 52 | 50 | BR_PROPERTY(int, windowWidth, 24) |
| 51 | + BR_PROPERTY(bool, takeFirst, false) | |
| 53 | 52 | BR_PROPERTY(float, threshold, 0) |
| 53 | + BR_PROPERTY(float, stepFraction, 0.25) | |
| 54 | 54 | |
| 55 | 55 | private: |
| 56 | 56 | int windowHeight; |
| ... | ... | @@ -66,6 +66,19 @@ private: |
| 66 | 66 | } |
| 67 | 67 | } |
| 68 | 68 | |
| 69 | + void store(QDataStream &stream) const | |
| 70 | + { | |
| 71 | + transform->store(stream); | |
| 72 | + stream << windowHeight; | |
| 73 | + } | |
| 74 | + | |
| 75 | + void load(QDataStream &stream) | |
| 76 | + { | |
| 77 | + transform->load(stream); | |
| 78 | + stream >> windowHeight; | |
| 79 | + } | |
| 80 | + | |
| 81 | +protected: // Let IntegralSlidingWindowTransform access this | |
| 69 | 82 | void project(const Template &src, Template &dst) const |
| 70 | 83 | { |
| 71 | 84 | (void)src;(void)dst;qFatal("don't do that"); |
| ... | ... | @@ -100,21 +113,28 @@ private: |
| 100 | 113 | } |
| 101 | 114 | } |
| 102 | 115 | } |
| 116 | +}; | |
| 103 | 117 | |
| 104 | - void store(QDataStream &stream) const | |
| 105 | - { | |
| 106 | - transform->store(stream); | |
| 107 | - stream << windowHeight; | |
| 108 | - } | |
| 118 | +BR_REGISTER(Transform, SlidingWindowTransform) | |
| 109 | 119 | |
| 110 | - void load(QDataStream &stream) | |
| 120 | +/*! | |
| 121 | + * \ingroup transforms | |
| 122 | + * \brief Overloads SlidingWindowTransform for integral images that should be | |
| 123 | + * sampled at multiple scales. | |
| 124 | + * \author Josh Klontz \cite jklontz | |
| 125 | + */ | |
| 126 | +class IntegralSlidingWindowTransform : public SlidingWindowTransform | |
| 127 | +{ | |
| 128 | + Q_OBJECT | |
| 129 | + | |
| 130 | + void project(const Template &src, Template &dst) const | |
| 111 | 131 | { |
| 112 | - transform->load(stream); | |
| 113 | - stream >> windowHeight; | |
| 132 | + // TODO: call SlidingWindowTransform::project on multiple scales | |
| 133 | + SlidingWindowTransform::project(src, dst); | |
| 114 | 134 | } |
| 115 | 135 | }; |
| 116 | 136 | |
| 117 | -BR_REGISTER(Transform, SlidingWindowTransform) | |
| 137 | +BR_REGISTER(Transform, IntegralSlidingWindowTransform) | |
| 118 | 138 | |
| 119 | 139 | static TemplateList cropTrainingSamples(const TemplateList &data, const float aspectRatio, const int minSize = 32, const float maxOverlap = 0.5, const int negToPosRatio = 1) |
| 120 | 140 | { | ... | ... |
scripts/pedestrianBaselineLBP.sh
| ... | ... | @@ -13,7 +13,7 @@ fi |
| 13 | 13 | ALG="Open+Cvt(Gray)+Rename(neg,0)+BuildScales(Blur(2)+LBP(1,2)+SlidingWindow(Hist(59)+Cat+LDA(isBinary=true),windowWidth=10,takeLargestScale=false,threshold=2),windowWidth=10,takeLargestScale=false,minScale=4)+ConsolidateDetections+Discard" |
| 14 | 14 | |
| 15 | 15 | # Josh's new algorithm (in progress) |
| 16 | -# ALG2="Open+Cvt(Gray)+Detector(Gradient+Bin(0,360,9,true)+Merge+Integral+SlidingWindow(Identity))" | |
| 16 | +# ALG="Open+Cvt(Gray)+Detector(Gradient+Bin(0,360,9,true)+Merge+Integral+IntegralSlidingWindow(RecursiveIntegralSampler(2,2,0,PCA(0.95))+Cat+LDA(0.95,isBinary=true)))" | |
| 17 | 17 | |
| 18 | 18 | br -useGui 0 \ |
| 19 | 19 | -algorithm "${ALG}" \ | ... | ... |