Enrollment 28.2.0
Loading...
Searching...
No Matches
ModalitiesGallery.h
Go to the documentation of this file.
1
9
10#pragma once
11#include "enrollment/Export.h"
17#include <shared_mutex>
18#include <unordered_map>
19
20namespace inno
21{
25 */
26 class ModalitiesGalleryReference
27 {
28 public:
33 [[nodiscard]] virtual std::shared_ptr<ModalitiesTemplate> GetModalitiesTemplates() const = 0;
34
39 [[nodiscard]] virtual size_t GetIndex() const = 0;
40
41 ModalitiesGalleryReference() = default;
42 virtual ~ModalitiesGalleryReference() = default;
43 ModalitiesGalleryReference(const ModalitiesGalleryReference&) = default;
44 ModalitiesGalleryReference(ModalitiesGalleryReference&&) = default;
45 ModalitiesGalleryReference& operator=(const ModalitiesGalleryReference&) = default;
46 ModalitiesGalleryReference& operator=(ModalitiesGalleryReference&&) = default;
47 };
48
51 */
52 class ModalitiesGalleryIndexedTemplate : public ModalitiesGalleryReference
53 {
54 public:
58 */
59 [[nodiscard]] size_t GetIndex() const final
60 {
61 return i;
62 }
66 */
67 [[nodiscard]] std::shared_ptr<ModalitiesTemplate> GetModalitiesTemplates() const final
68 {
69 return c;
70 }
71
76 */
77 static std::shared_ptr<ModalitiesGalleryIndexedTemplate> Downcast(
78 std::shared_ptr<ModalitiesGalleryReference>& reference)
79 {
80 return std::dynamic_pointer_cast<ModalitiesGalleryIndexedTemplate>(reference);
81 }
82
87 */
88 ModalitiesGalleryIndexedTemplate(size_t index, std::shared_ptr<ModalitiesTemplate> reference)
89 : i(index)
90 , c(std::move(reference))
91 {
92 }
93
94 private:
95 size_t i = {};
96 std::shared_ptr<ModalitiesTemplate> c;
97 };
98
101 */
102 enum class ModalitiesGalleryType : uint8_t
103 {
112
113 };
114
117 */
118 class ModalitiesGalleryConfig : public Serializable
119 {
120 public:
127 */
128 void SetThreadsCount(unsigned int value)
129 {
130 if (value == 0)
131 {
132 throw EnrollmentInvalidArgumentException("Number of gallery threads MUST be > 0");
133 }
134 threads = value;
135 }
136
141 */
142 [[nodiscard]] unsigned int GetThreadCount() const
143 {
144 return threads;
145 }
146
153 */
155 {
156 switch (value)
157 {
160 type = value;
161 return;
162 }
163 throw EnrollmentInvalidArgumentException("Type " + std::to_string(static_cast<int>(value)) +
164 " of Modalities Gallery is unknown");
165 }
166
172 */
173 [[nodiscard]] ModalitiesGalleryType GetGalleryType() const
174 {
175 return type;
176 }
177
181 */
182 void WriteTo(Writer& writer) const final
183 {
184 writer.Write("tc", threads);
185 writer.Write("t", static_cast<int>(type));
186 }
205 }
206
212 ModalitiesGalleryConfig() = default;
213
214 private:
215 static constexpr unsigned int DefaultThreads = 1;
216 unsigned int threads = DefaultThreads;
218 ModalitiesGalleryType type = DefaultType;
219 };
220
306 */
307 class ModalitiesGallery
308 {
309 public:
315 */
316 static std::shared_ptr<ModalitiesGallery> Create()
317 {
318 return std::shared_ptr<ModalitiesGallery>(new ModalitiesGallery(IndexedModalitiesGallery::Create({})));
319 }
320
326 */
327 static std::shared_ptr<ModalitiesGallery> Create(ModalitiesGalleryType type)
328 {
329 auto config = ModalitiesGalleryConfig{};
330 config.SetGalleryType(type);
331 return std::shared_ptr<ModalitiesGallery>(
332 new ModalitiesGallery(IndexedModalitiesGallery::Create(config.ToIndexedModalitiesGalleryConfig())));
333 }
334
340 */
341 static std::shared_ptr<ModalitiesGallery> Create(const ModalitiesGalleryConfig& config)
342 {
343 return std::shared_ptr<ModalitiesGallery>(
345 }
346
374 */
375 void Add(std::shared_ptr<ModalitiesGalleryReference> reference)
376 {
377 if (reference == nullptr)
378 {
379 throw NullArgumentException("Reference cannot be null");
380 }
381
382 const auto id = reference->GetIndex();
383
384 // Next operations must be exclusively locked to do not modify gallery during find operations
385 // Lock MUST be here to ensure that this gallery and underlying gallery has same reference
386 const std::unique_lock lock(mux);
387 gallery->Add(id, reference->GetModalitiesTemplates());
388 references[id] = std::move(reference);
389 }
390
399 */
400 void Remove(size_t index)
401 {
402 // Next operations must be exclusively locked to do not modify gallery during find operations
403 // Lock MUST be here to ensure that this gallery and underlying gallery has same reference
404 const std::unique_lock lock(mux);
405 gallery->Remove(index);
406 references.erase(index);
407 }
408
411 */
412 class ModalitiesCandidates
413 {
414 public:
419 */
420 [[nodiscard]] std::vector<std::shared_ptr<ModalitiesGalleryReference>> GetPrintCandidates() const
421 {
422 return prints;
423 }
428 */
429 [[nodiscard]] std::vector<std::shared_ptr<ModalitiesGalleryReference>> GetFaceCandidates() const
430 {
431 return faces;
432 }
437 */
438 [[nodiscard]] std::vector<std::shared_ptr<ModalitiesGalleryReference>> GetIrisCandidates() const
439 {
440 return irises;
441 }
445 */
446 [[nodiscard]] std::shared_ptr<ModalitiesTemplate> GetProbe() const
447 {
448 return p;
449 }
450
451 ModalitiesCandidates(std::vector<std::shared_ptr<ModalitiesGalleryReference>> ps,
452 std::vector<std::shared_ptr<ModalitiesGalleryReference>> fs,
453 std::vector<std::shared_ptr<ModalitiesGalleryReference>> is,
454 std::shared_ptr<ModalitiesTemplate> probe)
455 : prints(std::move(ps))
456 , faces(std::move(fs))
457 , irises(std::move(is))
458 , p(std::move(probe))
459 {
460 }
461 ModalitiesCandidates() = delete;
462 ~ModalitiesCandidates() = default;
463 ModalitiesCandidates(const ModalitiesCandidates&) = default;
464 ModalitiesCandidates(ModalitiesCandidates&&) = default;
465 ModalitiesCandidates& operator=(const ModalitiesCandidates&) = default;
466 ModalitiesCandidates& operator=(ModalitiesCandidates&&) = default;
467
468 private:
469 std::vector<std::shared_ptr<ModalitiesGalleryReference>> prints;
470 std::vector<std::shared_ptr<ModalitiesGalleryReference>> faces;
471 std::vector<std::shared_ptr<ModalitiesGalleryReference>> irises;
472 std::shared_ptr<ModalitiesTemplate> p;
473 };
474
496 */
497 [[nodiscard]] std::shared_ptr<ModalitiesCandidates> IdentifyModalities(
498 const std::shared_ptr<ModalitiesTemplate>& probe,
499 size_t maxCandidates) const
500 {
501 // Next operations must be shared locked to not allow modification of gallery, but allow calling this
502 // function from more threads without locking
503 const std::shared_lock lock(mux);
504
505 auto modalityIdentifiers = gallery->IdentifyModalities(probe, maxCandidates);
506 const auto& printIds = modalityIdentifiers->GetPrintIdentifiers();
507 std::vector<std::shared_ptr<ModalitiesGalleryReference>> pc(printIds.size());
508 std::transform(
509 printIds.begin(), printIds.end(), pc.begin(), [&](const auto& t) { return references.at(t); });
510 const auto& faceIds = modalityIdentifiers->GetFaceIdentifiers();
511 std::vector<std::shared_ptr<ModalitiesGalleryReference>> fc(faceIds.size());
512 std::transform(faceIds.begin(), faceIds.end(), fc.begin(), [&](const auto& t) { return references.at(t); });
513 const auto& irisIds = modalityIdentifiers->GetIrisIdentifiers();
514 std::vector<std::shared_ptr<ModalitiesGalleryReference>> ic(irisIds.size());
515 std::transform(irisIds.begin(), irisIds.end(), ic.begin(), [&](const auto& t) { return references.at(t); });
516
517 return std::make_shared<ModalitiesCandidates>(std::move(pc), std::move(fc), std::move(ic), probe);
518 }
519
523 */
524 class Candidate
525 {
526 public:
530 */
531 [[nodiscard]] std::shared_ptr<ModalitiesGalleryReference> GetCandidate() const
532 {
533 return c;
534 }
538 */
539 [[nodiscard]] ModalityScore GetScore() const
540 {
541 return s;
542 }
543
544 Candidate() = default;
545 Candidate(std::shared_ptr<ModalitiesGalleryReference> candidate, ModalityScore score)
546 : c(std::move(candidate))
547 , s(std::move(score))
548 {
549 }
550 ~Candidate() = default;
551 Candidate(const Candidate&) = default;
552 Candidate(Candidate&&) = default;
553 Candidate& operator=(const Candidate&) = default;
554 Candidate& operator=(Candidate&&) = default;
555
556 private:
557 std::shared_ptr<ModalitiesGalleryReference> c;
559 };
560
574 */
575 static std::vector<Candidate> Consolidate(
576 const std::shared_ptr<ModalitiesCandidates>& identifiedModalityCandidates,
577 size_t maxCandidates)
578 {
579 const ModalitiesVerifyMatcher::Config cfg = {};
580 const ModalitiesVerifyMatcher matcher = { cfg,
582 // Disable logging to make consolidation faster
583 std::make_shared<NullLogger>() };
584
585 const auto& probe = identifiedModalityCandidates->GetProbe();
586 const auto& probePrints = probe->GetPrintTemplates();
587 if (!std::all_of(probePrints.begin(),
588 probePrints.end(),
589 [](const auto& print) { return print->HasIcsRepresentation(); }))
590 {
591 throw EnrollmentRuntimeException("All prints of the probe must contain ICS representation");
592 }
593 for (const auto& c : identifiedModalityCandidates->GetPrintCandidates())
594 {
595 const auto& candidate = c->GetModalitiesTemplates();
596 const auto& candidatePrints = candidate->GetPrintTemplates();
597 if (std::any_of(candidatePrints.begin(),
598 candidatePrints.end(),
599 [](const auto& print) { return !print->HasIcsRepresentation(); }))
600 {
601 throw EnrollmentRuntimeException("All candidates prints must contain ICS representation");
602 }
603 }
604
605 return Consolidate(identifiedModalityCandidates, maxCandidates, matcher);
606 }
619 */
620 static std::vector<Candidate> Consolidate(
621 const std::shared_ptr<ModalitiesCandidates>& identifiedModalityCandidates,
622 size_t maxCandidates,
623 const ModalitiesMatcher& matcher)
624 {
625 std::unordered_map<size_t, std::shared_ptr<ModalitiesGalleryReference>> uniqueCandidates;
626
627 for (const auto& c : identifiedModalityCandidates->GetPrintCandidates())
628 {
629 uniqueCandidates[c->GetIndex()] = c;
630 }
631 for (const auto& c : identifiedModalityCandidates->GetFaceCandidates())
632 {
633 uniqueCandidates[c->GetIndex()] = c;
634 }
635 for (const auto& c : identifiedModalityCandidates->GetIrisCandidates())
636 {
637 uniqueCandidates[c->GetIndex()] = c;
638 }
639
640 const auto& probe = identifiedModalityCandidates->GetProbe();
641
642 std::vector<Candidate> result;
643 for (const auto& [_, c] : uniqueCandidates)
644 {
645 const auto& candidate = c->GetModalitiesTemplates();
646 auto score = probe->SimilarWith(*candidate, matcher);
647 result.emplace_back(c, score);
648 }
649
650 std::sort(
651 result.begin(),
652 result.end(),
653 [](const auto& a, const auto& b)
654 {
655 auto as = a.GetScore();
656 auto bs = b.GetScore();
657 constexpr unsigned int FaceNormalizerConstant = 10;
658 return std::max(
659 { as.GetPrintScore(), as.GetFaceScore() * FaceNormalizerConstant, as.GetIrisScore() }) >
660 std::max(
661 { bs.GetPrintScore(), bs.GetFaceScore() * FaceNormalizerConstant, bs.GetIrisScore() });
662 });
663
664 if (result.size() > maxCandidates)
665 {
666 result.resize(maxCandidates);
667 }
668
669 return result;
670 }
671
699 */
700 [[nodiscard]] std::vector<Candidate> Identify(const std::shared_ptr<ModalitiesTemplate>& probe,
701 size_t maxCandidates) const
702 {
703 auto modalitiesCandidates = IdentifyModalities(probe, maxCandidates);
704 return Consolidate(modalitiesCandidates, maxCandidates, consolidateMatcher);
705 }
706
707 ModalitiesGallery(const ModalitiesGallery&) = delete;
709 ModalitiesGallery& operator=(const ModalitiesGallery&) = delete;
710 ModalitiesGallery& operator=(ModalitiesGallery&&) = delete;
711 virtual ~ModalitiesGallery() = default;
712
713 private:
714 mutable std::shared_mutex mux;
715 std::shared_ptr<IndexedModalitiesGallery> gallery;
716
717 explicit ModalitiesGallery(std::shared_ptr<IndexedModalitiesGallery> g)
718 : gallery(std::move(g))
719 {
720 }
721
722 std::unordered_map<size_t, std::shared_ptr<ModalitiesGalleryReference>> references;
723 ModalitiesVerifyMatcher::Config matcherConfig;
724 ModalitiesVerifyMatcher consolidateMatcher = { matcherConfig,
726 // Disable logging to make consolidation faster
727 std::make_shared<NullLogger>() };
728 };
729} // namespace inno
@ 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
ModalitiesGalleryType
Type of ModalitiesGallery.
Definition ModalitiesGallery.h:102
@ PRINT_EMBEDDING
The gallery identification of candidates is based on print EmbeddingTemplate.
Definition ModalitiesGallery.h:110
@ PRINT_ICS_TEMPLATE
The gallery identification of candidates is based on print ICSTemplate.
Definition ModalitiesGallery.h:105
Base exception for all enrollment-sdk invalid argument exceptions.
Definition EnrollmentException.h:96
Base exception for all enrollment-sdk runtime exceptions.
Definition EnrollmentException.h:84
static std::shared_ptr< MultiModalityExecutor > Get()
Provides current executor.
Definition MultiModalityExecutor.h:440
IndexedModalitiesGallery configuration.
Definition IndexedModalitiesGallery.h:80
void SetGalleryType(IndexedModalitiesGalleryType value)
Set type of Modalities Gallery.
Definition IndexedModalitiesGallery.h:116
void SetThreadsCount(unsigned int value)
Set number of threads used by gallery.
Definition IndexedModalitiesGallery.h:89
static std::shared_ptr< IndexedModalitiesGallery > Create(IndexedModalitiesGalleryConfig config)
Create indexed gallery of references.
Definition IndexedModalitiesGallery.h:211
ModalitiesGallery configuration.
Definition ModalitiesGallery.h:118
void WriteTo(Writer &writer) const final
Function serializes configuration via provided Writer.
Definition ModalitiesGallery.h:181
IndexedModalitiesGalleryConfig ToIndexedModalitiesGalleryConfig() const
Function converts configuration to IndexedModalitiesGalleryConfig.
Definition ModalitiesGallery.h:190
unsigned int GetThreadCount() const
Get number of processing threads.
Definition ModalitiesGallery.h:141
ModalitiesGalleryType GetGalleryType() const
Get type of Modalities Gallery.
Definition ModalitiesGallery.h:172
void SetThreadsCount(unsigned int value)
Set number of threads used by gallery.
Definition ModalitiesGallery.h:127
void SetGalleryType(ModalitiesGalleryType value)
Set type of Modalities Gallery.
Definition ModalitiesGallery.h:153
ModalitiesGalleryConfig()=default
Default configuration is.
ModalitiesGalleryIndexedTemplate(size_t index, std::shared_ptr< ModalitiesTemplate > reference)
Create indexed reference with given index and template.
Definition ModalitiesGallery.h:87
size_t GetIndex() const final
Provides reference index.
Definition ModalitiesGallery.h:58
static std::shared_ptr< ModalitiesGalleryIndexedTemplate > Downcast(std::shared_ptr< ModalitiesGalleryReference > &reference)
Downcasts ModalitiesGalleryIndexedTemplate interface into indexed reference.
Definition ModalitiesGallery.h:76
std::shared_ptr< ModalitiesTemplate > GetModalitiesTemplates() const final
Provides reference ModalitiesTemplate.
Definition ModalitiesGallery.h:66
virtual size_t GetIndex() const =0
Provides unique reference index.
virtual std::shared_ptr< ModalitiesTemplate > GetModalitiesTemplates() const =0
Provides reference ModalitiesTemplate.
Found candidate.
Definition ModalitiesGallery.h:524
ModalityScore GetScore() const
Return score for candidate.
Definition ModalitiesGallery.h:538
std::shared_ptr< ModalitiesGalleryReference > GetCandidate() const
Return identified candidate.
Definition ModalitiesGallery.h:530
Contains candidates per each modality.
Definition ModalitiesGallery.h:412
std::vector< std::shared_ptr< ModalitiesGalleryReference > > GetPrintCandidates() const
Returns best candidates for print modality.
Definition ModalitiesGallery.h:419
std::vector< std::shared_ptr< ModalitiesGalleryReference > > GetIrisCandidates() const
Returns best candidates for iris modality.
Definition ModalitiesGallery.h:437
std::shared_ptr< ModalitiesTemplate > GetProbe() const
Returns probe for which candidates are searched.
Definition ModalitiesGallery.h:445
std::vector< std::shared_ptr< ModalitiesGalleryReference > > GetFaceCandidates() const
Returns best candidates for face modality.
Definition ModalitiesGallery.h:428
Gallery of references.
Definition ModalitiesGallery.h:307
static std::vector< Candidate > Consolidate(const std::shared_ptr< ModalitiesCandidates > &identifiedModalityCandidates, size_t maxCandidates)
Merges previously identified modality candidates into list of overall best candidates.
Definition ModalitiesGallery.h:574
std::vector< Candidate > Identify(const std::shared_ptr< ModalitiesTemplate > &probe, size_t maxCandidates) const
Search for given probe.
Definition ModalitiesGallery.h:699
static std::shared_ptr< ModalitiesGallery > Create(ModalitiesGalleryType type)
Create gallery of references.
Definition ModalitiesGallery.h:326
void Remove(size_t index)
Removes the ModalitiesGalleryReference stored at the specified index from the gallery.
Definition ModalitiesGallery.h:399
void Add(std::shared_ptr< ModalitiesGalleryReference > reference)
Adds ModalitiesGalleryReference into gallery.
Definition ModalitiesGallery.h:374
static std::shared_ptr< ModalitiesGallery > Create()
Create gallery of references.
Definition ModalitiesGallery.h:315
static std::vector< Candidate > Consolidate(const std::shared_ptr< ModalitiesCandidates > &identifiedModalityCandidates, size_t maxCandidates, const ModalitiesMatcher &matcher)
Merges previously identified modality candidates into list of overall best candidates.
Definition ModalitiesGallery.h:619
static std::shared_ptr< ModalitiesGallery > Create(const ModalitiesGalleryConfig &config)
Create gallery of references.
Definition ModalitiesGallery.h:340
std::shared_ptr< ModalitiesCandidates > IdentifyModalities(const std::shared_ptr< ModalitiesTemplate > &probe, size_t maxCandidates) const
Search for given probe.
Definition ModalitiesGallery.h:496
It is general matcher for ModalitiesTemplate - Applicant template in serialized form used for biome...
Definition ModalitiesMatcher.h:22
ModalitiesVerifyMatcher configuration.
Definition ModalitiesVerifyMatcher.h:33
ModalitiesVerifyMatcher is template matcher that uses Innovatrics proprietary verification algorithm.
Definition ModalitiesVerifyMatcher.h:27
Contains scores of multiple modalities.
Definition SimilarityScore.h:75
Null argument is not allowed.
Definition EnrollmentException.h:156
Provides interface for serialization of all classes.
Definition Writer.h:164