Оценка качества изображения
В этом разделе вы узнаете как интегрировать блок оценки качества изображения лица в свой проект на C++ или Python.
Блок оценки качества изображения лица (C++/Python)
1. Создание Quality Assessment Estimator
1.1 Для создания Quality Assessment Estimator выполните шаги 1-3, описанные в разделе Создание процессинг-блока и укажите следующие значения:
"QUALITY_ASSESSMENT_ESTIMATOR"
для ключа"unit_type"
- Пустую строку
""
для ключа"model_path"
- Для ключа "modification" нужно указать один из двух доступных режимов:
"assesment"
- первый из реализованных режимов блока Quality Assessment, в рамках которого оцениваются следующие параметры:'background_uniformity_score'
,'dynamic_range_score'
,'eyes_distance'
,'has_watermark'
,'illumination_score'
,'is_background_uniform'
,'is_dynamic_range_acceptable'
,'is_evenly_illuminated'
,'is_eyes_distance_acceptable'
,'is_left_eye_opened'
,'is_margins_acceptable'
,'is_neutral_emotion'
,'is_not_noisy'
,'is_right_eye_opened'
,'is_rotation_acceptable'
,'is_sharp'
,'left_eye_openness_score'
,'margin_inner_deviation'
,'margin_outer_deviation'
,' max_rotation_deviation'
,'neutral_emotion_score
' ,'no_flare'
,'noise_score'
,'not_masked'
,'not_masked_score'
,'right_eye_openness_score'
,'sharpness_score'
,'total_score'
,'watermark_score'
;"estimation"
- в данном режиме оценивается качество изображения в целом, а результат ("total_score"
) представляет собой реальное число от 0 (худшее качество) до 1 (идеальное качество).
- C++
- Python
configCtx["unit_type"] = "QUALITY_ASSESSMENT_ESTIMATOR";
//specify one key
configCtx["modification"] = "assessment"; //to evaluate metrics and obtain their results
// or
configCtx["modification"] = "estimation"; //to evaluate metrics and obtain photo quality values
// optional, default values are specified after "="
// paths specified for examples located in <sdk_dir>/bin
configCtx["sdk_path"] = "..";
configCtx["config_name"] = "quality_assessment.xml";
configCtx["facerec_conf_dir"] = sdk_path + "/conf/facerec/"
configCtx = {
"unit_type": "QUALITY_ASSESSMENT_ESTIMATOR",
#specify one key
"modification": "assessment", # to evaluate metrics and obtain their results
# or
"modification": "estimation", # to evaluate metrics and obtain photo quality values
# optional, default values are specified after ":"
# paths specified for examples located in <sdk_dir>/bin
"sdk_path": "..",
"config_name": "quality_assessment.xml",
"facerec_conf_dir": sdk_path + "/conf/facerec/"
}
1.2 Создайте процессинг-блок Quality Assessment Estimator:
- C++
- Python
- Flutter
pbio::ProcessingBlock qualityAssessmentEstimator = service->createProcessingBlock(configCtx);
qualityAssessmentEstimator = service.create_processing_block(configCtx)
ProcessingBlock qualityAssessmentEstimator = service.createProcessingBlock({
"unit_type": "QUALITY_ASSESSMENT_ESTIMATOR",
});
2. Проверка качества фотографии лица
2.1 Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
- C++
- Python
auto ioData = service->createContext();
ioData = service.create_context({})
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением в бинарном формате, выполнив шаги (1-3, 4.b), описанные в разделе Создание контейнера Context c RGB-изображением:
- C++
- Python
- Flutter
// помещение изображения в контейнер
auto imgCtx = ioData["image"];
pbio::context_utils::putImage(imgCtx, input_rawimg);
# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in image.shape]
}
ioData["image"] = imageCtx
}
File file = File(imagePath);
final Uint8List bytes = await file.readAsBytes();
final ImageDescriptor descriptor = await ImageDescriptor.encoded(await ImmutableBuffer.fromUint8List(bytes));
Context ioData = service.createContext({
"objects": [],
"image": {
"blob": bytes,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [descriptor.height, descriptor.width, 3]
}
});
2.3.1 Создайте объект Capturer:
- C++
- Python
- Flutter
const pbio::Capturer::Ptr capturer = service->createCapturer("common_capturer_refa_fda_a.xml");
capturer = service.create_capturer(Config("common_capturer_refa_fda_a.xml"))
Capturer capturer = service.createCapturer("common_capturer_refa_fda_a.xml");
2.3.2 Выполните детекцию лиц с помощью метода capture
:
- C++
- Python
- Flutter
std::vector<pbio::RawSample::Ptr> samples = capturer->capture(input_rawimg);
samples = capturer.capture(input_rawimg)
List<RawSample> samples = capturer.capture(bytes);
2.4.1 Каждый sample
сконвертируйте в Context-контейнер и добавьте в objects
:
- C++
- Python
- Flutter
auto objectsCtx = ioData["objects"];
for(auto &sample: samples)
{
objectsCtx.push_back(sample->toContext());
}
ioData["objects"] = []
for sample in samples:
ioData["objects"].push_back(sample.to_context())
for (RawSample sample in samples) {
ioData["objects"].pushBack(sample.toContext());
}
2.4.2 Вызовите qualityAssessmentEstimator()
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
- Flutter
qualityAssessmentEstimator(ioData);
qualityAssessmentEstimator(ioData)
Context ioData = qualityAssessmentEstimator.process(ioData);
Для точной оценки требуется только одно лицо человека в кадре, смотрящее в камеру, иначе общий балл будет низким, поскольку алгоритм учитывает относительный размер, положение и направленность головы.
Если захвачено несколько лиц, каждое из них будет обработано независимо.
Результат вызова qualityAssessmentEstimator()
будет добавлен в контейнер ioData
. Формат выходных данных представляет собой список объектов доступный по ключу "objects"
. Каждый объект списка имеет ключ "class"
со значением "face"
.
По ключу "quality"
расположен контекст с полным набором оценок (результат работы метода qualityAssessmentEstimator()
).
- Ключ
"total_score"
содержит общую оценку типа long в диапазоне [0,100]
assessment modification
/*
{
"quality": {
"total_score": {"type": "long", "minimum": 0, "maximum": 100},
"is_sharp": {"type": "boolean"},
"sharpness_score": {"type": "long", "minimum": 0, "maximum": 100},
"is_evenly_illuminated": {"type": "boolean"},
"illumination_score": {"type": "long", "minimum": 0, "maximum": 100},
"no_flare": {"type": "boolean"},
"is_left_eye_opened": {"type": "boolean"},
"left_eye_openness_score": {"type": "long", "minimum": 0, "maximum": 100},
"is_right_eye_opened": {"type": "boolean"},
"right_eye_openness_score": {"type": "long", "minimum": 0, "maximum": 100},
"is_rotation_acceptable": {"type": "boolean"},
"max_rotation_deviation": {"type": "long"},
"not_masked": {"type": "boolean"},
"not_masked_score": {"type": "long", "minimum": 0, "maximum": 100},
"is_neutral_emotion": {"type": "boolean"},
"neutral_emotion_score": {"type": "long", "minimum": 0, "maximum": 100},
"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": "long", "minimum": 0, "maximum": 100},
"watermark_score": {"type": "long", "minimum": 0},
"has_watermark": {"type": "boolean"},
"dynamic_range_score": {"type": "long", "minimum": 0},
"is_dynamic_range_acceptable": {"type": "boolean"},
"is_background_uniform": {"type": "boolean"},
"background_uniformity_score": {"type": "long", "minimum": 0, "maximum": 100}
}
}
*/