Enrollment 28.2.0
Loading...
Searching...
No Matches
Applicant.h
Go to the documentation of this file.
1
9
10#pragma once
11
24#include <algorithm>
25#include <atomic>
26#include <memory>
27#include <mutex>
28#include <vector>
29
30namespace inno
31{
32 class Logger;
33 class Print;
34
38 */
39 class ApplicantPrintValidation
40 {
41 public:
50 virtual bool Validate(const std::shared_ptr<ExtractedPrint>& probe,
51 const std::vector<std::shared_ptr<ExtractedPrint>>& gallery) = 0;
52
53 ApplicantPrintValidation() = default;
54 ApplicantPrintValidation(ApplicantPrintValidation&&) = delete;
55 ApplicantPrintValidation(const ApplicantPrintValidation&) = delete;
56 ApplicantPrintValidation& operator=(ApplicantPrintValidation&&) = delete;
57 ApplicantPrintValidation& operator=(const ApplicantPrintValidation&) = delete;
58 virtual ~ApplicantPrintValidation() = default;
59 };
60
68 */
69 class FlatteningValidation : public ApplicantPrintValidation
70 {
71 public:
75 */
76 std::shared_ptr<ExtractedPrint> GetInvalidatingPrint() const
77 {
78 const std::scoped_lock lock(invalidatingPrintMux);
79 return invalidatingPrint;
80 }
81
101 */
102 bool Validate(const std::shared_ptr<ExtractedPrint>& probe,
103 const std::vector<std::shared_ptr<ExtractedPrint>>& gallery) final
104 {
105 if (probe == nullptr)
106 {
107 throw NullArgumentException("Probe cannot be null");
108 }
109
110 if (probe->print == nullptr)
111 {
112 throw NullArgumentException("Probe print cannot be null");
113 }
114
115 return std::all_of(gallery.cbegin(),
116 gallery.cend(),
117 [this, probe](auto& g)
118 {
119 if (probe->print->position == g->print->position)
120 {
121 if (probe->SimilarWith(*g, matcher) < samePositionTh)
122 {
123 const std::scoped_lock lock(invalidatingPrintMux);
124 invalidatingPrint = g;
125 return false;
126 }
127 }
128 else
129 {
130 if (probe->SimilarWith(*g, matcher) > differentPositionTh)
131 {
132 const std::scoped_lock lock(invalidatingPrintMux);
133 invalidatingPrint = g;
134 return false;
135 }
136 }
137 return true;
138 });
139 }
140
149 */
150 FlatteningValidation(SimilarityThreshold samePositionThreshold,
151 SimilarityThreshold differentPositionThreshold,
152 ICSMatcher& printMatcher)
153 : samePositionTh(samePositionThreshold)
154 , differentPositionTh(differentPositionThreshold)
155 , matcher(printMatcher)
156 {
157 }
158
177 FlatteningValidation() = default;
180 FlatteningValidation& operator=(FlatteningValidation&&) = delete;
181 FlatteningValidation& operator=(const FlatteningValidation&) = delete;
182 virtual ~FlatteningValidation() = default;
183
184 private:
185 static constexpr SimilarityThreshold DefaultSamePositionThreshold = 40;
186 SimilarityThreshold samePositionTh = DefaultSamePositionThreshold;
187 static constexpr SimilarityThreshold DefaultDifferentPositionThreshold = 15;
188 SimilarityThreshold differentPositionTh = DefaultDifferentPositionThreshold;
189 ICSVerifyMatcher::Config defaultMatcherConfig;
190 ICSVerifyMatcher defaultMatcher;
191 // We do not create ICSMatcher as smart pointer in API, up to now we do not change the API due to this
192 // observation.
193 // NOLINTNEXTLINE(cppcoreguidelines-avoid-const-or-ref-data-members)
194 ICSMatcher& matcher = defaultMatcher;
195 mutable std::mutex invalidatingPrintMux;
196 std::shared_ptr<ExtractedPrint> invalidatingPrint;
197 };
198
202 */
203 class ApplicantFaceValidation
204 {
205 public:
214 virtual bool Validate(const std::shared_ptr<ExtractedFace>& probe,
215 const std::vector<std::shared_ptr<ExtractedFace>>& gallery) = 0;
216
217 ApplicantFaceValidation() = default;
218 ApplicantFaceValidation(ApplicantFaceValidation&&) = delete;
219 ApplicantFaceValidation(const ApplicantFaceValidation&) = delete;
220 ApplicantFaceValidation& operator=(ApplicantFaceValidation&&) = delete;
221 ApplicantFaceValidation& operator=(const ApplicantFaceValidation&) = delete;
222 virtual ~ApplicantFaceValidation() = default;
223 };
224
254 */
255 class Applicant final : public Serializable
256 {
257 public:
261 */
262 std::vector<std::shared_ptr<ExtractedPrint>> GetEnrolledPrints() const
263 {
264 const std::scoped_lock lock(printMutex);
265 return ps;
266 }
267
271 */
272 std::vector<std::shared_ptr<ExtractedFace>> GetEnrolledFaces() const
273 {
274 const std::scoped_lock lock(faceMutex);
275 return fs;
276 }
280 */
281 std::vector<std::shared_ptr<ExtractedIris>> GetEnrolledIrises() const
282 {
283 const std::scoped_lock lock(irisMutex);
284 return ir;
285 }
286
294 */
295 std::shared_ptr<ModalitiesTemplate> ToTemplate() const
296 {
297 const std::scoped_lock lock(printMutex, faceMutex, irisMutex);
298 auto prints = ExtractedPrint::ToTemplates(ps);
299 auto faces = ExtractedFace::ToTemplates(fs);
300 auto irises = ExtractedIris::ToTemplates(ir);
301 return ModalitiesTemplate::Create(prints, faces, irises);
302 }
303
309 */
310 std::shared_ptr<ModalitiesICSTemplate> ToICSTemplate() const
311 {
313 return ToICSTemplate(factory);
314 }
315
321 */
322 std::shared_ptr<ModalitiesICSTemplate> ToICSTemplate(ModalitiesICSTemplateFactory& factory) const
323 {
324 const std::scoped_lock lock(printMutex, faceMutex, irisMutex);
325 auto prints = ExtractedPrint::ToICSTemplates(ps);
326 auto faces = ExtractedFace::ToTemplates(fs);
327 auto irises = ExtractedIris::ToTemplates(ir);
328 return factory.CreateModalitiesICSTemplate(prints, faces, irises);
329 }
330
340 */
341 [[nodiscard]] ModalityScore SimilarWith(const Applicant& gallery, ApplicantMatcher& matcher) const
342 {
343 return matcher.Match(*this, gallery);
344 }
345
354 */
355 std::shared_ptr<ExtractedPrint> AddUniquePrint(std::shared_ptr<ExtractedPrint> print)
356 {
357 FlatteningValidation defaultFlatteningValidation;
358 auto isValid = AddValidPrint(std::move(print), defaultFlatteningValidation);
359
360 if (isValid)
361 {
362 return nullptr;
363 }
364 return defaultFlatteningValidation.GetInvalidatingPrint();
365 }
366
376 */
377 bool AddValidPrint(std::shared_ptr<ExtractedPrint> print, ApplicantPrintValidation& validation)
378 {
379 if (print == nullptr)
380 {
381 throw NullArgumentException("ExtractedPrint cannot be null");
382 }
383
384 const std::scoped_lock lock(printMutex);
385 auto isValid = validation.Validate(print, ps);
386
387 if (isValid)
388 {
389 DoAddPrint(std::move(print));
390 }
391
392 return isValid;
393 }
394
400 */
401 void AddPrint(std::shared_ptr<ExtractedPrint> print)
402 {
403 if (print == nullptr)
404 {
405 throw NullArgumentException("Print cannot be null");
406 }
407
408 DoAddPrint(std::move(print));
409 }
410
416 */
417 void AddSlap(std::shared_ptr<SlapCapture> slap)
418 {
419 if (slap == nullptr)
420 {
421 throw NullArgumentException("SlapCapture cannot be null");
422 }
423 log.LogInfo("Adding %v", slap);
424 const std::scoped_lock lock(slapMutex);
425 ss.emplace_back(std::move(slap));
426 }
427
433 */
434 void AddThumbs(std::shared_ptr<ThumbsCapture> thumbs)
435 {
436 if (thumbs == nullptr)
437 {
438 throw NullArgumentException("ThumbsCapture cannot be null");
439 }
440 log.LogInfo("Adding %v", thumbs);
441 const std::scoped_lock lock(thumbsMutex);
442 ts.emplace_back(std::move(thumbs));
443 }
444
456 */
457 bool AddValidFace(std::shared_ptr<ExtractedFace> face, ApplicantFaceValidation& validation)
458 {
459 if (face == nullptr)
460 {
461 throw NullArgumentException("ExtractedFace cannot be null");
462 }
463
464 const std::scoped_lock lock(faceMutex);
465
466 auto isValid = validation.Validate(face, fs);
467
468 if (isValid)
469 {
470 DoAddFace(std::move(face));
471 }
472
473 return isValid;
474 }
475
480 */
481 void AddFace(std::shared_ptr<ExtractedFace> face)
482 {
483 if (face == nullptr)
484 {
485 throw NullArgumentException("Face cannot be null");
486 }
487
488 const std::scoped_lock lock(faceMutex);
489 DoAddFace(std::move(face));
490 }
491
496 */
497 void AddIris(std::shared_ptr<ExtractedIris> iris)
498 {
499 if (iris == nullptr)
500 {
501 throw NullArgumentException("Iris cannot be null");
502 }
503
504 log.LogInfo("Adding %v", iris);
505
506 const std::scoped_lock lock(irisMutex);
507 ir.emplace_back(std::move(iris));
508 }
509
513 */
514 void WriteTo(Writer& writer) const final
515 {
516 const std::scoped_lock lock(printMutex, faceMutex, irisMutex, slapMutex, thumbsMutex);
517
518 writer.WriteArray("ps", ps);
519 writer.WriteArray("fs", fs);
520 writer.WriteArray("ir", ir);
521 writer.WriteArray("ss", ss);
522 writer.WriteArray("ts", ts);
523 }
524
527 */
528 Applicant()
529 : log(GlobalLogger::Get())
530 {
531 }
532
533 Applicant(const Applicant&) = delete;
534 Applicant(Applicant&&) = delete;
535 Applicant& operator=(const Applicant&) = delete;
536 Applicant& operator=(Applicant&&) = delete;
537 ~Applicant() = default;
538
539 private:
541 mutable std::mutex printMutex;
542 mutable std::mutex faceMutex;
543 mutable std::mutex irisMutex;
544 mutable std::mutex slapMutex;
545 mutable std::mutex thumbsMutex;
546 std::vector<std::shared_ptr<ExtractedPrint>> ps;
547 std::vector<std::shared_ptr<ExtractedFace>> fs;
548 std::vector<std::shared_ptr<ExtractedIris>> ir;
549 std::vector<std::shared_ptr<SlapCapture>> ss;
550 std::vector<std::shared_ptr<ThumbsCapture>> ts;
551
552 void DoAddPrint(std::shared_ptr<ExtractedPrint> tmpl)
553 {
554 log.LogInfo("Adding %v", tmpl->print);
555 ps.emplace_back(std::move(tmpl));
556 }
557
558 void DoAddFace(std::shared_ptr<ExtractedFace> tmpl)
559 {
560 log.LogInfo("Adding %v", tmpl->face);
561 fs.emplace_back(std::move(tmpl));
562 }
563 };
564} // namespace inno
unsigned int SimilarityThreshold
It is similarity threshold is threshold used to compare against SimilarityScore.
Definition SimilarityThreshold.h:17
Strategy used in Applicant to accept or reject ExtractedFace.
Definition Applicant.h:203
virtual bool Validate(const std::shared_ptr< ExtractedFace > &probe, const std::vector< std::shared_ptr< ExtractedFace > > &gallery)=0
Check if Face is valid.
It is general matcher for Applicant.
Definition ApplicantMatcher.h:21
virtual ModalityScore Match(const Applicant &probe, const Applicant &gallery) const =0
Calculates similarity score of probe and gallery applicant ICS template for each modality.
Strategy used in Applicant to accept or reject ExtractedPrint.
Definition Applicant.h:39
virtual bool Validate(const std::shared_ptr< ExtractedPrint > &probe, const std::vector< std::shared_ptr< ExtractedPrint > > &gallery)=0
Check if print is valid.
Applicant represent enrolled person.
Definition Applicant.h:255
void AddThumbs(std::shared_ptr< ThumbsCapture > thumbs)
It adds ThumbsCapture to applicant.
Definition Applicant.h:433
ModalityScore SimilarWith(const Applicant &gallery, ApplicantMatcher &matcher) const
Calculates SimilarityScore for each modality.
Definition Applicant.h:340
void WriteTo(Writer &writer) const final
It serializes applicant via provided Writer.
Definition Applicant.h:513
std::vector< std::shared_ptr< ExtractedFace > > GetEnrolledFaces() const
Function provides enrolled Faces.
Definition Applicant.h:271
std::shared_ptr< ExtractedPrint > AddUniquePrint(std::shared_ptr< ExtractedPrint > print)
Validates print according to default FlatteningValidation and adds Print when is valid.
Definition Applicant.h:354
bool AddValidFace(std::shared_ptr< ExtractedFace > face, ApplicantFaceValidation &validation)
Validates Face according to given ApplicantFaceValidation and adds Face when is valid.
Definition Applicant.h:456
bool AddValidPrint(std::shared_ptr< ExtractedPrint > print, ApplicantPrintValidation &validation)
Validates print according to given ApplicantPrintValidation and adds Print when is valid See Custom P...
Definition Applicant.h:376
void AddPrint(std::shared_ptr< ExtractedPrint > print)
Adds Print to applicant.
Definition Applicant.h:400
Applicant()
Constructor uses GLobalLogger.
Definition Applicant.h:527
std::shared_ptr< ModalitiesICSTemplate > ToICSTemplate() const
Converts Applicant to ModalitiesICSTemplate.
Definition Applicant.h:309
void AddIris(std::shared_ptr< ExtractedIris > iris)
It adds Iris to applicant.
Definition Applicant.h:496
void AddFace(std::shared_ptr< ExtractedFace > face)
It adds Face to applicant.
Definition Applicant.h:480
std::vector< std::shared_ptr< ExtractedIris > > GetEnrolledIrises() const
Function provides enrolled Irises.
Definition Applicant.h:280
std::vector< std::shared_ptr< ExtractedPrint > > GetEnrolledPrints() const
Function provides enrolled Prints.
Definition Applicant.h:261
void AddSlap(std::shared_ptr< SlapCapture > slap)
It adds SlapCapture to applicant.
Definition Applicant.h:416
std::shared_ptr< ModalitiesTemplate > ToTemplate() const
Converts Applicant to ModalitiesTemplate.
Definition Applicant.h:294
std::shared_ptr< ModalitiesICSTemplate > ToICSTemplate(ModalitiesICSTemplateFactory &factory) const
Converts Applicant to ModalitiesICSTemplate.
Definition Applicant.h:321
static std::vector< std::shared_ptr< FaceTemplate > > ToTemplates(const std::vector< std::shared_ptr< ExtractedFace > > &faces)
Converts a vector of ExtractedFace objects into a vector of FaceTemplate objects.
Definition Face.h:305
static std::vector< std::shared_ptr< IrisTemplate > > ToTemplates(const std::vector< std::shared_ptr< ExtractedIris > > &irises)
Converts a vector of ExtractedIris objects into a vector of IrisTemplate objects.
Definition Iris.h:439
static std::vector< std::shared_ptr< ICSTemplate > > ToICSTemplates(const std::vector< std::shared_ptr< ExtractedPrint > > &prints)
Converts a vector of ExtractedPrint objects into a vector of ICSTemplate objects.
Definition ExtractedPrint.h:50
static std::vector< std::shared_ptr< PrintTemplate > > ToTemplates(const std::vector< std::shared_ptr< ExtractedPrint > > &prints)
Converts a vector of ExtractedPrint objects into a vector of PrintTemplate objects.
Definition ExtractedPrint.h:67
Validates prints against gallery.
Definition Applicant.h:69
FlatteningValidation(SimilarityThreshold samePositionThreshold, SimilarityThreshold differentPositionThreshold, ICSMatcher &printMatcher)
Construct a new Flattening Validation object.
Definition Applicant.h:149
bool Validate(const std::shared_ptr< ExtractedPrint > &probe, const std::vector< std::shared_ptr< ExtractedPrint > > &gallery) final
Check if print is valid.
Definition Applicant.h:101
FlatteningValidation()=default
Construct a new Flattening Validation default object.
std::shared_ptr< ExtractedPrint > GetInvalidatingPrint() const
Function provides ExtractedPrint that causes invalidity of probe.
Definition Applicant.h:75
It provides functions with format specifier to compose and log message via provided Logger.
Definition FormattingLogger.h:601
void LogInfo(const char *format, Args &&... args) const
Formats and logs message as info message.
Definition FormattingLogger.h:611
Holds instance of Logger.
Definition Logger.h:275
It is general matcher for ICS templates.
Definition ICSMatcher.h:22
ICSVerifyMatcher configuration.
Definition ICSVerifyMatcher.h:288
ICSVerifyMatcher is template matcher that uses Innovatrics proprietary verification algorithm.
Definition ICSVerifyMatcher.h:32
Interface for library logging.
Definition Logger.h:45
ModalitiesICSTemplateDefaultFactory creates biometric representations from all modality templates.
Definition ModalitiesICSTemplateDefaultFactory.h:28
ModalitiesICSTemplateFactory creates biometric representations from all modality templates.
Definition ModalitiesICSTemplateFactory.h:26
virtual std::shared_ptr< ModalitiesICSTemplate > CreateModalitiesICSTemplate(const std::vector< std::shared_ptr< ICSTemplate > > &printTemplates, const std::vector< std::shared_ptr< FaceTemplate > > &faceTemplates, const std::vector< std::shared_ptr< IrisTemplate > > &irisTemplates) const =0
It creates ModalitiesICSTemplate.
static std::shared_ptr< ModalitiesTemplate > Create(const std::vector< uint8_t > &data)
Create ModalitiesTemplate object from serialized data.
Definition ModalitiesTemplate.h:120
Contains scores of multiple modalities.
Definition SimilarityScore.h:75
Null argument is not allowed.
Definition EnrollmentException.h:156
It holds all functions and data related to print manipulation.
Definition Print.h:47
Provides interface for serialization of all classes.
Definition Writer.h:164