Оценка качества изображения
Блок оценки качества изображения лица
Модификации процессинг-блока оценки качества
На данный момент существует следующие модификации:
"assessment"
- первый из реализованных режимов блока Quality Assessment, в рамках которого оцениваются следующие параметры.Параметры оцениваемые модификаций
"assessment"
Нажмите, чтобы отобразить список оцениваемых параметров
total_score
- численное значение, обозначает общую оценку качества изображения в баллах от 0 до 1.is_background_uniform
- логическое значение, указывает на однородность фона.background_uniformity_score
- численное значение, оценка однородности фона в баллах от 0 до 2.is_dynamic_range_acceptable
- логическое значение, показывает, что динамический диапазон интенсивности изображения в области лица превышает или не превышает значение 1,28.dynamic_range_score
- численное значение, оценка динамического диапазона интенсивности в баллах от 0 до 1.is_eyes_distance_acceptable
- логическое значение, обозначает допустимое/недопустимое расстояние между глазами.eyes_distance
- численное значение расстояния между глазами в пикселях.is_evenly_illuminated
- логическое значение, обозначает равномерность освещения на изображении.illumination_score
- численное значение, оценка равномерности освещения в баллах от 0 до 1.no_flare
- логическое значение, указывает на наличие или отсутствие вспышек на изображении.is_left_eye_opened
- логическое значение, обозначает положение левого глаза (открыт или закрыт).left_eye_openness_score
- численное значение, обозначает степень открытости глаза в баллах от 0 до 1.is_right_eye_opened
- логическое значение, обозначает положение правого глаза (открыт или закрыт).right_eye_openness_score
- численное значение, обозначает степень открытости глаза в баллах от 0 до 1.is_neutral_emotion
- логическое значение, обозначает наличие или отсутствие нейтрального выражения лица.neutral_emotion_score
- численное значение, оценка степени нейтральных эмоций в баллах от 0 до 1.is_not_noisy
- логическое значение, обозначает наличие или отсутствие шумов на изображении.noise_score
- численное значение, оценка зашумленности изображения в баллах от 0 до 1.is_sharp
- логическое значение, обозначает резкость изображения.sharpness_score
- численное значение, обозначает оценку резкости в баллах от 0 до 1.is_margins_acceptable
- логическое значение, обозначает допустимые/недопустимые отступы.margin_inner_deviation
- численное значение внутреннего отклонения в пикселях.margin_outer_deviation
- численное значение внешнего отклонения в пикселях.is_rotation_acceptable
- логическое значение, обозначает допустимый/недопустимый поворот головы.max_rotation_deviation
- численное значение, максимальный градус отклонения для трех (yaw, pitch, roll) углов поворота головы.not_masked
- логическое значение, указывает на наличие или отсутствие маски на лице.not_masked_score
- численное значение, обозначает степень уверенности в отсутствии маски на лице от 0 до 1.has_watermark
- логическое значение, указывает на наличие или отсутствие водяного знака на изображении.watermark_score
- численное значение, обозначает степень уверенности в наличии водяного знака на изображении от 0 до 1.
"estimation"
- в данном режиме оценивается качество изображения в целом, а результат ("total_score"
) представляет собой реальное число от 0 (худшее качество) до 1 (идеальное качество).
Спецификация процессинг-блока оценки качества
Входной контейнер Context должен содержать бинарное изображение и массив объектов, полученных после работы процессинг-блоков детекции лица и фиттера:
Нажмите, чтобы развернуть спецификацию входного контейнера Context
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "face",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2]
"keypoints": {
"left_eye_brow_left": {"proj" : [x, y]},
"left_eye_brow_up": {"proj" : [x, y]},
"left_eye_brow_right": {"proj" : [x, y]},
"right_eye_brow_left": {"proj" : [x, y]},
"right_eye_brow_up": {"proj" : [x, y]},
"right_eye_brow_right": {"proj" : [x, y]},
"left_eye_left": {"proj" : [x, y]},
"left_eye": {"proj" : [x, y]},
"left_eye_right": {"proj" : [x, y]},
"right_eye_left": {"proj" : [x, y]},
"right_eye": {"proj" : [x, y]},
"right_eye_right": {"proj" : [x, y]},
"left_ear_bottom": {"proj" : [x, y]},
"nose_left": {"proj" : [x, y]},
"nose": {"proj" : [x, y]},
"nose_right": {"proj" : [x, y]},
"right_ear_bottom": {"proj" : [x, y]},
"mouth_left": {"proj" : [x, y]},
"mouth": {"proj" : [x, y]},
"mouth_right": {"proj" : [x, y]},
"chin": {"proj" : [x, y]},
"points": ["proj": [x, y]]
}
}]
}После вызова процессинг-блока оценки качества, каждому объекту из массива
"objects"
будут добавлены атрибуты соответсвующие этому блоку.
Спецификация выходного контейнера Context:
- assessment
- estimation
{
"quality": {
"total_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_sharp": {"type": "boolean"},
"sharpness_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_evenly_illuminated": {"type": "boolean"},
"illumination_score": {"type": "double", "minimum": 0, "maximum": 1},
"no_flare": {"type": "boolean"},
"is_left_eye_opened": {"type": "boolean"},
"left_eye_openness_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_right_eye_opened": {"type": "boolean"},
"right_eye_openness_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_rotation_acceptable": {"type": "boolean"},
"max_rotation_deviation": {"type": "long"},
"not_masked": {"type": "boolean"},
"not_masked_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_neutral_emotion": {"type": "boolean"},
"neutral_emotion_score": {"type": "double", "minimum": 0, "maximum": 1},
"is_eyes_distance_acceptable": {"type": "boolean"},
"eyes_distance": {"type": "long", "minimum": 0}
"is_margins_acceptable": {"type": "boolean"},
"margin_outer_deviation": {"type": "long", "minimum": 0}
"margin_inner_deviation": {"type": "long", "minimum": 0}
"is_not_noisy": {"type": "boolean"},
"noise_score": {"type": "double", "minimum": 0, "maximum": 1},
"watermark_score": {"type": "long", "minimum": 0},
"has_watermark": {"type": "boolean"},
"dynamic_range_score": {"type": "double", "minimum": 0},
"is_dynamic_range_acceptable": {"type": "boolean"},
"is_background_uniform": {"type": "boolean"},
"background_uniformity_score": {"type": "double", "minimum": 0, "maximum": 1}
}
}
[{
"quality": {
"total_score": {"type": "double", "minimum": 0, "maximum": 1}
}
}]
Пример работы процессинг-блока
Создайте конфигурационный контейнер Context и укажите значения
"unit_type"
,"modification"
,"version"
, интересующего вас блока Пример создания процессинг-блока вы можете найти на странице Работа с процессинг-блоком.Передайте контейнер-контекст полученный после работы процессинг-блоков детекции лица и фиттера.
Вызовете процессинг-блок оценки.
Получите результат работы процессинг-блока.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
auto configCtx = service->createContext();
configCtx["unit_type"] = "QUALITY_ASSESSMENT_ESTIMATOR";
pbio::ProcessingBlock blockQuality = service->createProcessingBlock(configCtx);
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector(ioData);
faceFitter(ioData);
blockQuality(ioData);
double total_score = ioData["objects"][0]["quality"]["total_score"].getDouble();
configCtx = {"unit_type": "QUALITY_ASSESSMENT_ESTIMATOR"}
blockQuality = service.create_processing_block(configCtx)
#------------------
# создание процессинг-блока и контейнера Context с бинарным изображением
#------------------
faceDetector(ioData)
faceFitter(ioData)
blockQuality(ioData)
total_score = ioData["objects"][0]["quality"]["total_score"].get_value()
ProcessingBlock blockQuality = service.createProcessingBlock({"unit_type": "QUALITY_ASSESSMENT_ESTIMATOR"});
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockQuality.process(ioData);
double total_score = ioData["objects"][0]["quality"]["total_score"].get_value();
Dictionary<object, object> configCtx = new();
configCtx["unit_type"] = "QUALITY_ASSESSMENT_ESTIMATOR";
ProcessingBlock blockQuality = service.CreateProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.Invoke(ioData);
faceFitter.Invoke(ioData);
blockQuality.Invoke(ioData);
double total_score = ioData["objects"][0]["quality"]["total_score"].GetDouble();
Context configCtx = service.createContext();
configCtx.get("unit_type").setString("QUALITY_ASSESSMENT_ESTIMATOR");
ProcessingBlock blockQuality = service.createProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockQuality.process(ioData);
double total_score = ioData.get("objects").get(0).get("quality").get("total_score").getDouble();
val configCtx = service.createContext()
configCtx["unit_type"].string = "QUALITY_ASSESSMENT_ESTIMATOR"
val blockQuality = service.createProcessingBlock(configCtx)
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData)
faceFitter.process(ioData)
blockQuality.process(ioData)
val total_score = ioData["objects"][0]["quality"]["total_score"].double
Для точной оценки требуется только одно лицо человека в кадре, смотрящее в камеру, иначе общий балл будет низким, поскольку алгоритм учитывает относительный размер, положение и направленность головы.
Если захвачено несколько лиц, каждое из них будет обработано независимо.