Face Engine SDK  5.5.0
A face detection, recognition and tracking engine.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
IAttributeEstimator.h
1 #pragma once
2 
3 #include <fsdk/IObject.h>
4 #include <fsdk/FSDKError.h>
5 #include <fsdk/Optional.h>
6 #include <fsdk/Types.h>
7 
8 #include <algorithm>
9 
10 namespace fsdk {
11 
12 #ifndef DOXYGEN_SHOULD_SKIP_THIS
13  DECLARE_SMARTPTR(IAttributeEstimator);
14 
19  struct EthnicityEstimation {
20  float africanAmerican;
21  float indian;
22  float asian;
23  float caucasian;
24 
25  enum Ethnicities {
26  AfricanAmerican = 0,
27  Indian,
28  Asian,
29  Caucasian,
30  Count
31  };
32 
36  inline Ethnicities getPredominantEthnicity() const;
37 
42  inline float getEthnicityScore(Ethnicities ethnicity) const;
43  };
44 
55  struct IAttributeEstimator : IRefCounted {
56 
61  enum EstimationRequest {
62  estimateAge = 1 << 0,
63  estimateGender = 1 << 1,
64  estimateEthnicity = 1 << 2,
65  estimateAll = 0xffff
66  };
67 
71  struct EstimationResult {
73  Optional<float> age;
75  Optional<float> gender;
77  Optional<float> genderScore;
79  Optional<EthnicityEstimation> ethnicity;
80  };
81 
89  virtual Result<FSDKError> estimate(
90  const Image& warp,
91  const EstimationRequest request,
92  EstimationResult& out) const noexcept = 0;
93 
104  virtual ResultValue<FSDKError, EstimationResult> estimate(
105  Span<const Image> warps,
106  const EstimationRequest request,
107  Span<EstimationResult> results) const noexcept = 0;
108 
117  virtual Result<FSDKError>
118  validate(
119  Span<const Image> warps,
120  const EstimationRequest request,
121  Span<Result<FSDKError>> errors) const noexcept = 0;
122  };
123 
127  using EstimationRequest = IAttributeEstimator::EstimationRequest;
128  using AttributeEstimationResult = IAttributeEstimator::EstimationResult;
129 
130  /*
131  Implementation details.
132  */
133  EthnicityEstimation::Ethnicities
134  EthnicityEstimation::getPredominantEthnicity() const {
135  const float* arr = &this->africanAmerican;
136  return static_cast<EthnicityEstimation::Ethnicities>(
137  std::distance(arr, std::max_element(arr, arr+EthnicityEstimation::Count))
138  );
139  }
140 
141  /*
142  Implementation details.
143  */
144  float
145  EthnicityEstimation::getEthnicityScore(
146  EthnicityEstimation::Ethnicities ethnicity
147  ) const {
148  return *(&this->africanAmerican + static_cast<uint32_t>(ethnicity));
149  }
150 
151  /*
152  Implementation details.
153  */
154  inline IAttributeEstimator::EstimationRequest
155  operator|(
156  IAttributeEstimator::EstimationRequest first,
157  IAttributeEstimator::EstimationRequest second
158  ) {
159  return static_cast<IAttributeEstimator::EstimationRequest>(
160  static_cast<int>(first) | static_cast<int>(second)
161  );
162  }
163 
164 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
165 
166 } // namespace sdk
#define DECLARE_SMARTPTR(X)
Smart ptr declaration helper macro.
Definition: Def.h:59
Common data types and structures.
Object system types and interfaces.
Common SDK error codes.