Enrollment 28.2.0
Loading...
Searching...
No Matches
MultiModalityExecutor.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "enrollment/Export.h"
18#include <algorithm>
19#include <cstdint>
20#include <memory>
21#include <vector>
22
23namespace inno
24{
25// See doc/Main.markdown "Header and Binary parts" for reason why we use pragma pack 1
26#pragma pack(push, 1)
27 struct INNO_ENROLLMENT_API inno_Template
28 {
29 static constexpr int NotExistingPosition = 0;
30
31 static std::vector<inno_Template> FromTemplates(const std::vector<std::shared_ptr<FaceTemplate>>& ft)
32 {
33 std::vector<inno_Template> transformedTemplates(ft.size());
34 std::transform(
35 ft.begin(),
36 ft.end(),
37 transformedTemplates.begin(),
38 [](const auto& t)
39 {
40 if (t == nullptr)
41 {
42 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
43 }
44 return inno_Template{ t->data.size(), t->data.data(), inno_Template::NotExistingPosition };
45 });
46 return transformedTemplates;
47 }
48 static std::vector<inno_Template> FromTemplates(const std::vector<std::shared_ptr<IrisTemplate>>& it)
49 {
50 std::vector<inno_Template> transformedTemplates(it.size());
51 std::transform(
52 it.begin(),
53 it.end(),
54 transformedTemplates.begin(),
55 [](const auto& t)
56 {
57 if (t == nullptr)
58 {
59 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
60 }
61 return inno_Template{ t->data.size(),
62 t->data.data(),
63 t->IsIrisTemplateBiometricPositionKnown()
64 ? IrisPositionToIsoPosition(t->GetIrisTemplateBiometricPosition())
65 : NotExistingPosition };
66 });
67 return transformedTemplates;
68 }
69 static std::vector<inno_Template> FromTemplates(const std::vector<std::shared_ptr<ICSTemplate>>& pt)
70 {
71 std::vector<inno_Template> transformedTemplates(pt.size());
72 std::transform(pt.begin(),
73 pt.end(),
74 transformedTemplates.begin(),
75 [](const auto& t)
76 {
77 if (t == nullptr)
78 {
79 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
80 }
81 return inno_Template{ t->icsTemplateData.size(),
82 t->icsTemplateData.data(),
83 t->IsICSTemplateBiometricPositionKnown()
84 ? PrintToIsoPosition(t->GetICSTemplateBiometricPosition())
85 : NotExistingPosition };
86 });
87 return transformedTemplates;
88 }
89 static std::vector<inno_Template> FromTemplates(const std::vector<std::shared_ptr<EmbeddingTemplate>>& pt)
90 {
91 std::vector<inno_Template> transformedTemplates(pt.size());
92 std::transform(pt.begin(),
93 pt.end(),
94 transformedTemplates.begin(),
95 [](const auto& t)
96 {
97 if (t == nullptr)
98 {
99 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
100 }
101 return inno_Template{ t->embeddingTemplateData.size(),
102 t->embeddingTemplateData.data(),
103 t->IsEmbeddingTemplateBiometricPositionKnown()
104 ? PrintToIsoPosition(t->GetEmbeddingTemplateBiometricPosition())
105 : NotExistingPosition };
106 });
107 return transformedTemplates;
108 }
109
110 static const uint8_t* GetEnd(const uint8_t* begin, const size_t length)
111 {
112 const auto* end = begin;
113 std::advance(end, length);
114 return end;
115 }
116
117 static std::shared_ptr<FaceTemplate> ToFaceTemplate(const inno_Template& ft)
118 {
119 return std::make_shared<FaceTemplate>(std::vector<uint8_t>{ ft.data, GetEnd(ft.data, ft.length) });
120 }
121
122 static std::shared_ptr<IrisTemplate> ToIrisTemplate(const inno_Template& it)
123 {
124 if (it.position == inno_Template::NotExistingPosition)
125 {
126 return std::make_shared<IrisTemplate>(std::vector<uint8_t>{ it.data, GetEnd(it.data, it.length) });
127 }
128 return std::make_shared<IrisTemplate>(std::vector<uint8_t>{ it.data, GetEnd(it.data, it.length) },
129 IsoToIrisPosition(it.position));
130 }
131
132 static std::shared_ptr<ICSTemplate> ToICSTemplate(const inno_Template& pt)
133 {
134 if (pt.position == inno_Template::NotExistingPosition)
135 {
136 return std::make_shared<ICSTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) });
137 }
138 return std::make_shared<ICSTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) },
139 IsoToPrintPosition(pt.position));
140 }
141
142 static std::shared_ptr<EmbeddingTemplate> ToEmbeddingTemplate(const inno_Template& pt)
143 {
144 if (pt.position == inno_Template::NotExistingPosition)
145 {
146 return std::make_shared<EmbeddingTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) });
147 }
148 return std::make_shared<EmbeddingTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) },
149 IsoToPrintPosition(pt.position));
150 }
151
152 bool operator==(const inno_Template& r) const
153 {
154 return length == r.length && data == r.data && position == r.position;
155 }
156
157 size_t length;
158 const uint8_t* data;
159 int position;
160 };
161 struct INNO_ENROLLMENT_API inno_PrintTemplate
162 {
163 static inno_PrintTemplate FromTemplate(const std::shared_ptr<PrintTemplate>& t)
164 {
165 inno_Template icsTemplate{ 0, nullptr, inno_Template::NotExistingPosition };
166 if (t->HasIcsRepresentation())
167 {
168 auto i = t->GetICSRepresentation();
169 icsTemplate = inno_Template{ i->icsTemplateData.size(),
170 i->icsTemplateData.data(),
171 i->IsICSTemplateBiometricPositionKnown()
172 ? PrintToIsoPosition(i->GetICSTemplateBiometricPosition())
173 : inno_Template::NotExistingPosition };
174 }
175
176 inno_Template embeddingTemplate{ 0, nullptr, inno_Template::NotExistingPosition };
177 if (t->HasEmbeddingRepresentation())
178 {
179 auto em = t->GetEmbeddingRepresentation();
180 embeddingTemplate = inno_Template{ em->embeddingTemplateData.size(),
181 em->embeddingTemplateData.data(),
182 em->IsEmbeddingTemplateBiometricPositionKnown()
183 ? PrintToIsoPosition(em->GetEmbeddingTemplateBiometricPosition())
184 : inno_Template::NotExistingPosition };
185 }
186 return inno_PrintTemplate{ icsTemplate, embeddingTemplate };
187 }
188
189 static std::vector<inno_PrintTemplate> FromTemplates(const std::vector<std::shared_ptr<PrintTemplate>>& pt)
190 {
191 std::vector<inno_PrintTemplate> transformedTemplates(pt.size());
192 std::transform(
193 pt.begin(), pt.end(), transformedTemplates.begin(), [](const auto& t) { return FromTemplate(t); });
194 return transformedTemplates;
195 }
196
197 static std::shared_ptr<PrintTemplate> ToTemplate(const inno_PrintTemplate& pt)
198 {
199 if (nullptr != pt.ics.data && nullptr != pt.embedding.data)
200 {
201 return std::make_shared<PrintTemplate>(inno_Template::ToICSTemplate(pt.ics),
202 inno_Template::ToEmbeddingTemplate(pt.embedding));
203 }
204 if (nullptr != pt.ics.data)
205 {
206 return std::make_shared<PrintTemplate>(inno_Template::ToICSTemplate(pt.ics));
207 }
208 return std::make_shared<PrintTemplate>(inno_Template::ToEmbeddingTemplate(pt.embedding));
209 }
210
211 inno_Template ics;
212 inno_Template embedding;
213 };
214#pragma pack(pop)
215 using inno_AllocateData = uint8_t* (*)(void*, size_t);
216
217 class MultiModalityExecutor
218 {
219 public:
220 static constexpr size_t MaxErrorMessage = 200;
221 virtual void CreateUserRecord(const std::shared_ptr<Logger>& log,
222 const inno_Template* prints,
223 size_t printsSize,
224 const inno_Template* faces,
225 size_t facesSize,
226 const inno_Template* irises,
227 size_t irisesSize,
228 inno_AllocateData allocator,
229 void* container,
230 ErrorCallbacks errorCallbacks) = 0;
231
232 virtual void Verify(const std::shared_ptr<Logger>& log,
233 const uint8_t* probe,
234 size_t probeSize,
235 const uint8_t* gallery,
236 size_t gallerySize,
237 unsigned int maxRotation,
238 int* printScore,
239 int* faceScore,
240 int* irisScore,
241 ErrorCallbacks errorCallbacks) = 0;
242
243 MultiModalityExecutor() = default;
244 virtual ~MultiModalityExecutor() = default;
245 MultiModalityExecutor(const MultiModalityExecutor&) = delete;
246 MultiModalityExecutor(MultiModalityExecutor&&) = delete;
247 MultiModalityExecutor& operator=(const MultiModalityExecutor&) = delete;
248 MultiModalityExecutor& operator=(MultiModalityExecutor&&) = delete;
249 };
250
251 extern "C"
252 {
253 INNO_ENROLLMENT_API void inno_local_CreateUserRecord(LoggerCallBacks logCallbacks,
254 const inno_Template* prints,
255 size_t printsSize,
256 const inno_Template* faces,
257 size_t facesSize,
258 const inno_Template* irises,
259 size_t irisesSize,
260 inno_AllocateData allocator,
261 void* container,
262 ErrorCallbacks errorCallbacks);
263 INNO_ENROLLMENT_API void inno_local_MultiVerify(LoggerCallBacks logCallbacks,
264 const uint8_t* probe,
265 const uint8_t* gallery,
266 unsigned int maxRotation,
267 int* printScore,
268 int* faceScore,
269 int* irisScore,
270 ErrorCallbacks errorCallbacks);
271 }
272
273 class LocalMultiModalityExecutor : public MultiModalityExecutor
274 {
275 public:
276 void CreateUserRecord(const std::shared_ptr<Logger>& log,
277 const inno_Template* prints,
278 size_t printsSize,
279 const inno_Template* faces,
280 size_t facesSize,
281 const inno_Template* irises,
282 size_t irisesSize,
283 inno_AllocateData allocator,
284 void* container,
285 ErrorCallbacks errorCallbacks) final
286 {
287 const CallbackLogger slog(log);
288 inno_local_CreateUserRecord(slog.GetCallbacks(),
289 prints,
290 printsSize,
291 faces,
292 facesSize,
293 irises,
294 irisesSize,
295 allocator,
296 container,
297 errorCallbacks);
298 }
299
300 void Verify(const std::shared_ptr<Logger>& log,
301 const uint8_t* probe,
302 size_t /* probeSize */,
303 const uint8_t* gallery,
304 size_t /* gallerySize */,
305 unsigned int maxRotation,
306 int* printScore,
307 int* faceScore,
308 int* irisScore,
309 ErrorCallbacks errorCallbacks) final
310 {
311 const CallbackLogger slog(log);
312 inno_local_MultiVerify(
313 slog.GetCallbacks(), probe, gallery, maxRotation, printScore, faceScore, irisScore, errorCallbacks);
314 }
315
316 LocalMultiModalityExecutor() = default;
317 virtual ~LocalMultiModalityExecutor() = default;
318 LocalMultiModalityExecutor(const LocalMultiModalityExecutor&) = delete;
319 LocalMultiModalityExecutor(LocalMultiModalityExecutor&&) = delete;
320 LocalMultiModalityExecutor& operator=(const LocalMultiModalityExecutor&) = delete;
321 LocalMultiModalityExecutor& operator=(LocalMultiModalityExecutor&&) = delete;
322 };
323
324 extern "C"
325 {
326 struct inno_grcp_MultiModalityChannel;
327
328 INNO_ENROLLMENT_API inno_grcp_MultiModalityChannel* inno_grpc_MultiModality_Channel_Create(
329 const char* endpoint);
330 INNO_ENROLLMENT_API void inno_grpc_MultiModality_Channel_Destroy(inno_grcp_MultiModalityChannel* channel);
331 INNO_ENROLLMENT_API void inno_grpc_CreateUserRecord(inno_grcp_MultiModalityChannel* channel,
332 LoggerCallBacks logCallbacks,
333 const inno_Template* prints,
334 size_t printsSize,
335 const inno_Template* faces,
336 size_t facesSize,
337 const inno_Template* irises,
338 size_t irisesSize,
339 inno_AllocateData allocator,
340 void* container,
341 ErrorCallbacks errorCallbacks);
342 INNO_ENROLLMENT_API void inno_grpc_MultiVerify(inno_grcp_MultiModalityChannel* channel,
343 LoggerCallBacks logCallbacks,
344 const uint8_t* probe,
345 size_t probeSize,
346 const uint8_t* gallery,
347 size_t gallerySize,
348 unsigned int maxRotation,
349 int* printScore,
350 int* faceScore,
351 int* irisScore,
352 ErrorCallbacks errorCallbacks);
353 }
354
355 class GrpcMultiModalityExecutor : public MultiModalityExecutor
356 {
357 public:
358 void CreateUserRecord(const std::shared_ptr<Logger>& log,
359 const inno_Template* prints,
360 size_t printsSize,
361 const inno_Template* faces,
362 size_t facesSize,
363 const inno_Template* irises,
364 size_t irisesSize,
365 inno_AllocateData allocator,
366 void* container,
367 ErrorCallbacks errorCallbacks) final
368 {
369 const CallbackLogger slog(log);
370 inno_grpc_CreateUserRecord(grpc.get(),
371 slog.GetCallbacks(),
372 prints,
373 printsSize,
374 faces,
375 facesSize,
376 irises,
377 irisesSize,
378 allocator,
379 container,
380 errorCallbacks);
381 }
382
383 void Verify(const std::shared_ptr<Logger>& log,
384 const uint8_t* probe,
385 size_t probeSize,
386 const uint8_t* gallery,
387 size_t gallerySize,
388 unsigned int maxRotation,
389 int* printScore,
390 int* faceScore,
391 int* irisScore,
392 ErrorCallbacks errorCallbacks) final
393 {
394 const CallbackLogger slog(log);
395 inno_grpc_MultiVerify(grpc.get(),
396 slog.GetCallbacks(),
397 probe,
398 probeSize,
399 gallery,
400 gallerySize,
401 maxRotation,
402 printScore,
403 faceScore,
404 irisScore,
405 errorCallbacks);
406 }
407
413 explicit GrpcMultiModalityExecutor(const std::string& endPoint)
414 : grpc(inno_grpc_MultiModality_Channel_Create(endPoint.c_str()), inno_grpc_MultiModality_Channel_Destroy)
415 {
416 }
417
418 GrpcMultiModalityExecutor() = delete;
419 virtual ~GrpcMultiModalityExecutor() = default;
420 GrpcMultiModalityExecutor(const GrpcMultiModalityExecutor&) = delete;
421 GrpcMultiModalityExecutor(GrpcMultiModalityExecutor&&) = delete;
422 GrpcMultiModalityExecutor& operator=(const GrpcMultiModalityExecutor&) = delete;
423 GrpcMultiModalityExecutor& operator=(GrpcMultiModalityExecutor&&) = delete;
424
425 private:
426 std::unique_ptr<inno_grcp_MultiModalityChannel, void (*)(inno_grcp_MultiModalityChannel*)> grpc;
427 };
428
433 */
434 class GlobalMultiModalityExecutor
435 {
436 public:
440 */
441 static std::shared_ptr<MultiModalityExecutor> Get()
442 {
443 return GlobalMultiModalityExecutor::Instance().GetInternal();
444 }
445
450 */
451 static void Set(std::shared_ptr<MultiModalityExecutor> executor)
452 {
453 if (executor == nullptr)
454 {
455 throw EnrollmentInvalidArgumentException("executor can not be null");
456 }
457
458 GlobalMultiModalityExecutor::Instance().SetInternal(std::move(executor));
459 }
460
462 virtual ~GlobalMultiModalityExecutor() = default;
467
468 private:
469 std::shared_ptr<MultiModalityExecutor> pe;
470 std::mutex peMux;
471
472 std::shared_ptr<MultiModalityExecutor> GetInternal()
473 {
474 const std::scoped_lock lock(peMux);
475 return pe;
476 }
477
478 static GlobalMultiModalityExecutor& Instance()
479 {
480 static GlobalMultiModalityExecutor e(std::make_shared<LocalMultiModalityExecutor>());
481 return e;
482 }
483
484 void SetInternal(std::shared_ptr<MultiModalityExecutor> executor)
485 {
486 const std::scoped_lock lock(peMux);
487 pe = std::move(executor);
488 }
489
490 explicit GlobalMultiModalityExecutor(std::shared_ptr<MultiModalityExecutor> e)
491 : pe(std::move(e))
492 {
493 }
494 };
495} // namespace inno
Base exception for all enrollment-sdk invalid argument exceptions.
Definition EnrollmentException.h:96
Holds instance of MultiModalityExecutor.
Definition MultiModalityExecutor.h:434
static std::shared_ptr< MultiModalityExecutor > Get()
Provides current executor.
Definition MultiModalityExecutor.h:440
static void Set(std::shared_ptr< MultiModalityExecutor > executor)
Sets new global executor.
Definition MultiModalityExecutor.h:450
static constexpr IrisPosition IsoToIrisPosition(int irisPosition)
Function converts ISO position to IrisPosition.
Definition IrisPosition.h:56
static constexpr PrintPosition IsoToPrintPosition(int isoPosition)
Function converts ISO position to PrintPosition.
Definition PrintPosition.h:138
static constexpr int PrintToIsoPosition(PrintPosition position)
Function converts Print position to ISO position.
Definition PrintPosition.h:204