Commit 0f1ec326201af39b480f0781f20b2d9f90bebcdd

Authored by Josh Klontz
1 parent 5dad9e23

implemented janus_verify

Showing 2 changed files with 76 additions and 20 deletions
1 -Subproject commit 734353f82cfb4754f1da40bc69370bcee33b929b 1 +Subproject commit a8e295a7cfb8941b7a2468c5423c591a387071d2
openbr/janus.cpp
@@ -8,51 +8,107 @@ @@ -8,51 +8,107 @@
8 // Use the provided default implementation of some functions 8 // Use the provided default implementation of some functions
9 #include "janus/src/janus.cpp" 9 #include "janus/src/janus.cpp"
10 10
  11 +using namespace br;
  12 +
  13 +static QSharedPointer<Transform> transform;
  14 +static QSharedPointer<Distance> distance;
  15 +
11 janus_error janus_initialize(const char *sdk_path, const char *model_file) 16 janus_error janus_initialize(const char *sdk_path, const char *model_file)
12 { 17 {
13 int argc = 1; 18 int argc = 1;
14 - const char *argv[1] = { "" };  
15 - br::Context::initialize(argc, (char**)argv, sdk_path); 19 + const char *argv[1] = { "janus" };
  20 + Context::initialize(argc, (char**)argv, sdk_path);
16 QString algorithm = model_file; 21 QString algorithm = model_file;
17 - if (algorithm.isEmpty()) algorithm = "FaceRecognition";  
18 - br::Globals->algorithm = algorithm; 22 + if (algorithm.isEmpty()) algorithm = "Cvt(Gray)+Affine(88,88,0.25,0.35)+<FaceRecognitionExtraction>+<FaceRecognitionEmbedding>+<FaceRecognitionQuantization>:ByteL1";
  23 + transform = Transform::fromAlgorithm(algorithm, false);
  24 + distance = Distance::fromAlgorithm(algorithm);
19 return JANUS_SUCCESS; 25 return JANUS_SUCCESS;
20 } 26 }
21 27
22 janus_error janus_finalize() 28 janus_error janus_finalize()
23 { 29 {
24 - br::Context::finalize(); 30 + Context::finalize();
25 return JANUS_SUCCESS; 31 return JANUS_SUCCESS;
26 } 32 }
27 33
  34 +struct janus_incomplete_template_type
  35 +{
  36 + QList<cv::Mat> data;
  37 +};
  38 +
28 janus_error janus_initialize_template(janus_incomplete_template *incomplete_template) 39 janus_error janus_initialize_template(janus_incomplete_template *incomplete_template)
29 { 40 {
30 - (void) incomplete_template; 41 + *incomplete_template = new janus_incomplete_template_type();
31 return JANUS_SUCCESS; 42 return JANUS_SUCCESS;
32 } 43 }
33 44
34 janus_error janus_add_image(const janus_image image, const janus_attribute_list attributes, janus_incomplete_template incomplete_template) 45 janus_error janus_add_image(const janus_image image, const janus_attribute_list attributes, janus_incomplete_template incomplete_template)
35 { 46 {
36 - (void) image;  
37 - (void) attributes;  
38 - (void) incomplete_template; 47 + Template t;
  48 + t.append(cv::Mat(image.height,
  49 + image.width,
  50 + image.color_space == JANUS_GRAY8 ? CV_8UC1 : CV_8UC1,
  51 + image.data));
  52 + for (size_t i=0; i<attributes.size; i++)
  53 + t.file.set(janus_attribute_to_string(attributes.attributes[i]), attributes.values[i]);
  54 +
  55 + if (!t.file.contains("JANUS_RIGHT_EYE_X") ||
  56 + !t.file.contains("JANUS_RIGHT_EYE_Y") ||
  57 + !t.file.contains("JANUS_LEFT_EYE_X") ||
  58 + !t.file.contains("JANUS_LEFT_EYE_Y"))
  59 + return JANUS_SUCCESS;
  60 +
  61 + t.file.set("Affine_0", QPointF(t.file.get<float>("JANUS_RIGHT_EYE_X"), t.file.get<float>("JANUS_RIGHT_EYE_Y")));
  62 + t.file.set("Affine_1", QPointF(t.file.get<float>("JANUS_LEFT_EYE_X"), t.file.get<float>("JANUS_LEFT_EYE_Y")));
  63 + Template u;
  64 + transform->project(t, u);
  65 + incomplete_template->data.append(u);
39 return JANUS_SUCCESS; 66 return JANUS_SUCCESS;
40 } 67 }
41 68
42 janus_error janus_finalize_template(janus_incomplete_template incomplete_template, janus_template template_, size_t *bytes) 69 janus_error janus_finalize_template(janus_incomplete_template incomplete_template, janus_template template_, size_t *bytes)
43 -{  
44 - (void) incomplete_template;  
45 - (void) template_;  
46 - *bytes = 0; 70 +{
  71 + size_t templateBytes = 0;
  72 + size_t numTemplates = 0;
  73 + *bytes = sizeof(templateBytes) + sizeof(numTemplates);
  74 + janus_template pos = template_ + *bytes;
  75 +
  76 + foreach (const cv::Mat &m, incomplete_template->data) {
  77 + assert(m.isContinuous());
  78 + const size_t currentTemplateBytes = m.rows * m.cols * m.elemSize();
  79 + if (templateBytes == 0)
  80 + templateBytes = currentTemplateBytes;
  81 + if (templateBytes != currentTemplateBytes)
  82 + return JANUS_UNKNOWN_ERROR;
  83 + if (*bytes + templateBytes > JANUS_MAX_TEMPLATE_SIZE)
  84 + break;
  85 + memcpy(pos, m.data, templateBytes);
  86 + *bytes += templateBytes;
  87 + pos = pos + templateBytes;
  88 + numTemplates++;
  89 + }
  90 +
  91 + *(reinterpret_cast<size_t*>(template_)+0) = templateBytes;
  92 + *(reinterpret_cast<size_t*>(template_)+1) = numTemplates;
  93 + delete incomplete_template;
47 return JANUS_SUCCESS; 94 return JANUS_SUCCESS;
48 } 95 }
49 96
50 -janus_error janus_verify(const janus_template a, const size_t a_bytes, const janus_template b, const size_t b_bytes, float *similarity) 97 +janus_error janus_verify(const janus_template a, const janus_template b, float *similarity)
51 { 98 {
52 - (void) a;  
53 - (void) a_bytes;  
54 - (void) b;  
55 - (void) b_bytes;  
56 - *similarity = 0; 99 + size_t a_bytes, a_templates, b_bytes, b_templates;
  100 + a_bytes = *(reinterpret_cast<size_t*>(a)+0);
  101 + a_templates = *(reinterpret_cast<size_t*>(a)+1);
  102 + b_bytes = *(reinterpret_cast<size_t*>(b)+0);
  103 + b_templates = *(reinterpret_cast<size_t*>(b)+1);
  104 + if (a_bytes != b_bytes)
  105 + return JANUS_UNKNOWN_ERROR;
  106 +
  107 + float dist = 0;
  108 + for (size_t i=0; i<a_templates; i++)
  109 + for (size_t j=0; j<b_templates; j++)
  110 + dist += distance->compare(cv::Mat(1, a_bytes, CV_8UC1, a+2*sizeof(size_t)+i*a_bytes),
  111 + cv::Mat(1, b_bytes, CV_8UC1, b+2*sizeof(size_t)+i*b_bytes));
  112 + *similarity = a_templates * b_templates / dist;
57 return JANUS_SUCCESS; 113 return JANUS_SUCCESS;
58 } 114 }