"""
Module contains a structure for a task estimation targets
"""
from typing import Set, Optional
from .enums import SDKFaceEstimations, SDKHumanEstimations
[docs]class BaseEstimationTargets:
"""
Base class for estimation targets
"""
__slots__ = ()
[docs] def isEmpty(self) -> bool:
"""
Check targets is empty or not.
Returns:
True if exists a targets to estimation otherwise False
"""
def checkTarget(targetName: str):
""" Check estimation target. """
target = getattr(self, targetName)
if isinstance(target, int):
return target
return target.estimate
return not any(filter(checkTarget, self.__slots__))
[docs]class SDKLivenessEstimationPolicy:
"""
Liveness estimations policy
Attributes:
estimate (int): whether to estimate liveness
scoreThreshold (Optional[float]): liveness estimation score threshold ([0...1])
qualityThreshold (Optional[float]): liveness estimation quality threshold ([0...1])
"""
__slots__ = ("estimate", "scoreThreshold", "qualityThreshold")
def __init__(self, estimate: int = 0, scoreThreshold: float = None, qualityThreshold: float = None):
if estimate and qualityThreshold is None:
raise RuntimeError("Liveness estimation is enabled, but quality threshold was not specified.")
self.estimate = estimate
self.scoreThreshold = scoreThreshold
self.qualityThreshold = qualityThreshold
def __repr__(self):
return "SDKLivenessEstimationPolicy({})".format({key: getattr(self, key) for key in self.__slots__})
[docs]class SDKFaceEstimationTargets(BaseEstimationTargets):
"""
Face estimations targets
Attributes:
estimateGaze (int): estimate or not gaze direction
estimateHeadPose (int): estimate or not head pose
estimateEyesAttributes (int): estimate or not eyes attributes
estimateAGS (int): estimate or not ags
estimateQuality (int): estimate or not head pose
estimateMouthAttributes (int): estimate or not mouth state
estimateEmotions (int): estimate or not emotions
estimateBasicAttributes (int): estimate or not basic attributes
estimateFaceDescriptor (int): estimate or not face descriptor
0 - not estimate face descriptor
1 - estimate default version descriptor
other values - descriptor version
estimateMask (int): estimate or not mask
estimateGlasses (int): estimate or not glasses
estimateLiveness (SDKLivenessEstimationPolicy): liveness estimation policy
"""
__slots__ = (
"estimateGaze",
"estimateHeadPose",
"estimateEyesAttributes",
"estimateAGS",
"estimateEmotions",
"estimateFaceDescriptor",
"estimateMouthAttributes",
"estimateQuality",
"estimateBasicAttributes",
"estimateMask",
"estimateGlasses",
"estimateLiveness",
)
def __init__(
self,
estimateGaze: int = 0,
estimateHeadPose: int = 0,
estimateEyesAttributes: int = 0,
estimateAGS: int = 0,
estimateQuality: int = 0,
estimateMouthAttributes: int = 0,
estimateEmotions: int = 0,
estimateFaceDescriptor: int = 0,
estimateBasicAttributes: int = 0,
estimateMask: int = 0,
estimateGlasses: int = 0,
estimateLiveness: SDKLivenessEstimationPolicy = SDKLivenessEstimationPolicy(),
):
self.estimateBasicAttributes = estimateBasicAttributes
self.estimateEmotions = estimateEmotions
self.estimateFaceDescriptor = estimateFaceDescriptor
self.estimateMouthAttributes = estimateMouthAttributes
self.estimateQuality = estimateQuality
self.estimateGaze = estimateGaze
self.estimateHeadPose = estimateHeadPose
self.estimateEyesAttributes = estimateEyesAttributes
self.estimateAGS = estimateAGS
self.estimateMask = estimateMask
self.estimateGlasses = estimateGlasses
self.estimateLiveness = estimateLiveness
[docs] def getTargetsForFaceDetector(self) -> Set[SDKFaceEstimations]:
"""
Get targets for detector.
Returns:
set of estimations that detector must do
"""
allEstimations = {
SDKFaceEstimations.gaze: self.estimateGaze,
SDKFaceEstimations.headPose: self.estimateHeadPose,
SDKFaceEstimations.eyes: self.estimateEyesAttributes,
SDKFaceEstimations.ags: self.estimateAGS,
SDKFaceEstimations.liveness: self.estimateLiveness.estimate,
}
return set((estimation for estimation, value in allEstimations.items() if value))
[docs] def getTargetForWarpEstimator(self) -> Set[SDKFaceEstimations]:
"""
Get targets for detector.
Returns:
set of estimations that warp estimator must do
"""
allEstimations = {
SDKFaceEstimations.mouthAttributes: self.estimateMouthAttributes,
SDKFaceEstimations.quality: self.estimateQuality,
SDKFaceEstimations.emotions: self.estimateEmotions,
SDKFaceEstimations.mask: self.estimateMask,
SDKFaceEstimations.glasses: self.estimateGlasses,
}
return set((estimation for estimation, value in allEstimations.items() if value))
[docs]class SDKHumanEstimationTargets(BaseEstimationTargets):
"""
Human body estimations targets
Attributes:
estimateHumanDescriptor (int): estimate or not face descriptor
0 - not estimate face descriptor
1 - estimate default version descriptor
other values - descriptor version
"""
__slots__ = ("estimateHumanDescriptor",)
def __init__(self, estimateHumanDescriptor: int = 0):
self.estimateHumanDescriptor = estimateHumanDescriptor
[docs]class SDKEstimationTargets:
"""
SDK estimation target structure.
Attributes:
estimateFace (int): estimate or not face detection/face attributes
estimateHuman (int): estimate or not human detection/human attributes
faceEstimationTargets (SDKFaceEstimationTargets): face estimation targets
humanEstimationTargets (SDKHumanEstimationTargets): human estimation targets
Notes:
landmarks68 estimated always for face detection (for more precision warping).
"""
__slots__ = ("estimateFace", "estimateHuman", "faceEstimationTargets", "humanEstimationTargets")
def __init__(
self,
estimateFace: int = 1,
estimateHuman: int = 1,
faceEstimationTargets: Optional[SDKFaceEstimationTargets] = None,
humanEstimationTargets: Optional[SDKHumanEstimationTargets] = None,
):
self.estimateHuman = estimateHuman
self.estimateFace = estimateFace
self.humanEstimationTargets = (
SDKHumanEstimationTargets() if humanEstimationTargets is None else humanEstimationTargets
)
self.faceEstimationTargets = (
SDKFaceEstimationTargets() if faceEstimationTargets is None else faceEstimationTargets
)