Commit 4b34805ad82c6d5a9fbdd19015f8bde7e14c1401

Authored by Josh Klontz
1 parent e3b09a68

added IUM bins

Showing 1 changed file with 32 additions and 9 deletions
sdk/plugins/quality.cpp
... ... @@ -15,37 +15,60 @@ namespace br
15 15 class IUMTransform : public Transform
16 16 {
17 17 Q_OBJECT
18   - Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance)
  18 + Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false)
  19 + Q_PROPERTY(double mean READ get_mean WRITE set_mean RESET reset_mean)
  20 + Q_PROPERTY(double stddev READ get_stddev WRITE set_stddev RESET reset_stddev)
19 21 BR_PROPERTY(br::Distance*, distance, Factory<Distance>::make(".Dist(L2)"))
  22 + BR_PROPERTY(double, mean, 0)
  23 + BR_PROPERTY(double, stddev, 1)
20 24 br::TemplateList impostors;
21 25  
  26 + float calculateIUM(const Template &probe, const TemplateList &gallery) const
  27 + {
  28 + QList<float> scores = distance->compare(gallery, probe);
  29 + float min, max;
  30 + Common::MinMax(scores, &min, &max);
  31 + double mean;
  32 + Common::Mean(scores, &mean);
  33 + return (max-mean)/(max-min);
  34 + }
  35 +
22 36 void train(const TemplateList &data)
23 37 {
24 38 distance->train(data);
25 39 impostors = data;
  40 +
  41 + QList<float> iums; iums.reserve(impostors.size());
  42 + QList<int> labels = impostors.labels<int>();
  43 + for (int i=0; i<data.size(); i++) {
  44 + TemplateList subset = impostors;
  45 + for (int j=subset.size()-1; j>=0; j--)
  46 + if (labels[j] == labels[i])
  47 + subset.removeAt(j);
  48 + iums.append(calculateIUM(impostors[i], subset));
  49 + }
  50 +
  51 + Common::MeanStdDev(iums, &mean, &stddev);
26 52 }
27 53  
28 54 void project(const Template &src, Template &dst) const
29 55 {
30   - QList<float> scores = distance->compare(impostors, src);
31   - float min, max;
32   - Common::MinMax(scores, &min, &max);
33   - double mean;
34   - Common::Mean(scores, &mean);
35 56 dst = src;
36   - dst.file.insert("IUM", float((max-mean)/(max-min)));
  57 + float ium = calculateIUM(src, impostors);
  58 + dst.file.insert("IUM", ium);
  59 + dst.file.insert("IUM_Bin", ium < mean-stddev ? 0 : (ium < mean+stddev ? 1 : 2));
37 60 }
38 61  
39 62 void store(QDataStream &stream) const
40 63 {
41 64 distance->store(stream);
42   - stream << impostors;
  65 + stream << mean << stddev << impostors;
43 66 }
44 67  
45 68 void load(QDataStream &stream)
46 69 {
47 70 distance->load(stream);
48   - stream >> impostors;
  71 + stream >> mean >> stddev >> impostors;
49 72 }
50 73 };
51 74  
... ...