Commit f207c6884845d3d648d02b894bca78dcda01f900
Merge branch 'master' of https://github.com/biometrics/openbr
Showing
4 changed files
with
42 additions
and
20 deletions
openbr/openbr_plugin.cpp
| ... | ... | @@ -137,6 +137,8 @@ QVariant File::parse(const QString &value) |
| 137 | 137 | if (ok) return point; |
| 138 | 138 | const QRectF rect = QtUtils::toRect(value, &ok); |
| 139 | 139 | if (ok) return rect; |
| 140 | + const int i = value.toInt(&ok); | |
| 141 | + if (ok) return i; | |
| 140 | 142 | const float f = value.toFloat(&ok); |
| 141 | 143 | if (ok) return f; |
| 142 | 144 | return value; | ... | ... |
openbr/plugins/algorithms.cpp
| ... | ... | @@ -44,7 +44,7 @@ class AlgorithmsInitializer : public Initializer |
| 44 | 44 | Globals->abbreviations.insert("AgeEstimation", "AgeRegression"); |
| 45 | 45 | Globals->abbreviations.insert("FaceRecognition2", "{PP5Register+Affine(128,128,0.25,0.35)+Cvt(Gray)}+(Gradient+Bin(0,360,9,true))/(Blur(1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+LBP(1,2,true)+Bin(0,10,10,true))+Merge+Integral+RecursiveIntegralSampler(4,2,8,LDA(.98)+Normalize(L1))+Cat+PCA(768)+Normalize(L1)+Quantize:UCharL1"); |
| 46 | 46 | Globals->abbreviations.insert("CropFace", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.25,0.35)"); |
| 47 | - Globals->abbreviations.insert("4SF", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.33,0.45)+(Grid(10,10)+SIFTDescriptor(12)+ByRow)/(Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+LBP(1,2)+RectRegions(8,8,6,6)+Hist(59))+PCA(0.95)+Normalize(L2)+Dup(12)+RndSubspace(0.05,1)+LDA(0.98)+Cat+PCA(0.95)+Normalize(L1)+Quantize:NegativeLogPlusOne(ByteL1)"); | |
| 47 | + Globals->abbreviations.insert("4SF", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.33,0.45)+(Grid(10,10)+SIFTDescriptor(12)+ByRow)/(Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+LBP(1,2)+RectRegions(8,8,6,6)+Hist(59))+PCA(0.95)+Cat+Normalize(L2)+Dup(12)+RndSubspace(0.05,1)+LDA(0.98)+Cat+PCA(0.95)+Normalize(L1)+Quantize:NegativeLogPlusOne(ByteL1)"); | |
| 48 | 48 | |
| 49 | 49 | // Video |
| 50 | 50 | Globals->abbreviations.insert("DisplayVideo", "Stream(FPSLimit(30)+Show(false,[FrameNumber])+Discard)"); | ... | ... |
openbr/plugins/gallery.cpp
| ... | ... | @@ -506,38 +506,55 @@ BR_REGISTER(Gallery, csvGallery) |
| 506 | 506 | * \brief Treats each line as a file. |
| 507 | 507 | * \author Josh Klontz \cite jklontz |
| 508 | 508 | * |
| 509 | - * The entire line is treated as the file path. | |
| 509 | + * The entire line is treated as the file path. An optional label may be specified using a space ' ' separator: | |
| 510 | 510 | * |
| 511 | +\verbatim | |
| 512 | +<FILE> | |
| 513 | +<FILE> | |
| 514 | +... | |
| 515 | +<FILE> | |
| 516 | +\endverbatim | |
| 517 | + * or | |
| 518 | +\verbatim | |
| 519 | +<FILE> <LABEL> | |
| 520 | +<FILE> <LABEL> | |
| 521 | +... | |
| 522 | +<FILE> <LABEL> | |
| 523 | +\endverbatim | |
| 511 | 524 | * \see csvGallery |
| 512 | 525 | */ |
| 513 | 526 | class txtGallery : public Gallery |
| 514 | 527 | { |
| 515 | 528 | Q_OBJECT |
| 516 | - Q_PROPERTY(QString metadataKey READ get_metadataKey WRITE set_metadataKey RESET reset_metadataKey STORED false) | |
| 517 | - BR_PROPERTY(QString, metadataKey, "") | |
| 529 | + Q_PROPERTY(QString label READ get_label WRITE set_label RESET reset_label STORED false) | |
| 530 | + BR_PROPERTY(QString, label, "") | |
| 518 | 531 | |
| 519 | 532 | QStringList lines; |
| 520 | 533 | |
| 521 | 534 | ~txtGallery() |
| 522 | 535 | { |
| 523 | - if (!lines.isEmpty()) QtUtils::writeFile(file.name, lines); | |
| 536 | + if (!lines.isEmpty()) | |
| 537 | + QtUtils::writeFile(file.name, lines); | |
| 524 | 538 | } |
| 525 | 539 | |
| 526 | 540 | TemplateList readBlock(bool *done) |
| 527 | 541 | { |
| 528 | - *done = true; | |
| 529 | 542 | TemplateList templates; |
| 530 | - if (!file.exists()) return templates; | |
| 531 | - | |
| 532 | - foreach (const QString &line, QtUtils::readLines(file)) | |
| 533 | - templates.append(File(line)); | |
| 543 | + foreach (const QString &line, QtUtils::readLines(file)) { | |
| 544 | + int splitIndex = line.lastIndexOf(' '); | |
| 545 | + if (splitIndex == -1) templates.append(File(line)); | |
| 546 | + else templates.append(File(line.mid(0, splitIndex), line.mid(splitIndex+1))); | |
| 547 | + } | |
| 534 | 548 | *done = true; |
| 535 | 549 | return templates; |
| 536 | 550 | } |
| 537 | 551 | |
| 538 | 552 | void write(const Template &t) |
| 539 | 553 | { |
| 540 | - lines.append(metadataKey.isEmpty() ? t.file.flat() : t.file.get<QString>(metadataKey)); | |
| 554 | + QString line = t.file.name; | |
| 555 | + if (!label.isEmpty()) | |
| 556 | + line += " " + t.file.get<QString>(label); | |
| 557 | + lines.append(line); | |
| 541 | 558 | } |
| 542 | 559 | }; |
| 543 | 560 | |
| ... | ... | @@ -687,7 +704,9 @@ class dbGallery : public Gallery |
| 687 | 704 | if (!subset.isEmpty()) { |
| 688 | 705 | const QStringList &words = subset.split(":"); |
| 689 | 706 | QtUtils::checkArgsSize("Input", words, 2, 4); |
| 690 | - seed = QtUtils::toInt(words[0]); | |
| 707 | + if (words[0] == "train") seed = 0; | |
| 708 | + else if (words[0] == "test" ) seed = 1; | |
| 709 | + else seed = QtUtils::toInt(words[0]); | |
| 691 | 710 | if (words[1].startsWith('{') && words[1].endsWith('}')) { |
| 692 | 711 | foreach (const QString ®exp, words[1].mid(1, words[1].size()-2).split(",")) |
| 693 | 712 | metadataFields.append(QRegExp(regexp)); |
| ... | ... | @@ -813,16 +832,10 @@ class googleGallery : public Gallery |
| 813 | 832 | return templates; |
| 814 | 833 | } |
| 815 | 834 | |
| 816 | - void write(const Template &t) | |
| 835 | + void write(const Template &) | |
| 817 | 836 | { |
| 818 | - (void) t; | |
| 819 | 837 | qFatal("Not supported."); |
| 820 | 838 | } |
| 821 | - | |
| 822 | - void init() | |
| 823 | - { | |
| 824 | - // | |
| 825 | - } | |
| 826 | 839 | }; |
| 827 | 840 | |
| 828 | 841 | BR_REGISTER(Gallery, googleGallery) | ... | ... |
openbr/plugins/stream.cpp
| ... | ... | @@ -1285,11 +1285,18 @@ public: |
| 1285 | 1285 | qWarning("Attempted to train untrainable transform, nothing will happen."); |
| 1286 | 1286 | return; |
| 1287 | 1287 | } |
| 1288 | + QList<TemplateList> separated; | |
| 1289 | + foreach (const TemplateList & list, data) { | |
| 1290 | + foreach(const Template & t, list) { | |
| 1291 | + separated.append(TemplateList()); | |
| 1292 | + separated.last().append(t); | |
| 1293 | + } | |
| 1294 | + } | |
| 1288 | 1295 | |
| 1289 | 1296 | for (int i=0; i < transforms.size(); i++) { |
| 1290 | 1297 | // OK we have a trainable transform, we need to get input data for it. |
| 1291 | 1298 | if (transforms[i]->trainable) { |
| 1292 | - QList<TemplateList> copy = data; | |
| 1299 | + QList<TemplateList> copy = separated; | |
| 1293 | 1300 | // Project from the start to the trainable stage. |
| 1294 | 1301 | subProject(copy,i); |
| 1295 | 1302 | ... | ... |