12#include "enrollment/Export.h"
27 struct INNO_ENROLLMENT_API inno_Template
29 static constexpr int NotExistingPosition = 0;
31 static std::vector<inno_Template> FromTemplates(
const std::vector<std::shared_ptr<FaceTemplate>>& ft)
33 std::vector<inno_Template> transformedTemplates(ft.size());
37 transformedTemplates.begin(),
42 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
44 return inno_Template{ t->data.size(), t->data.data(), inno_Template::NotExistingPosition };
46 return transformedTemplates;
48 static std::vector<inno_Template> FromTemplates(
const std::vector<std::shared_ptr<IrisTemplate>>& it)
50 std::vector<inno_Template> transformedTemplates(it.size());
54 transformedTemplates.begin(),
59 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
61 return inno_Template{ t->data.size(),
63 t->IsIrisTemplateBiometricPositionKnown()
64 ? IrisPositionToIsoPosition(t->GetIrisTemplateBiometricPosition())
65 : NotExistingPosition };
67 return transformedTemplates;
69 static std::vector<inno_Template> FromTemplates(
const std::vector<std::shared_ptr<ICSTemplate>>& pt)
71 std::vector<inno_Template> transformedTemplates(pt.size());
72 std::transform(pt.begin(),
74 transformedTemplates.begin(),
79 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
81 return inno_Template{ t->icsTemplateData.size(),
82 t->icsTemplateData.data(),
83 t->IsICSTemplateBiometricPositionKnown()
84 ? PrintToIsoPosition(t->GetICSTemplateBiometricPosition())
85 : NotExistingPosition };
87 return transformedTemplates;
89 static std::vector<inno_Template> FromTemplates(
const std::vector<std::shared_ptr<EmbeddingTemplate>>& pt)
91 std::vector<inno_Template> transformedTemplates(pt.size());
92 std::transform(pt.begin(),
94 transformedTemplates.begin(),
99 return inno_Template{ 0, nullptr, inno_Template::NotExistingPosition };
101 return inno_Template{ t->embeddingTemplateData.size(),
102 t->embeddingTemplateData.data(),
103 t->IsEmbeddingTemplateBiometricPositionKnown()
104 ? PrintToIsoPosition(t->GetEmbeddingTemplateBiometricPosition())
105 : NotExistingPosition };
107 return transformedTemplates;
110 static const uint8_t* GetEnd(
const uint8_t* begin,
const size_t length)
112 const auto* end = begin;
113 std::advance(end, length);
117 static std::shared_ptr<FaceTemplate> ToFaceTemplate(
const inno_Template& ft)
119 return std::make_shared<FaceTemplate>(std::vector<uint8_t>{ ft.data, GetEnd(ft.data, ft.length) });
122 static std::shared_ptr<IrisTemplate> ToIrisTemplate(
const inno_Template& it)
124 if (it.position == inno_Template::NotExistingPosition)
126 return std::make_shared<IrisTemplate>(std::vector<uint8_t>{ it.data, GetEnd(it.data, it.length) });
128 return std::make_shared<IrisTemplate>(std::vector<uint8_t>{ it.data, GetEnd(it.data, it.length) },
132 static std::shared_ptr<ICSTemplate> ToICSTemplate(
const inno_Template& pt)
134 if (pt.position == inno_Template::NotExistingPosition)
136 return std::make_shared<ICSTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) });
138 return std::make_shared<ICSTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) },
142 static std::shared_ptr<EmbeddingTemplate> ToEmbeddingTemplate(
const inno_Template& pt)
144 if (pt.position == inno_Template::NotExistingPosition)
146 return std::make_shared<EmbeddingTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) });
148 return std::make_shared<EmbeddingTemplate>(std::vector<uint8_t>{ pt.data, GetEnd(pt.data, pt.length) },
152 bool operator==(
const inno_Template& r)
const
154 return length == r.length && data == r.data && position == r.position;
161 struct INNO_ENROLLMENT_API inno_PrintTemplate
163 static inno_PrintTemplate FromTemplate(
const std::shared_ptr<PrintTemplate>& t)
165 inno_Template icsTemplate{ 0,
nullptr, inno_Template::NotExistingPosition };
166 if (t->HasIcsRepresentation())
168 auto i = t->GetICSRepresentation();
169 icsTemplate = inno_Template{ i->icsTemplateData.size(),
170 i->icsTemplateData.data(),
171 i->IsICSTemplateBiometricPositionKnown()
173 : inno_Template::NotExistingPosition };
176 inno_Template embeddingTemplate{ 0,
nullptr, inno_Template::NotExistingPosition };
177 if (t->HasEmbeddingRepresentation())
179 auto em = t->GetEmbeddingRepresentation();
180 embeddingTemplate = inno_Template{ em->embeddingTemplateData.size(),
181 em->embeddingTemplateData.data(),
182 em->IsEmbeddingTemplateBiometricPositionKnown()
184 : inno_Template::NotExistingPosition };
186 return inno_PrintTemplate{ icsTemplate, embeddingTemplate };
189 static std::vector<inno_PrintTemplate> FromTemplates(
const std::vector<std::shared_ptr<PrintTemplate>>& pt)
191 std::vector<inno_PrintTemplate> transformedTemplates(pt.size());
193 pt.begin(), pt.end(), transformedTemplates.begin(), [](
const auto& t) { return FromTemplate(t); });
194 return transformedTemplates;
197 static std::shared_ptr<PrintTemplate> ToTemplate(
const inno_PrintTemplate& pt)
199 if (
nullptr != pt.ics.data &&
nullptr != pt.embedding.data)
201 return std::make_shared<PrintTemplate>(inno_Template::ToICSTemplate(pt.ics),
202 inno_Template::ToEmbeddingTemplate(pt.embedding));
204 if (
nullptr != pt.ics.data)
206 return std::make_shared<PrintTemplate>(inno_Template::ToICSTemplate(pt.ics));
208 return std::make_shared<PrintTemplate>(inno_Template::ToEmbeddingTemplate(pt.embedding));
212 inno_Template embedding;
215 using inno_AllocateData = uint8_t* (*)(
void*,
size_t);
217 class MultiModalityExecutor
220 static constexpr size_t MaxErrorMessage = 200;
221 virtual void CreateUserRecord(
const std::shared_ptr<Logger>& log,
222 const inno_Template* prints,
224 const inno_Template* faces,
226 const inno_Template* irises,
228 inno_AllocateData allocator,
230 ErrorCallbacks errorCallbacks) = 0;
232 virtual void Verify(
const std::shared_ptr<Logger>& log,
233 const uint8_t* probe,
235 const uint8_t* gallery,
237 unsigned int maxRotation,
241 ErrorCallbacks errorCallbacks) = 0;
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;
253 INNO_ENROLLMENT_API
void inno_local_CreateUserRecord(LoggerCallBacks logCallbacks,
254 const inno_Template* prints,
256 const inno_Template* faces,
258 const inno_Template* irises,
260 inno_AllocateData allocator,
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,
270 ErrorCallbacks errorCallbacks);
273 class LocalMultiModalityExecutor :
public MultiModalityExecutor
276 void CreateUserRecord(
const std::shared_ptr<Logger>& log,
277 const inno_Template* prints,
279 const inno_Template* faces,
281 const inno_Template* irises,
283 inno_AllocateData allocator,
285 ErrorCallbacks errorCallbacks)
final
287 const CallbackLogger slog(log);
288 inno_local_CreateUserRecord(slog.GetCallbacks(),
300 void Verify(
const std::shared_ptr<Logger>& log,
301 const uint8_t* probe,
303 const uint8_t* gallery,
305 unsigned int maxRotation,
309 ErrorCallbacks errorCallbacks)
final
311 const CallbackLogger slog(log);
312 inno_local_MultiVerify(
313 slog.GetCallbacks(), probe, gallery, maxRotation, printScore, faceScore, irisScore, errorCallbacks);
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;
326 struct inno_grcp_MultiModalityChannel;
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,
335 const inno_Template* faces,
337 const inno_Template* irises,
339 inno_AllocateData allocator,
341 ErrorCallbacks errorCallbacks);
342 INNO_ENROLLMENT_API
void inno_grpc_MultiVerify(inno_grcp_MultiModalityChannel* channel,
343 LoggerCallBacks logCallbacks,
344 const uint8_t* probe,
346 const uint8_t* gallery,
348 unsigned int maxRotation,
352 ErrorCallbacks errorCallbacks);
355 class GrpcMultiModalityExecutor :
public MultiModalityExecutor
358 void CreateUserRecord(
const std::shared_ptr<Logger>& log,
359 const inno_Template* prints,
361 const inno_Template* faces,
363 const inno_Template* irises,
365 inno_AllocateData allocator,
367 ErrorCallbacks errorCallbacks)
final
369 const CallbackLogger slog(log);
370 inno_grpc_CreateUserRecord(grpc.get(),
383 void Verify(
const std::shared_ptr<Logger>& log,
384 const uint8_t* probe,
386 const uint8_t* gallery,
388 unsigned int maxRotation,
392 ErrorCallbacks errorCallbacks)
final
394 const CallbackLogger slog(log);
395 inno_grpc_MultiVerify(grpc.get(),
413 explicit GrpcMultiModalityExecutor(
const std::string& endPoint)
414 : grpc(inno_grpc_MultiModality_Channel_Create(endPoint.c_str()), inno_grpc_MultiModality_Channel_Destroy)
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;
426 std::unique_ptr<inno_grcp_MultiModalityChannel, void (*)(inno_grcp_MultiModalityChannel*)> grpc;
434 class GlobalMultiModalityExecutor
441 static std::shared_ptr<MultiModalityExecutor>
Get()
443 return GlobalMultiModalityExecutor::Instance().GetInternal();
451 static void Set(std::shared_ptr<MultiModalityExecutor> executor)
453 if (executor ==
nullptr)
458 GlobalMultiModalityExecutor::Instance().SetInternal(std::move(executor));
469 std::shared_ptr<MultiModalityExecutor> pe;
472 std::shared_ptr<MultiModalityExecutor> GetInternal()
474 const std::scoped_lock lock(peMux);
478 static GlobalMultiModalityExecutor& Instance()
480 static GlobalMultiModalityExecutor e(std::make_shared<LocalMultiModalityExecutor>());
484 void SetInternal(std::shared_ptr<MultiModalityExecutor> executor)
486 const std::scoped_lock lock(peMux);
487 pe = std::move(executor);
490 explicit GlobalMultiModalityExecutor(std::shared_ptr<MultiModalityExecutor> e)
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