Commit 7e7832fb823a4b838be95099fb50daa73d71a98c

Authored by Josh Klontz
1 parent d2d7f162

removed onlinerod

openbr/plugins/cluster/onlinerod.cpp deleted
1   -#include <openbr/plugins/openbr_internal.h>
2   -#include <openbr/core/cluster.h>
3   -#include <openbr/core/opencvutils.h>
4   -
5   -using namespace cv;
6   -
7   -namespace br
8   -{
9   -
10   -/*!
11   - * \brief Constructors clusters based on the Rank-Order distance in an online, incremental manner
12   - * \author Charles Otto \cite caotto
13   - * \author Jordan Cheney \cite JordanCheney
14   - * \br_property br::Distance* distance Distance to compute the similarity score between templates. Default is L2.
15   - * \br_property int kNN Maximum number of nearest neighbors to keep for each template. Default is 20.
16   - * \br_property float aggression Clustering aggresiveness. A higher value will result in larger clusters. Default is 10.
17   - * \br_property bool incremental If true, compute the clusters as each template is processed otherwise compute the templates at the end. Default is false.
18   - * \br_property QString evalOutput Path to store cluster informtation. Optional. Default is an empty string.
19   - * \br_paper Zhu et al.
20   - * "A Rank-Order Distance based Clustering Algorithm for Face Tagging"
21   - * CVPR 2011
22   - */
23   -class OnlineRODTransform : public TimeVaryingTransform
24   -{
25   - Q_OBJECT
26   - Q_PROPERTY(br::Distance *distance READ get_distance WRITE set_distance RESET reset_distance STORED true)
27   - Q_PROPERTY(int kNN READ get_kNN WRITE set_kNN RESET reset_kNN STORED false)
28   - Q_PROPERTY(float aggression READ get_aggression WRITE set_aggression RESET reset_aggression STORED false)
29   - Q_PROPERTY(bool incremental READ get_incremental WRITE set_incremental RESET reset_incremental STORED false)
30   - Q_PROPERTY(QString evalOutput READ get_evalOutput WRITE set_evalOutput RESET reset_evalOutput STORED false)
31   -
32   - BR_PROPERTY(br::Distance*, distance, Distance::make(".Dist(L2)",this))
33   - BR_PROPERTY(int, kNN, 20)
34   - BR_PROPERTY(float, aggression, 10)
35   - BR_PROPERTY(bool, incremental, false)
36   - BR_PROPERTY(QString, evalOutput, "")
37   -
38   - TemplateList templates;
39   - Neighborhood neighborhood;
40   -
41   -public:
42   - OnlineRODTransform() : TimeVaryingTransform(false, false) {}
43   -
44   -private:
45   - void projectUpdate(const TemplateList &src, TemplateList &dst)
46   - {
47   - // update current graph
48   - foreach(const Template &t, src) {
49   - QList<float> scores = distance->compare(templates, t);
50   -
51   - // attempt to udpate each existing point's (sorted) k-NN list with these results.
52   - Neighbors currentN;
53   - for (int i=0; i < scores.size(); i++) {
54   - currentN.append(Neighbor(i, scores[i]));
55   - Neighbors target = neighborhood[i];
56   -
57   - // should we insert the new neighbor into the current target's list?
58   - if (target.size() < kNN || scores[i] > target.last().second) {
59   - // insert into the sorted nearest neighbor list
60   - Neighbor temp(scores.size(), scores[i]);
61   - br::Neighbors::iterator res = qLowerBound(target.begin(), target.end(), temp, compareNeighbors);
62   - target.insert(res, temp);
63   -
64   - if (target.size() > kNN)
65   - target.removeLast();
66   -
67   - neighborhood[i] = target;
68   - }
69   - }
70   -
71   - // add a new row, consisting of the top neighbors of the newest point
72   - int actuallyKeep = std::min(kNN, currentN.size());
73   - std::partial_sort(currentN.begin(), currentN.begin()+actuallyKeep, currentN.end(), compareNeighbors);
74   -
75   - Neighbors selected = currentN.mid(0, actuallyKeep);
76   - neighborhood.append(selected);
77   - templates.append(t);
78   - }
79   -
80   - if (incremental)
81   - identifyClusters(dst);
82   - }
83   -
84   - void finalize(TemplateList &output)
85   - {
86   - if (!templates.empty()) {
87   - identifyClusters(output);
88   - templates.clear();
89   - neighborhood.clear();
90   - }
91   - }
92   -
93   - void identifyClusters(TemplateList &dst)
94   - {
95   - Clusters clusters = ClusterGraph(neighborhood, aggression, evalOutput);
96   - if (Globals->verbose)
97   - qDebug("Built %d clusters from %d templates", clusters.size(), templates.size());
98   -
99   - for (int i = 0; i < clusters.size(); i++) {
100   - // Calculate the centroid of each cluster
101   - Mat center = Mat::zeros(templates[0].m().rows, templates[0].m().cols, CV_32F);
102   - foreach (int t, clusters[i]) {
103   - Mat converted; templates[t].m().convertTo(converted, CV_32F);
104   - center += converted;
105   - }
106   - center /= clusters[i].size();
107   -
108   - // Calculate the Euclidean distance from the center to use as the cluster confidence
109   - foreach (int t, clusters[i]) {
110   - templates[t].file.set("Cluster", i);
111   - Mat c; templates[t].m().convertTo(c, CV_32F);
112   - Mat p; pow(c - center, 2, p);
113   - templates[t].file.set("ClusterConfidence", sqrt(sum(p)[0]));
114   - }
115   - }
116   - dst.append(templates);
117   - }
118   -};
119   -
120   -BR_REGISTER(Transform, OnlineRODTransform)
121   -
122   -} // namespace br
123   -
124   -#include "onlinerod.moc"
125   -