You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

260 lines
9.8 KiB

#pragma once
#pragma once
#include <fsdk/IObject.h>
#include <fsdk/FSDKError.h>
#include <fsdk/Optional.h>
#include <fsdk/Types.h>
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<int>(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<FSDKError>
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<FSDKError>
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<FSDKError>
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<FSDKError>
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<FSDKError> estimate(
Span<const Image> warps,
Span<MedicalMaskEstimation> 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<FSDKError> estimate(
Span<const Image> warps,
Span<MedicalMaskEstimationExtended> 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<FSDKError> estimate(
Span<const Image> images,
Span<const Detection> detections,
Span<MedicalMaskEstimation> 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<FSDKError> estimate(
Span<const Image> images,
Span<const Detection> detections,
Span<MedicalMaskEstimationExtended> 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<FSDKError>
validate(
Span<const Image> warps,
Span<Result<FSDKError>> 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<FSDKError>
validate(
Span<const Image> images,
Span<const Detection> detections,
Span<Result<FSDKError>> 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<int>(type)];
default:
return 0.f;
}
}
} // namespace fsdk