Commit 3d27a527054b1f8a6b020d129f6aff9bf93524c1

Authored by Scott Klum
2 parents 92f65021 68b85a6a

Merge branch 'master' of https://github.com/biometrics/openbr

app/br/br.cpp
@@ -138,8 +138,8 @@ public: @@ -138,8 +138,8 @@ public:
138 check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'evalDetection'."); 138 check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'evalDetection'.");
139 br_eval_detection(parv[0], parv[1], parc == 3 ? parv[2] : ""); 139 br_eval_detection(parv[0], parv[1], parc == 3 ? parv[2] : "");
140 } else if (!strcmp(fun, "evalLandmarking")) { 140 } else if (!strcmp(fun, "evalLandmarking")) {
141 - check((parc >= 2) && (parc <= 3), "Incorrect parameter count for 'evalLandmarking'.");  
142 - br_eval_detection(parv[0], parv[1], parc == 3 ? parv[2] : ""); 141 + check((parc >= 2) && (parc <= 5), "Incorrect parameter count for 'evalLandmarking'.");
  142 + br_eval_landmarking(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? atoi(parv[3]) : 0, parc >= 5 ? atoi(parv[4]) : 1);
143 } else if (!strcmp(fun, "evalRegression")) { 143 } else if (!strcmp(fun, "evalRegression")) {
144 check(parc >= 2 && parc <= 4, "Incorrect parameter count for 'evalRegression'."); 144 check(parc >= 2 && parc <= 4, "Incorrect parameter count for 'evalRegression'.");
145 br_eval_regression(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? parv[3] : ""); 145 br_eval_regression(parv[0], parv[1], parc >= 3 ? parv[2] : "", parc >= 4 ? parv[3] : "");
@@ -221,7 +221,7 @@ private: @@ -221,7 +221,7 @@ private:
221 "-evalClassification <predicted_gallery> <truth_gallery> <predicted property name> <ground truth proprty name>\n" 221 "-evalClassification <predicted_gallery> <truth_gallery> <predicted property name> <ground truth proprty name>\n"
222 "-evalClustering <clusters> <gallery>\n" 222 "-evalClustering <clusters> <gallery>\n"
223 "-evalDetection <predicted_gallery> <truth_gallery> [{csv}]\n" 223 "-evalDetection <predicted_gallery> <truth_gallery> [{csv}]\n"
224 - "-evalLandmarking <predicted_gallery> <truth_gallery> [{csv}]\n" 224 + "-evalLandmarking <predicted_gallery> <truth_gallery> [{csv} [<normalization_index_a> <normalization_index_b>]]\n"
225 "-evalRegression <predicted_gallery> <truth_gallery> <predicted property name> <ground truth property name>\n" 225 "-evalRegression <predicted_gallery> <truth_gallery> <predicted property name> <ground truth property name>\n"
226 "-plotDetection <file> ... <file> {destination}\n" 226 "-plotDetection <file> ... <file> {destination}\n"
227 "-plotMetadata <file> ... <file> <columns>\n" 227 "-plotMetadata <file> ... <file> <columns>\n"
data/KTH/test_9ppl.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<biometric-signature-set>
  3 + <biometric-signature name="boxing17-1">
  4 + <presentation Label="boxing" file-name="boxing/person17_boxing_d1_uncomp.avi" />
  5 + </biometric-signature>
  6 + <biometric-signature name="boxing17-2">
  7 + <presentation Label="boxing" file-name="boxing/person17_boxing_d2_uncomp.avi" />
  8 + </biometric-signature>
  9 + <biometric-signature name="boxing17-3">
  10 + <presentation Label="boxing" file-name="boxing/person17_boxing_d3_uncomp.avi" />
  11 + </biometric-signature>
  12 + <biometric-signature name="boxing17-4">
  13 + <presentation Label="boxing" file-name="boxing/person17_boxing_d4_uncomp.avi" />
  14 + </biometric-signature>
  15 + <biometric-signature name="boxing18-1">
  16 + <presentation Label="boxing" file-name="boxing/person18_boxing_d1_uncomp.avi" />
  17 + </biometric-signature>
  18 + <biometric-signature name="boxing18-2">
  19 + <presentation Label="boxing" file-name="boxing/person18_boxing_d2_uncomp.avi" />
  20 + </biometric-signature>
  21 + <biometric-signature name="boxing18-3">
  22 + <presentation Label="boxing" file-name="boxing/person18_boxing_d3_uncomp.avi" />
  23 + </biometric-signature>
  24 + <biometric-signature name="boxing18-4">
  25 + <presentation Label="boxing" file-name="boxing/person18_boxing_d4_uncomp.avi" />
  26 + </biometric-signature>
  27 + <biometric-signature name="boxing19-1">
  28 + <presentation Label="boxing" file-name="boxing/person19_boxing_d1_uncomp.avi" />
  29 + </biometric-signature>
  30 + <biometric-signature name="boxing19-2">
  31 + <presentation Label="boxing" file-name="boxing/person19_boxing_d2_uncomp.avi" />
  32 + </biometric-signature>
  33 + <biometric-signature name="boxing19-3">
  34 + <presentation Label="boxing" file-name="boxing/person19_boxing_d3_uncomp.avi" />
  35 + </biometric-signature>
  36 + <biometric-signature name="boxing19-4">
  37 + <presentation Label="boxing" file-name="boxing/person19_boxing_d4_uncomp.avi" />
  38 + </biometric-signature>
  39 + <biometric-signature name="boxing20-1">
  40 + <presentation Label="boxing" file-name="boxing/person20_boxing_d1_uncomp.avi" />
  41 + </biometric-signature>
  42 + <biometric-signature name="boxing20-2">
  43 + <presentation Label="boxing" file-name="boxing/person20_boxing_d2_uncomp.avi" />
  44 + </biometric-signature>
  45 + <biometric-signature name="boxing20-3">
  46 + <presentation Label="boxing" file-name="boxing/person20_boxing_d3_uncomp.avi" />
  47 + </biometric-signature>
  48 + <biometric-signature name="boxing20-4">
  49 + <presentation Label="boxing" file-name="boxing/person20_boxing_d4_uncomp.avi" />
  50 + </biometric-signature>
  51 + <biometric-signature name="boxing21-1">
  52 + <presentation Label="boxing" file-name="boxing/person21_boxing_d1_uncomp.avi" />
  53 + </biometric-signature>
  54 + <biometric-signature name="boxing21-2">
  55 + <presentation Label="boxing" file-name="boxing/person21_boxing_d2_uncomp.avi" />
  56 + </biometric-signature>
  57 + <biometric-signature name="boxing21-3">
  58 + <presentation Label="boxing" file-name="boxing/person21_boxing_d3_uncomp.avi" />
  59 + </biometric-signature>
  60 + <biometric-signature name="boxing21-4">
  61 + <presentation Label="boxing" file-name="boxing/person21_boxing_d4_uncomp.avi" />
  62 + </biometric-signature>
  63 + <biometric-signature name="boxing22-1">
  64 + <presentation Label="boxing" file-name="boxing/person22_boxing_d1_uncomp.avi" />
  65 + </biometric-signature>
  66 + <biometric-signature name="boxing22-2">
  67 + <presentation Label="boxing" file-name="boxing/person22_boxing_d2_uncomp.avi" />
  68 + </biometric-signature>
  69 + <biometric-signature name="boxing22-3">
  70 + <presentation Label="boxing" file-name="boxing/person22_boxing_d3_uncomp.avi" />
  71 + </biometric-signature>
  72 + <biometric-signature name="boxing22-4">
  73 + <presentation Label="boxing" file-name="boxing/person22_boxing_d4_uncomp.avi" />
  74 + </biometric-signature>
  75 + <biometric-signature name="boxing23-1">
  76 + <presentation Label="boxing" file-name="boxing/person23_boxing_d1_uncomp.avi" />
  77 + </biometric-signature>
  78 + <biometric-signature name="boxing23-2">
  79 + <presentation Label="boxing" file-name="boxing/person23_boxing_d2_uncomp.avi" />
  80 + </biometric-signature>
  81 + <biometric-signature name="boxing23-3">
  82 + <presentation Label="boxing" file-name="boxing/person23_boxing_d3_uncomp.avi" />
  83 + </biometric-signature>
  84 + <biometric-signature name="boxing23-4">
  85 + <presentation Label="boxing" file-name="boxing/person23_boxing_d4_uncomp.avi" />
  86 + </biometric-signature>
  87 + <biometric-signature name="boxing24-1">
  88 + <presentation Label="boxing" file-name="boxing/person24_boxing_d1_uncomp.avi" />
  89 + </biometric-signature>
  90 + <biometric-signature name="boxing24-2">
  91 + <presentation Label="boxing" file-name="boxing/person24_boxing_d2_uncomp.avi" />
  92 + </biometric-signature>
  93 + <biometric-signature name="boxing24-3">
  94 + <presentation Label="boxing" file-name="boxing/person24_boxing_d3_uncomp.avi" />
  95 + </biometric-signature>
  96 + <biometric-signature name="boxing24-4">
  97 + <presentation Label="boxing" file-name="boxing/person24_boxing_d4_uncomp.avi" />
  98 + </biometric-signature>
  99 + <biometric-signature name="boxing25-1">
  100 + <presentation Label="boxing" file-name="boxing/person25_boxing_d1_uncomp.avi" />
  101 + </biometric-signature>
  102 + <biometric-signature name="boxing25-2">
  103 + <presentation Label="boxing" file-name="boxing/person25_boxing_d2_uncomp.avi" />
  104 + </biometric-signature>
  105 + <biometric-signature name="boxing25-3">
  106 + <presentation Label="boxing" file-name="boxing/person25_boxing_d3_uncomp.avi" />
  107 + </biometric-signature>
  108 + <biometric-signature name="boxing25-4">
  109 + <presentation Label="boxing" file-name="boxing/person25_boxing_d4_uncomp.avi" />
  110 + </biometric-signature>
  111 + <biometric-signature name="handclapping17-1">
  112 + <presentation Label="handclapping" file-name="handclapping/person17_handclapping_d1_uncomp.avi" />
  113 + </biometric-signature>
  114 + <biometric-signature name="handclapping17-2">
  115 + <presentation Label="handclapping" file-name="handclapping/person17_handclapping_d2_uncomp.avi" />
  116 + </biometric-signature>
  117 + <biometric-signature name="handclapping17-3">
  118 + <presentation Label="handclapping" file-name="handclapping/person17_handclapping_d3_uncomp.avi" />
  119 + </biometric-signature>
  120 + <biometric-signature name="handclapping17-4">
  121 + <presentation Label="handclapping" file-name="handclapping/person17_handclapping_d4_uncomp.avi" />
  122 + </biometric-signature>
  123 + <biometric-signature name="handclapping18-1">
  124 + <presentation Label="handclapping" file-name="handclapping/person18_handclapping_d1_uncomp.avi" />
  125 + </biometric-signature>
  126 + <biometric-signature name="handclapping18-2">
  127 + <presentation Label="handclapping" file-name="handclapping/person18_handclapping_d2_uncomp.avi" />
  128 + </biometric-signature>
  129 + <biometric-signature name="handclapping18-3">
  130 + <presentation Label="handclapping" file-name="handclapping/person18_handclapping_d3_uncomp.avi" />
  131 + </biometric-signature>
  132 + <biometric-signature name="handclapping18-4">
  133 + <presentation Label="handclapping" file-name="handclapping/person18_handclapping_d4_uncomp.avi" />
  134 + </biometric-signature>
  135 + <biometric-signature name="handclapping19-1">
  136 + <presentation Label="handclapping" file-name="handclapping/person19_handclapping_d1_uncomp.avi" />
  137 + </biometric-signature>
  138 + <biometric-signature name="handclapping19-2">
  139 + <presentation Label="handclapping" file-name="handclapping/person19_handclapping_d2_uncomp.avi" />
  140 + </biometric-signature>
  141 + <biometric-signature name="handclapping19-3">
  142 + <presentation Label="handclapping" file-name="handclapping/person19_handclapping_d3_uncomp.avi" />
  143 + </biometric-signature>
  144 + <biometric-signature name="handclapping19-4">
  145 + <presentation Label="handclapping" file-name="handclapping/person19_handclapping_d4_uncomp.avi" />
  146 + </biometric-signature>
  147 + <biometric-signature name="handclapping20-1">
  148 + <presentation Label="handclapping" file-name="handclapping/person20_handclapping_d1_uncomp.avi" />
  149 + </biometric-signature>
  150 + <biometric-signature name="handclapping20-2">
  151 + <presentation Label="handclapping" file-name="handclapping/person20_handclapping_d2_uncomp.avi" />
  152 + </biometric-signature>
  153 + <biometric-signature name="handclapping20-3">
  154 + <presentation Label="handclapping" file-name="handclapping/person20_handclapping_d3_uncomp.avi" />
  155 + </biometric-signature>
  156 + <biometric-signature name="handclapping20-4">
  157 + <presentation Label="handclapping" file-name="handclapping/person20_handclapping_d4_uncomp.avi" />
  158 + </biometric-signature>
  159 + <biometric-signature name="handclapping21-1">
  160 + <presentation Label="handclapping" file-name="handclapping/person21_handclapping_d1_uncomp.avi" />
  161 + </biometric-signature>
  162 + <biometric-signature name="handclapping21-2">
  163 + <presentation Label="handclapping" file-name="handclapping/person21_handclapping_d2_uncomp.avi" />
  164 + </biometric-signature>
  165 + <biometric-signature name="handclapping21-3">
  166 + <presentation Label="handclapping" file-name="handclapping/person21_handclapping_d3_uncomp.avi" />
  167 + </biometric-signature>
  168 + <biometric-signature name="handclapping21-4">
  169 + <presentation Label="handclapping" file-name="handclapping/person21_handclapping_d4_uncomp.avi" />
  170 + </biometric-signature>
  171 + <biometric-signature name="handclapping22-1">
  172 + <presentation Label="handclapping" file-name="handclapping/person22_handclapping_d1_uncomp.avi" />
  173 + </biometric-signature>
  174 + <biometric-signature name="handclapping22-2">
  175 + <presentation Label="handclapping" file-name="handclapping/person22_handclapping_d2_uncomp.avi" />
  176 + </biometric-signature>
  177 + <biometric-signature name="handclapping22-3">
  178 + <presentation Label="handclapping" file-name="handclapping/person22_handclapping_d3_uncomp.avi" />
  179 + </biometric-signature>
  180 + <biometric-signature name="handclapping22-4">
  181 + <presentation Label="handclapping" file-name="handclapping/person22_handclapping_d4_uncomp.avi" />
  182 + </biometric-signature>
  183 + <biometric-signature name="handclapping23-1">
  184 + <presentation Label="handclapping" file-name="handclapping/person23_handclapping_d1_uncomp.avi" />
  185 + </biometric-signature>
  186 + <biometric-signature name="handclapping23-2">
  187 + <presentation Label="handclapping" file-name="handclapping/person23_handclapping_d2_uncomp.avi" />
  188 + </biometric-signature>
  189 + <biometric-signature name="handclapping23-3">
  190 + <presentation Label="handclapping" file-name="handclapping/person23_handclapping_d3_uncomp.avi" />
  191 + </biometric-signature>
  192 + <biometric-signature name="handclapping23-4">
  193 + <presentation Label="handclapping" file-name="handclapping/person23_handclapping_d4_uncomp.avi" />
  194 + </biometric-signature>
  195 + <biometric-signature name="handclapping24-1">
  196 + <presentation Label="handclapping" file-name="handclapping/person24_handclapping_d1_uncomp.avi" />
  197 + </biometric-signature>
  198 + <biometric-signature name="handclapping24-2">
  199 + <presentation Label="handclapping" file-name="handclapping/person24_handclapping_d2_uncomp.avi" />
  200 + </biometric-signature>
  201 + <biometric-signature name="handclapping24-3">
  202 + <presentation Label="handclapping" file-name="handclapping/person24_handclapping_d3_uncomp.avi" />
  203 + </biometric-signature>
  204 + <biometric-signature name="handclapping24-4">
  205 + <presentation Label="handclapping" file-name="handclapping/person24_handclapping_d4_uncomp.avi" />
  206 + </biometric-signature>
  207 + <biometric-signature name="handclapping25-1">
  208 + <presentation Label="handclapping" file-name="handclapping/person25_handclapping_d1_uncomp.avi" />
  209 + </biometric-signature>
  210 + <biometric-signature name="handclapping25-2">
  211 + <presentation Label="handclapping" file-name="handclapping/person25_handclapping_d2_uncomp.avi" />
  212 + </biometric-signature>
  213 + <biometric-signature name="handclapping25-3">
  214 + <presentation Label="handclapping" file-name="handclapping/person25_handclapping_d3_uncomp.avi" />
  215 + </biometric-signature>
  216 + <biometric-signature name="handclapping25-4">
  217 + <presentation Label="handclapping" file-name="handclapping/person25_handclapping_d4_uncomp.avi" />
  218 + </biometric-signature>
  219 + <biometric-signature name="handwaving17-1">
  220 + <presentation Label="handwaving" file-name="handwaving/person17_handwaving_d1_uncomp.avi" />
  221 + </biometric-signature>
  222 + <biometric-signature name="handwaving17-2">
  223 + <presentation Label="handwaving" file-name="handwaving/person17_handwaving_d2_uncomp.avi" />
  224 + </biometric-signature>
  225 + <biometric-signature name="handwaving17-3">
  226 + <presentation Label="handwaving" file-name="handwaving/person17_handwaving_d3_uncomp.avi" />
  227 + </biometric-signature>
  228 + <biometric-signature name="handwaving17-4">
  229 + <presentation Label="handwaving" file-name="handwaving/person17_handwaving_d4_uncomp.avi" />
  230 + </biometric-signature>
  231 + <biometric-signature name="handwaving18-1">
  232 + <presentation Label="handwaving" file-name="handwaving/person18_handwaving_d1_uncomp.avi" />
  233 + </biometric-signature>
  234 + <biometric-signature name="handwaving18-2">
  235 + <presentation Label="handwaving" file-name="handwaving/person18_handwaving_d2_uncomp.avi" />
  236 + </biometric-signature>
  237 + <biometric-signature name="handwaving18-3">
  238 + <presentation Label="handwaving" file-name="handwaving/person18_handwaving_d3_uncomp.avi" />
  239 + </biometric-signature>
  240 + <biometric-signature name="handwaving18-4">
  241 + <presentation Label="handwaving" file-name="handwaving/person18_handwaving_d4_uncomp.avi" />
  242 + </biometric-signature>
  243 + <biometric-signature name="handwaving19-1">
  244 + <presentation Label="handwaving" file-name="handwaving/person19_handwaving_d1_uncomp.avi" />
  245 + </biometric-signature>
  246 + <biometric-signature name="handwaving19-2">
  247 + <presentation Label="handwaving" file-name="handwaving/person19_handwaving_d2_uncomp.avi" />
  248 + </biometric-signature>
  249 + <biometric-signature name="handwaving19-3">
  250 + <presentation Label="handwaving" file-name="handwaving/person19_handwaving_d3_uncomp.avi" />
  251 + </biometric-signature>
  252 + <biometric-signature name="handwaving19-4">
  253 + <presentation Label="handwaving" file-name="handwaving/person19_handwaving_d4_uncomp.avi" />
  254 + </biometric-signature>
  255 + <biometric-signature name="handwaving20-1">
  256 + <presentation Label="handwaving" file-name="handwaving/person20_handwaving_d1_uncomp.avi" />
  257 + </biometric-signature>
  258 + <biometric-signature name="handwaving20-2">
  259 + <presentation Label="handwaving" file-name="handwaving/person20_handwaving_d2_uncomp.avi" />
  260 + </biometric-signature>
  261 + <biometric-signature name="handwaving20-3">
  262 + <presentation Label="handwaving" file-name="handwaving/person20_handwaving_d3_uncomp.avi" />
  263 + </biometric-signature>
  264 + <biometric-signature name="handwaving20-4">
  265 + <presentation Label="handwaving" file-name="handwaving/person20_handwaving_d4_uncomp.avi" />
  266 + </biometric-signature>
  267 + <biometric-signature name="handwaving21-1">
  268 + <presentation Label="handwaving" file-name="handwaving/person21_handwaving_d1_uncomp.avi" />
  269 + </biometric-signature>
  270 + <biometric-signature name="handwaving21-2">
  271 + <presentation Label="handwaving" file-name="handwaving/person21_handwaving_d2_uncomp.avi" />
  272 + </biometric-signature>
  273 + <biometric-signature name="handwaving21-3">
  274 + <presentation Label="handwaving" file-name="handwaving/person21_handwaving_d3_uncomp.avi" />
  275 + </biometric-signature>
  276 + <biometric-signature name="handwaving21-4">
  277 + <presentation Label="handwaving" file-name="handwaving/person21_handwaving_d4_uncomp.avi" />
  278 + </biometric-signature>
  279 + <biometric-signature name="handwaving22-1">
  280 + <presentation Label="handwaving" file-name="handwaving/person22_handwaving_d1_uncomp.avi" />
  281 + </biometric-signature>
  282 + <biometric-signature name="handwaving22-2">
  283 + <presentation Label="handwaving" file-name="handwaving/person22_handwaving_d2_uncomp.avi" />
  284 + </biometric-signature>
  285 + <biometric-signature name="handwaving22-3">
  286 + <presentation Label="handwaving" file-name="handwaving/person22_handwaving_d3_uncomp.avi" />
  287 + </biometric-signature>
  288 + <biometric-signature name="handwaving22-4">
  289 + <presentation Label="handwaving" file-name="handwaving/person22_handwaving_d4_uncomp.avi" />
  290 + </biometric-signature>
  291 + <biometric-signature name="handwaving23-1">
  292 + <presentation Label="handwaving" file-name="handwaving/person23_handwaving_d1_uncomp.avi" />
  293 + </biometric-signature>
  294 + <biometric-signature name="handwaving23-2">
  295 + <presentation Label="handwaving" file-name="handwaving/person23_handwaving_d2_uncomp.avi" />
  296 + </biometric-signature>
  297 + <biometric-signature name="handwaving23-3">
  298 + <presentation Label="handwaving" file-name="handwaving/person23_handwaving_d3_uncomp.avi" />
  299 + </biometric-signature>
  300 + <biometric-signature name="handwaving23-4">
  301 + <presentation Label="handwaving" file-name="handwaving/person23_handwaving_d4_uncomp.avi" />
  302 + </biometric-signature>
  303 + <biometric-signature name="handwaving24-1">
  304 + <presentation Label="handwaving" file-name="handwaving/person24_handwaving_d1_uncomp.avi" />
  305 + </biometric-signature>
  306 + <biometric-signature name="handwaving24-2">
  307 + <presentation Label="handwaving" file-name="handwaving/person24_handwaving_d2_uncomp.avi" />
  308 + </biometric-signature>
  309 + <biometric-signature name="handwaving24-3">
  310 + <presentation Label="handwaving" file-name="handwaving/person24_handwaving_d3_uncomp.avi" />
  311 + </biometric-signature>
  312 + <biometric-signature name="handwaving24-4">
  313 + <presentation Label="handwaving" file-name="handwaving/person24_handwaving_d4_uncomp.avi" />
  314 + </biometric-signature>
  315 + <biometric-signature name="handwaving25-1">
  316 + <presentation Label="handwaving" file-name="handwaving/person25_handwaving_d1_uncomp.avi" />
  317 + </biometric-signature>
  318 + <biometric-signature name="handwaving25-2">
  319 + <presentation Label="handwaving" file-name="handwaving/person25_handwaving_d2_uncomp.avi" />
  320 + </biometric-signature>
  321 + <biometric-signature name="handwaving25-3">
  322 + <presentation Label="handwaving" file-name="handwaving/person25_handwaving_d3_uncomp.avi" />
  323 + </biometric-signature>
  324 + <biometric-signature name="handwaving25-4">
  325 + <presentation Label="handwaving" file-name="handwaving/person25_handwaving_d4_uncomp.avi" />
  326 + </biometric-signature>
  327 + <biometric-signature name="jogging17-1">
  328 + <presentation Label="jogging" file-name="jogging/person17_jogging_d1_uncomp.avi" />
  329 + </biometric-signature>
  330 + <biometric-signature name="jogging17-2">
  331 + <presentation Label="jogging" file-name="jogging/person17_jogging_d2_uncomp.avi" />
  332 + </biometric-signature>
  333 + <biometric-signature name="jogging17-3">
  334 + <presentation Label="jogging" file-name="jogging/person17_jogging_d3_uncomp.avi" />
  335 + </biometric-signature>
  336 + <biometric-signature name="jogging17-4">
  337 + <presentation Label="jogging" file-name="jogging/person17_jogging_d4_uncomp.avi" />
  338 + </biometric-signature>
  339 + <biometric-signature name="jogging18-1">
  340 + <presentation Label="jogging" file-name="jogging/person18_jogging_d1_uncomp.avi" />
  341 + </biometric-signature>
  342 + <biometric-signature name="jogging18-2">
  343 + <presentation Label="jogging" file-name="jogging/person18_jogging_d2_uncomp.avi" />
  344 + </biometric-signature>
  345 + <biometric-signature name="jogging18-3">
  346 + <presentation Label="jogging" file-name="jogging/person18_jogging_d3_uncomp.avi" />
  347 + </biometric-signature>
  348 + <biometric-signature name="jogging18-4">
  349 + <presentation Label="jogging" file-name="jogging/person18_jogging_d4_uncomp.avi" />
  350 + </biometric-signature>
  351 + <biometric-signature name="jogging19-1">
  352 + <presentation Label="jogging" file-name="jogging/person19_jogging_d1_uncomp.avi" />
  353 + </biometric-signature>
  354 + <biometric-signature name="jogging19-2">
  355 + <presentation Label="jogging" file-name="jogging/person19_jogging_d2_uncomp.avi" />
  356 + </biometric-signature>
  357 + <biometric-signature name="jogging19-3">
  358 + <presentation Label="jogging" file-name="jogging/person19_jogging_d3_uncomp.avi" />
  359 + </biometric-signature>
  360 + <biometric-signature name="jogging19-4">
  361 + <presentation Label="jogging" file-name="jogging/person19_jogging_d4_uncomp.avi" />
  362 + </biometric-signature>
  363 + <biometric-signature name="jogging20-1">
  364 + <presentation Label="jogging" file-name="jogging/person20_jogging_d1_uncomp.avi" />
  365 + </biometric-signature>
  366 + <biometric-signature name="jogging20-2">
  367 + <presentation Label="jogging" file-name="jogging/person20_jogging_d2_uncomp.avi" />
  368 + </biometric-signature>
  369 + <biometric-signature name="jogging20-3">
  370 + <presentation Label="jogging" file-name="jogging/person20_jogging_d3_uncomp.avi" />
  371 + </biometric-signature>
  372 + <biometric-signature name="jogging20-4">
  373 + <presentation Label="jogging" file-name="jogging/person20_jogging_d4_uncomp.avi" />
  374 + </biometric-signature>
  375 + <biometric-signature name="jogging21-1">
  376 + <presentation Label="jogging" file-name="jogging/person21_jogging_d1_uncomp.avi" />
  377 + </biometric-signature>
  378 + <biometric-signature name="jogging21-2">
  379 + <presentation Label="jogging" file-name="jogging/person21_jogging_d2_uncomp.avi" />
  380 + </biometric-signature>
  381 + <biometric-signature name="jogging21-3">
  382 + <presentation Label="jogging" file-name="jogging/person21_jogging_d3_uncomp.avi" />
  383 + </biometric-signature>
  384 + <biometric-signature name="jogging21-4">
  385 + <presentation Label="jogging" file-name="jogging/person21_jogging_d4_uncomp.avi" />
  386 + </biometric-signature>
  387 + <biometric-signature name="jogging22-1">
  388 + <presentation Label="jogging" file-name="jogging/person22_jogging_d1_uncomp.avi" />
  389 + </biometric-signature>
  390 + <biometric-signature name="jogging22-2">
  391 + <presentation Label="jogging" file-name="jogging/person22_jogging_d2_uncomp.avi" />
  392 + </biometric-signature>
  393 + <biometric-signature name="jogging22-3">
  394 + <presentation Label="jogging" file-name="jogging/person22_jogging_d3_uncomp.avi" />
  395 + </biometric-signature>
  396 + <biometric-signature name="jogging22-4">
  397 + <presentation Label="jogging" file-name="jogging/person22_jogging_d4_uncomp.avi" />
  398 + </biometric-signature>
  399 + <biometric-signature name="jogging23-1">
  400 + <presentation Label="jogging" file-name="jogging/person23_jogging_d1_uncomp.avi" />
  401 + </biometric-signature>
  402 + <biometric-signature name="jogging23-2">
  403 + <presentation Label="jogging" file-name="jogging/person23_jogging_d2_uncomp.avi" />
  404 + </biometric-signature>
  405 + <biometric-signature name="jogging23-3">
  406 + <presentation Label="jogging" file-name="jogging/person23_jogging_d3_uncomp.avi" />
  407 + </biometric-signature>
  408 + <biometric-signature name="jogging23-4">
  409 + <presentation Label="jogging" file-name="jogging/person23_jogging_d4_uncomp.avi" />
  410 + </biometric-signature>
  411 + <biometric-signature name="jogging24-1">
  412 + <presentation Label="jogging" file-name="jogging/person24_jogging_d1_uncomp.avi" />
  413 + </biometric-signature>
  414 + <biometric-signature name="jogging24-2">
  415 + <presentation Label="jogging" file-name="jogging/person24_jogging_d2_uncomp.avi" />
  416 + </biometric-signature>
  417 + <biometric-signature name="jogging24-3">
  418 + <presentation Label="jogging" file-name="jogging/person24_jogging_d3_uncomp.avi" />
  419 + </biometric-signature>
  420 + <biometric-signature name="jogging24-4">
  421 + <presentation Label="jogging" file-name="jogging/person24_jogging_d4_uncomp.avi" />
  422 + </biometric-signature>
  423 + <biometric-signature name="jogging25-1">
  424 + <presentation Label="jogging" file-name="jogging/person25_jogging_d1_uncomp.avi" />
  425 + </biometric-signature>
  426 + <biometric-signature name="jogging25-2">
  427 + <presentation Label="jogging" file-name="jogging/person25_jogging_d2_uncomp.avi" />
  428 + </biometric-signature>
  429 + <biometric-signature name="jogging25-3">
  430 + <presentation Label="jogging" file-name="jogging/person25_jogging_d3_uncomp.avi" />
  431 + </biometric-signature>
  432 + <biometric-signature name="jogging25-4">
  433 + <presentation Label="jogging" file-name="jogging/person25_jogging_d4_uncomp.avi" />
  434 + </biometric-signature>
  435 + <biometric-signature name="running17-1">
  436 + <presentation Label="running" file-name="running/person17_running_d1_uncomp.avi" />
  437 + </biometric-signature>
  438 + <biometric-signature name="running17-2">
  439 + <presentation Label="running" file-name="running/person17_running_d2_uncomp.avi" />
  440 + </biometric-signature>
  441 + <biometric-signature name="running17-3">
  442 + <presentation Label="running" file-name="running/person17_running_d3_uncomp.avi" />
  443 + </biometric-signature>
  444 + <biometric-signature name="running17-4">
  445 + <presentation Label="running" file-name="running/person17_running_d4_uncomp.avi" />
  446 + </biometric-signature>
  447 + <biometric-signature name="running18-1">
  448 + <presentation Label="running" file-name="running/person18_running_d1_uncomp.avi" />
  449 + </biometric-signature>
  450 + <biometric-signature name="running18-2">
  451 + <presentation Label="running" file-name="running/person18_running_d2_uncomp.avi" />
  452 + </biometric-signature>
  453 + <biometric-signature name="running18-3">
  454 + <presentation Label="running" file-name="running/person18_running_d3_uncomp.avi" />
  455 + </biometric-signature>
  456 + <biometric-signature name="running18-4">
  457 + <presentation Label="running" file-name="running/person18_running_d4_uncomp.avi" />
  458 + </biometric-signature>
  459 + <biometric-signature name="running19-1">
  460 + <presentation Label="running" file-name="running/person19_running_d1_uncomp.avi" />
  461 + </biometric-signature>
  462 + <biometric-signature name="running19-2">
  463 + <presentation Label="running" file-name="running/person19_running_d2_uncomp.avi" />
  464 + </biometric-signature>
  465 + <biometric-signature name="running19-3">
  466 + <presentation Label="running" file-name="running/person19_running_d3_uncomp.avi" />
  467 + </biometric-signature>
  468 + <biometric-signature name="running19-4">
  469 + <presentation Label="running" file-name="running/person19_running_d4_uncomp.avi" />
  470 + </biometric-signature>
  471 + <biometric-signature name="running20-1">
  472 + <presentation Label="running" file-name="running/person20_running_d1_uncomp.avi" />
  473 + </biometric-signature>
  474 + <biometric-signature name="running20-2">
  475 + <presentation Label="running" file-name="running/person20_running_d2_uncomp.avi" />
  476 + </biometric-signature>
  477 + <biometric-signature name="running20-3">
  478 + <presentation Label="running" file-name="running/person20_running_d3_uncomp.avi" />
  479 + </biometric-signature>
  480 + <biometric-signature name="running20-4">
  481 + <presentation Label="running" file-name="running/person20_running_d4_uncomp.avi" />
  482 + </biometric-signature>
  483 + <biometric-signature name="running21-1">
  484 + <presentation Label="running" file-name="running/person21_running_d1_uncomp.avi" />
  485 + </biometric-signature>
  486 + <biometric-signature name="running21-2">
  487 + <presentation Label="running" file-name="running/person21_running_d2_uncomp.avi" />
  488 + </biometric-signature>
  489 + <biometric-signature name="running21-3">
  490 + <presentation Label="running" file-name="running/person21_running_d3_uncomp.avi" />
  491 + </biometric-signature>
  492 + <biometric-signature name="running21-4">
  493 + <presentation Label="running" file-name="running/person21_running_d4_uncomp.avi" />
  494 + </biometric-signature>
  495 + <biometric-signature name="running22-1">
  496 + <presentation Label="running" file-name="running/person22_running_d1_uncomp.avi" />
  497 + </biometric-signature>
  498 + <biometric-signature name="running22-2">
  499 + <presentation Label="running" file-name="running/person22_running_d2_uncomp.avi" />
  500 + </biometric-signature>
  501 + <biometric-signature name="running22-3">
  502 + <presentation Label="running" file-name="running/person22_running_d3_uncomp.avi" />
  503 + </biometric-signature>
  504 + <biometric-signature name="running22-4">
  505 + <presentation Label="running" file-name="running/person22_running_d4_uncomp.avi" />
  506 + </biometric-signature>
  507 + <biometric-signature name="running23-1">
  508 + <presentation Label="running" file-name="running/person23_running_d1_uncomp.avi" />
  509 + </biometric-signature>
  510 + <biometric-signature name="running23-2">
  511 + <presentation Label="running" file-name="running/person23_running_d2_uncomp.avi" />
  512 + </biometric-signature>
  513 + <biometric-signature name="running23-3">
  514 + <presentation Label="running" file-name="running/person23_running_d3_uncomp.avi" />
  515 + </biometric-signature>
  516 + <biometric-signature name="running23-4">
  517 + <presentation Label="running" file-name="running/person23_running_d4_uncomp.avi" />
  518 + </biometric-signature>
  519 + <biometric-signature name="running24-1">
  520 + <presentation Label="running" file-name="running/person24_running_d1_uncomp.avi" />
  521 + </biometric-signature>
  522 + <biometric-signature name="running24-2">
  523 + <presentation Label="running" file-name="running/person24_running_d2_uncomp.avi" />
  524 + </biometric-signature>
  525 + <biometric-signature name="running24-3">
  526 + <presentation Label="running" file-name="running/person24_running_d3_uncomp.avi" />
  527 + </biometric-signature>
  528 + <biometric-signature name="running24-4">
  529 + <presentation Label="running" file-name="running/person24_running_d4_uncomp.avi" />
  530 + </biometric-signature>
  531 + <biometric-signature name="running25-1">
  532 + <presentation Label="running" file-name="running/person25_running_d1_uncomp.avi" />
  533 + </biometric-signature>
  534 + <biometric-signature name="running25-2">
  535 + <presentation Label="running" file-name="running/person25_running_d2_uncomp.avi" />
  536 + </biometric-signature>
  537 + <biometric-signature name="running25-3">
  538 + <presentation Label="running" file-name="running/person25_running_d3_uncomp.avi" />
  539 + </biometric-signature>
  540 + <biometric-signature name="running25-4">
  541 + <presentation Label="running" file-name="running/person25_running_d4_uncomp.avi" />
  542 + </biometric-signature>
  543 + <biometric-signature name="walking17-1">
  544 + <presentation Label="walking" file-name="walking/person17_walking_d1_uncomp.avi" />
  545 + </biometric-signature>
  546 + <biometric-signature name="walking17-2">
  547 + <presentation Label="walking" file-name="walking/person17_walking_d2_uncomp.avi" />
  548 + </biometric-signature>
  549 + <biometric-signature name="walking17-3">
  550 + <presentation Label="walking" file-name="walking/person17_walking_d3_uncomp.avi" />
  551 + </biometric-signature>
  552 + <biometric-signature name="walking17-4">
  553 + <presentation Label="walking" file-name="walking/person17_walking_d4_uncomp.avi" />
  554 + </biometric-signature>
  555 + <biometric-signature name="walking18-1">
  556 + <presentation Label="walking" file-name="walking/person18_walking_d1_uncomp.avi" />
  557 + </biometric-signature>
  558 + <biometric-signature name="walking18-2">
  559 + <presentation Label="walking" file-name="walking/person18_walking_d2_uncomp.avi" />
  560 + </biometric-signature>
  561 + <biometric-signature name="walking18-3">
  562 + <presentation Label="walking" file-name="walking/person18_walking_d3_uncomp.avi" />
  563 + </biometric-signature>
  564 + <biometric-signature name="walking18-4">
  565 + <presentation Label="walking" file-name="walking/person18_walking_d4_uncomp.avi" />
  566 + </biometric-signature>
  567 + <biometric-signature name="walking19-1">
  568 + <presentation Label="walking" file-name="walking/person19_walking_d1_uncomp.avi" />
  569 + </biometric-signature>
  570 + <biometric-signature name="walking19-2">
  571 + <presentation Label="walking" file-name="walking/person19_walking_d2_uncomp.avi" />
  572 + </biometric-signature>
  573 + <biometric-signature name="walking19-3">
  574 + <presentation Label="walking" file-name="walking/person19_walking_d3_uncomp.avi" />
  575 + </biometric-signature>
  576 + <biometric-signature name="walking19-4">
  577 + <presentation Label="walking" file-name="walking/person19_walking_d4_uncomp.avi" />
  578 + </biometric-signature>
  579 + <biometric-signature name="walking20-1">
  580 + <presentation Label="walking" file-name="walking/person20_walking_d1_uncomp.avi" />
  581 + </biometric-signature>
  582 + <biometric-signature name="walking20-2">
  583 + <presentation Label="walking" file-name="walking/person20_walking_d2_uncomp.avi" />
  584 + </biometric-signature>
  585 + <biometric-signature name="walking20-3">
  586 + <presentation Label="walking" file-name="walking/person20_walking_d3_uncomp.avi" />
  587 + </biometric-signature>
  588 + <biometric-signature name="walking20-4">
  589 + <presentation Label="walking" file-name="walking/person20_walking_d4_uncomp.avi" />
  590 + </biometric-signature>
  591 + <biometric-signature name="walking21-1">
  592 + <presentation Label="walking" file-name="walking/person21_walking_d1_uncomp.avi" />
  593 + </biometric-signature>
  594 + <biometric-signature name="walking21-2">
  595 + <presentation Label="walking" file-name="walking/person21_walking_d2_uncomp.avi" />
  596 + </biometric-signature>
  597 + <biometric-signature name="walking21-3">
  598 + <presentation Label="walking" file-name="walking/person21_walking_d3_uncomp.avi" />
  599 + </biometric-signature>
  600 + <biometric-signature name="walking21-4">
  601 + <presentation Label="walking" file-name="walking/person21_walking_d4_uncomp.avi" />
  602 + </biometric-signature>
  603 + <biometric-signature name="walking22-1">
  604 + <presentation Label="walking" file-name="walking/person22_walking_d1_uncomp.avi" />
  605 + </biometric-signature>
  606 + <biometric-signature name="walking22-2">
  607 + <presentation Label="walking" file-name="walking/person22_walking_d2_uncomp.avi" />
  608 + </biometric-signature>
  609 + <biometric-signature name="walking22-3">
  610 + <presentation Label="walking" file-name="walking/person22_walking_d3_uncomp.avi" />
  611 + </biometric-signature>
  612 + <biometric-signature name="walking22-4">
  613 + <presentation Label="walking" file-name="walking/person22_walking_d4_uncomp.avi" />
  614 + </biometric-signature>
  615 + <biometric-signature name="walking23-1">
  616 + <presentation Label="walking" file-name="walking/person23_walking_d1_uncomp.avi" />
  617 + </biometric-signature>
  618 + <biometric-signature name="walking23-2">
  619 + <presentation Label="walking" file-name="walking/person23_walking_d2_uncomp.avi" />
  620 + </biometric-signature>
  621 + <biometric-signature name="walking23-3">
  622 + <presentation Label="walking" file-name="walking/person23_walking_d3_uncomp.avi" />
  623 + </biometric-signature>
  624 + <biometric-signature name="walking23-4">
  625 + <presentation Label="walking" file-name="walking/person23_walking_d4_uncomp.avi" />
  626 + </biometric-signature>
  627 + <biometric-signature name="walking24-1">
  628 + <presentation Label="walking" file-name="walking/person24_walking_d1_uncomp.avi" />
  629 + </biometric-signature>
  630 + <biometric-signature name="walking24-2">
  631 + <presentation Label="walking" file-name="walking/person24_walking_d2_uncomp.avi" />
  632 + </biometric-signature>
  633 + <biometric-signature name="walking24-3">
  634 + <presentation Label="walking" file-name="walking/person24_walking_d3_uncomp.avi" />
  635 + </biometric-signature>
  636 + <biometric-signature name="walking24-4">
  637 + <presentation Label="walking" file-name="walking/person24_walking_d4_uncomp.avi" />
  638 + </biometric-signature>
  639 + <biometric-signature name="walking25-1">
  640 + <presentation Label="walking" file-name="walking/person25_walking_d1_uncomp.avi" />
  641 + </biometric-signature>
  642 + <biometric-signature name="walking25-2">
  643 + <presentation Label="walking" file-name="walking/person25_walking_d2_uncomp.avi" />
  644 + </biometric-signature>
  645 + <biometric-signature name="walking25-3">
  646 + <presentation Label="walking" file-name="walking/person25_walking_d3_uncomp.avi" />
  647 + </biometric-signature>
  648 + <biometric-signature name="walking25-4">
  649 + <presentation Label="walking" file-name="walking/person25_walking_d4_uncomp.avi" />
  650 + </biometric-signature>
  651 +</biometric-signature-set>
data/KTH/train_16ppl.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<biometric-signature-set>
  3 + <biometric-signature name="boxing1-1">
  4 + <presentation Label="boxing" file-name="boxing/person01_boxing_d1_uncomp.avi" />
  5 + </biometric-signature>
  6 + <biometric-signature name="boxing1-2">
  7 + <presentation Label="boxing" file-name="boxing/person01_boxing_d2_uncomp.avi" />
  8 + </biometric-signature>
  9 + <biometric-signature name="boxing1-3">
  10 + <presentation Label="boxing" file-name="boxing/person01_boxing_d3_uncomp.avi" />
  11 + </biometric-signature>
  12 + <biometric-signature name="boxing2-1">
  13 + <presentation Label="boxing" file-name="boxing/person02_boxing_d1_uncomp.avi" />
  14 + </biometric-signature>
  15 + <biometric-signature name="boxing2-2">
  16 + <presentation Label="boxing" file-name="boxing/person02_boxing_d2_uncomp.avi" />
  17 + </biometric-signature>
  18 + <biometric-signature name="boxing2-3">
  19 + <presentation Label="boxing" file-name="boxing/person02_boxing_d3_uncomp.avi" />
  20 + </biometric-signature>
  21 + <biometric-signature name="boxing2-4">
  22 + <presentation Label="boxing" file-name="boxing/person02_boxing_d4_uncomp.avi" />
  23 + </biometric-signature>
  24 + <biometric-signature name="boxing3-1">
  25 + <presentation Label="boxing" file-name="boxing/person03_boxing_d1_uncomp.avi" />
  26 + </biometric-signature>
  27 + <biometric-signature name="boxing3-2">
  28 + <presentation Label="boxing" file-name="boxing/person03_boxing_d2_uncomp.avi" />
  29 + </biometric-signature>
  30 + <biometric-signature name="boxing3-3">
  31 + <presentation Label="boxing" file-name="boxing/person03_boxing_d3_uncomp.avi" />
  32 + </biometric-signature>
  33 + <biometric-signature name="boxing3-4">
  34 + <presentation Label="boxing" file-name="boxing/person03_boxing_d4_uncomp.avi" />
  35 + </biometric-signature>
  36 + <biometric-signature name="boxing4-1">
  37 + <presentation Label="boxing" file-name="boxing/person04_boxing_d1_uncomp.avi" />
  38 + </biometric-signature>
  39 + <biometric-signature name="boxing4-2">
  40 + <presentation Label="boxing" file-name="boxing/person04_boxing_d2_uncomp.avi" />
  41 + </biometric-signature>
  42 + <biometric-signature name="boxing4-3">
  43 + <presentation Label="boxing" file-name="boxing/person04_boxing_d3_uncomp.avi" />
  44 + </biometric-signature>
  45 + <biometric-signature name="boxing4-4">
  46 + <presentation Label="boxing" file-name="boxing/person04_boxing_d4_uncomp.avi" />
  47 + </biometric-signature>
  48 + <biometric-signature name="boxing5-1">
  49 + <presentation Label="boxing" file-name="boxing/person05_boxing_d1_uncomp.avi" />
  50 + </biometric-signature>
  51 + <biometric-signature name="boxing5-2">
  52 + <presentation Label="boxing" file-name="boxing/person05_boxing_d2_uncomp.avi" />
  53 + </biometric-signature>
  54 + <biometric-signature name="boxing5-3">
  55 + <presentation Label="boxing" file-name="boxing/person05_boxing_d3_uncomp.avi" />
  56 + </biometric-signature>
  57 + <biometric-signature name="boxing5-4">
  58 + <presentation Label="boxing" file-name="boxing/person05_boxing_d4_uncomp.avi" />
  59 + </biometric-signature>
  60 + <biometric-signature name="boxing6-1">
  61 + <presentation Label="boxing" file-name="boxing/person06_boxing_d1_uncomp.avi" />
  62 + </biometric-signature>
  63 + <biometric-signature name="boxing6-2">
  64 + <presentation Label="boxing" file-name="boxing/person06_boxing_d2_uncomp.avi" />
  65 + </biometric-signature>
  66 + <biometric-signature name="boxing6-3">
  67 + <presentation Label="boxing" file-name="boxing/person06_boxing_d3_uncomp.avi" />
  68 + </biometric-signature>
  69 + <biometric-signature name="boxing6-4">
  70 + <presentation Label="boxing" file-name="boxing/person06_boxing_d4_uncomp.avi" />
  71 + </biometric-signature>
  72 + <biometric-signature name="boxing7-1">
  73 + <presentation Label="boxing" file-name="boxing/person07_boxing_d1_uncomp.avi" />
  74 + </biometric-signature>
  75 + <biometric-signature name="boxing7-2">
  76 + <presentation Label="boxing" file-name="boxing/person07_boxing_d2_uncomp.avi" />
  77 + </biometric-signature>
  78 + <biometric-signature name="boxing7-3">
  79 + <presentation Label="boxing" file-name="boxing/person07_boxing_d3_uncomp.avi" />
  80 + </biometric-signature>
  81 + <biometric-signature name="boxing7-4">
  82 + <presentation Label="boxing" file-name="boxing/person07_boxing_d4_uncomp.avi" />
  83 + </biometric-signature>
  84 + <biometric-signature name="boxing8-1">
  85 + <presentation Label="boxing" file-name="boxing/person08_boxing_d1_uncomp.avi" />
  86 + </biometric-signature>
  87 + <biometric-signature name="boxing8-2">
  88 + <presentation Label="boxing" file-name="boxing/person08_boxing_d2_uncomp.avi" />
  89 + </biometric-signature>
  90 + <biometric-signature name="boxing8-3">
  91 + <presentation Label="boxing" file-name="boxing/person08_boxing_d3_uncomp.avi" />
  92 + </biometric-signature>
  93 + <biometric-signature name="boxing8-4">
  94 + <presentation Label="boxing" file-name="boxing/person08_boxing_d4_uncomp.avi" />
  95 + </biometric-signature>
  96 + <biometric-signature name="boxing9-1">
  97 + <presentation Label="boxing" file-name="boxing/person09_boxing_d1_uncomp.avi" />
  98 + </biometric-signature>
  99 + <biometric-signature name="boxing9-2">
  100 + <presentation Label="boxing" file-name="boxing/person09_boxing_d2_uncomp.avi" />
  101 + </biometric-signature>
  102 + <biometric-signature name="boxing9-3">
  103 + <presentation Label="boxing" file-name="boxing/person09_boxing_d3_uncomp.avi" />
  104 + </biometric-signature>
  105 + <biometric-signature name="boxing9-4">
  106 + <presentation Label="boxing" file-name="boxing/person09_boxing_d4_uncomp.avi" />
  107 + </biometric-signature>
  108 + <biometric-signature name="boxing10-1">
  109 + <presentation Label="boxing" file-name="boxing/person10_boxing_d1_uncomp.avi" />
  110 + </biometric-signature>
  111 + <biometric-signature name="boxing10-2">
  112 + <presentation Label="boxing" file-name="boxing/person10_boxing_d2_uncomp.avi" />
  113 + </biometric-signature>
  114 + <biometric-signature name="boxing10-3">
  115 + <presentation Label="boxing" file-name="boxing/person10_boxing_d3_uncomp.avi" />
  116 + </biometric-signature>
  117 + <biometric-signature name="boxing10-4">
  118 + <presentation Label="boxing" file-name="boxing/person10_boxing_d4_uncomp.avi" />
  119 + </biometric-signature>
  120 + <biometric-signature name="boxing11-1">
  121 + <presentation Label="boxing" file-name="boxing/person11_boxing_d1_uncomp.avi" />
  122 + </biometric-signature>
  123 + <biometric-signature name="boxing11-2">
  124 + <presentation Label="boxing" file-name="boxing/person11_boxing_d2_uncomp.avi" />
  125 + </biometric-signature>
  126 + <biometric-signature name="boxing11-3">
  127 + <presentation Label="boxing" file-name="boxing/person11_boxing_d3_uncomp.avi" />
  128 + </biometric-signature>
  129 + <biometric-signature name="boxing11-4">
  130 + <presentation Label="boxing" file-name="boxing/person11_boxing_d4_uncomp.avi" />
  131 + </biometric-signature>
  132 + <biometric-signature name="boxing12-1">
  133 + <presentation Label="boxing" file-name="boxing/person12_boxing_d1_uncomp.avi" />
  134 + </biometric-signature>
  135 + <biometric-signature name="boxing12-2">
  136 + <presentation Label="boxing" file-name="boxing/person12_boxing_d2_uncomp.avi" />
  137 + </biometric-signature>
  138 + <biometric-signature name="boxing12-3">
  139 + <presentation Label="boxing" file-name="boxing/person12_boxing_d3_uncomp.avi" />
  140 + </biometric-signature>
  141 + <biometric-signature name="boxing12-4">
  142 + <presentation Label="boxing" file-name="boxing/person12_boxing_d4_uncomp.avi" />
  143 + </biometric-signature>
  144 + <biometric-signature name="boxing13-1">
  145 + <presentation Label="boxing" file-name="boxing/person13_boxing_d1_uncomp.avi" />
  146 + </biometric-signature>
  147 + <biometric-signature name="boxing13-2">
  148 + <presentation Label="boxing" file-name="boxing/person13_boxing_d2_uncomp.avi" />
  149 + </biometric-signature>
  150 + <biometric-signature name="boxing13-3">
  151 + <presentation Label="boxing" file-name="boxing/person13_boxing_d3_uncomp.avi" />
  152 + </biometric-signature>
  153 + <biometric-signature name="boxing13-4">
  154 + <presentation Label="boxing" file-name="boxing/person13_boxing_d4_uncomp.avi" />
  155 + </biometric-signature>
  156 + <biometric-signature name="boxing14-1">
  157 + <presentation Label="boxing" file-name="boxing/person14_boxing_d1_uncomp.avi" />
  158 + </biometric-signature>
  159 + <biometric-signature name="boxing14-2">
  160 + <presentation Label="boxing" file-name="boxing/person14_boxing_d2_uncomp.avi" />
  161 + </biometric-signature>
  162 + <biometric-signature name="boxing14-3">
  163 + <presentation Label="boxing" file-name="boxing/person14_boxing_d3_uncomp.avi" />
  164 + </biometric-signature>
  165 + <biometric-signature name="boxing14-4">
  166 + <presentation Label="boxing" file-name="boxing/person14_boxing_d4_uncomp.avi" />
  167 + </biometric-signature>
  168 + <biometric-signature name="boxing15-1">
  169 + <presentation Label="boxing" file-name="boxing/person15_boxing_d1_uncomp.avi" />
  170 + </biometric-signature>
  171 + <biometric-signature name="boxing15-2">
  172 + <presentation Label="boxing" file-name="boxing/person15_boxing_d2_uncomp.avi" />
  173 + </biometric-signature>
  174 + <biometric-signature name="boxing15-3">
  175 + <presentation Label="boxing" file-name="boxing/person15_boxing_d3_uncomp.avi" />
  176 + </biometric-signature>
  177 + <biometric-signature name="boxing15-4">
  178 + <presentation Label="boxing" file-name="boxing/person15_boxing_d4_uncomp.avi" />
  179 + </biometric-signature>
  180 + <biometric-signature name="boxing16-1">
  181 + <presentation Label="boxing" file-name="boxing/person16_boxing_d1_uncomp.avi" />
  182 + </biometric-signature>
  183 + <biometric-signature name="boxing16-2">
  184 + <presentation Label="boxing" file-name="boxing/person16_boxing_d2_uncomp.avi" />
  185 + </biometric-signature>
  186 + <biometric-signature name="boxing16-3">
  187 + <presentation Label="boxing" file-name="boxing/person16_boxing_d3_uncomp.avi" />
  188 + </biometric-signature>
  189 + <biometric-signature name="boxing16-4">
  190 + <presentation Label="boxing" file-name="boxing/person16_boxing_d4_uncomp.avi" />
  191 + </biometric-signature>
  192 + <biometric-signature name="handclapping1-1">
  193 + <presentation Label="handclapping" file-name="handclapping/person01_handclapping_d1_uncomp.avi" />
  194 + </biometric-signature>
  195 + <biometric-signature name="handclapping1-2">
  196 + <presentation Label="handclapping" file-name="handclapping/person01_handclapping_d2_uncomp.avi" />
  197 + </biometric-signature>
  198 + <biometric-signature name="handclapping1-3">
  199 + <presentation Label="handclapping" file-name="handclapping/person01_handclapping_d3_uncomp.avi" />
  200 + </biometric-signature>
  201 + <biometric-signature name="handclapping1-4">
  202 + <presentation Label="handclapping" file-name="handclapping/person01_handclapping_d4_uncomp.avi" />
  203 + </biometric-signature>
  204 + <biometric-signature name="handclapping2-1">
  205 + <presentation Label="handclapping" file-name="handclapping/person02_handclapping_d1_uncomp.avi" />
  206 + </biometric-signature>
  207 + <biometric-signature name="handclapping2-2">
  208 + <presentation Label="handclapping" file-name="handclapping/person02_handclapping_d2_uncomp.avi" />
  209 + </biometric-signature>
  210 + <biometric-signature name="handclapping2-3">
  211 + <presentation Label="handclapping" file-name="handclapping/person02_handclapping_d3_uncomp.avi" />
  212 + </biometric-signature>
  213 + <biometric-signature name="handclapping2-4">
  214 + <presentation Label="handclapping" file-name="handclapping/person02_handclapping_d4_uncomp.avi" />
  215 + </biometric-signature>
  216 + <biometric-signature name="handclapping3-1">
  217 + <presentation Label="handclapping" file-name="handclapping/person03_handclapping_d1_uncomp.avi" />
  218 + </biometric-signature>
  219 + <biometric-signature name="handclapping3-2">
  220 + <presentation Label="handclapping" file-name="handclapping/person03_handclapping_d2_uncomp.avi" />
  221 + </biometric-signature>
  222 + <biometric-signature name="handclapping3-3">
  223 + <presentation Label="handclapping" file-name="handclapping/person03_handclapping_d3_uncomp.avi" />
  224 + </biometric-signature>
  225 + <biometric-signature name="handclapping3-4">
  226 + <presentation Label="handclapping" file-name="handclapping/person03_handclapping_d4_uncomp.avi" />
  227 + </biometric-signature>
  228 + <biometric-signature name="handclapping4-1">
  229 + <presentation Label="handclapping" file-name="handclapping/person04_handclapping_d1_uncomp.avi" />
  230 + </biometric-signature>
  231 + <biometric-signature name="handclapping4-2">
  232 + <presentation Label="handclapping" file-name="handclapping/person04_handclapping_d2_uncomp.avi" />
  233 + </biometric-signature>
  234 + <biometric-signature name="handclapping4-3">
  235 + <presentation Label="handclapping" file-name="handclapping/person04_handclapping_d3_uncomp.avi" />
  236 + </biometric-signature>
  237 + <biometric-signature name="handclapping4-4">
  238 + <presentation Label="handclapping" file-name="handclapping/person04_handclapping_d4_uncomp.avi" />
  239 + </biometric-signature>
  240 + <biometric-signature name="handclapping5-1">
  241 + <presentation Label="handclapping" file-name="handclapping/person05_handclapping_d1_uncomp.avi" />
  242 + </biometric-signature>
  243 + <biometric-signature name="handclapping5-2">
  244 + <presentation Label="handclapping" file-name="handclapping/person05_handclapping_d2_uncomp.avi" />
  245 + </biometric-signature>
  246 + <biometric-signature name="handclapping5-3">
  247 + <presentation Label="handclapping" file-name="handclapping/person05_handclapping_d3_uncomp.avi" />
  248 + </biometric-signature>
  249 + <biometric-signature name="handclapping5-4">
  250 + <presentation Label="handclapping" file-name="handclapping/person05_handclapping_d4_uncomp.avi" />
  251 + </biometric-signature>
  252 + <biometric-signature name="handclapping6-1">
  253 + <presentation Label="handclapping" file-name="handclapping/person06_handclapping_d1_uncomp.avi" />
  254 + </biometric-signature>
  255 + <biometric-signature name="handclapping6-2">
  256 + <presentation Label="handclapping" file-name="handclapping/person06_handclapping_d2_uncomp.avi" />
  257 + </biometric-signature>
  258 + <biometric-signature name="handclapping6-3">
  259 + <presentation Label="handclapping" file-name="handclapping/person06_handclapping_d3_uncomp.avi" />
  260 + </biometric-signature>
  261 + <biometric-signature name="handclapping6-4">
  262 + <presentation Label="handclapping" file-name="handclapping/person06_handclapping_d4_uncomp.avi" />
  263 + </biometric-signature>
  264 + <biometric-signature name="handclapping7-1">
  265 + <presentation Label="handclapping" file-name="handclapping/person07_handclapping_d1_uncomp.avi" />
  266 + </biometric-signature>
  267 + <biometric-signature name="handclapping7-2">
  268 + <presentation Label="handclapping" file-name="handclapping/person07_handclapping_d2_uncomp.avi" />
  269 + </biometric-signature>
  270 + <biometric-signature name="handclapping7-3">
  271 + <presentation Label="handclapping" file-name="handclapping/person07_handclapping_d3_uncomp.avi" />
  272 + </biometric-signature>
  273 + <biometric-signature name="handclapping7-4">
  274 + <presentation Label="handclapping" file-name="handclapping/person07_handclapping_d4_uncomp.avi" />
  275 + </biometric-signature>
  276 + <biometric-signature name="handclapping8-1">
  277 + <presentation Label="handclapping" file-name="handclapping/person08_handclapping_d1_uncomp.avi" />
  278 + </biometric-signature>
  279 + <biometric-signature name="handclapping8-2">
  280 + <presentation Label="handclapping" file-name="handclapping/person08_handclapping_d2_uncomp.avi" />
  281 + </biometric-signature>
  282 + <biometric-signature name="handclapping8-3">
  283 + <presentation Label="handclapping" file-name="handclapping/person08_handclapping_d3_uncomp.avi" />
  284 + </biometric-signature>
  285 + <biometric-signature name="handclapping8-4">
  286 + <presentation Label="handclapping" file-name="handclapping/person08_handclapping_d4_uncomp.avi" />
  287 + </biometric-signature>
  288 + <biometric-signature name="handclapping9-1">
  289 + <presentation Label="handclapping" file-name="handclapping/person09_handclapping_d1_uncomp.avi" />
  290 + </biometric-signature>
  291 + <biometric-signature name="handclapping9-2">
  292 + <presentation Label="handclapping" file-name="handclapping/person09_handclapping_d2_uncomp.avi" />
  293 + </biometric-signature>
  294 + <biometric-signature name="handclapping9-3">
  295 + <presentation Label="handclapping" file-name="handclapping/person09_handclapping_d3_uncomp.avi" />
  296 + </biometric-signature>
  297 + <biometric-signature name="handclapping9-4">
  298 + <presentation Label="handclapping" file-name="handclapping/person09_handclapping_d4_uncomp.avi" />
  299 + </biometric-signature>
  300 + <biometric-signature name="handclapping10-1">
  301 + <presentation Label="handclapping" file-name="handclapping/person10_handclapping_d1_uncomp.avi" />
  302 + </biometric-signature>
  303 + <biometric-signature name="handclapping10-2">
  304 + <presentation Label="handclapping" file-name="handclapping/person10_handclapping_d2_uncomp.avi" />
  305 + </biometric-signature>
  306 + <biometric-signature name="handclapping10-3">
  307 + <presentation Label="handclapping" file-name="handclapping/person10_handclapping_d3_uncomp.avi" />
  308 + </biometric-signature>
  309 + <biometric-signature name="handclapping10-4">
  310 + <presentation Label="handclapping" file-name="handclapping/person10_handclapping_d4_uncomp.avi" />
  311 + </biometric-signature>
  312 + <biometric-signature name="handclapping11-1">
  313 + <presentation Label="handclapping" file-name="handclapping/person11_handclapping_d1_uncomp.avi" />
  314 + </biometric-signature>
  315 + <biometric-signature name="handclapping11-2">
  316 + <presentation Label="handclapping" file-name="handclapping/person11_handclapping_d2_uncomp.avi" />
  317 + </biometric-signature>
  318 + <biometric-signature name="handclapping11-3">
  319 + <presentation Label="handclapping" file-name="handclapping/person11_handclapping_d3_uncomp.avi" />
  320 + </biometric-signature>
  321 + <biometric-signature name="handclapping11-4">
  322 + <presentation Label="handclapping" file-name="handclapping/person11_handclapping_d4_uncomp.avi" />
  323 + </biometric-signature>
  324 + <biometric-signature name="handclapping12-1">
  325 + <presentation Label="handclapping" file-name="handclapping/person12_handclapping_d1_uncomp.avi" />
  326 + </biometric-signature>
  327 + <biometric-signature name="handclapping12-2">
  328 + <presentation Label="handclapping" file-name="handclapping/person12_handclapping_d2_uncomp.avi" />
  329 + </biometric-signature>
  330 + <biometric-signature name="handclapping12-3">
  331 + <presentation Label="handclapping" file-name="handclapping/person12_handclapping_d3_uncomp.avi" />
  332 + </biometric-signature>
  333 + <biometric-signature name="handclapping12-4">
  334 + <presentation Label="handclapping" file-name="handclapping/person12_handclapping_d4_uncomp.avi" />
  335 + </biometric-signature>
  336 + <biometric-signature name="handclapping13-1">
  337 + <presentation Label="handclapping" file-name="handclapping/person13_handclapping_d1_uncomp.avi" />
  338 + </biometric-signature>
  339 + <biometric-signature name="handclapping13-2">
  340 + <presentation Label="handclapping" file-name="handclapping/person13_handclapping_d2_uncomp.avi" />
  341 + </biometric-signature>
  342 + <biometric-signature name="handclapping13-4">
  343 + <presentation Label="handclapping" file-name="handclapping/person13_handclapping_d4_uncomp.avi" />
  344 + </biometric-signature>
  345 + <biometric-signature name="handclapping14-1">
  346 + <presentation Label="handclapping" file-name="handclapping/person14_handclapping_d1_uncomp.avi" />
  347 + </biometric-signature>
  348 + <biometric-signature name="handclapping14-2">
  349 + <presentation Label="handclapping" file-name="handclapping/person14_handclapping_d2_uncomp.avi" />
  350 + </biometric-signature>
  351 + <biometric-signature name="handclapping14-3">
  352 + <presentation Label="handclapping" file-name="handclapping/person14_handclapping_d3_uncomp.avi" />
  353 + </biometric-signature>
  354 + <biometric-signature name="handclapping14-4">
  355 + <presentation Label="handclapping" file-name="handclapping/person14_handclapping_d4_uncomp.avi" />
  356 + </biometric-signature>
  357 + <biometric-signature name="handclapping15-1">
  358 + <presentation Label="handclapping" file-name="handclapping/person15_handclapping_d1_uncomp.avi" />
  359 + </biometric-signature>
  360 + <biometric-signature name="handclapping15-2">
  361 + <presentation Label="handclapping" file-name="handclapping/person15_handclapping_d2_uncomp.avi" />
  362 + </biometric-signature>
  363 + <biometric-signature name="handclapping15-3">
  364 + <presentation Label="handclapping" file-name="handclapping/person15_handclapping_d3_uncomp.avi" />
  365 + </biometric-signature>
  366 + <biometric-signature name="handclapping15-4">
  367 + <presentation Label="handclapping" file-name="handclapping/person15_handclapping_d4_uncomp.avi" />
  368 + </biometric-signature>
  369 + <biometric-signature name="handclapping16-1">
  370 + <presentation Label="handclapping" file-name="handclapping/person16_handclapping_d1_uncomp.avi" />
  371 + </biometric-signature>
  372 + <biometric-signature name="handclapping16-2">
  373 + <presentation Label="handclapping" file-name="handclapping/person16_handclapping_d2_uncomp.avi" />
  374 + </biometric-signature>
  375 + <biometric-signature name="handclapping16-3">
  376 + <presentation Label="handclapping" file-name="handclapping/person16_handclapping_d3_uncomp.avi" />
  377 + </biometric-signature>
  378 + <biometric-signature name="handclapping16-4">
  379 + <presentation Label="handclapping" file-name="handclapping/person16_handclapping_d4_uncomp.avi" />
  380 + </biometric-signature>
  381 + <biometric-signature name="handwaving1-1">
  382 + <presentation Label="handwaving" file-name="handwaving/person01_handwaving_d1_uncomp.avi" />
  383 + </biometric-signature>
  384 + <biometric-signature name="handwaving1-2">
  385 + <presentation Label="handwaving" file-name="handwaving/person01_handwaving_d2_uncomp.avi" />
  386 + </biometric-signature>
  387 + <biometric-signature name="handwaving1-3">
  388 + <presentation Label="handwaving" file-name="handwaving/person01_handwaving_d3_uncomp.avi" />
  389 + </biometric-signature>
  390 + <biometric-signature name="handwaving1-4">
  391 + <presentation Label="handwaving" file-name="handwaving/person01_handwaving_d4_uncomp.avi" />
  392 + </biometric-signature>
  393 + <biometric-signature name="handwaving2-1">
  394 + <presentation Label="handwaving" file-name="handwaving/person02_handwaving_d1_uncomp.avi" />
  395 + </biometric-signature>
  396 + <biometric-signature name="handwaving2-2">
  397 + <presentation Label="handwaving" file-name="handwaving/person02_handwaving_d2_uncomp.avi" />
  398 + </biometric-signature>
  399 + <biometric-signature name="handwaving2-3">
  400 + <presentation Label="handwaving" file-name="handwaving/person02_handwaving_d3_uncomp.avi" />
  401 + </biometric-signature>
  402 + <biometric-signature name="handwaving2-4">
  403 + <presentation Label="handwaving" file-name="handwaving/person02_handwaving_d4_uncomp.avi" />
  404 + </biometric-signature>
  405 + <biometric-signature name="handwaving3-1">
  406 + <presentation Label="handwaving" file-name="handwaving/person03_handwaving_d1_uncomp.avi" />
  407 + </biometric-signature>
  408 + <biometric-signature name="handwaving3-2">
  409 + <presentation Label="handwaving" file-name="handwaving/person03_handwaving_d2_uncomp.avi" />
  410 + </biometric-signature>
  411 + <biometric-signature name="handwaving3-3">
  412 + <presentation Label="handwaving" file-name="handwaving/person03_handwaving_d3_uncomp.avi" />
  413 + </biometric-signature>
  414 + <biometric-signature name="handwaving3-4">
  415 + <presentation Label="handwaving" file-name="handwaving/person03_handwaving_d4_uncomp.avi" />
  416 + </biometric-signature>
  417 + <biometric-signature name="handwaving4-1">
  418 + <presentation Label="handwaving" file-name="handwaving/person04_handwaving_d1_uncomp.avi" />
  419 + </biometric-signature>
  420 + <biometric-signature name="handwaving4-2">
  421 + <presentation Label="handwaving" file-name="handwaving/person04_handwaving_d2_uncomp.avi" />
  422 + </biometric-signature>
  423 + <biometric-signature name="handwaving4-3">
  424 + <presentation Label="handwaving" file-name="handwaving/person04_handwaving_d3_uncomp.avi" />
  425 + </biometric-signature>
  426 + <biometric-signature name="handwaving4-4">
  427 + <presentation Label="handwaving" file-name="handwaving/person04_handwaving_d4_uncomp.avi" />
  428 + </biometric-signature>
  429 + <biometric-signature name="handwaving5-1">
  430 + <presentation Label="handwaving" file-name="handwaving/person05_handwaving_d1_uncomp.avi" />
  431 + </biometric-signature>
  432 + <biometric-signature name="handwaving5-2">
  433 + <presentation Label="handwaving" file-name="handwaving/person05_handwaving_d2_uncomp.avi" />
  434 + </biometric-signature>
  435 + <biometric-signature name="handwaving5-3">
  436 + <presentation Label="handwaving" file-name="handwaving/person05_handwaving_d3_uncomp.avi" />
  437 + </biometric-signature>
  438 + <biometric-signature name="handwaving5-4">
  439 + <presentation Label="handwaving" file-name="handwaving/person05_handwaving_d4_uncomp.avi" />
  440 + </biometric-signature>
  441 + <biometric-signature name="handwaving6-1">
  442 + <presentation Label="handwaving" file-name="handwaving/person06_handwaving_d1_uncomp.avi" />
  443 + </biometric-signature>
  444 + <biometric-signature name="handwaving6-2">
  445 + <presentation Label="handwaving" file-name="handwaving/person06_handwaving_d2_uncomp.avi" />
  446 + </biometric-signature>
  447 + <biometric-signature name="handwaving6-3">
  448 + <presentation Label="handwaving" file-name="handwaving/person06_handwaving_d3_uncomp.avi" />
  449 + </biometric-signature>
  450 + <biometric-signature name="handwaving6-4">
  451 + <presentation Label="handwaving" file-name="handwaving/person06_handwaving_d4_uncomp.avi" />
  452 + </biometric-signature>
  453 + <biometric-signature name="handwaving7-1">
  454 + <presentation Label="handwaving" file-name="handwaving/person07_handwaving_d1_uncomp.avi" />
  455 + </biometric-signature>
  456 + <biometric-signature name="handwaving7-2">
  457 + <presentation Label="handwaving" file-name="handwaving/person07_handwaving_d2_uncomp.avi" />
  458 + </biometric-signature>
  459 + <biometric-signature name="handwaving7-3">
  460 + <presentation Label="handwaving" file-name="handwaving/person07_handwaving_d3_uncomp.avi" />
  461 + </biometric-signature>
  462 + <biometric-signature name="handwaving7-4">
  463 + <presentation Label="handwaving" file-name="handwaving/person07_handwaving_d4_uncomp.avi" />
  464 + </biometric-signature>
  465 + <biometric-signature name="handwaving8-1">
  466 + <presentation Label="handwaving" file-name="handwaving/person08_handwaving_d1_uncomp.avi" />
  467 + </biometric-signature>
  468 + <biometric-signature name="handwaving8-2">
  469 + <presentation Label="handwaving" file-name="handwaving/person08_handwaving_d2_uncomp.avi" />
  470 + </biometric-signature>
  471 + <biometric-signature name="handwaving8-3">
  472 + <presentation Label="handwaving" file-name="handwaving/person08_handwaving_d3_uncomp.avi" />
  473 + </biometric-signature>
  474 + <biometric-signature name="handwaving8-4">
  475 + <presentation Label="handwaving" file-name="handwaving/person08_handwaving_d4_uncomp.avi" />
  476 + </biometric-signature>
  477 + <biometric-signature name="handwaving9-1">
  478 + <presentation Label="handwaving" file-name="handwaving/person09_handwaving_d1_uncomp.avi" />
  479 + </biometric-signature>
  480 + <biometric-signature name="handwaving9-2">
  481 + <presentation Label="handwaving" file-name="handwaving/person09_handwaving_d2_uncomp.avi" />
  482 + </biometric-signature>
  483 + <biometric-signature name="handwaving9-3">
  484 + <presentation Label="handwaving" file-name="handwaving/person09_handwaving_d3_uncomp.avi" />
  485 + </biometric-signature>
  486 + <biometric-signature name="handwaving9-4">
  487 + <presentation Label="handwaving" file-name="handwaving/person09_handwaving_d4_uncomp.avi" />
  488 + </biometric-signature>
  489 + <biometric-signature name="handwaving10-1">
  490 + <presentation Label="handwaving" file-name="handwaving/person10_handwaving_d1_uncomp.avi" />
  491 + </biometric-signature>
  492 + <biometric-signature name="handwaving10-2">
  493 + <presentation Label="handwaving" file-name="handwaving/person10_handwaving_d2_uncomp.avi" />
  494 + </biometric-signature>
  495 + <biometric-signature name="handwaving10-3">
  496 + <presentation Label="handwaving" file-name="handwaving/person10_handwaving_d3_uncomp.avi" />
  497 + </biometric-signature>
  498 + <biometric-signature name="handwaving10-4">
  499 + <presentation Label="handwaving" file-name="handwaving/person10_handwaving_d4_uncomp.avi" />
  500 + </biometric-signature>
  501 + <biometric-signature name="handwaving11-1">
  502 + <presentation Label="handwaving" file-name="handwaving/person11_handwaving_d1_uncomp.avi" />
  503 + </biometric-signature>
  504 + <biometric-signature name="handwaving11-2">
  505 + <presentation Label="handwaving" file-name="handwaving/person11_handwaving_d2_uncomp.avi" />
  506 + </biometric-signature>
  507 + <biometric-signature name="handwaving11-3">
  508 + <presentation Label="handwaving" file-name="handwaving/person11_handwaving_d3_uncomp.avi" />
  509 + </biometric-signature>
  510 + <biometric-signature name="handwaving11-4">
  511 + <presentation Label="handwaving" file-name="handwaving/person11_handwaving_d4_uncomp.avi" />
  512 + </biometric-signature>
  513 + <biometric-signature name="handwaving12-1">
  514 + <presentation Label="handwaving" file-name="handwaving/person12_handwaving_d1_uncomp.avi" />
  515 + </biometric-signature>
  516 + <biometric-signature name="handwaving12-2">
  517 + <presentation Label="handwaving" file-name="handwaving/person12_handwaving_d2_uncomp.avi" />
  518 + </biometric-signature>
  519 + <biometric-signature name="handwaving12-3">
  520 + <presentation Label="handwaving" file-name="handwaving/person12_handwaving_d3_uncomp.avi" />
  521 + </biometric-signature>
  522 + <biometric-signature name="handwaving12-4">
  523 + <presentation Label="handwaving" file-name="handwaving/person12_handwaving_d4_uncomp.avi" />
  524 + </biometric-signature>
  525 + <biometric-signature name="handwaving13-1">
  526 + <presentation Label="handwaving" file-name="handwaving/person13_handwaving_d1_uncomp.avi" />
  527 + </biometric-signature>
  528 + <biometric-signature name="handwaving13-2">
  529 + <presentation Label="handwaving" file-name="handwaving/person13_handwaving_d2_uncomp.avi" />
  530 + </biometric-signature>
  531 + <biometric-signature name="handwaving13-3">
  532 + <presentation Label="handwaving" file-name="handwaving/person13_handwaving_d3_uncomp.avi" />
  533 + </biometric-signature>
  534 + <biometric-signature name="handwaving13-4">
  535 + <presentation Label="handwaving" file-name="handwaving/person13_handwaving_d4_uncomp.avi" />
  536 + </biometric-signature>
  537 + <biometric-signature name="handwaving14-1">
  538 + <presentation Label="handwaving" file-name="handwaving/person14_handwaving_d1_uncomp.avi" />
  539 + </biometric-signature>
  540 + <biometric-signature name="handwaving14-2">
  541 + <presentation Label="handwaving" file-name="handwaving/person14_handwaving_d2_uncomp.avi" />
  542 + </biometric-signature>
  543 + <biometric-signature name="handwaving14-3">
  544 + <presentation Label="handwaving" file-name="handwaving/person14_handwaving_d3_uncomp.avi" />
  545 + </biometric-signature>
  546 + <biometric-signature name="handwaving14-4">
  547 + <presentation Label="handwaving" file-name="handwaving/person14_handwaving_d4_uncomp.avi" />
  548 + </biometric-signature>
  549 + <biometric-signature name="handwaving15-1">
  550 + <presentation Label="handwaving" file-name="handwaving/person15_handwaving_d1_uncomp.avi" />
  551 + </biometric-signature>
  552 + <biometric-signature name="handwaving15-2">
  553 + <presentation Label="handwaving" file-name="handwaving/person15_handwaving_d2_uncomp.avi" />
  554 + </biometric-signature>
  555 + <biometric-signature name="handwaving15-3">
  556 + <presentation Label="handwaving" file-name="handwaving/person15_handwaving_d3_uncomp.avi" />
  557 + </biometric-signature>
  558 + <biometric-signature name="handwaving15-4">
  559 + <presentation Label="handwaving" file-name="handwaving/person15_handwaving_d4_uncomp.avi" />
  560 + </biometric-signature>
  561 + <biometric-signature name="handwaving16-1">
  562 + <presentation Label="handwaving" file-name="handwaving/person16_handwaving_d1_uncomp.avi" />
  563 + </biometric-signature>
  564 + <biometric-signature name="handwaving16-2">
  565 + <presentation Label="handwaving" file-name="handwaving/person16_handwaving_d2_uncomp.avi" />
  566 + </biometric-signature>
  567 + <biometric-signature name="handwaving16-3">
  568 + <presentation Label="handwaving" file-name="handwaving/person16_handwaving_d3_uncomp.avi" />
  569 + </biometric-signature>
  570 + <biometric-signature name="handwaving16-4">
  571 + <presentation Label="handwaving" file-name="handwaving/person16_handwaving_d4_uncomp.avi" />
  572 + </biometric-signature>
  573 + <biometric-signature name="jogging1-1">
  574 + <presentation Label="jogging" file-name="jogging/person01_jogging_d1_uncomp.avi" />
  575 + </biometric-signature>
  576 + <biometric-signature name="jogging1-2">
  577 + <presentation Label="jogging" file-name="jogging/person01_jogging_d2_uncomp.avi" />
  578 + </biometric-signature>
  579 + <biometric-signature name="jogging1-3">
  580 + <presentation Label="jogging" file-name="jogging/person01_jogging_d3_uncomp.avi" />
  581 + </biometric-signature>
  582 + <biometric-signature name="jogging1-4">
  583 + <presentation Label="jogging" file-name="jogging/person01_jogging_d4_uncomp.avi" />
  584 + </biometric-signature>
  585 + <biometric-signature name="jogging2-1">
  586 + <presentation Label="jogging" file-name="jogging/person02_jogging_d1_uncomp.avi" />
  587 + </biometric-signature>
  588 + <biometric-signature name="jogging2-2">
  589 + <presentation Label="jogging" file-name="jogging/person02_jogging_d2_uncomp.avi" />
  590 + </biometric-signature>
  591 + <biometric-signature name="jogging2-3">
  592 + <presentation Label="jogging" file-name="jogging/person02_jogging_d3_uncomp.avi" />
  593 + </biometric-signature>
  594 + <biometric-signature name="jogging2-4">
  595 + <presentation Label="jogging" file-name="jogging/person02_jogging_d4_uncomp.avi" />
  596 + </biometric-signature>
  597 + <biometric-signature name="jogging3-1">
  598 + <presentation Label="jogging" file-name="jogging/person03_jogging_d1_uncomp.avi" />
  599 + </biometric-signature>
  600 + <biometric-signature name="jogging3-2">
  601 + <presentation Label="jogging" file-name="jogging/person03_jogging_d2_uncomp.avi" />
  602 + </biometric-signature>
  603 + <biometric-signature name="jogging3-3">
  604 + <presentation Label="jogging" file-name="jogging/person03_jogging_d3_uncomp.avi" />
  605 + </biometric-signature>
  606 + <biometric-signature name="jogging3-4">
  607 + <presentation Label="jogging" file-name="jogging/person03_jogging_d4_uncomp.avi" />
  608 + </biometric-signature>
  609 + <biometric-signature name="jogging4-1">
  610 + <presentation Label="jogging" file-name="jogging/person04_jogging_d1_uncomp.avi" />
  611 + </biometric-signature>
  612 + <biometric-signature name="jogging4-2">
  613 + <presentation Label="jogging" file-name="jogging/person04_jogging_d2_uncomp.avi" />
  614 + </biometric-signature>
  615 + <biometric-signature name="jogging4-3">
  616 + <presentation Label="jogging" file-name="jogging/person04_jogging_d3_uncomp.avi" />
  617 + </biometric-signature>
  618 + <biometric-signature name="jogging4-4">
  619 + <presentation Label="jogging" file-name="jogging/person04_jogging_d4_uncomp.avi" />
  620 + </biometric-signature>
  621 + <biometric-signature name="jogging5-1">
  622 + <presentation Label="jogging" file-name="jogging/person05_jogging_d1_uncomp.avi" />
  623 + </biometric-signature>
  624 + <biometric-signature name="jogging5-2">
  625 + <presentation Label="jogging" file-name="jogging/person05_jogging_d2_uncomp.avi" />
  626 + </biometric-signature>
  627 + <biometric-signature name="jogging5-3">
  628 + <presentation Label="jogging" file-name="jogging/person05_jogging_d3_uncomp.avi" />
  629 + </biometric-signature>
  630 + <biometric-signature name="jogging5-4">
  631 + <presentation Label="jogging" file-name="jogging/person05_jogging_d4_uncomp.avi" />
  632 + </biometric-signature>
  633 + <biometric-signature name="jogging6-1">
  634 + <presentation Label="jogging" file-name="jogging/person06_jogging_d1_uncomp.avi" />
  635 + </biometric-signature>
  636 + <biometric-signature name="jogging6-2">
  637 + <presentation Label="jogging" file-name="jogging/person06_jogging_d2_uncomp.avi" />
  638 + </biometric-signature>
  639 + <biometric-signature name="jogging6-3">
  640 + <presentation Label="jogging" file-name="jogging/person06_jogging_d3_uncomp.avi" />
  641 + </biometric-signature>
  642 + <biometric-signature name="jogging6-4">
  643 + <presentation Label="jogging" file-name="jogging/person06_jogging_d4_uncomp.avi" />
  644 + </biometric-signature>
  645 + <biometric-signature name="jogging7-1">
  646 + <presentation Label="jogging" file-name="jogging/person07_jogging_d1_uncomp.avi" />
  647 + </biometric-signature>
  648 + <biometric-signature name="jogging7-2">
  649 + <presentation Label="jogging" file-name="jogging/person07_jogging_d2_uncomp.avi" />
  650 + </biometric-signature>
  651 + <biometric-signature name="jogging7-3">
  652 + <presentation Label="jogging" file-name="jogging/person07_jogging_d3_uncomp.avi" />
  653 + </biometric-signature>
  654 + <biometric-signature name="jogging7-4">
  655 + <presentation Label="jogging" file-name="jogging/person07_jogging_d4_uncomp.avi" />
  656 + </biometric-signature>
  657 + <biometric-signature name="jogging8-1">
  658 + <presentation Label="jogging" file-name="jogging/person08_jogging_d1_uncomp.avi" />
  659 + </biometric-signature>
  660 + <biometric-signature name="jogging8-2">
  661 + <presentation Label="jogging" file-name="jogging/person08_jogging_d2_uncomp.avi" />
  662 + </biometric-signature>
  663 + <biometric-signature name="jogging8-3">
  664 + <presentation Label="jogging" file-name="jogging/person08_jogging_d3_uncomp.avi" />
  665 + </biometric-signature>
  666 + <biometric-signature name="jogging8-4">
  667 + <presentation Label="jogging" file-name="jogging/person08_jogging_d4_uncomp.avi" />
  668 + </biometric-signature>
  669 + <biometric-signature name="jogging9-1">
  670 + <presentation Label="jogging" file-name="jogging/person09_jogging_d1_uncomp.avi" />
  671 + </biometric-signature>
  672 + <biometric-signature name="jogging9-2">
  673 + <presentation Label="jogging" file-name="jogging/person09_jogging_d2_uncomp.avi" />
  674 + </biometric-signature>
  675 + <biometric-signature name="jogging9-3">
  676 + <presentation Label="jogging" file-name="jogging/person09_jogging_d3_uncomp.avi" />
  677 + </biometric-signature>
  678 + <biometric-signature name="jogging9-4">
  679 + <presentation Label="jogging" file-name="jogging/person09_jogging_d4_uncomp.avi" />
  680 + </biometric-signature>
  681 + <biometric-signature name="jogging10-1">
  682 + <presentation Label="jogging" file-name="jogging/person10_jogging_d1_uncomp.avi" />
  683 + </biometric-signature>
  684 + <biometric-signature name="jogging10-2">
  685 + <presentation Label="jogging" file-name="jogging/person10_jogging_d2_uncomp.avi" />
  686 + </biometric-signature>
  687 + <biometric-signature name="jogging10-3">
  688 + <presentation Label="jogging" file-name="jogging/person10_jogging_d3_uncomp.avi" />
  689 + </biometric-signature>
  690 + <biometric-signature name="jogging10-4">
  691 + <presentation Label="jogging" file-name="jogging/person10_jogging_d4_uncomp.avi" />
  692 + </biometric-signature>
  693 + <biometric-signature name="jogging11-1">
  694 + <presentation Label="jogging" file-name="jogging/person11_jogging_d1_uncomp.avi" />
  695 + </biometric-signature>
  696 + <biometric-signature name="jogging11-2">
  697 + <presentation Label="jogging" file-name="jogging/person11_jogging_d2_uncomp.avi" />
  698 + </biometric-signature>
  699 + <biometric-signature name="jogging11-3">
  700 + <presentation Label="jogging" file-name="jogging/person11_jogging_d3_uncomp.avi" />
  701 + </biometric-signature>
  702 + <biometric-signature name="jogging11-4">
  703 + <presentation Label="jogging" file-name="jogging/person11_jogging_d4_uncomp.avi" />
  704 + </biometric-signature>
  705 + <biometric-signature name="jogging12-1">
  706 + <presentation Label="jogging" file-name="jogging/person12_jogging_d1_uncomp.avi" />
  707 + </biometric-signature>
  708 + <biometric-signature name="jogging12-2">
  709 + <presentation Label="jogging" file-name="jogging/person12_jogging_d2_uncomp.avi" />
  710 + </biometric-signature>
  711 + <biometric-signature name="jogging12-3">
  712 + <presentation Label="jogging" file-name="jogging/person12_jogging_d3_uncomp.avi" />
  713 + </biometric-signature>
  714 + <biometric-signature name="jogging12-4">
  715 + <presentation Label="jogging" file-name="jogging/person12_jogging_d4_uncomp.avi" />
  716 + </biometric-signature>
  717 + <biometric-signature name="jogging13-1">
  718 + <presentation Label="jogging" file-name="jogging/person13_jogging_d1_uncomp.avi" />
  719 + </biometric-signature>
  720 + <biometric-signature name="jogging13-2">
  721 + <presentation Label="jogging" file-name="jogging/person13_jogging_d2_uncomp.avi" />
  722 + </biometric-signature>
  723 + <biometric-signature name="jogging13-3">
  724 + <presentation Label="jogging" file-name="jogging/person13_jogging_d3_uncomp.avi" />
  725 + </biometric-signature>
  726 + <biometric-signature name="jogging13-4">
  727 + <presentation Label="jogging" file-name="jogging/person13_jogging_d4_uncomp.avi" />
  728 + </biometric-signature>
  729 + <biometric-signature name="jogging14-1">
  730 + <presentation Label="jogging" file-name="jogging/person14_jogging_d1_uncomp.avi" />
  731 + </biometric-signature>
  732 + <biometric-signature name="jogging14-2">
  733 + <presentation Label="jogging" file-name="jogging/person14_jogging_d2_uncomp.avi" />
  734 + </biometric-signature>
  735 + <biometric-signature name="jogging14-3">
  736 + <presentation Label="jogging" file-name="jogging/person14_jogging_d3_uncomp.avi" />
  737 + </biometric-signature>
  738 + <biometric-signature name="jogging14-4">
  739 + <presentation Label="jogging" file-name="jogging/person14_jogging_d4_uncomp.avi" />
  740 + </biometric-signature>
  741 + <biometric-signature name="jogging15-1">
  742 + <presentation Label="jogging" file-name="jogging/person15_jogging_d1_uncomp.avi" />
  743 + </biometric-signature>
  744 + <biometric-signature name="jogging15-2">
  745 + <presentation Label="jogging" file-name="jogging/person15_jogging_d2_uncomp.avi" />
  746 + </biometric-signature>
  747 + <biometric-signature name="jogging15-3">
  748 + <presentation Label="jogging" file-name="jogging/person15_jogging_d3_uncomp.avi" />
  749 + </biometric-signature>
  750 + <biometric-signature name="jogging15-4">
  751 + <presentation Label="jogging" file-name="jogging/person15_jogging_d4_uncomp.avi" />
  752 + </biometric-signature>
  753 + <biometric-signature name="jogging16-1">
  754 + <presentation Label="jogging" file-name="jogging/person16_jogging_d1_uncomp.avi" />
  755 + </biometric-signature>
  756 + <biometric-signature name="jogging16-2">
  757 + <presentation Label="jogging" file-name="jogging/person16_jogging_d2_uncomp.avi" />
  758 + </biometric-signature>
  759 + <biometric-signature name="jogging16-3">
  760 + <presentation Label="jogging" file-name="jogging/person16_jogging_d3_uncomp.avi" />
  761 + </biometric-signature>
  762 + <biometric-signature name="jogging16-4">
  763 + <presentation Label="jogging" file-name="jogging/person16_jogging_d4_uncomp.avi" />
  764 + </biometric-signature>
  765 + <biometric-signature name="running1-1">
  766 + <presentation Label="running" file-name="running/person01_running_d1_uncomp.avi" />
  767 + </biometric-signature>
  768 + <biometric-signature name="running1-2">
  769 + <presentation Label="running" file-name="running/person01_running_d2_uncomp.avi" />
  770 + </biometric-signature>
  771 + <biometric-signature name="running1-3">
  772 + <presentation Label="running" file-name="running/person01_running_d3_uncomp.avi" />
  773 + </biometric-signature>
  774 + <biometric-signature name="running1-4">
  775 + <presentation Label="running" file-name="running/person01_running_d4_uncomp.avi" />
  776 + </biometric-signature>
  777 + <biometric-signature name="running2-1">
  778 + <presentation Label="running" file-name="running/person02_running_d1_uncomp.avi" />
  779 + </biometric-signature>
  780 + <biometric-signature name="running2-2">
  781 + <presentation Label="running" file-name="running/person02_running_d2_uncomp.avi" />
  782 + </biometric-signature>
  783 + <biometric-signature name="running2-3">
  784 + <presentation Label="running" file-name="running/person02_running_d3_uncomp.avi" />
  785 + </biometric-signature>
  786 + <biometric-signature name="running2-4">
  787 + <presentation Label="running" file-name="running/person02_running_d4_uncomp.avi" />
  788 + </biometric-signature>
  789 + <biometric-signature name="running3-1">
  790 + <presentation Label="running" file-name="running/person03_running_d1_uncomp.avi" />
  791 + </biometric-signature>
  792 + <biometric-signature name="running3-2">
  793 + <presentation Label="running" file-name="running/person03_running_d2_uncomp.avi" />
  794 + </biometric-signature>
  795 + <biometric-signature name="running3-3">
  796 + <presentation Label="running" file-name="running/person03_running_d3_uncomp.avi" />
  797 + </biometric-signature>
  798 + <biometric-signature name="running3-4">
  799 + <presentation Label="running" file-name="running/person03_running_d4_uncomp.avi" />
  800 + </biometric-signature>
  801 + <biometric-signature name="running4-1">
  802 + <presentation Label="running" file-name="running/person04_running_d1_uncomp.avi" />
  803 + </biometric-signature>
  804 + <biometric-signature name="running4-2">
  805 + <presentation Label="running" file-name="running/person04_running_d2_uncomp.avi" />
  806 + </biometric-signature>
  807 + <biometric-signature name="running4-3">
  808 + <presentation Label="running" file-name="running/person04_running_d3_uncomp.avi" />
  809 + </biometric-signature>
  810 + <biometric-signature name="running4-4">
  811 + <presentation Label="running" file-name="running/person04_running_d4_uncomp.avi" />
  812 + </biometric-signature>
  813 + <biometric-signature name="running5-1">
  814 + <presentation Label="running" file-name="running/person05_running_d1_uncomp.avi" />
  815 + </biometric-signature>
  816 + <biometric-signature name="running5-2">
  817 + <presentation Label="running" file-name="running/person05_running_d2_uncomp.avi" />
  818 + </biometric-signature>
  819 + <biometric-signature name="running5-3">
  820 + <presentation Label="running" file-name="running/person05_running_d3_uncomp.avi" />
  821 + </biometric-signature>
  822 + <biometric-signature name="running5-4">
  823 + <presentation Label="running" file-name="running/person05_running_d4_uncomp.avi" />
  824 + </biometric-signature>
  825 + <biometric-signature name="running6-1">
  826 + <presentation Label="running" file-name="running/person06_running_d1_uncomp.avi" />
  827 + </biometric-signature>
  828 + <biometric-signature name="running6-2">
  829 + <presentation Label="running" file-name="running/person06_running_d2_uncomp.avi" />
  830 + </biometric-signature>
  831 + <biometric-signature name="running6-3">
  832 + <presentation Label="running" file-name="running/person06_running_d3_uncomp.avi" />
  833 + </biometric-signature>
  834 + <biometric-signature name="running6-4">
  835 + <presentation Label="running" file-name="running/person06_running_d4_uncomp.avi" />
  836 + </biometric-signature>
  837 + <biometric-signature name="running7-1">
  838 + <presentation Label="running" file-name="running/person07_running_d1_uncomp.avi" />
  839 + </biometric-signature>
  840 + <biometric-signature name="running7-2">
  841 + <presentation Label="running" file-name="running/person07_running_d2_uncomp.avi" />
  842 + </biometric-signature>
  843 + <biometric-signature name="running7-3">
  844 + <presentation Label="running" file-name="running/person07_running_d3_uncomp.avi" />
  845 + </biometric-signature>
  846 + <biometric-signature name="running7-4">
  847 + <presentation Label="running" file-name="running/person07_running_d4_uncomp.avi" />
  848 + </biometric-signature>
  849 + <biometric-signature name="running8-1">
  850 + <presentation Label="running" file-name="running/person08_running_d1_uncomp.avi" />
  851 + </biometric-signature>
  852 + <biometric-signature name="running8-2">
  853 + <presentation Label="running" file-name="running/person08_running_d2_uncomp.avi" />
  854 + </biometric-signature>
  855 + <biometric-signature name="running8-3">
  856 + <presentation Label="running" file-name="running/person08_running_d3_uncomp.avi" />
  857 + </biometric-signature>
  858 + <biometric-signature name="running8-4">
  859 + <presentation Label="running" file-name="running/person08_running_d4_uncomp.avi" />
  860 + </biometric-signature>
  861 + <biometric-signature name="running9-1">
  862 + <presentation Label="running" file-name="running/person09_running_d1_uncomp.avi" />
  863 + </biometric-signature>
  864 + <biometric-signature name="running9-2">
  865 + <presentation Label="running" file-name="running/person09_running_d2_uncomp.avi" />
  866 + </biometric-signature>
  867 + <biometric-signature name="running9-3">
  868 + <presentation Label="running" file-name="running/person09_running_d3_uncomp.avi" />
  869 + </biometric-signature>
  870 + <biometric-signature name="running9-4">
  871 + <presentation Label="running" file-name="running/person09_running_d4_uncomp.avi" />
  872 + </biometric-signature>
  873 + <biometric-signature name="running10-1">
  874 + <presentation Label="running" file-name="running/person10_running_d1_uncomp.avi" />
  875 + </biometric-signature>
  876 + <biometric-signature name="running10-2">
  877 + <presentation Label="running" file-name="running/person10_running_d2_uncomp.avi" />
  878 + </biometric-signature>
  879 + <biometric-signature name="running10-3">
  880 + <presentation Label="running" file-name="running/person10_running_d3_uncomp.avi" />
  881 + </biometric-signature>
  882 + <biometric-signature name="running10-4">
  883 + <presentation Label="running" file-name="running/person10_running_d4_uncomp.avi" />
  884 + </biometric-signature>
  885 + <biometric-signature name="running11-1">
  886 + <presentation Label="running" file-name="running/person11_running_d1_uncomp.avi" />
  887 + </biometric-signature>
  888 + <biometric-signature name="running11-2">
  889 + <presentation Label="running" file-name="running/person11_running_d2_uncomp.avi" />
  890 + </biometric-signature>
  891 + <biometric-signature name="running11-3">
  892 + <presentation Label="running" file-name="running/person11_running_d3_uncomp.avi" />
  893 + </biometric-signature>
  894 + <biometric-signature name="running11-4">
  895 + <presentation Label="running" file-name="running/person11_running_d4_uncomp.avi" />
  896 + </biometric-signature>
  897 + <biometric-signature name="running12-1">
  898 + <presentation Label="running" file-name="running/person12_running_d1_uncomp.avi" />
  899 + </biometric-signature>
  900 + <biometric-signature name="running12-2">
  901 + <presentation Label="running" file-name="running/person12_running_d2_uncomp.avi" />
  902 + </biometric-signature>
  903 + <biometric-signature name="running12-3">
  904 + <presentation Label="running" file-name="running/person12_running_d3_uncomp.avi" />
  905 + </biometric-signature>
  906 + <biometric-signature name="running12-4">
  907 + <presentation Label="running" file-name="running/person12_running_d4_uncomp.avi" />
  908 + </biometric-signature>
  909 + <biometric-signature name="running13-1">
  910 + <presentation Label="running" file-name="running/person13_running_d1_uncomp.avi" />
  911 + </biometric-signature>
  912 + <biometric-signature name="running13-2">
  913 + <presentation Label="running" file-name="running/person13_running_d2_uncomp.avi" />
  914 + </biometric-signature>
  915 + <biometric-signature name="running13-3">
  916 + <presentation Label="running" file-name="running/person13_running_d3_uncomp.avi" />
  917 + </biometric-signature>
  918 + <biometric-signature name="running13-4">
  919 + <presentation Label="running" file-name="running/person13_running_d4_uncomp.avi" />
  920 + </biometric-signature>
  921 + <biometric-signature name="running14-1">
  922 + <presentation Label="running" file-name="running/person14_running_d1_uncomp.avi" />
  923 + </biometric-signature>
  924 + <biometric-signature name="running14-2">
  925 + <presentation Label="running" file-name="running/person14_running_d2_uncomp.avi" />
  926 + </biometric-signature>
  927 + <biometric-signature name="running14-3">
  928 + <presentation Label="running" file-name="running/person14_running_d3_uncomp.avi" />
  929 + </biometric-signature>
  930 + <biometric-signature name="running14-4">
  931 + <presentation Label="running" file-name="running/person14_running_d4_uncomp.avi" />
  932 + </biometric-signature>
  933 + <biometric-signature name="running15-1">
  934 + <presentation Label="running" file-name="running/person15_running_d1_uncomp.avi" />
  935 + </biometric-signature>
  936 + <biometric-signature name="running15-2">
  937 + <presentation Label="running" file-name="running/person15_running_d2_uncomp.avi" />
  938 + </biometric-signature>
  939 + <biometric-signature name="running15-3">
  940 + <presentation Label="running" file-name="running/person15_running_d3_uncomp.avi" />
  941 + </biometric-signature>
  942 + <biometric-signature name="running15-4">
  943 + <presentation Label="running" file-name="running/person15_running_d4_uncomp.avi" />
  944 + </biometric-signature>
  945 + <biometric-signature name="running16-1">
  946 + <presentation Label="running" file-name="running/person16_running_d1_uncomp.avi" />
  947 + </biometric-signature>
  948 + <biometric-signature name="running16-2">
  949 + <presentation Label="running" file-name="running/person16_running_d2_uncomp.avi" />
  950 + </biometric-signature>
  951 + <biometric-signature name="running16-3">
  952 + <presentation Label="running" file-name="running/person16_running_d3_uncomp.avi" />
  953 + </biometric-signature>
  954 + <biometric-signature name="running16-4">
  955 + <presentation Label="running" file-name="running/person16_running_d4_uncomp.avi" />
  956 + </biometric-signature>
  957 + <biometric-signature name="walking1-1">
  958 + <presentation Label="walking" file-name="walking/person01_walking_d1_uncomp.avi" />
  959 + </biometric-signature>
  960 + <biometric-signature name="walking1-2">
  961 + <presentation Label="walking" file-name="walking/person01_walking_d2_uncomp.avi" />
  962 + </biometric-signature>
  963 + <biometric-signature name="walking1-3">
  964 + <presentation Label="walking" file-name="walking/person01_walking_d3_uncomp.avi" />
  965 + </biometric-signature>
  966 + <biometric-signature name="walking1-4">
  967 + <presentation Label="walking" file-name="walking/person01_walking_d4_uncomp.avi" />
  968 + </biometric-signature>
  969 + <biometric-signature name="walking2-1">
  970 + <presentation Label="walking" file-name="walking/person02_walking_d1_uncomp.avi" />
  971 + </biometric-signature>
  972 + <biometric-signature name="walking2-2">
  973 + <presentation Label="walking" file-name="walking/person02_walking_d2_uncomp.avi" />
  974 + </biometric-signature>
  975 + <biometric-signature name="walking2-3">
  976 + <presentation Label="walking" file-name="walking/person02_walking_d3_uncomp.avi" />
  977 + </biometric-signature>
  978 + <biometric-signature name="walking2-4">
  979 + <presentation Label="walking" file-name="walking/person02_walking_d4_uncomp.avi" />
  980 + </biometric-signature>
  981 + <biometric-signature name="walking3-1">
  982 + <presentation Label="walking" file-name="walking/person03_walking_d1_uncomp.avi" />
  983 + </biometric-signature>
  984 + <biometric-signature name="walking3-2">
  985 + <presentation Label="walking" file-name="walking/person03_walking_d2_uncomp.avi" />
  986 + </biometric-signature>
  987 + <biometric-signature name="walking3-3">
  988 + <presentation Label="walking" file-name="walking/person03_walking_d3_uncomp.avi" />
  989 + </biometric-signature>
  990 + <biometric-signature name="walking3-4">
  991 + <presentation Label="walking" file-name="walking/person03_walking_d4_uncomp.avi" />
  992 + </biometric-signature>
  993 + <biometric-signature name="walking4-1">
  994 + <presentation Label="walking" file-name="walking/person04_walking_d1_uncomp.avi" />
  995 + </biometric-signature>
  996 + <biometric-signature name="walking4-2">
  997 + <presentation Label="walking" file-name="walking/person04_walking_d2_uncomp.avi" />
  998 + </biometric-signature>
  999 + <biometric-signature name="walking4-3">
  1000 + <presentation Label="walking" file-name="walking/person04_walking_d3_uncomp.avi" />
  1001 + </biometric-signature>
  1002 + <biometric-signature name="walking4-4">
  1003 + <presentation Label="walking" file-name="walking/person04_walking_d4_uncomp.avi" />
  1004 + </biometric-signature>
  1005 + <biometric-signature name="walking5-1">
  1006 + <presentation Label="walking" file-name="walking/person05_walking_d1_uncomp.avi" />
  1007 + </biometric-signature>
  1008 + <biometric-signature name="walking5-2">
  1009 + <presentation Label="walking" file-name="walking/person05_walking_d2_uncomp.avi" />
  1010 + </biometric-signature>
  1011 + <biometric-signature name="walking5-3">
  1012 + <presentation Label="walking" file-name="walking/person05_walking_d3_uncomp.avi" />
  1013 + </biometric-signature>
  1014 + <biometric-signature name="walking5-4">
  1015 + <presentation Label="walking" file-name="walking/person05_walking_d4_uncomp.avi" />
  1016 + </biometric-signature>
  1017 + <biometric-signature name="walking6-1">
  1018 + <presentation Label="walking" file-name="walking/person06_walking_d1_uncomp.avi" />
  1019 + </biometric-signature>
  1020 + <biometric-signature name="walking6-2">
  1021 + <presentation Label="walking" file-name="walking/person06_walking_d2_uncomp.avi" />
  1022 + </biometric-signature>
  1023 + <biometric-signature name="walking6-3">
  1024 + <presentation Label="walking" file-name="walking/person06_walking_d3_uncomp.avi" />
  1025 + </biometric-signature>
  1026 + <biometric-signature name="walking6-4">
  1027 + <presentation Label="walking" file-name="walking/person06_walking_d4_uncomp.avi" />
  1028 + </biometric-signature>
  1029 + <biometric-signature name="walking7-1">
  1030 + <presentation Label="walking" file-name="walking/person07_walking_d1_uncomp.avi" />
  1031 + </biometric-signature>
  1032 + <biometric-signature name="walking7-2">
  1033 + <presentation Label="walking" file-name="walking/person07_walking_d2_uncomp.avi" />
  1034 + </biometric-signature>
  1035 + <biometric-signature name="walking7-3">
  1036 + <presentation Label="walking" file-name="walking/person07_walking_d3_uncomp.avi" />
  1037 + </biometric-signature>
  1038 + <biometric-signature name="walking7-4">
  1039 + <presentation Label="walking" file-name="walking/person07_walking_d4_uncomp.avi" />
  1040 + </biometric-signature>
  1041 + <biometric-signature name="walking8-1">
  1042 + <presentation Label="walking" file-name="walking/person08_walking_d1_uncomp.avi" />
  1043 + </biometric-signature>
  1044 + <biometric-signature name="walking8-2">
  1045 + <presentation Label="walking" file-name="walking/person08_walking_d2_uncomp.avi" />
  1046 + </biometric-signature>
  1047 + <biometric-signature name="walking8-3">
  1048 + <presentation Label="walking" file-name="walking/person08_walking_d3_uncomp.avi" />
  1049 + </biometric-signature>
  1050 + <biometric-signature name="walking8-4">
  1051 + <presentation Label="walking" file-name="walking/person08_walking_d4_uncomp.avi" />
  1052 + </biometric-signature>
  1053 + <biometric-signature name="walking9-1">
  1054 + <presentation Label="walking" file-name="walking/person09_walking_d1_uncomp.avi" />
  1055 + </biometric-signature>
  1056 + <biometric-signature name="walking9-2">
  1057 + <presentation Label="walking" file-name="walking/person09_walking_d2_uncomp.avi" />
  1058 + </biometric-signature>
  1059 + <biometric-signature name="walking9-3">
  1060 + <presentation Label="walking" file-name="walking/person09_walking_d3_uncomp.avi" />
  1061 + </biometric-signature>
  1062 + <biometric-signature name="walking9-4">
  1063 + <presentation Label="walking" file-name="walking/person09_walking_d4_uncomp.avi" />
  1064 + </biometric-signature>
  1065 + <biometric-signature name="walking10-1">
  1066 + <presentation Label="walking" file-name="walking/person10_walking_d1_uncomp.avi" />
  1067 + </biometric-signature>
  1068 + <biometric-signature name="walking10-2">
  1069 + <presentation Label="walking" file-name="walking/person10_walking_d2_uncomp.avi" />
  1070 + </biometric-signature>
  1071 + <biometric-signature name="walking10-3">
  1072 + <presentation Label="walking" file-name="walking/person10_walking_d3_uncomp.avi" />
  1073 + </biometric-signature>
  1074 + <biometric-signature name="walking10-4">
  1075 + <presentation Label="walking" file-name="walking/person10_walking_d4_uncomp.avi" />
  1076 + </biometric-signature>
  1077 + <biometric-signature name="walking11-1">
  1078 + <presentation Label="walking" file-name="walking/person11_walking_d1_uncomp.avi" />
  1079 + </biometric-signature>
  1080 + <biometric-signature name="walking11-2">
  1081 + <presentation Label="walking" file-name="walking/person11_walking_d2_uncomp.avi" />
  1082 + </biometric-signature>
  1083 + <biometric-signature name="walking11-3">
  1084 + <presentation Label="walking" file-name="walking/person11_walking_d3_uncomp.avi" />
  1085 + </biometric-signature>
  1086 + <biometric-signature name="walking11-4">
  1087 + <presentation Label="walking" file-name="walking/person11_walking_d4_uncomp.avi" />
  1088 + </biometric-signature>
  1089 + <biometric-signature name="walking12-1">
  1090 + <presentation Label="walking" file-name="walking/person12_walking_d1_uncomp.avi" />
  1091 + </biometric-signature>
  1092 + <biometric-signature name="walking12-2">
  1093 + <presentation Label="walking" file-name="walking/person12_walking_d2_uncomp.avi" />
  1094 + </biometric-signature>
  1095 + <biometric-signature name="walking12-3">
  1096 + <presentation Label="walking" file-name="walking/person12_walking_d3_uncomp.avi" />
  1097 + </biometric-signature>
  1098 + <biometric-signature name="walking12-4">
  1099 + <presentation Label="walking" file-name="walking/person12_walking_d4_uncomp.avi" />
  1100 + </biometric-signature>
  1101 + <biometric-signature name="walking13-1">
  1102 + <presentation Label="walking" file-name="walking/person13_walking_d1_uncomp.avi" />
  1103 + </biometric-signature>
  1104 + <biometric-signature name="walking13-2">
  1105 + <presentation Label="walking" file-name="walking/person13_walking_d2_uncomp.avi" />
  1106 + </biometric-signature>
  1107 + <biometric-signature name="walking13-3">
  1108 + <presentation Label="walking" file-name="walking/person13_walking_d3_uncomp.avi" />
  1109 + </biometric-signature>
  1110 + <biometric-signature name="walking13-4">
  1111 + <presentation Label="walking" file-name="walking/person13_walking_d4_uncomp.avi" />
  1112 + </biometric-signature>
  1113 + <biometric-signature name="walking14-1">
  1114 + <presentation Label="walking" file-name="walking/person14_walking_d1_uncomp.avi" />
  1115 + </biometric-signature>
  1116 + <biometric-signature name="walking14-2">
  1117 + <presentation Label="walking" file-name="walking/person14_walking_d2_uncomp.avi" />
  1118 + </biometric-signature>
  1119 + <biometric-signature name="walking14-3">
  1120 + <presentation Label="walking" file-name="walking/person14_walking_d3_uncomp.avi" />
  1121 + </biometric-signature>
  1122 + <biometric-signature name="walking14-4">
  1123 + <presentation Label="walking" file-name="walking/person14_walking_d4_uncomp.avi" />
  1124 + </biometric-signature>
  1125 + <biometric-signature name="walking15-1">
  1126 + <presentation Label="walking" file-name="walking/person15_walking_d1_uncomp.avi" />
  1127 + </biometric-signature>
  1128 + <biometric-signature name="walking15-2">
  1129 + <presentation Label="walking" file-name="walking/person15_walking_d2_uncomp.avi" />
  1130 + </biometric-signature>
  1131 + <biometric-signature name="walking15-3">
  1132 + <presentation Label="walking" file-name="walking/person15_walking_d3_uncomp.avi" />
  1133 + </biometric-signature>
  1134 + <biometric-signature name="walking15-4">
  1135 + <presentation Label="walking" file-name="walking/person15_walking_d4_uncomp.avi" />
  1136 + </biometric-signature>
  1137 + <biometric-signature name="walking16-1">
  1138 + <presentation Label="walking" file-name="walking/person16_walking_d1_uncomp.avi" />
  1139 + </biometric-signature>
  1140 + <biometric-signature name="walking16-2">
  1141 + <presentation Label="walking" file-name="walking/person16_walking_d2_uncomp.avi" />
  1142 + </biometric-signature>
  1143 + <biometric-signature name="walking16-3">
  1144 + <presentation Label="walking" file-name="walking/person16_walking_d3_uncomp.avi" />
  1145 + </biometric-signature>
  1146 + <biometric-signature name="walking16-4">
  1147 + <presentation Label="walking" file-name="walking/person16_walking_d4_uncomp.avi" />
  1148 + </biometric-signature>
  1149 +</biometric-signature-set>
openbr/core/eval.cpp
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 16
17 #include "bee.h" 17 #include "bee.h"
18 #include "eval.h" 18 #include "eval.h"
  19 +#include "openbr/core/common.h"
19 #include "openbr/core/qtutils.h" 20 #include "openbr/core/qtutils.h"
20 21
21 using namespace cv; 22 using namespace cv;
@@ -255,9 +256,9 @@ struct Counter @@ -255,9 +256,9 @@ struct Counter
255 } 256 }
256 }; 257 };
257 258
258 -void EvalClassification(const QString &predictedInput, const QString &truthInput, QString predictedProperty, QString truthProperty) 259 +void EvalClassification(const QString &predictedGallery, const QString &truthGallery, QString predictedProperty, QString truthProperty)
259 { 260 {
260 - qDebug("Evaluating classification of %s against %s", qPrintable(predictedInput), qPrintable(truthInput)); 261 + qDebug("Evaluating classification of %s against %s", qPrintable(predictedGallery), qPrintable(truthGallery));
261 262
262 if (predictedProperty.isEmpty()) 263 if (predictedProperty.isEmpty())
263 predictedProperty = "Label"; 264 predictedProperty = "Label";
@@ -269,8 +270,8 @@ void EvalClassification(const QString &amp;predictedInput, const QString &amp;truthInput @@ -269,8 +270,8 @@ void EvalClassification(const QString &amp;predictedInput, const QString &amp;truthInput
269 if (truthProperty.isEmpty()) 270 if (truthProperty.isEmpty())
270 truthProperty = "Label"; 271 truthProperty = "Label";
271 272
272 - TemplateList predicted(TemplateList::fromGallery(predictedInput));  
273 - TemplateList truth(TemplateList::fromGallery(truthInput)); 273 + TemplateList predicted(TemplateList::fromGallery(predictedGallery));
  274 + TemplateList truth(TemplateList::fromGallery(truthGallery));
274 if (predicted.size() != truth.size()) qFatal("Input size mismatch."); 275 if (predicted.size() != truth.size()) qFatal("Input size mismatch.");
275 276
276 QHash<QString, Counter> counters; 277 QHash<QString, Counter> counters;
@@ -383,13 +384,19 @@ static QStringList computeDetectionResults(const QList&lt;ResolvedDetection&gt; &amp;detec @@ -383,13 +384,19 @@ static QStringList computeDetectionResults(const QList&lt;ResolvedDetection&gt; &amp;detec
383 } 384 }
384 385
385 const int keep = qMin(points.size(), Max_Points); 386 const int keep = qMin(points.size(), Max_Points);
386 - if (keep < 2) qFatal("Insufficient points."); 387 + if (keep < 1) qFatal("Insufficient points.");
387 388
388 QStringList lines; lines.reserve(keep); 389 QStringList lines; lines.reserve(keep);
389 - for (int i=0; i<keep; i++) {  
390 - const DetectionOperatingPoint &point = points[double(i) / double(keep-1) * double(points.size()-1)]; 390 + if (keep == 1) {
  391 + const DetectionOperatingPoint &point = points[0];
391 lines.append(QString("%1ROC, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.FalsePositives), QString::number(point.Recall))); 392 lines.append(QString("%1ROC, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.FalsePositives), QString::number(point.Recall)));
392 lines.append(QString("%1PR, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.Recall), QString::number(point.Precision))); 393 lines.append(QString("%1PR, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.Recall), QString::number(point.Precision)));
  394 + } else {
  395 + for (int i=0; i<keep; i++) {
  396 + const DetectionOperatingPoint &point = points[double(i) / double(keep-1) * double(points.size()-1)];
  397 + lines.append(QString("%1ROC, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.FalsePositives), QString::number(point.Recall)));
  398 + lines.append(QString("%1PR, %2, %3").arg(discrete ? "Discrete" : "Continuous", QString::number(point.Recall), QString::number(point.Precision)));
  399 + }
393 } 400 }
394 return lines; 401 return lines;
395 } 402 }
@@ -403,11 +410,11 @@ QString getDetectKey(const TemplateList &amp;templates) @@ -403,11 +410,11 @@ QString getDetectKey(const TemplateList &amp;templates)
403 return ""; 410 return "";
404 } 411 }
405 412
406 -float EvalDetection(const QString &predictedInput, const QString &truthInput, const QString &csv) 413 +float EvalDetection(const QString &predictedGallery, const QString &truthGallery, const QString &csv)
407 { 414 {
408 - qDebug("Evaluating detection of %s against %s", qPrintable(predictedInput), qPrintable(truthInput));  
409 - const TemplateList predicted(TemplateList::fromGallery(predictedInput));  
410 - const TemplateList truth(TemplateList::fromGallery(truthInput)); 415 + qDebug("Evaluating detection of %s against %s", qPrintable(predictedGallery), qPrintable(truthGallery));
  416 + const TemplateList predicted(TemplateList::fromGallery(predictedGallery));
  417 + const TemplateList truth(TemplateList::fromGallery(truthGallery));
411 418
412 // Figure out which metadata field contains a bounding box 419 // Figure out which metadata field contains a bounding box
413 QString truthDetectKey = getDetectKey(truth); 420 QString truthDetectKey = getDetectKey(truth);
@@ -476,16 +483,55 @@ float EvalDetection(const QString &amp;predictedInput, const QString &amp;truthInput, co @@ -476,16 +483,55 @@ float EvalDetection(const QString &amp;predictedInput, const QString &amp;truthInput, co
476 return averageOverlap; 483 return averageOverlap;
477 } 484 }
478 485
479 -void EvalLandmarking(const QString &predictedInput, const QString &truthInput, const QString &csv) 486 +float EvalLandmarking(const QString &predictedGallery, const QString &truthGallery, const QString &csv, int normalizationIndexA, int normalizationIndexB)
480 { 487 {
481 - (void) predictedInput;  
482 - (void) truthInput;  
483 - (void) csv; 488 + qDebug("Evaluating landmarking of %s against %s", qPrintable(predictedGallery), qPrintable(truthGallery));
  489 + const TemplateList predicted(TemplateList::fromGallery(predictedGallery));
  490 + const TemplateList truth(TemplateList::fromGallery(truthGallery));
  491 + const QStringList predictedNames = File::get<QString>(predicted, "name");
  492 + const QStringList truthNames = File::get<QString>(truth, "name");
  493 +
  494 + QList< QList<float> > pointErrors;
  495 + for (int i=0; i<predicted.size(); i++) {
  496 + const QString &predictedName = predictedNames[i];
  497 + const int truthIndex = truthNames.indexOf(predictedName);
  498 + if (truthIndex == -1) qFatal("Could not identify ground truth for file: %s", qPrintable(predictedName));
  499 + const QList<QPointF> predictedPoints = predicted[i].file.points();
  500 + const QList<QPointF> truthPoints = truth[truthIndex].file.points();
  501 + if (predictedPoints.size() != truthPoints.size()) qFatal("Points size mismatch for file: %s", qPrintable(predictedName));
  502 + while (pointErrors.size() < predictedPoints.size())
  503 + pointErrors.append(QList<float>());
  504 + if (normalizationIndexA >= truthPoints.size()) qFatal("Normalization index A is out of range.");
  505 + if (normalizationIndexB >= truthPoints.size()) qFatal("Normalization index B is out of range.");
  506 + const float normalizedLength = QtUtils::euclideanLength(truthPoints[normalizationIndexB] - truthPoints[normalizationIndexA]);
  507 + for (int j=0; j<predictedPoints.size(); j++)
  508 + pointErrors[j].append(QtUtils::euclideanLength(predictedPoints[j] - truthPoints[j])/normalizedLength);
  509 + }
  510 +
  511 + QList<float> averagePointErrors; averagePointErrors.reserve(pointErrors.size());
  512 + for (int i=0; i<pointErrors.size(); i++) {
  513 + std::sort(pointErrors[i].begin(), pointErrors[i].end());
  514 + averagePointErrors.append(Common::Mean(pointErrors[i]));
  515 + }
  516 + const float averagePointError = Common::Mean(averagePointErrors);
  517 +
  518 + QStringList lines;
  519 + lines.append("Plot,X,Y");
  520 + for (int i=0; i<pointErrors.size(); i++) {
  521 + const QList<float> &pointError = pointErrors[i];
  522 + const int keep = qMin(Max_Points, pointError.size());
  523 + for (int j=0; j<keep; j++)
  524 + lines.append(QString("Box,%1,%2").arg(QString::number(i), QString::number(pointError[j*(pointError.size()-1)/(keep-1)])));
  525 + }
  526 +
  527 + QtUtils::writeFile(csv, lines);
  528 + qDebug("Average Error: %.3f", averagePointError);
  529 + return averagePointError;
484 } 530 }
485 531
486 -void EvalRegression(const QString &predictedInput, const QString &truthInput, QString predictedProperty, QString truthProperty) 532 +void EvalRegression(const QString &predictedGallery, const QString &truthGallery, QString predictedProperty, QString truthProperty)
487 { 533 {
488 - qDebug("Evaluating regression of %s against %s", qPrintable(predictedInput), qPrintable(truthInput)); 534 + qDebug("Evaluating regression of %s against %s", qPrintable(predictedGallery), qPrintable(truthGallery));
489 535
490 if (predictedProperty.isEmpty()) 536 if (predictedProperty.isEmpty())
491 predictedProperty = "Regressor"; 537 predictedProperty = "Regressor";
@@ -497,8 +543,8 @@ void EvalRegression(const QString &amp;predictedInput, const QString &amp;truthInput, QS @@ -497,8 +543,8 @@ void EvalRegression(const QString &amp;predictedInput, const QString &amp;truthInput, QS
497 if (truthProperty.isEmpty()) 543 if (truthProperty.isEmpty())
498 predictedProperty = "Regressand"; 544 predictedProperty = "Regressand";
499 545
500 - const TemplateList predicted(TemplateList::fromGallery(predictedInput));  
501 - const TemplateList truth(TemplateList::fromGallery(truthInput)); 546 + const TemplateList predicted(TemplateList::fromGallery(predictedGallery));
  547 + const TemplateList truth(TemplateList::fromGallery(truthGallery));
502 if (predicted.size() != truth.size()) qFatal("Input size mismatch."); 548 if (predicted.size() != truth.size()) qFatal("Input size mismatch.");
503 549
504 float rmsError = 0; 550 float rmsError = 0;
openbr/core/eval.h
@@ -26,10 +26,10 @@ namespace br @@ -26,10 +26,10 @@ namespace br
26 float Evaluate(const QString &simmat, const QString &mask = "", const QString &csv = ""); // Returns TAR @ FAR = 0.001 26 float Evaluate(const QString &simmat, const QString &mask = "", const QString &csv = ""); // Returns TAR @ FAR = 0.001
27 float Evaluate(const cv::Mat &scores, const FileList &target, const FileList &query, const QString &csv = "", int parition = 0); 27 float Evaluate(const cv::Mat &scores, const FileList &target, const FileList &query, const QString &csv = "", int parition = 0);
28 float Evaluate(const cv::Mat &scores, const cv::Mat &masks, const QString &csv = ""); 28 float Evaluate(const cv::Mat &scores, const cv::Mat &masks, const QString &csv = "");
29 - void EvalClassification(const QString &predictedInput, const QString &truthInput, QString predictedProperty="", QString truthProperty="");  
30 - float EvalDetection(const QString &predictedInput, const QString &truthInput, const QString &csv = ""); // Return average overlap  
31 - void EvalLandmarking(const QString &predictedInput, const QString &truthInput, const QString &csv = "");  
32 - void EvalRegression(const QString &predictedInput, const QString &truthInput, QString predictedProperty="", QString truthProperty=""); 29 + void EvalClassification(const QString &predictedGallery, const QString &truthGallery, QString predictedProperty = "", QString truthProperty = "");
  30 + float EvalDetection(const QString &predictedGallery, const QString &truthGallery, const QString &csv = ""); // Return average overlap
  31 + float EvalLandmarking(const QString &predictedGallery, const QString &truthGallery, const QString &csv = "", int normalizationIndexA = 0, int normalizationIndexB = 1); // Return average error
  32 + void EvalRegression(const QString &predictedGallery, const QString &truthGallery, QString predictedProperty = "", QString truthProperty = "");
33 } 33 }
34 34
35 #endif // __EVAL_H 35 #endif // __EVAL_H
openbr/core/plot.cpp
@@ -271,6 +271,34 @@ bool Plot(const QStringList &amp;files, const File &amp;destination, bool show) @@ -271,6 +271,34 @@ bool Plot(const QStringList &amp;files, const File &amp;destination, bool show)
271 return p.finalize(show); 271 return p.finalize(show);
272 } 272 }
273 273
  274 +//Check if only one ROC point is in the file
  275 +bool fileHasSinglePoint(const QString &evalFile) {
  276 + QFile file(evalFile);
  277 + bool success = file.open(QFile::ReadOnly);
  278 + if (!success) qFatal("Failed to open %s for reading.", qPrintable(evalFile));
  279 + QStringList lines = QString(file.readAll()).split("\n");
  280 + file.close();
  281 +
  282 + int rocCnt = 0;
  283 + foreach (const QString &line, lines) {
  284 + if (line.contains("DiscreteROC")) {
  285 + rocCnt++;
  286 + }
  287 + if (rocCnt > 1)
  288 + return false;
  289 + }
  290 +
  291 + return true;
  292 +}
  293 +
  294 +//Check all files to see if any single file has only have one ROC point
  295 +bool filesHaveSinglePoint(const QStringList &files) {
  296 + foreach (const File &file, files)
  297 + if (fileHasSinglePoint(file))
  298 + return true;
  299 + return false;
  300 +}
  301 +
274 bool PlotDetection(const QStringList &files, const File &destination, bool show) 302 bool PlotDetection(const QStringList &files, const File &destination, bool show)
275 { 303 {
276 qDebug("Plotting %d detection file(s) to %s", files.size(), qPrintable(destination)); 304 qDebug("Plotting %d detection file(s) to %s", files.size(), qPrintable(destination));
@@ -287,8 +315,12 @@ bool PlotDetection(const QStringList &amp;files, const File &amp;destination, bool show) @@ -287,8 +315,12 @@ bool PlotDetection(const QStringList &amp;files, const File &amp;destination, bool show)
287 "rm(data)\n" 315 "rm(data)\n"
288 "\n"); 316 "\n");
289 317
  318 + QString plotType("line");
  319 + if (filesHaveSinglePoint(files))
  320 + plotType = QString("point");
  321 +
290 foreach (const QString &type, QStringList() << "Discrete" << "Continuous") 322 foreach (const QString &type, QStringList() << "Discrete" << "Continuous")
291 - p.file.write(qPrintable(QString("qplot(X, Y, data=%1ROC%2").arg(type, (p.major.smooth || p.minor.smooth) ? ", geom=\"smooth\", method=loess, level=0.99" : ", geom=\"line\"") + 323 + p.file.write(qPrintable(QString("qplot(X, Y, data=%1ROC%2").arg(type, (p.major.smooth || p.minor.smooth) ? ", geom=\"smooth\", method=loess, level=0.99" : QString(", geom=\"%1\"").arg(plotType)) +
292 (p.major.size > 1 ? QString(", colour=factor(%1)").arg(p.major.header) : QString()) + 324 (p.major.size > 1 ? QString(", colour=factor(%1)").arg(p.major.header) : QString()) +
293 (p.minor.size > 1 ? QString(", linetype=factor(%1)").arg(p.minor.header) : QString()) + 325 (p.minor.size > 1 ? QString(", linetype=factor(%1)").arg(p.minor.header) : QString()) +
294 QString(", xlab=\"False Accepts\", ylab=\"True Accept Rate\") + theme_minimal()") + 326 QString(", xlab=\"False Accepts\", ylab=\"True Accept Rate\") + theme_minimal()") +
@@ -297,7 +329,7 @@ bool PlotDetection(const QStringList &amp;files, const File &amp;destination, bool show) @@ -297,7 +329,7 @@ bool PlotDetection(const QStringList &amp;files, const File &amp;destination, bool show)
297 QString(" + scale_x_log10() + scale_y_continuous(labels=percent) + annotation_logticks(sides=\"b\") + ggtitle(\"%1\")\n\n").arg(type))); 329 QString(" + scale_x_log10() + scale_y_continuous(labels=percent) + annotation_logticks(sides=\"b\") + ggtitle(\"%1\")\n\n").arg(type)));
298 330
299 foreach (const QString &type, QStringList() << "Discrete" << "Continuous") 331 foreach (const QString &type, QStringList() << "Discrete" << "Continuous")
300 - p.file.write(qPrintable(QString("qplot(X, Y, data=%1PR%2").arg(type, (p.major.smooth || p.minor.smooth) ? ", geom=\"smooth\", method=loess, level=0.99" : ", geom=\"line\"") + 332 + p.file.write(qPrintable(QString("qplot(X, Y, data=%1PR%2").arg(type, (p.major.smooth || p.minor.smooth) ? ", geom=\"smooth\", method=loess, level=0.99" : QString(", geom=\"%1\"").arg(plotType)) +
301 (p.major.size > 1 ? QString(", colour=factor(%1)").arg(p.major.header) : QString()) + 333 (p.major.size > 1 ? QString(", colour=factor(%1)").arg(p.major.header) : QString()) +
302 (p.minor.size > 1 ? QString(", linetype=factor(%1)").arg(p.minor.header) : QString()) + 334 (p.minor.size > 1 ? QString(", linetype=factor(%1)").arg(p.minor.header) : QString()) +
303 QString(", xlab=\"Recall\", ylab=\"Precision\") + theme_minimal()") + 335 QString(", xlab=\"Recall\", ylab=\"Precision\") + theme_minimal()") +
openbr/core/qtutils.cpp
@@ -33,7 +33,10 @@ @@ -33,7 +33,10 @@
33 33
34 using namespace br; 34 using namespace br;
35 35
36 -QStringList QtUtils::getFiles(QDir dir, bool recursive) 36 +namespace QtUtils
  37 +{
  38 +
  39 +QStringList getFiles(QDir dir, bool recursive)
37 { 40 {
38 dir = QDir(dir.canonicalPath()); 41 dir = QDir(dir.canonicalPath());
39 42
@@ -51,7 +54,7 @@ QStringList QtUtils::getFiles(QDir dir, bool recursive) @@ -51,7 +54,7 @@ QStringList QtUtils::getFiles(QDir dir, bool recursive)
51 return files; 54 return files;
52 } 55 }
53 56
54 -QStringList QtUtils::getFiles(const QString &regexp) 57 +QStringList getFiles(const QString &regexp)
55 { 58 {
56 QFileInfo fileInfo(regexp); 59 QFileInfo fileInfo(regexp);
57 QDir dir(fileInfo.dir()); 60 QDir dir(fileInfo.dir());
@@ -65,14 +68,14 @@ QStringList QtUtils::getFiles(const QString &amp;regexp) @@ -65,14 +68,14 @@ QStringList QtUtils::getFiles(const QString &amp;regexp)
65 return files; 68 return files;
66 } 69 }
67 70
68 -QStringList QtUtils::readLines(const QString &file) 71 +QStringList readLines(const QString &file)
69 { 72 {
70 QStringList lines; 73 QStringList lines;
71 readFile(file, lines); 74 readFile(file, lines);
72 return lines; 75 return lines;
73 } 76 }
74 77
75 -void QtUtils::readFile(const QString &file, QStringList &lines) 78 +void readFile(const QString &file, QStringList &lines)
76 { 79 {
77 QByteArray data; 80 QByteArray data;
78 readFile(file, data); 81 readFile(file, data);
@@ -81,7 +84,7 @@ void QtUtils::readFile(const QString &amp;file, QStringList &amp;lines) @@ -81,7 +84,7 @@ void QtUtils::readFile(const QString &amp;file, QStringList &amp;lines)
81 lines[i] = lines[i].simplified(); 84 lines[i] = lines[i].simplified();
82 } 85 }
83 86
84 -void QtUtils::readFile(const QString &file, QByteArray &data, bool uncompress) 87 +void readFile(const QString &file, QByteArray &data, bool uncompress)
85 { 88 {
86 QFile f(file); 89 QFile f(file);
87 if (!f.open(QFile::ReadOnly)) { 90 if (!f.open(QFile::ReadOnly)) {
@@ -93,17 +96,17 @@ void QtUtils::readFile(const QString &amp;file, QByteArray &amp;data, bool uncompress) @@ -93,17 +96,17 @@ void QtUtils::readFile(const QString &amp;file, QByteArray &amp;data, bool uncompress)
93 f.close(); 96 f.close();
94 } 97 }
95 98
96 -void QtUtils::writeFile(const QString &file, const QStringList &lines) 99 +void writeFile(const QString &file, const QStringList &lines)
97 { 100 {
98 writeFile(file, lines.join("\n")); 101 writeFile(file, lines.join("\n"));
99 } 102 }
100 103
101 -void QtUtils::writeFile(const QString &file, const QString &data) 104 +void writeFile(const QString &file, const QString &data)
102 { 105 {
103 writeFile(file, data.toLocal8Bit()); 106 writeFile(file, data.toLocal8Bit());
104 } 107 }
105 108
106 -void QtUtils::writeFile(const QString &file, const QByteArray &data, int compression) 109 +void writeFile(const QString &file, const QByteArray &data, int compression)
107 { 110 {
108 if (file.isEmpty()) return; 111 if (file.isEmpty()) return;
109 const QString baseName = QFileInfo(file).baseName(); 112 const QString baseName = QFileInfo(file).baseName();
@@ -122,7 +125,7 @@ void QtUtils::writeFile(const QString &amp;file, const QByteArray &amp;data, int compres @@ -122,7 +125,7 @@ void QtUtils::writeFile(const QString &amp;file, const QByteArray &amp;data, int compres
122 } 125 }
123 } 126 }
124 127
125 -void QtUtils::copyFile(const QString &src, const QString &dst) 128 +void copyFile(const QString &src, const QString &dst)
126 { 129 {
127 touchDir(QFileInfo(dst)); 130 touchDir(QFileInfo(dst));
128 if (!QFile::copy(src, dst)) { 131 if (!QFile::copy(src, dst)) {
@@ -131,24 +134,24 @@ void QtUtils::copyFile(const QString &amp;src, const QString &amp;dst) @@ -131,24 +134,24 @@ void QtUtils::copyFile(const QString &amp;src, const QString &amp;dst)
131 } 134 }
132 } 135 }
133 136
134 -void QtUtils::touchDir(const QDir &dir) 137 +void touchDir(const QDir &dir)
135 { 138 {
136 if (dir.exists(".")) return; 139 if (dir.exists(".")) return;
137 if (!dir.mkpath(".")) 140 if (!dir.mkpath("."))
138 qFatal("Unable to create path to dir %s", qPrintable(dir.absolutePath())); 141 qFatal("Unable to create path to dir %s", qPrintable(dir.absolutePath()));
139 } 142 }
140 143
141 -void QtUtils::touchDir(const QFile &file) 144 +void touchDir(const QFile &file)
142 { 145 {
143 touchDir(QFileInfo(file)); 146 touchDir(QFileInfo(file));
144 } 147 }
145 148
146 -void QtUtils::touchDir(const QFileInfo &fileInfo) 149 +void touchDir(const QFileInfo &fileInfo)
147 { 150 {
148 touchDir(fileInfo.dir()); 151 touchDir(fileInfo.dir());
149 } 152 }
150 153
151 -void QtUtils::emptyDir(QDir &dir) 154 +void emptyDir(QDir &dir)
152 { 155 {
153 foreach (const QString &folder, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks)) { 156 foreach (const QString &folder, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks)) {
154 QDir subdir(dir); 157 QDir subdir(dir);
@@ -166,13 +169,13 @@ void QtUtils::emptyDir(QDir &amp;dir) @@ -166,13 +169,13 @@ void QtUtils::emptyDir(QDir &amp;dir)
166 dir.remove(symlink); 169 dir.remove(symlink);
167 } 170 }
168 171
169 -void QtUtils::deleteDir(QDir &dir) 172 +void deleteDir(QDir &dir)
170 { 173 {
171 emptyDir(dir); 174 emptyDir(dir);
172 dir.rmdir("."); 175 dir.rmdir(".");
173 } 176 }
174 177
175 -QString QtUtils::find(const QString &file, const QString &alt) 178 +QString find(const QString &file, const QString &alt)
176 { 179 {
177 if (QFileInfo(file).exists()) return file; 180 if (QFileInfo(file).exists()) return file;
178 if (QFileInfo(alt).exists()) return alt; 181 if (QFileInfo(alt).exists()) return alt;
@@ -180,28 +183,28 @@ QString QtUtils::find(const QString &amp;file, const QString &amp;alt) @@ -180,28 +183,28 @@ QString QtUtils::find(const QString &amp;file, const QString &amp;alt)
180 return ""; 183 return "";
181 } 184 }
182 185
183 -bool QtUtils::toBool(const QString &string) 186 +bool toBool(const QString &string)
184 { 187 {
185 bool ok; 188 bool ok;
186 bool result = (bool)string.toInt(&ok); if (!ok) qFatal("Expected integer value, got %s.", qPrintable(string)); 189 bool result = (bool)string.toInt(&ok); if (!ok) qFatal("Expected integer value, got %s.", qPrintable(string));
187 return result; 190 return result;
188 } 191 }
189 192
190 -int QtUtils::toInt(const QString &string) 193 +int toInt(const QString &string)
191 { 194 {
192 bool ok; 195 bool ok;
193 int result = string.toInt(&ok); if (!ok) qFatal("Expected integer value, got %s.", qPrintable(string)); 196 int result = string.toInt(&ok); if (!ok) qFatal("Expected integer value, got %s.", qPrintable(string));
194 return result; 197 return result;
195 } 198 }
196 199
197 -float QtUtils::toFloat(const QString &string) 200 +float toFloat(const QString &string)
198 { 201 {
199 bool ok; 202 bool ok;
200 float result = string.toFloat(&ok); if (!ok) qFatal("Expected floating point value, got %s.", qPrintable(string)); 203 float result = string.toFloat(&ok); if (!ok) qFatal("Expected floating point value, got %s.", qPrintable(string));
201 return result; 204 return result;
202 } 205 }
203 206
204 -QList<float> QtUtils::toFloats(const QStringList &strings) 207 +QList<float> toFloats(const QStringList &strings)
205 { 208 {
206 QList<float> floats; 209 QList<float> floats;
207 bool ok; 210 bool ok;
@@ -212,7 +215,7 @@ QList&lt;float&gt; QtUtils::toFloats(const QStringList &amp;strings) @@ -212,7 +215,7 @@ QList&lt;float&gt; QtUtils::toFloats(const QStringList &amp;strings)
212 return floats; 215 return floats;
213 } 216 }
214 217
215 -QStringList QtUtils::toStringList(const QList<float> &values) 218 +QStringList toStringList(const QList<float> &values)
216 { 219 {
217 QStringList result; result.reserve(values.size()); 220 QStringList result; result.reserve(values.size());
218 foreach (float value, values) 221 foreach (float value, values)
@@ -220,7 +223,7 @@ QStringList QtUtils::toStringList(const QList&lt;float&gt; &amp;values) @@ -220,7 +223,7 @@ QStringList QtUtils::toStringList(const QList&lt;float&gt; &amp;values)
220 return result; 223 return result;
221 } 224 }
222 225
223 -QStringList QtUtils::toStringList(const std::vector<std::string> &string_list) 226 +QStringList toStringList(const std::vector<std::string> &string_list)
224 { 227 {
225 QStringList result; 228 QStringList result;
226 foreach (const std::string &string, string_list) 229 foreach (const std::string &string, string_list)
@@ -228,7 +231,7 @@ QStringList QtUtils::toStringList(const std::vector&lt;std::string&gt; &amp;string_list) @@ -228,7 +231,7 @@ QStringList QtUtils::toStringList(const std::vector&lt;std::string&gt; &amp;string_list)
228 return result; 231 return result;
229 } 232 }
230 233
231 -QStringList QtUtils::toStringList(int num_strings, const char *strings[]) 234 +QStringList toStringList(int num_strings, const char *strings[])
232 { 235 {
233 QStringList result; 236 QStringList result;
234 for (int i=0; i<num_strings; i++) 237 for (int i=0; i<num_strings; i++)
@@ -236,13 +239,13 @@ QStringList QtUtils::toStringList(int num_strings, const char *strings[]) @@ -236,13 +239,13 @@ QStringList QtUtils::toStringList(int num_strings, const char *strings[])
236 return result; 239 return result;
237 } 240 }
238 241
239 -QString QtUtils::shortTextHash(QString string) 242 +QString shortTextHash(QString string)
240 { 243 {
241 string.remove(QRegExp("[{}<>&]")); 244 string.remove(QRegExp("[{}<>&]"));
242 return QString(QCryptographicHash::hash(qPrintable(string), QCryptographicHash::Md5).toBase64()).remove(QRegExp("[^a-zA-Z1-9]")).left(6); 245 return QString(QCryptographicHash::hash(qPrintable(string), QCryptographicHash::Md5).toBase64()).remove(QRegExp("[^a-zA-Z1-9]")).left(6);
243 } 246 }
244 247
245 -QStringList QtUtils::parse(QString args, char split, bool *ok) 248 +QStringList parse(QString args, char split, bool *ok)
246 { 249 {
247 if (args.isEmpty()) return QStringList(); 250 if (args.isEmpty()) return QStringList();
248 251
@@ -295,7 +298,7 @@ QStringList QtUtils::parse(QString args, char split, bool *ok) @@ -295,7 +298,7 @@ QStringList QtUtils::parse(QString args, char split, bool *ok)
295 return words; 298 return words;
296 } 299 }
297 300
298 -void QtUtils::checkArgsSize(const QString &name, const QStringList &args, int min, int max) 301 +void checkArgsSize(const QString &name, const QStringList &args, int min, int max)
299 { 302 {
300 if (max == -1) max = std::numeric_limits<int>::max(); 303 if (max == -1) max = std::numeric_limits<int>::max();
301 if (max == 0) max = min; 304 if (max == 0) max = min;
@@ -303,7 +306,7 @@ void QtUtils::checkArgsSize(const QString &amp;name, const QStringList &amp;args, int mi @@ -303,7 +306,7 @@ void QtUtils::checkArgsSize(const QString &amp;name, const QStringList &amp;args, int mi
303 if (args.size() > max) qFatal("%s expects no more than %d arguments, got %d", qPrintable(name), max, args.size()); 306 if (args.size() > max) qFatal("%s expects no more than %d arguments, got %d", qPrintable(name), max, args.size());
304 } 307 }
305 308
306 -QPointF QtUtils::toPoint(const QString &string, bool *ok) 309 +QPointF toPoint(const QString &string, bool *ok)
307 { 310 {
308 if (string.startsWith('(') && string.endsWith(')')) { 311 if (string.startsWith('(') && string.endsWith(')')) {
309 bool okParse; 312 bool okParse;
@@ -324,7 +327,7 @@ QPointF QtUtils::toPoint(const QString &amp;string, bool *ok) @@ -324,7 +327,7 @@ QPointF QtUtils::toPoint(const QString &amp;string, bool *ok)
324 return QPointF(); 327 return QPointF();
325 } 328 }
326 329
327 -QRectF QtUtils::toRect(const QString &string, bool *ok) 330 +QRectF toRect(const QString &string, bool *ok)
328 { 331 {
329 if (string.startsWith('(') && string.endsWith(')')) { 332 if (string.startsWith('(') && string.endsWith(')')) {
330 bool okParse; 333 bool okParse;
@@ -347,7 +350,7 @@ QRectF QtUtils::toRect(const QString &amp;string, bool *ok) @@ -347,7 +350,7 @@ QRectF QtUtils::toRect(const QString &amp;string, bool *ok)
347 return QRectF(); 350 return QRectF();
348 } 351 }
349 352
350 -QStringList QtUtils::naturalSort(const QStringList &strings) 353 +QStringList naturalSort(const QStringList &strings)
351 { 354 {
352 QList<std::string> stdStrings; stdStrings.reserve(strings.size()); 355 QList<std::string> stdStrings; stdStrings.reserve(strings.size());
353 foreach (const QString &string, strings) 356 foreach (const QString &string, strings)
@@ -362,7 +365,7 @@ QStringList QtUtils::naturalSort(const QStringList &amp;strings) @@ -362,7 +365,7 @@ QStringList QtUtils::naturalSort(const QStringList &amp;strings)
362 return result; 365 return result;
363 } 366 }
364 367
365 -bool QtUtils::runRScript(const QString &file) 368 +bool runRScript(const QString &file)
366 { 369 {
367 QProcess RScript; 370 QProcess RScript;
368 RScript.start("Rscript", QStringList() << file); 371 RScript.start("Rscript", QStringList() << file);
@@ -374,7 +377,7 @@ bool QtUtils::runRScript(const QString &amp;file) @@ -374,7 +377,7 @@ bool QtUtils::runRScript(const QString &amp;file)
374 return result; 377 return result;
375 } 378 }
376 379
377 -bool QtUtils::runDot(const QString &file) 380 +bool runDot(const QString &file)
378 { 381 {
379 QProcess dot; 382 QProcess dot;
380 dot.start("dot -Tpdf -O " + file); 383 dot.start("dot -Tpdf -O " + file);
@@ -382,7 +385,7 @@ bool QtUtils::runDot(const QString &amp;file) @@ -382,7 +385,7 @@ bool QtUtils::runDot(const QString &amp;file)
382 return ((dot.exitCode() == 0) && (dot.error() == QProcess::UnknownError)); 385 return ((dot.exitCode() == 0) && (dot.error() == QProcess::UnknownError));
383 } 386 }
384 387
385 -void QtUtils::showFile(const QString &file) 388 +void showFile(const QString &file)
386 { 389 {
387 #ifndef BR_EMBEDDED 390 #ifndef BR_EMBEDDED
388 (void) file; 391 (void) file;
@@ -393,7 +396,7 @@ void QtUtils::showFile(const QString &amp;file) @@ -393,7 +396,7 @@ void QtUtils::showFile(const QString &amp;file)
393 #endif // BR_EMBEDDED 396 #endif // BR_EMBEDDED
394 } 397 }
395 398
396 -QString QtUtils::toString(const QVariant &variant) 399 +QString toString(const QVariant &variant)
397 { 400 {
398 if (variant.canConvert(QVariant::String)) return variant.toString(); 401 if (variant.canConvert(QVariant::String)) return variant.toString();
399 else if(variant.canConvert(QVariant::PointF)) return QString("(%1,%2)").arg(QString::number(qvariant_cast<QPointF>(variant).x()), 402 else if(variant.canConvert(QVariant::PointF)) return QString("(%1,%2)").arg(QString::number(qvariant_cast<QPointF>(variant).x()),
@@ -404,3 +407,11 @@ QString QtUtils::toString(const QVariant &amp;variant) @@ -404,3 +407,11 @@ QString QtUtils::toString(const QVariant &amp;variant)
404 QString::number(qvariant_cast<QRectF>(variant).height())); 407 QString::number(qvariant_cast<QRectF>(variant).height()));
405 return QString(); 408 return QString();
406 } 409 }
  410 +
  411 +float euclideanLength(const QPointF &point)
  412 +{
  413 + return sqrt(pow(point.x(), 2) + pow(point.y(), 2));
  414 +}
  415 +
  416 +} // namespace QtUtils
  417 +
openbr/core/qtutils.h
@@ -73,6 +73,9 @@ namespace QtUtils @@ -73,6 +73,9 @@ namespace QtUtils
73 73
74 /**** Variant Utilities ****/ 74 /**** Variant Utilities ****/
75 QString toString(const QVariant &variant); 75 QString toString(const QVariant &variant);
  76 +
  77 + /**** Point Utilities ****/
  78 + float euclideanLength(const QPointF &point);
76 } 79 }
77 80
78 #endif // __QTUTILS_H 81 #endif // __QTUTILS_H
openbr/openbr.cpp
@@ -87,9 +87,9 @@ float br_eval_detection(const char *predicted_gallery, const char *truth_gallery @@ -87,9 +87,9 @@ float br_eval_detection(const char *predicted_gallery, const char *truth_gallery
87 return EvalDetection(predicted_gallery, truth_gallery, csv); 87 return EvalDetection(predicted_gallery, truth_gallery, csv);
88 } 88 }
89 89
90 -void br_eval_landmarking(const char *predicted_gallery, const char *truth_gallery, const char *csv) 90 +float br_eval_landmarking(const char *predicted_gallery, const char *truth_gallery, const char *csv, int normalization_index_a, int normalization_index_b)
91 { 91 {
92 - return EvalLandmarking(predicted_gallery, truth_gallery, csv); 92 + return EvalLandmarking(predicted_gallery, truth_gallery, csv, normalization_index_a, normalization_index_b);
93 } 93 }
94 94
95 void br_eval_regression(const char *predicted_gallery, const char *truth_gallery, const char * predicted_property, const char * truth_property) 95 void br_eval_regression(const char *predicted_gallery, const char *truth_gallery, const char * predicted_property, const char * truth_property)
openbr/openbr.h
@@ -173,8 +173,10 @@ BR_EXPORT float br_eval_detection(const char *predicted_gallery, const char *tru @@ -173,8 +173,10 @@ BR_EXPORT float br_eval_detection(const char *predicted_gallery, const char *tru
173 * \param predicted_gallery The predicted br::Gallery. 173 * \param predicted_gallery The predicted br::Gallery.
174 * \param truth_gallery The ground truth br::Gallery. 174 * \param truth_gallery The ground truth br::Gallery.
175 * \param csv Optional \c .csv file to contain performance metrics. 175 * \param csv Optional \c .csv file to contain performance metrics.
  176 + * \param normalization_index_a Optional first index in the list of points to use for normalization.
  177 + * \param normalization_index_b Optional second index in the list of points to use for normalization.
176 */ 178 */
177 -BR_EXPORT void br_eval_landmarking(const char *predicted_gallery, const char *truth_gallery, const char *csv = ""); 179 +BR_EXPORT float br_eval_landmarking(const char *predicted_gallery, const char *truth_gallery, const char *csv = "", int normalization_index_a = 0, int normalization_index_b = 1);
178 180
179 /*! 181 /*!
180 * \brief Evaluates regression accuracy to disk. 182 * \brief Evaluates regression accuracy to disk.
openbr/openbr_plugin.cpp
@@ -127,12 +127,12 @@ QString File::resolved() const @@ -127,12 +127,12 @@ QString File::resolved() const
127 127
128 bool File::contains(const QString &key) const 128 bool File::contains(const QString &key) const
129 { 129 {
130 - return m_metadata.contains(key) || Globals->contains(key); 130 + return m_metadata.contains(key) || Globals->contains(key) || key == "name";
131 } 131 }
132 132
133 QVariant File::value(const QString &key) const 133 QVariant File::value(const QString &key) const
134 { 134 {
135 - return m_metadata.contains(key) ? m_metadata.value(key) : Globals->property(qPrintable(key)); 135 + return m_metadata.contains(key) ? m_metadata.value(key) : (key == "name" ? name : Globals->property(qPrintable(key)));
136 } 136 }
137 137
138 QVariant File::parse(const QString &value) 138 QVariant File::parse(const QString &value)
openbr/openbr_plugin.h
@@ -138,6 +138,7 @@ void reset_##NAME() { NAME = DEFAULT; } @@ -138,6 +138,7 @@ void reset_##NAME() { NAME = DEFAULT; }
138 * 138 *
139 * Key | Value | Description 139 * Key | Value | Description
140 * --- | ---- | ----------- 140 * --- | ---- | -----------
  141 + * name | QString | Contents of #name
141 * separator | QString | Seperate #name into multiple files 142 * separator | QString | Seperate #name into multiple files
142 * Index | int | Index of a template in a template list 143 * Index | int | Index of a template in a template list
143 * Confidence | float | Classification/Regression quality 144 * Confidence | float | Classification/Regression quality
openbr/plugins/algorithms.cpp
@@ -46,12 +46,13 @@ class AlgorithmsInitializer : public Initializer @@ -46,12 +46,13 @@ class AlgorithmsInitializer : public Initializer
46 Globals->abbreviations.insert("CropFace", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.25,0.35)"); 46 Globals->abbreviations.insert("CropFace", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.25,0.35)");
47 47
48 // Video 48 // Video
49 - Globals->abbreviations.insert("DisplayVideo", "Stream([FPSLimit(30)+Show(false,[FrameNumber])+Discard])");  
50 - Globals->abbreviations.insert("PerFrameDetection", "Stream([SaveMat(original)+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+RestoreMat(original)+Draw(inPlace=true),Show(false,[FrameNumber])+Discard])");  
51 - Globals->abbreviations.insert("AgeGenderDemo", "Stream([SaveMat(original)+Cvt(Gray)+Cascade(FrontalFace)+Expand+<FaceClassificationRegistration>+<FaceClassificationExtraction>+<AgeRegressor>/<GenderClassifier>+Discard+RestoreMat(original)+Draw(inPlace=true)+DrawPropertiesPoint([Age,Gender],Affine_0,inPlace=true)+SaveMat(original)+Discard+Contract,RestoreMat(original)+FPSCalc+Show(false,[AvgFPS,Age,Gender])+Discard])");  
52 - Globals->abbreviations.insert("HOG", "Stream([KeyPointDetector(SIFT)+ROI+Expand+Resize(32,32)+Gradient+RectRegions+Bin(0,360,8)+Hist(8)+Cat])+Contract+CatRows+KMeans(500)+Hist(500)+SVM");  
53 - Globals->abbreviations.insert("HOF", "Stream([KeyPointDetector(SIFT),AggregateFrames(2)+OpticalFlow+Gradient+Bin(0,360,8)+ROI+Hist(8)])+Contract+CatRows+KMeans(500)+Hist(500)");  
54 - Globals->abbreviations.insert("HOGHOF", "Stream([Cvt(Gray),KeyPointDetector(SIFT),AggregateFrames(2),(OpticalFlow+Gradient+Bin(0,360,8)+ROI+Hist(8))/(First+Gradient+Bin(0,360,8)+ROI+Hist(8)),CatCols])+Contract+CatRows+KMeans(500)+Hist(500)"); 49 + Globals->abbreviations.insert("DisplayVideo", "Stream(FPSLimit(30)+Show(false,[FrameNumber])+Discard)");
  50 + Globals->abbreviations.insert("PerFrameDetection", "Stream(SaveMat(original)+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+RestoreMat(original)+Draw(inPlace=true)+Show(false,[FrameNumber])+Discard)");
  51 + Globals->abbreviations.insert("AgeGenderDemo", "Stream(SaveMat(original)+Cvt(Gray)+Cascade(FrontalFace)+Expand+<FaceClassificationRegistration>+<FaceClassificationExtraction>+<AgeRegressor>/<GenderClassifier>+Discard+RestoreMat(original)+Draw(inPlace=true)+DrawPropertiesPoint([Age,Gender],Affine_0,inPlace=true)+SaveMat(original)+Discard+Contract+RestoreMat(original)+FPSCalc+Show(false,[AvgFPS,Age,Gender])+Discard)");
  52 +
  53 + Globals->abbreviations.insert("HOG", "Stream(DropFrames(5)+Cvt(Gray)+KeyPointDetector(SIFT)+ROI+Expand+Resize(32,32)+Gradient+RectRegions+Bin(0,360,8)+Hist(8)+Cat)+Contract+CatRows+KMeans(500)+Hist(500)+SVM");
  54 + Globals->abbreviations.insert("HOF", "Stream(DropFrames(5)+KeyPointDetector(SIFT)+AggregateFrames(2)+OpticalFlow+ROI+Expand+Resize(32,32)+Gradient+RectRegions+Bin(0,360,8)+Hist(8)+Cat)+Contract+CatRows+KMeans(500)+Hist(500)");
  55 + Globals->abbreviations.insert("HOGHOF", "Stream(DropFrames(5)+Cvt(Gray),KeyPointDetector(SIFT)+AggregateFrames(2)+(OpticalFlow+Gradient+Bin(0,360,8)+ROI+Hist(8))/(First+Gradient+Bin(0,360,8)+ROI+Hist(8))+CatCols)+Contract+CatRows+KMeans(500)+Hist(500)");
55 56
56 // Generic Image Processing 57 // Generic Image Processing
57 Globals->abbreviations.insert("SIFT", "Open+KeyPointDetector(SIFT)+KeyPointDescriptor(SIFT):KeyPointMatcher(BruteForce)"); 58 Globals->abbreviations.insert("SIFT", "Open+KeyPointDetector(SIFT)+KeyPointDescriptor(SIFT):KeyPointMatcher(BruteForce)");
openbr/plugins/cascade.cpp
@@ -99,6 +99,8 @@ class CascadeTransform : public UntrainableMetaTransform @@ -99,6 +99,8 @@ class CascadeTransform : public UntrainableMetaTransform
99 Template u(t.file, m); 99 Template u(t.file, m);
100 if (rejectLevels.size() > j) 100 if (rejectLevels.size() > j)
101 u.file.set("Confidence", rejectLevels[j]*levelWeights[j]); 101 u.file.set("Confidence", rejectLevels[j]*levelWeights[j]);
  102 + else
  103 + u.file.set("Confidence", 1);
102 const QRectF rect = OpenCVUtils::fromRect(rects[j]); 104 const QRectF rect = OpenCVUtils::fromRect(rects[j]);
103 u.file.appendRect(rect); 105 u.file.appendRect(rect);
104 u.file.set(model, rect); 106 u.file.set(model, rect);
openbr/plugins/frames.cpp
@@ -19,7 +19,7 @@ class AggregateFrames : public TimeVaryingTransform @@ -19,7 +19,7 @@ class AggregateFrames : public TimeVaryingTransform
19 TemplateList buffer; 19 TemplateList buffer;
20 20
21 public: 21 public:
22 - AggregateFrames() : TimeVaryingTransform(false) {} 22 + AggregateFrames() : TimeVaryingTransform(false, false) {}
23 23
24 private: 24 private:
25 void train(const TemplateList &data) 25 void train(const TemplateList &data)
@@ -29,15 +29,18 @@ private: @@ -29,15 +29,18 @@ private:
29 29
30 void projectUpdate(const Template &src, Template &dst) 30 void projectUpdate(const Template &src, Template &dst)
31 { 31 {
32 - // DropFrames will pass on empty Templates  
33 - // but we only want to use non-dropped frames  
34 - if (src.empty()) return;  
35 buffer.append(src); 32 buffer.append(src);
36 if (buffer.size() < n) return; 33 if (buffer.size() < n) return;
37 foreach (const Template &t, buffer) dst.append(t); 34 foreach (const Template &t, buffer) dst.append(t);
38 dst.file = buffer.takeFirst().file; 35 dst.file = buffer.takeFirst().file;
39 } 36 }
40 37
  38 + void finalize(TemplateList & output)
  39 + {
  40 + (void) output;
  41 + buffer.clear();
  42 + }
  43 +
41 void store(QDataStream &stream) const 44 void store(QDataStream &stream) const
42 { 45 {
43 (void) stream; 46 (void) stream;
@@ -58,35 +61,21 @@ BR_REGISTER(Transform, AggregateFrames) @@ -58,35 +61,21 @@ BR_REGISTER(Transform, AggregateFrames)
58 * 61 *
59 * For a video with m frames, DropFrames will pass on m/n frames. 62 * For a video with m frames, DropFrames will pass on m/n frames.
60 */ 63 */
61 -class DropFrames : public TimeVaryingTransform 64 +class DropFrames : public UntrainableMetaTransform
62 { 65 {
63 Q_OBJECT 66 Q_OBJECT
64 Q_PROPERTY(int n READ get_n WRITE set_n RESET reset_n STORED false) 67 Q_PROPERTY(int n READ get_n WRITE set_n RESET reset_n STORED false)
65 BR_PROPERTY(int, n, 1) 68 BR_PROPERTY(int, n, 1)
66 69
67 -public:  
68 - DropFrames() : TimeVaryingTransform(false) {}  
69 -  
70 -private:  
71 - void train(const TemplateList &data) 70 + void project(const TemplateList &src, TemplateList &dst) const
72 { 71 {
73 - (void) data;  
74 - }  
75 -  
76 - void projectUpdate(const Template &src, Template &dst)  
77 - {  
78 - if (src.file.get<int>("FrameNumber") % n != 0) return; 72 + if (src.first().file.get<int>("FrameNumber") % n != 0) return;
79 dst = src; 73 dst = src;
80 } 74 }
81 75
82 - void store(QDataStream &stream) const 76 + void project(const Template &src, Template &dst) const
83 { 77 {
84 - (void) stream;  
85 - }  
86 -  
87 - void load(QDataStream &stream)  
88 - {  
89 - (void) stream; 78 + (void) src; (void) dst; qFatal("shouldn't be here");
90 } 79 }
91 }; 80 };
92 81
openbr/plugins/gallery.cpp
@@ -873,6 +873,50 @@ class FDDBGallery : public Gallery @@ -873,6 +873,50 @@ class FDDBGallery : public Gallery
873 873
874 BR_REGISTER(Gallery, FDDBGallery) 874 BR_REGISTER(Gallery, FDDBGallery)
875 875
  876 +/*!
  877 + * \ingroup galleries
  878 + * \brief Text format for associating anonymous landmarks with images.
  879 + * \author Josh Klontz \cite jklontz
  880 + *
  881 + * \code
  882 + * file_name:x1,y1,x2,y2,...,xn,yn
  883 + * file_name:x1,y1,x2,y2,...,xn,yn
  884 + * ...
  885 + * file_name:x1,y1,x2,y2,...,xn,yn
  886 + * \endcode
  887 + */
  888 +class landmarksGallery : public Gallery
  889 +{
  890 + Q_OBJECT
  891 +
  892 + TemplateList readBlock(bool *done)
  893 + {
  894 + *done = true;
  895 + TemplateList templates;
  896 + foreach (const QString &line, QtUtils::readLines(file)) {
  897 + const QStringList words = line.split(':');
  898 + if (words.size() != 2) qFatal("Expected exactly one ':' in: %s.", qPrintable(line));
  899 + File file(words[0]);
  900 + const QList<float> vals = QtUtils::toFloats(words[1].split(','));
  901 + if (vals.size() % 2 != 0) qFatal("Expected an even number of comma-separated values.");
  902 + QList<QPointF> points; points.reserve(vals.size()/2);
  903 + for (int i=0; i<vals.size(); i+=2)
  904 + points.append(QPointF(vals[i], vals[i+1]));
  905 + file.setPoints(points);
  906 + templates.append(file);
  907 + }
  908 + return templates;
  909 + }
  910 +
  911 + void write(const Template &t)
  912 + {
  913 + (void) t;
  914 + qFatal("Not implemented.");
  915 + }
  916 +};
  917 +
  918 +BR_REGISTER(Gallery, landmarksGallery)
  919 +
876 } // namespace br 920 } // namespace br
877 921
878 #include "gallery.moc" 922 #include "gallery.moc"
openbr/plugins/gui.cpp
@@ -143,6 +143,51 @@ private: @@ -143,6 +143,51 @@ private:
143 143
144 }; 144 };
145 145
  146 +class PromptWindow : public DisplayWindow
  147 +{
  148 + bool eventFilter(QObject * obj, QEvent * event)
  149 + {
  150 + if (event->type() == QEvent::KeyPress)
  151 + {
  152 + event->accept();
  153 +
  154 + QKeyEvent * key_event = dynamic_cast<QKeyEvent *> (event);
  155 + if (key_event == NULL) {
  156 + qDebug("failed to donwcast key event");
  157 + return true;
  158 + }
  159 +
  160 + QString text = key_event->text();
  161 +
  162 + text =text.toLower();
  163 + if (text == "y" || text == "n")
  164 + {
  165 + gotString = key_event->text();
  166 + wait.wakeAll();
  167 + }
  168 + else qDebug("Please answer y/n");
  169 +
  170 + return true;
  171 + } else {
  172 + return QObject::eventFilter(obj, event);
  173 + }
  174 + }
  175 +
  176 +public:
  177 + QString waitForKeyPress()
  178 + {
  179 + QMutexLocker locker(&lock);
  180 + wait.wait(&lock);
  181 +
  182 + return gotString;
  183 + }
  184 +
  185 +private:
  186 + QString gotString;
  187 +
  188 +
  189 +};
  190 +
146 191
147 // I want a template class that doesn't look like a template class 192 // I want a template class that doesn't look like a template class
148 class NominalCreation 193 class NominalCreation
@@ -382,6 +427,68 @@ public: @@ -382,6 +427,68 @@ public:
382 427
383 BR_REGISTER(Transform, ManualTransform) 428 BR_REGISTER(Transform, ManualTransform)
384 429
  430 +
  431 +/*!
  432 + * \ingroup transforms
  433 + * \brief Display an image, and asks a yes/no question about it
  434 + * \author Charles Otto \cite caotto
  435 + */
  436 +class SurveyTransform : public ShowTransform
  437 +{
  438 + Q_OBJECT
  439 +
  440 +public:
  441 + Q_PROPERTY(QString question READ get_question WRITE set_question RESET reset_question STORED false)
  442 + BR_PROPERTY(QString, question, "Yes/No")
  443 +
  444 + Q_PROPERTY(QString propertyName READ get_propertyName WRITE set_propertyName RESET reset_propertyName STORED false)
  445 + BR_PROPERTY(QString, propertyName, "answer")
  446 +
  447 +
  448 + void projectUpdate(const TemplateList &src, TemplateList &dst)
  449 + {
  450 + if (Globals->parallelism > 1)
  451 + qFatal("SurveyTransform cannot execute in parallel.");
  452 +
  453 + dst = src;
  454 +
  455 + if (src.empty())
  456 + return;
  457 +
  458 + for (int i = 0; i < dst.size(); i++) {
  459 + foreach(const cv::Mat &m, dst[i]) {
  460 + qImageBuffer = toQImage(m);
  461 + displayBuffer->convertFromImage(qImageBuffer);
  462 +
  463 + emit updateImage(displayBuffer->copy(displayBuffer->rect()));
  464 +
  465 + // Blocking wait for a key-press
  466 + if (this->waitInput) {
  467 + QString answer = p_window->waitForKeyPress();
  468 +
  469 + dst[i].file.set(this->propertyName, answer);
  470 + }
  471 + }
  472 + }
  473 + }
  474 + PromptWindow * p_window;
  475 +
  476 +
  477 + void init()
  478 + {
  479 + if (!Globals->useGui)
  480 + return;
  481 +
  482 + initActual<PromptWindow>();
  483 + p_window = (PromptWindow *) window;
  484 +
  485 + emit changeTitle(this->question);
  486 + }
  487 +};
  488 +
  489 +BR_REGISTER(Transform, SurveyTransform)
  490 +
  491 +
385 class FPSLimit : public TimeVaryingTransform 492 class FPSLimit : public TimeVaryingTransform
386 { 493 {
387 Q_OBJECT 494 Q_OBJECT
openbr/plugins/meta.cpp
@@ -614,6 +614,11 @@ public: @@ -614,6 +614,11 @@ public:
614 614
615 void train(const TemplateList &data) 615 void train(const TemplateList &data)
616 { 616 {
  617 + if (!transform->trainable) {
  618 + qWarning("Attempted to train untrainable transform, nothing will happen.");
  619 + return;
  620 + }
  621 +
617 transform->train(data); 622 transform->train(data);
618 } 623 }
619 624
@@ -628,7 +633,6 @@ public: @@ -628,7 +633,6 @@ public:
628 else dst = output[0]; 633 else dst = output[0];
629 } 634 }
630 635
631 -  
632 // For each input template, form a single element TemplateList, push all those 636 // For each input template, form a single element TemplateList, push all those
633 // lists through transform, and form dst by concatenating the results. 637 // lists through transform, and form dst by concatenating the results.
634 // Process the single elemnt templates in parallel if parallelism is enabled. 638 // Process the single elemnt templates in parallel if parallelism is enabled.
@@ -677,7 +681,6 @@ public: @@ -677,7 +681,6 @@ public:
677 681
678 void init() 682 void init()
679 { 683 {
680 -  
681 if (transform && transform->timeVarying()) 684 if (transform && transform->timeVarying())
682 transform = new br::TimeInvariantWrapperTransform(transform); 685 transform = new br::TimeInvariantWrapperTransform(transform);
683 } 686 }
openbr/plugins/openbr_internal.h
@@ -122,7 +122,10 @@ public: @@ -122,7 +122,10 @@ public:
122 122
123 TimeInvariantWrapperTransform(Transform * basis) : transformSource(new TransformCopier(basis)) 123 TimeInvariantWrapperTransform(Transform * basis) : transformSource(new TransformCopier(basis))
124 { 124 {
  125 + if (!basis)
  126 + qFatal("TimeInvariantWrapper created with NULL transform");
125 baseTransform = basis; 127 baseTransform = basis;
  128 + trainable = basis->trainable;
126 } 129 }
127 130
128 virtual void project(const Template &src, Template &dst) const 131 virtual void project(const Template &src, Template &dst) const
@@ -132,7 +135,6 @@ public: @@ -132,7 +135,6 @@ public:
132 transformSource.release(aTransform); 135 transformSource.release(aTransform);
133 } 136 }
134 137
135 -  
136 void project(const TemplateList &src, TemplateList &dst) const 138 void project(const TemplateList &src, TemplateList &dst) const
137 { 139 {
138 Transform * aTransform = transformSource.acquire(); 140 Transform * aTransform = transformSource.acquire();
openbr/plugins/stream.cpp
@@ -649,7 +649,7 @@ public: @@ -649,7 +649,7 @@ public:
649 class ProcessingStage 649 class ProcessingStage
650 { 650 {
651 public: 651 public:
652 - friend class StreamTransform; 652 + friend class DirectStreamTransform;
653 public: 653 public:
654 ProcessingStage(int nThreads = 1) 654 ProcessingStage(int nThreads = 1)
655 { 655 {
@@ -1015,15 +1015,23 @@ public: @@ -1015,15 +1015,23 @@ public:
1015 }; 1015 };
1016 1016
1017 1017
1018 -class StreamTransform : public CompositeTransform 1018 +
  1019 +class DirectStreamTransform : public CompositeTransform
1019 { 1020 {
1020 Q_OBJECT 1021 Q_OBJECT
1021 public: 1022 public:
1022 Q_PROPERTY(int activeFrames READ get_activeFrames WRITE set_activeFrames RESET reset_activeFrames) 1023 Q_PROPERTY(int activeFrames READ get_activeFrames WRITE set_activeFrames RESET reset_activeFrames)
1023 BR_PROPERTY(int, activeFrames, 100) 1024 BR_PROPERTY(int, activeFrames, 100)
1024 1025
  1026 + friend class StreamTransfrom;
  1027 +
1025 void train(const TemplateList & data) 1028 void train(const TemplateList & data)
1026 { 1029 {
  1030 + if (!trainable) {
  1031 + qWarning("Attempted to train untrainable transform, nothing will happen.");
  1032 + return;
  1033 + }
  1034 + qFatal("Stream train is currently not implemented.");
1027 foreach(Transform * transform, transforms) { 1035 foreach(Transform * transform, transforms) {
1028 transform->train(data); 1036 transform->train(data);
1029 } 1037 }
@@ -1110,6 +1118,10 @@ public: @@ -1110,6 +1118,10 @@ public:
1110 { 1118 {
1111 if (transforms.isEmpty()) return; 1119 if (transforms.isEmpty()) return;
1112 1120
  1121 + for (int i=0; i < processingStages.size();i++)
  1122 + delete processingStages[i];
  1123 + processingStages.clear();
  1124 +
1113 // call CompositeTransform::init so that trainable is set 1125 // call CompositeTransform::init so that trainable is set
1114 // correctly. 1126 // correctly.
1115 CompositeTransform::init(); 1127 CompositeTransform::init();
@@ -1185,12 +1197,13 @@ public: @@ -1185,12 +1197,13 @@ public:
1185 collectionStage->nextStage = readStage; 1197 collectionStage->nextStage = readStage;
1186 } 1198 }
1187 1199
1188 - ~StreamTransform() 1200 + ~DirectStreamTransform()
1189 { 1201 {
1190 // Delete all the stages 1202 // Delete all the stages
1191 for (int i = 0; i < processingStages.size(); i++) { 1203 for (int i = 0; i < processingStages.size(); i++) {
1192 delete processingStages[i]; 1204 delete processingStages[i];
1193 } 1205 }
  1206 + processingStages.clear();
1194 } 1207 }
1195 1208
1196 protected: 1209 protected:
@@ -1232,12 +1245,150 @@ protected: @@ -1232,12 +1245,150 @@ protected:
1232 } 1245 }
1233 }; 1246 };
1234 1247
1235 -QHash<QObject *, QThreadPool *> StreamTransform::pools;  
1236 -QMutex StreamTransform::poolsAccess; 1248 +QHash<QObject *, QThreadPool *> DirectStreamTransform::pools;
  1249 +QMutex DirectStreamTransform::poolsAccess;
  1250 +
  1251 +BR_REGISTER(Transform, DirectStreamTransform)
  1252 +
  1253 +;
  1254 +
  1255 +class StreamTransform : public TimeVaryingTransform
  1256 +{
  1257 + Q_OBJECT
  1258 +
  1259 +public:
  1260 + StreamTransform() : TimeVaryingTransform(false)
  1261 + {
  1262 + }
  1263 +
  1264 + Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false)
  1265 + Q_PROPERTY(int activeFrames READ get_activeFrames WRITE set_activeFrames RESET reset_activeFrames)
  1266 + BR_PROPERTY(br::Transform *, transform, NULL)
  1267 + BR_PROPERTY(int, activeFrames, 100)
  1268 +
  1269 + bool timeVarying() const { return true; }
  1270 +
  1271 + void project(const Template &src, Template &dst) const
  1272 + {
  1273 + basis.project(src,dst);
  1274 + }
  1275 +
  1276 + void projectUpdate(const Template &src, Template &dst)
  1277 + {
  1278 + basis.projectUpdate(src,dst);
  1279 + }
  1280 + void projectUpdate(const TemplateList & src, TemplateList & dst)
  1281 + {
  1282 + basis.projectUpdate(src,dst);
  1283 + }
  1284 +
  1285 +
  1286 + void train(const TemplateList & data)
  1287 + {
  1288 + basis.train(data);
  1289 + }
  1290 +
  1291 + virtual void finalize(TemplateList & output)
  1292 + {
  1293 + (void) output;
  1294 + // Nothing in particular to do here, stream calls finalize
  1295 + // on all child transforms as part of projectUpdate
  1296 + }
  1297 +
  1298 + // reinterpret transform, set up the actual stream. We can only reinterpret pipes
  1299 + void init()
  1300 + {
  1301 + if (!transform)
  1302 + return;
  1303 + trainable = transform->trainable;
  1304 +
  1305 + basis.setParent(this->parent());
  1306 + basis.transforms.clear();
  1307 + basis.activeFrames = this->activeFrames;
  1308 +
  1309 + // We need at least a CompositeTransform * to acess transform's children.
  1310 + CompositeTransform * downcast = dynamic_cast<CompositeTransform *> (transform);
  1311 +
  1312 + // If this isn't even a composite transform, or it's not a pipe, just set up
  1313 + // basis with 1 stage.
  1314 + if (!downcast || QString(transform->metaObject()->className()) != "br::PipeTransform")
  1315 + {
  1316 + basis.transforms.append(transform);
  1317 + basis.init();
  1318 + return;
  1319 + }
  1320 + if (downcast->transforms.empty())
  1321 + {
  1322 + qWarning("Trying to set up empty stream");
  1323 + basis.init();
  1324 + return;
  1325 + }
  1326 +
  1327 + // OK now we will regroup downcast's children
  1328 + QList<QList<Transform *> > sets;
  1329 + sets.append(QList<Transform *> ());
  1330 + sets.last().append(downcast->transforms[0]);
  1331 + if (downcast->transforms[0]->timeVarying())
  1332 + sets.append(QList<Transform *> ());
  1333 +
  1334 + for (int i=1;i < downcast->transforms.size(); i++) {
  1335 + // If this is time varying it becomse its own stage
  1336 + if (downcast->transforms[i]->timeVarying()) {
  1337 + // If a set was already active, we add another one
  1338 + if (!sets.last().empty()) {
  1339 + sets.append(QList<Transform *>());
  1340 + }
  1341 + // add the item
  1342 + sets.last().append(downcast->transforms[i]);
  1343 + // Add another set to indicate separation.
  1344 + sets.append(QList<Transform *>());
  1345 + }
  1346 + // otherwise, we can combine non time-varying stages
  1347 + else {
  1348 + sets.last().append(downcast->transforms[i]);
  1349 + }
  1350 +
  1351 + }
  1352 + if (sets.last().empty())
  1353 + sets.removeLast();
  1354 +
  1355 + QList<Transform *> transform_set;
  1356 + transform_set.reserve(sets.size());
  1357 + for (int i=0; i < sets.size(); i++) {
  1358 + // If this is a single transform set, we add that to the list
  1359 + if (sets[i].size() == 1 ) {
  1360 + transform_set.append(sets[i].at(0));
  1361 + }
  1362 + //otherwise we build a pipe
  1363 + else {
  1364 + CompositeTransform * pipe = dynamic_cast<CompositeTransform *>(Transform::make("Pipe([])", this));
  1365 + pipe->transforms = sets[i];
  1366 + pipe->init();
  1367 + transform_set.append(pipe);
  1368 + }
  1369 + }
  1370 +
  1371 + basis.transforms = transform_set;
  1372 + basis.init();
  1373 + }
  1374 +
  1375 + Transform * smartCopy()
  1376 + {
  1377 + // We just want the DirectStream to begin with, so just return a copy of that.
  1378 + DirectStreamTransform * res = (DirectStreamTransform *) basis.smartCopy();
  1379 + res->activeFrames = this->activeFrames;
  1380 + return res;
  1381 + }
  1382 +
  1383 +
  1384 +private:
  1385 + DirectStreamTransform basis;
  1386 +};
1237 1387
1238 BR_REGISTER(Transform, StreamTransform) 1388 BR_REGISTER(Transform, StreamTransform)
1239 1389
1240 1390
  1391 +
1241 } // namespace br 1392 } // namespace br
1242 1393
1243 #include "stream.moc" 1394 #include "stream.moc"