Enrollment 28.2.0
Loading...
Searching...
No Matches
IndexedModalitiesGallery.h
Go to the documentation of this file.
1
9
10#pragma once
11#include "enrollment/Export.h"
13#include <shared_mutex>
14#include <unordered_map>
15
16namespace inno
17{
18 extern "C"
19 {
20 INNO_ENROLLMENT_API void* inno_local_IndexedModalitiesGallery_Create(inno_Deleter* deleter,
21 uint8_t type,
22 uint64_t threadsCount,
23 ErrorCallbacks errorCallbacks);
24 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_CheckPrintTemplate(void* gallery,
25 inno_Template print,
26 ErrorCallbacks errorCallbacks);
27 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_CheckFaceTemplate(void* gallery,
28 inno_Template face,
29 ErrorCallbacks errorCallbacks);
30 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_CheckIrisTemplate(void* gallery,
31 inno_Template iris,
32 ErrorCallbacks errorCallbacks);
33 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_ReferenceAdd(void* gallery,
34 size_t id,
35 inno_Template* prints,
36 size_t printsSize,
37 inno_Template* faces,
38 size_t facesSize,
39 inno_Template* irises,
40 size_t irisesSize,
41 ErrorCallbacks errorCallbacks);
42 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_ReferenceRemove(void* gallery,
43 size_t id,
44 ErrorCallbacks errorCallbacks);
45 using inno_AllocateIds = size_t* (*)(void*, size_t);
46 INNO_ENROLLMENT_API void inno_local_IndexedModalitiesGallery_CandidateFind(void* gallery,
47 inno_Template* prints,
48 size_t printsSize,
49 inno_Template* faces,
50 size_t facesSize,
51 inno_Template* irises,
52 size_t irisesSize,
53 inno_AllocateIds allocator,
54 void* printsCandidates,
55 void* facesCandidates,
56 void* irisesCandidates,
57 size_t bestCandidatesCount,
58 ErrorCallbacks errorCallbacks);
59 }
60
63 */
64 enum class IndexedModalitiesGalleryType : uint8_t
65 {
74
75 };
76
79 */
80 class IndexedModalitiesGalleryConfig : public Serializable
81 {
82 public:
89 */
90 void SetThreadsCount(unsigned int value)
91 {
92 if (value == 0)
93 {
94 throw EnrollmentInvalidArgumentException("Number of gallery threads MUST be > 0");
95 }
96 threads = value;
97 }
98
103 */
104 [[nodiscard]] unsigned int GetThreadCount() const
105 {
106 return threads;
107 }
108
116 */
118 {
119 switch (value)
120 {
123 type = value;
124 return;
125 }
126 throw EnrollmentInvalidArgumentException("Type " + std::to_string(static_cast<int>(value)) +
127 " of IndexedModalitiesGallery is unknown");
128 }
129
135 */
136 [[nodiscard]] IndexedModalitiesGalleryType GetGalleryType() const
137 {
138 return type;
139 }
140
144 */
145 void WriteTo(Writer& writer) const final
146 {
147 writer.Write("tc", threads);
148 writer.Write("t", static_cast<int>(type));
149 }
150
157
158 private:
159 static constexpr unsigned int DefaultThreads = 1;
160 unsigned int threads = DefaultThreads;
162 IndexedModalitiesGalleryType type = DefaultType;
163 };
164
200 */
201 class IndexedModalitiesGallery
202 {
203 public:
205 using Identifier = size_t;
211 */
212 static std::shared_ptr<IndexedModalitiesGallery> Create(IndexedModalitiesGalleryConfig config)
213 {
214 return std::shared_ptr<IndexedModalitiesGallery>(new IndexedModalitiesGallery(std::move(config)));
215 }
216
239 */
240 virtual void Add(Identifier identifier, const std::shared_ptr<ModalitiesTemplate>& templ)
241 {
242 if (templ == nullptr)
243 {
244 throw NullArgumentException("Reference template cannot be null");
245 }
246
247 auto [prints, faces, irises] = ConvertToInnoTemplates(templ);
248
249 inno_local_IndexedModalitiesGallery_ReferenceAdd(impl.get(),
250 identifier,
251 prints.data(),
252 prints.size(),
253 faces.data(),
254 faces.size(),
255 irises.data(),
256 irises.size(),
257 ThrowOnError{});
258 }
259
265 */
266 virtual void Remove(Identifier identifier)
267 {
268 inno_local_IndexedModalitiesGallery_ReferenceRemove(impl.get(), identifier, ThrowOnError{});
269 }
270
273 */
274 class ModalitiesIdentifiers
275 {
276 public:
281 */
282 [[nodiscard]] std::vector<Identifier> GetPrintIdentifiers() const
283 {
284 return prints;
285 }
290 */
291 [[nodiscard]] std::vector<Identifier> GetFaceIdentifiers() const
292 {
293 return faces;
294 }
299 */
300 [[nodiscard]] std::vector<Identifier> GetIrisIdentifiers() const
301 {
302 return irises;
303 }
304
305 ModalitiesIdentifiers(std::vector<Identifier> ps, std::vector<Identifier> fs, std::vector<Identifier> is)
306 : prints(std::move(ps))
307 , faces(std::move(fs))
308 , irises(std::move(is))
309 {
310 }
311 ModalitiesIdentifiers() = delete;
312
313 private:
314 std::vector<Identifier> prints;
315 std::vector<Identifier> faces;
316 std::vector<Identifier> irises;
317 };
318
340 */
341 [[nodiscard]] virtual std::shared_ptr<ModalitiesIdentifiers> IdentifyModalities(
342 const std::shared_ptr<ModalitiesTemplate>& probe,
343 size_t maxCandidates) const
344 {
345 auto [prints, faces, irises] = ConvertToInnoTemplates(probe);
346
347 std::vector<Identifier> printIds;
348 std::vector<Identifier> faceIds;
349 std::vector<Identifier> irisIds;
350 auto idsAllocator = +[](void* container, size_t length) -> size_t*
351 {
352 std::vector<Identifier>& vec = *static_cast<std::vector<Identifier>*>(container);
353 vec.resize(length);
354 return vec.data();
355 };
356
357 inno_local_IndexedModalitiesGallery_CandidateFind(impl.get(),
358 prints.data(),
359 prints.size(),
360 faces.data(),
361 faces.size(),
362 irises.data(),
363 irises.size(),
364 idsAllocator,
365 &printIds,
366 &faceIds,
367 &irisIds,
368 maxCandidates,
369 ThrowOnError{});
370
371 return std::make_shared<ModalitiesIdentifiers>(std::move(printIds), std::move(faceIds), std::move(irisIds));
372 }
373
376 IndexedModalitiesGallery& operator=(const IndexedModalitiesGallery&) = delete;
378 virtual ~IndexedModalitiesGallery() = default;
379
380 private:
382
384 : c(std::move(config))
385 , impl(CreateImpl(c.GetGalleryType(), c.GetThreadCount()))
386
387 {
388 }
389
390 [[nodiscard]] std::tuple<std::vector<inno_Template>, std::vector<inno_Template>, std::vector<inno_Template>>
391 ConvertToInnoTemplates(const std::shared_ptr<ModalitiesTemplate>& tmpl) const
392 {
393 if (tmpl == nullptr)
394 {
395 throw NullArgumentException("Null template cannot be processed by gallery");
396 }
397 auto printTemplates = tmpl->GetPrintTemplates();
399 ? inno_Template::FromTemplates(PrintTemplate::ToEmbeddingTemplates(printTemplates))
400 : inno_Template::FromTemplates(PrintTemplate::ToICSTemplates(printTemplates));
401 std::for_each(prints.begin(),
402 prints.end(),
403 [&](auto& t)
404 { inno_local_IndexedModalitiesGallery_CheckPrintTemplate(impl.get(), t, ThrowOnError{}); });
405
406 auto faceTemplates = tmpl->GetFaceTemplates();
407 auto faces = inno_Template::FromTemplates(faceTemplates);
408 std::for_each(faces.begin(),
409 faces.end(),
410 [&](auto& t)
411 { inno_local_IndexedModalitiesGallery_CheckFaceTemplate(impl.get(), t, ThrowOnError{}); });
412
413 auto irisTemplates = tmpl->GetIrisTemplates();
414 auto irises = inno_Template::FromTemplates(irisTemplates);
415 std::for_each(irises.begin(),
416 irises.end(),
417 [&](auto& t)
418 { inno_local_IndexedModalitiesGallery_CheckIrisTemplate(impl.get(), t, ThrowOnError{}); });
419
420 return { prints, faces, irises };
421 }
422
423 static std::unique_ptr<void, inno_Deleter> CreateImpl(IndexedModalitiesGalleryType type, size_t threadsCount)
424 {
425 inno_Deleter deleter = {};
426
427 auto* i = inno_local_IndexedModalitiesGallery_Create(
428 &deleter, static_cast<uint8_t>(type), static_cast<uint64_t>(threadsCount), ThrowOnError{});
429
430 return { i, deleter };
431 }
432
433 std::unique_ptr<void, inno_Deleter> impl;
434 };
435} // namespace inno
IndexedModalitiesGalleryType
Type of IndexedModalitiesGallery.
Definition IndexedModalitiesGallery.h:64
@ PRINT_EMBEDDING
The gallery identification of candidates is based on print EmbeddingTemplate.
Definition IndexedModalitiesGallery.h:72
@ PRINT_ICS_TEMPLATE
The gallery identification of candidates is based on print ICSTemplate.
Definition IndexedModalitiesGallery.h:67
Base exception for all enrollment-sdk invalid argument exceptions.
Definition EnrollmentException.h:96
IndexedModalitiesGallery configuration.
Definition IndexedModalitiesGallery.h:80
void WriteTo(Writer &writer) const final
Function serializes configuration via provided Writer.
Definition IndexedModalitiesGallery.h:144
IndexedModalitiesGalleryConfig()=default
Default configuration is.
IndexedModalitiesGalleryType GetGalleryType() const
Get type of Modalities Gallery.
Definition IndexedModalitiesGallery.h:135
void SetGalleryType(IndexedModalitiesGalleryType value)
Set type of Modalities Gallery.
Definition IndexedModalitiesGallery.h:116
unsigned int GetThreadCount() const
Get number of processing threads.
Definition IndexedModalitiesGallery.h:103
void SetThreadsCount(unsigned int value)
Set number of threads used by gallery.
Definition IndexedModalitiesGallery.h:89
Contains candidates per each modality.
Definition IndexedModalitiesGallery.h:274
std::vector< Identifier > GetPrintIdentifiers() const
Returns best candidates for print modality.
Definition IndexedModalitiesGallery.h:281
std::vector< Identifier > GetFaceIdentifiers() const
Returns best candidates for face modality.
Definition IndexedModalitiesGallery.h:290
std::vector< Identifier > GetIrisIdentifiers() const
Returns best candidates for iris modality.
Definition IndexedModalitiesGallery.h:299
Gallery of references identifiers.
Definition IndexedModalitiesGallery.h:201
virtual std::shared_ptr< ModalitiesIdentifiers > IdentifyModalities(const std::shared_ptr< ModalitiesTemplate > &probe, size_t maxCandidates) const
Search for given probe.
Definition IndexedModalitiesGallery.h:340
virtual void Remove(Identifier identifier)
Removes reference template under provided index identifier from the gallery.
Definition IndexedModalitiesGallery.h:265
size_t Identifier
Index identifier of reference in gallery.
Definition IndexedModalitiesGallery.h:204
virtual void Add(Identifier identifier, const std::shared_ptr< ModalitiesTemplate > &templ)
Adds reference template under index identifier into gallery.
Definition IndexedModalitiesGallery.h:239
static std::shared_ptr< IndexedModalitiesGallery > Create(IndexedModalitiesGalleryConfig config)
Create indexed gallery of references.
Definition IndexedModalitiesGallery.h:211
Null argument is not allowed.
Definition EnrollmentException.h:156
static std::vector< std::shared_ptr< EmbeddingTemplate > > ToEmbeddingTemplates(const std::vector< std::shared_ptr< PrintTemplate > > &templates)
Converts a PrintTemplate objects into an EmbeddingTemplate objects.
Definition PrintTemplate.h:58
Provides interface for serialization of all classes.
Definition Writer.h:164