#pragma once #pragma once #include #include #include #include namespace fsdk { #ifndef DOXYGEN_SHOULD_SKIP_THIS DECLARE_SMARTPTR(IMedicalMaskEstimator); #endif /** * @brief MedicalMask estimator output enum. * This enum contains all possible estimation results. * */ enum class MedicalMask { Mask = 0, //!< medical mask is on the face NoMask, //!< no medical mask on the face OccludedFace //!< face is occluded by something }; /** * @brief MedicalMask estimator output enum. * This enum contains all possible extended estimation results. * */ enum class MedicalMaskExtended { Mask = 0, //!< medical mask is on the face NoMask, //!< no medical mask on the face MaskNotInPlace, //!< mask is not on the right place OccludedFace //!< face is occluded by something }; /** * @brief MedicalMask estimator output enum. * This enum contains all type of DetailedMaskType results. * */ enum class DetailedMaskType { CorrectMask = 0, //!< correct mask on the face (mouth and nose are covered correctly) MouthCoveredWithMask, //!< mask covers only a mouth ClearFace, //!< clear face - no mask on the face ClearFaceWithMaskUnderChin, //!< clear face with a mask around of a chin, mask does not cover anything in the face region (from mouth to eyes) PartlyCoveredFace, //!< face is covered with not a medical mask or a full mask FullMask, //!< face is covered with a full mask (such as balaclava, sky mask, etc.) Count }; /** * @brief MedicalMask estimator output structure. * This structure contains the result of estimation (@see MedicalMask enum) * and probability scores for each possible estimation result. * Probability scores are defined in [0,1] range. * */ struct MedicalMaskEstimation { MedicalMask result; //!< estimation result (@see MedicalMask enum) DetailedMaskType maskType; //!< detailed type (@see DetailedMaskType enum) // scores float maskScore; //!< medical mask is on the face score float noMaskScore; //!< no medical mask on the face score float occludedFaceScore; //!< face is occluded by something score float scores[static_cast(DetailedMaskType::Count)]; //!< detailed estimation scores /** * @brief Returns score of required detailed mask type. * @param [in] type detailed mask type. * @see DetailedMaskType for more info. * */ inline float getScore(DetailedMaskType type) const; }; /** * @brief MedicalMask estimator output structure. * This structure contains the result of estimation (@see MedicalMaskExtended enum) * and probability scores for each possible estimation result. * Probability scores are defined in [0,1] range. * */ struct MedicalMaskEstimationExtended { MedicalMaskExtended result; //!< estimation result (@see MedicalMaskExtended enum) // scores float maskScore; //!< medical mask is on the face score float noMaskScore; //!< no medical mask on the face score float maskNotInPlace; //!< mask is not on the right place float occludedFaceScore; //!< face is occluded by something score }; /** * @brief MedicalMask estimator interface. * @note Estimator predicts mask. * */ struct IMedicalMaskEstimator : IRefCounted { /** * @brief Estimate MedicalMask probabilities. * @param [in] warp image with warped face. * @param [out] estimation estimation results. * @return Result with error code. * @see MedicalMaskEstimation, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * */ virtual Result estimate( const Image& warp, MedicalMaskEstimation& estimation) const noexcept = 0; /** * @brief Estimate MedicalMask probabilities. * @param [in] warp image with warped face. * @param [out] estimation estimation results. * @return Result with error code. * @see MedicalMaskEstimationExtended, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * */ virtual Result estimate( const Image& warp, MedicalMaskEstimationExtended& estimation) const noexcept = 0; /** * @brief Estimate MedicalMask probabilities. * @param [in] image source image. * @param [in] detection detection coordinates in image space. * @param [out] estimation estimation results. * @return Result with error code. * @see MedicalMaskEstimation, Detection, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * */ virtual Result estimate( const Image& image, const Detection& detection, MedicalMaskEstimation& estimation) const noexcept = 0; /** * @brief Estimate MedicalMask probabilities. * @param [in] image source image. * @param [in] detection detection coordinates in image space. * @param [out] estimation estimation results. * @return Result with error code. * @see MedicalMaskEstimationExtended, Detection, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * */ virtual Result estimate( const Image& image, const Detection& detection, MedicalMaskEstimationExtended& estimation) const noexcept = 0; /** * @brief Estimate Medical Mask probabilities. * @param [in] warps span of images with warped faces. * @param [out] estimations span of estimations. * @return Result with error code. * @see Span, MedicalMaskEstimation, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result estimate( Span warps, Span estimations) const noexcept = 0; /** * @brief Estimate Medical Mask probabilities. * @param [in] warps span of images with warped faces. * @param [out] estimations span of estimations. * @return Result with error code. * @see Span, MedicalMaskEstimationExtended, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result estimate( Span warps, Span estimations) const noexcept = 0; /** * @brief Estimate Medical Mask probabilities. * @param [in] images span of source images. * @param [in] detections span of detection coordinates in corresponding source images space. * @param [out] estimations span of estimations. * @return Result with error code. * @see Span, Detection, MedicalMaskEstimation, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result estimate( Span images, Span detections, Span estimations) const noexcept = 0; /** * @brief Estimate Medical Mask probabilities. * @param [in] images span of source images; * @param [in] detections span of detection coordinates in corresponding source images space. * @param [out] estimations span of estimations; * @return Result with error code. * @see Span, Detection, MedicalMaskEstimationExtended, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result estimate( Span images, Span detections, Span estimations) const noexcept = 0; /** * @brief Validate input of multiple frames in a single function call. * @param [in] warps span of images with warped faces. * @param [out] errors output span of errors for each image. * @return Result with error code. * @see Span, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result validate( Span warps, Span> errors) const noexcept = 0; /** * @brief Validate input of multiple frames in a single function call. * @param [in] images span of source images. * @param [in] detections span of detection coordinates in corresponding source images space. * @param [out] errors output span of errors for each image. * @return Result with error code. * @see Span, Detection, Image, Result and FSDKError for details. * @note images format must be R8G8B8, @see Format. * @note all spans should be based on user owned continuous collections. * @note all spans should be equal size. * */ virtual Result validate( Span images, Span detections, Span> errors) const noexcept = 0; }; /* Implementation details. */ float MedicalMaskEstimation::getScore(DetailedMaskType type) const { switch (type) { case DetailedMaskType::CorrectMask: case DetailedMaskType::MouthCoveredWithMask: case DetailedMaskType::ClearFace: case DetailedMaskType::ClearFaceWithMaskUnderChin: case DetailedMaskType::PartlyCoveredFace: case DetailedMaskType::FullMask: return scores[static_cast(type)]; default: return 0.f; } } } // namespace fsdk