Оценка качества изображения
Блок оценки качества изображения лица
Под оценкой качества изображения лица в Face SDK понимается проверка соответствия изображения стандартам качества, описанным в таких документах, таких как ISO/IEC 19794-5:2011 или ICAO Guidelines for Passport Photographs.
В рамках этой процедуры реализован широкий набор проверок качества. Однако для современных алгоритмов распознавания не все из них одинаково значимы для обеспечения точности распознавания лиц.
Поэтому, если вам требуется контроль качества лиц исключительно для минимизации ошибок распознавания или при использовании Liveness Detection, см. Контроль качества изображений.
Время работы модификаций блока оценки качества
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** | Процент отбрасываемых по total_score худших сэмплов | FNMR | FPR |
---|---|---|---|---|---|---|---|
assessment | 1 | 3.16 | 59 | 57 | 1 | 0.0097 | 1.98E-07 |
5 | 0.0087 | 2.00E-07 | |||||
10 | 0.0081 | 2.11E-07 | |||||
2 | 3.24 | 62 | 61 | 1 | 0.0097 | 1.98E-07 | |
5 | 0.0087 | 2.00E-07 | |||||
10 | 0.0081 | 2.11E-07 |
** - GPU (NVIDIA GTX 10xx серия)
Создание и конфигурирование блока
Модификация "assessment"
— первый из реализованных режимов блока Quality Assessment
, наиболее подходящий для задач проверки качества изображений лиц на соответствие таким стандартам, как ISO/IEC 19794-5:2011 или ICAO Guidelines for Passport Photographs. Все результаты отдельных проверок агрегируются в общий показатель total_score, который отражает, насколько фотография соответствует стандарту.
На данный момент рекомендуется использовать вторую версию модификации assessment
. Обратите внимание: для корректной оценки на изображении должно присутствовать только одно лицо, смотрящее прямо в камеру. В противном случае итоговый балл может быть занижен. При захвате нескольких лиц сразу, каждое из них будет обработано независимо.
Параметры, оцениваемые модификацией "assessment"
1-й версии
Нажмите, чтобы отобразить список оцениваемых параметров
total_score
- численное значение, обозначает общую оценку качества изображения в баллах от 0 до 1.is_background_uniform
- логическое значение, указывает на однородность фона.background_uniformity_score
- численное значение, оценка однородности фона в баллах от 0 до 1.is_dynamic_range_acceptable
- логическое значение, показывает, что динамический диапазон интенсивности изображения в области лица превышает или не превышает значение 1,28.dynamic_range_score
- численное значение, оценка динамического диапазона интенсивности в баллах от 0 до 2.55.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.
Параметры, оцениваемые модификацией "assessment"
2-й версии
Нажмите, чтобы отобразить список оцениваемых параметров
total_score
- численное значение, обозначает общую оценку качества изображения в баллах от 0 до 1.is_background_uniform
- логическое значение, указывает на однородность фона.background_uniformity_score
- численное значение, оценка однородности фона в баллах от 0 до 1.is_dynamic_range_acceptable
- логическое значение, показывает, что динамический диапазон интенсивности изображения в области лица превышает или не превышает значение 1,28.dynamic_range_score
- численное значение, оценка динамического диапазона интенсивности в баллах от 0 до 2.55.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.face_width_pixels
- численное значение, обозначает ширину лица в пикселяхface_height_pixels
- численное значение, обозначает высоту лица в пикселяхface_size_on_image
- численное значение, обозначает размер лица на изображении от 0 до 1 (ICAO-параметр)is_face_size_acceptable
- логическое значение, обозначает допустимый размер лица на изображении (70-80% от площади изображения) (ICAO-параметр)is_image_gray
- логическое значение, обозначает является ли изображение серым (ICAO-параметр)min_image_dpi
- численное значение, обозначает количество пикселей на дюйм (ICAO-параметр)is_high_resolution
- логическое значение, обозначает является ли изображение изображением в высоком качестве (ICAO-параметр)image_width_to_height_ratio
- численное значение, обозначает отношение ширины к высоте изображенияred_eyes_right_score
- численное значение, оценка степени красноты правого глаза (ICAO-параметр)red_eyes_left_score
- численное значение, оценка степени красноты левого глаза (ICAO-параметр)is_red_eyes
- логическое значение, обозначает наличие красноты глаз (ICAO-параметр)not_has_glasses
- логическое значение, обозначает отсутствие очков (ICAO-параметр)glasses_score
- численное значение, обозначает оценку наличия очков от 0 до 1 (ICAO-параметр)mouth_openness_score
- численное значение, оценка степени открытости рта от до 1 (ICAO-параметр)is_mouth_openness
- логическое значение, обозначает является ли рот открытым (ICAO-параметр)
Для получения лучших результатов при оценке качества изображения с помощью модификации "assessment"
2-й версии следует использовать FACE_FITTER
с модификацией tddfa
или tddfa_faster
.
Также, при оценке качества изображения с помощью модификации "assessment"
2-й версии можно отключать некоторые проверки, при этом отключенные проверки не будут влиять на итоговый результат.
Отключаемые проверки 2-й версии модификации "assessment"
Нажмите, чтобы отобразить список отключаемых параметров. Все параметры включены по умолчанию
enable_check_sharpness
- логическое значение, проверка резкостиenable_check_illumination
- логическое значение, проверка равномерности освещенияenable_check_flare
- логическое значение, проверка вспышекenable_check_noise
- логическое значение, проверка шумовenable_check_dynamic_range
- логическое значение, проверка динамического диапазона интенсивностиenable_check_watermark
- логическое значение, проверка водяного знакаenable_check_background
- логическое значение, проверка однородности фонаenable_check_eye_openness
- логическое значение, проверка открытости глазenable_check_mask
- логическое значение, проверка наличия маскиenable_check_neutral_emotion
- логическое значение, проверка эмоцийenable_check_eye_distance
- логическое значение, проверка расстояния между глазамиenable_check_margin
- логическое значение, проверка отступовenable_check_rotation
- логическое значение, проверка поворота головыenable_check_resolution
- логическое значение, проверка разрешения изображенияenable_check_gray_scale
- логическое значение, проверка является ли изображение серымenable_check_face_size
- логическое значение, проверка размера лицаenable_check_red_eye
- логическое значение, проверка красноты глазenable_check_glasses
- логическое значение, проверка наличия очковenable_check_mouth_openness
- логическое значение, проверка открытости рта
Спецификация входного контейнера Context
Processing Block ожидает входной контейнер 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 v1
- assessment v2
{
"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},
"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},
"face_width_pixels": { "type": "long" },
"face_height_pixels": { "type": "long" },
"face_size_on_image": { "type": "double", "minimum": 0, "maximum": 1 },
"is_face_size_acceptable": { "type": "boolean" },
"is_image_gray": { "type": "boolean" },
"min_image_dpi": { "type": "long" },
"is_high_resolution": { "type": "boolean" },
"image_width_to_height_ratio": { "type": "double" },
"red_eyes_right_score": { "type": "double" },
"red_eyes_left_score": { "type": "double" },
"is_red_eyes": { "type": "boolean" },
"glasses_score": { "type": "double", "minimum": 0, "maximum": 1 },
"not_has_glasses": { "type": "boolean" },
"mouth_openness_score": { "type": "double", "minimum": 0, "maximum": 1 },
"is_mouth_openness": { "type": "boolean" }
}
}
Пример работы процессинг-блока
Создайте конфигурационный контейнер Context и укажите значения
"unit_type"
,"modification"
,"version"
для нужного вам блока. Пример создания процессинг-блока можно найти на странице Работа с процессинг-блоком.Передайте контейнер-контекст, полученный после работы процессинг-блоков детектора и фиттера.
Вызовите процессинг-блок оценки.
Получите результат работы процессинг-блока.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
- NodeJS
- Go
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
let configCtx = new facerec.Context();
configCtx.get("unit_type").value = "QUALITY_ASSESSMENT_ESTIMATOR";
let blockQuality = new facerec.ProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockQuality.process(ioData);
let total_score = ioData.get("objects").get(0).get("quality").get("total_score").value
configContext, err := facesdk.CreateContext()
context, err := configContext.GetOrInsertByKey("unit_type")
err = context.SetString("QUALITY_ASSESSMENT_ESTIMATOR")
defer configContext.Close()
blockQuality, err := service.CreateProcessingBlock(configContext)
defer blockQuality.Close()
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
err = faceDetector.Process(ioData);
err = faceFitter.Process(ioData);
err = blockQuality.Process(ioData);
context, err = ioData.GetByKey("objects")
context, err = context.GetByIndex(0)
context, err = context.GetByKey("quality")
context, err = context.GetByKey("total_score")
totalScore, err = context.GetFloat()