Перейти к основному содержимому
Версия: 3.17.3

Блок проверки качества фото

В этом разделе вы узнаете, как интегрировать блок оценки качества фотографии лица в свой проект на C++ или Python.

Блок оценки качества фотографии лица (C++/Python)

Требования

  • Операционная система Windows x86 64-bit или Linux x86 64-bit.
  • Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).

1. Создание Quality Assessment Estimator

1.1 Для создания Quality Assessment Estimator, выполните шаги 1-3, описанные в разделе Создание процессинг-блока и укажите следующие значения:

  • "QUALITY_ASSESSMENT_ESTIMATOR" для ключа "unit_type";
  • Пустую строку "" для ключа "model_path".
configCtx["unit_type"] = "QUALITY_ASSESSMENT_ESTIMATOR";
configCtx["model_path"] = "";

// опционально, значения по умолчанию указаны после знака "="
// пути указаны для примеров, расположенных в <sdk_dir>/bin
configCtx["sdk_path"] = "..";
configCtx["config_name"] = "quality_assessment.xml";
configCtx["facerec_conf_dir"] = sdk_path + "/conf/facerec/"

1.2 Создайте процессинг-блок Quality Assessment Estimator:

pbio::ProcessingBlock qualityAssessmentEstimator = service->createProcessingBlock(configCtx);

2. Проверка качества фотографии лица

2.1 Создайте Context-контейнер ioData для данных ввода-вывода, используя метод createContext():

auto ioData = service->createContext();

2.2 Создайте Context-контейнер imgCtx с RGB-изображением в бинарном формате, выполнив шаги (1-3, 4.b), описанные в разделе Создание контейнера Context c RGB-изображением:

// помещение изображения в контейнер
auto wholeImageCtx = imgCtx["image"];
pbio::context_utils::putImage(wholeImageCtx, input_rawimg);
// добавьте ключ `"objects"`
auto objectsCtx = imgCtx["objects"];

2.3.1 Создайте объект Capturer. Описание см. в разделе Класс Capturer:

const pbio::Capturer::Ptr capturer = service->createCapturer("common_capturer_refa_fda_a.xml");

2.3.2 Задетектируйте лица с помощью метода capture:

std::vector<pbio::RawSample::Ptr> samples = capturer->capture(input_rawimg);

2.4 Создайте Context-контейнер capture_result. Поместите в него бинарное изображение, используя ключ "image":

capture_result = service->createContext();
auto wholeImageCtx = capture_result["image"];
pbio::context_utils::putImage(wholeImageCtx, input_rawimg);

2.5.1 Для каждого задетектированного лица создайте Context-контейнер faceData и передайте контейнер с изображением по ключу "image_ptr":

for(auto &sample: samples)
{
auto faceData = service->createContext();
faceData["image_ptr"] = capture_result["image"];

2.5.2 Конвертируйте объект RawSample в Context-контейнер faceData:

    pbio::context_utils::putRawSample(faceData, sample, "fda", input_rawimg.width, input_rawimg.height);

2.5.3 Вызовите qualityAssessmentEstimator() и передайте Context-контейнер faceData, содержащий изображение:

    qualityAssessmentEstimator(faceData);

2.5.4 Переместите результаты работы блока в контейнер ioData:

    objectsCtx.push_back(std::move(faceData));
}
ioData = std::move(capture_result);

Для точной оценки требуется только одно лицо человека в кадре, смотрящего в камеру, иначе общий балл будет низким, поскольку алгоритм учитывает относительный размер, положение и направленность головы. Если захвачено несколько лиц, каждое из них будет обработано независимо.

Результат вызова qualityAssessmentEstimator() будет добавлен в контейнер ioData. Формат выходных данных представляет собой список объектов, доступный по ключу "objects". Каждый объект списка имеет ключ "class" со значением "face".

По ключам "quality": "qaa" расположен контекст с полным набором оценок (результат работы метода qualityAssessmentEstimator()).

  • Ключ "totalScore" содержит общую оценку типа long в диапазоне [0,100]
/*
{
"quality": {
"qaa": {
"totalScore": {"type": "long", "minimum": 0, "maximum": 100},
"isSharp": {"type": "boolean"},
"sharpnessScore": {"type": "long", "minimum": 0, "maximum": 100},
"isEvenlyIlluminated": {"type": "boolean"},
"illuminationScore": {"type": "long", "minimum": 0, "maximum": 100},
"noFlare": {"type": "boolean"},
"isLeftEyeOpened": {"type": "boolean"},
"leftEyeOpennessScore": {"type": "long", "minimum": 0, "maximum": 100},
"isRightEyeOpened": {"type": "boolean"},
"rightEyeOpennessScore": {"type": "long", "minimum": 0, "maximum": 100},
"isRotationAcceptable": {"type": "boolean"},
"maxRotationDeviation": {"type": "long"},
"notMasked": {"type": "boolean"},
"notMaskedScore": {"type": "long", "minimum": 0, "maximum": 100},
"isNeutralEmotion": {"type": "boolean"},
"neutralEmotionScore": {"type": "long", "minimum": 0, "maximum": 100},
"isEyesDistanceAcceptable": {"type": "boolean"},
"eyesDistance": {"type": "long", "minimum": 0}
"isMarginsAcceptable": {"type": "boolean"},
"marginOuterDeviation": {"type": "long", "minimum": 0}
"marginInnerDeviation": {"type": "long", "minimum": 0}
"isNotNoisy": {"type": "boolean"},
"noiseScore": {"type": "long", "minimum": 0, "maximum": 100},
"watermarkScore": {"type": "long", "minimum": 0},
"hasWatermark": {"type": "boolean"},
"dynamicRangeScore": {"type": "long", "minimum": 0},
"isDynamicRangeAcceptable": {"type": "boolean"},
"isBackgroundUniform": {"type": "boolean"},
"backgroundUniformityScore": {"type": "long", "minimum": 0, "maximum": 100}
}
}
}
*/
примечание

Примеры использования Quality Assessment Estimator:

3. Ускорение на GPU

Блок оценки качества не поддерживает ускорение графического процессора, но задействованные модули, перечисленные в конфигурационном файле, могут иметь собственные возможности ускорения.