Commit 3e2bb59573adce9615bdcc9b783aabb98e3c8ed3
1 parent
d7b36b93
fixed you tube face sorting issue
Showing
2 changed files
with
30 additions
and
6 deletions
sdk/core/core.cpp
| ... | ... | @@ -259,7 +259,7 @@ private: |
| 259 | 259 | if (Globals->abbreviations.contains(description)) |
| 260 | 260 | return init(Globals->abbreviations[description]); |
| 261 | 261 | |
| 262 | - QStringList words = description.split(':'); | |
| 262 | + QStringList words = QtUtils::parse(description, ':'); | |
| 263 | 263 | if (words.size() > 2) qFatal("Invalid algorithm format."); |
| 264 | 264 | |
| 265 | 265 | transform = QSharedPointer<Transform>(Transform::make(words[0], NULL)); | ... | ... |
sdk/plugins/youtube.cpp
| 1 | 1 | #include <openbr_plugin.h> |
| 2 | 2 | |
| 3 | +#include "core/common.h" | |
| 4 | + | |
| 3 | 5 | namespace br |
| 4 | 6 | { |
| 5 | 7 | |
| ... | ... | @@ -24,20 +26,22 @@ class YouTubeFacesDBTransform : public UntrainableMetaTransform |
| 24 | 26 | distance = Distance::fromAlgorithm(algorithm); |
| 25 | 27 | } |
| 26 | 28 | |
| 27 | - void project(const Template &src, Template &dst) const | |
| 29 | + void project(const TemplateList &src, TemplateList &dst) const | |
| 28 | 30 | { |
| 29 | - dst = src; | |
| 30 | - | |
| 31 | - // First input is the header in 'splits.txt' | |
| 32 | - if (src.file.getInt("Index") == 0) return; | |
| 31 | + Transform::project(src.mid(1) /* First template is the header in 'splits.txt' */, dst); | |
| 32 | + } | |
| 33 | 33 | |
| 34 | + void project(const Template &src, Template &dst) const | |
| 35 | + { | |
| 34 | 36 | const QStringList words = src.file.name.split(", "); |
| 35 | 37 | dst.file.name = words[0] + "_" + words[1] + "_" + words[4] + ".mtx"; |
| 36 | 38 | |
| 37 | 39 | TemplateList queryTemplates = TemplateList::fromGallery(File(words[2]).resolved()); |
| 40 | + sort(queryTemplates); | |
| 38 | 41 | queryTemplates >> *transform; |
| 39 | 42 | |
| 40 | 43 | TemplateList targetTemplates = TemplateList::fromGallery(File(words[3]).resolved()); |
| 44 | + sort(targetTemplates); | |
| 41 | 45 | targetTemplates >> *transform; |
| 42 | 46 | |
| 43 | 47 | QScopedPointer<MatrixOutput> memoryOutput(MatrixOutput::make(targetTemplates.files(), queryTemplates.files())); |
| ... | ... | @@ -46,6 +50,26 @@ class YouTubeFacesDBTransform : public UntrainableMetaTransform |
| 46 | 50 | dst.clear(); |
| 47 | 51 | dst.m() = memoryOutput.data()->data; |
| 48 | 52 | } |
| 53 | + | |
| 54 | + static void sort(TemplateList &templates) | |
| 55 | + { | |
| 56 | + // The file names in the YouTube Faces Database make it very difficult | |
| 57 | + // for them to be ordered by frame number automatically, | |
| 58 | + // hence we do it manually here. | |
| 59 | + QList<int> frames; | |
| 60 | + foreach (const Template &t, templates) { | |
| 61 | + QStringList words = t.file.name.split('.'); | |
| 62 | + frames.append(words[words.size()-2].toInt()); | |
| 63 | + } | |
| 64 | + | |
| 65 | + typedef QPair<int,int> SortedFrame; // <frame number, original index> | |
| 66 | + QList<SortedFrame> sortedFrames = Common::Sort(frames); | |
| 67 | + TemplateList sortedTemplates; sortedTemplates.reserve(templates.size()); | |
| 68 | + foreach (const SortedFrame &sortedFrame, sortedFrames) | |
| 69 | + sortedTemplates.append(templates[sortedFrame.second]); | |
| 70 | + | |
| 71 | + templates = sortedTemplates; | |
| 72 | + } | |
| 49 | 73 | }; |
| 50 | 74 | |
| 51 | 75 | BR_REGISTER(Transform, YouTubeFacesDBTransform) | ... | ... |