Оценка Liveness
В этом разделе вы узнаете как интегрировать компонент Liveness Estimator в ваш проект на C++ или Python для оценки принадлежности лица реальному человеку ("живость").
2D RGB Оценка принадлежности лица реальному человеку (C++/Python)
Модификация 3
1. Создание Liveness Estimator
1.1 Для создания Liveness Estimator выполните шаги 1-3, описанные в разделе Создание процессинг-блока и укажите следующие значения:
"LIVENESS_ESTIMATOR"
для ключа"unit_type"
- Пустую строку
""
для ключа"model_path"
- C++
- Python
configCtx["unit_type"] = "LIVENESS_ESTIMATOR";
configCtx["model_path"] = "";
// опционально, значения по умолчанию указаны после знака "="
// пути указаны для примеров, расположенных в <sdk_dir>/bin
configCtx["sdk_path"] = "..";
configCtx["capturer_config_name"] = "common_capturer_uld_fda.xml";
configCtx["config_name"] = "liveness_2d_estimator_v3.xml";
configCtx["facerec_conf_dir"] = sdk_dir + "/conf/facerec";
configCtx["dll_path"] = "facerec.dll"; // для Windows
// или
configCtx["dll_path"] = sdk_dir + "/lib/libfacerec.so"; // для Linux
configCtx = {
"unit_type": "LIVENESS_ESTIMATOR",
"model_path": "",
# опционально, значения по умолчанию указаны после двоеточия
# пути указаны для примеров, расположенных в <sdk_dir>/bin
"sdk_path": "..",
"capturer_config_name": "common_capturer_uld_fda.xml",
"config_name": "liveness_2d_estimator_v3.xml",
"facerec_conf_dir": sdk_path + "/conf/facerec/",
"dll_path": "facerec.dll", # для Windows
# или
"dll_path": sdk_dir + "/lib/libfacerec.so" # для Linux
}
Списки существующих конфигурационных файлов можно найти в разделах:
- Файлы конфигурации объекта Capturer для ключа
"capturer_config_name"
- Класс Liveness2DEstimator для ключа
"config_name"
1.2 Создание процессинг-блока Liveness Estimator:
- C++
- Python
- Flutter
pbio::ProcessingBlock livenessEstimator = service->createProcessingBlock(configCtx);
livenessEstimator = service.create_processing_block(configCtx)
ProcessingBlock livenessEstimator = service.createProcessingBlock({
"unit_type": "LIVENESS_ESTIMATOR",
"model_path": "",
// опционально, значения по умолчанию указаны после знака "="
// пути указаны для примеров, расположенных в <sdk_dir>/bin
"sdk_path": "..",
"capturer_config_name": "common_capturer_uld_fda.xml",
"config_name": "liveness_2d_estimator_v3.xml",
"facerec_conf_dir": sdk_path + "/conf/facerec/",
"dll_path": "facerec.dll", # для Windows
# или
"dll_path": sdk_dir + "/lib/libfacerec.so" # для Linux
});
2. Оценка лица
2.1 Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
- C++
- Python
- Flutter
auto ioData = service->createContext();
ioData = service.create_context({})
Context ioData = service.createContext({
"objects": []
});
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением, выполнив шаги, описанные на странице Создание контейнера 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));
Map<String, dynamic> imageContext = {
"blob": bytes,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [descriptor.height, descriptor.width, 3]
};
2.3 Поместите исходное изображение в контейнер данных ввода-вывода:
- C++
- Python
- Flutter
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
ioData = service.createContext({
"objects": [],
"image": {
"blob": <массив байт с изображением в RGB формате>,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [<высота изображения в пикселях>, <ширина изображения в пикселях>, 3]
}
});
2.4 Вызовите livenessEstimator
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
- Flutter
livenessEstimator(ioData);
livenessEstimator(ioData)
Context result = livenessEstimator.process(ioData);
Для точной оценки требуется присутствие в кадре лица только одного человека, смотрящего в камеру, иначе будет возвращен статус "MULTIPLE_FACE_FRAMED".
Если на изображении обнаружено несколько лиц, будет обработано только одно из них (случайным образом).
Метод livenessEstimator()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
Формат выходных данных представляет собой список объектов доступный по ключу "objects"
.
Каждый объект списка имеет ключ "class"
со значением "face"
.
По ключу "liveness"
доступен объект Context, содержащий 3 элемента:
- ключ
"confidence"
со значением типа double в диапазоне [0,1] - ключ
"value"
со значением типа string, которое соответствует одному из состояний pbio::Liveness2DEstimator::Liveness - ключ
"info"
со значением типа string, которое соответствует одному из двух состояний: "REAL" или "FAKE"
/*
{
"objects": [{ "bbox": [x1, y2, x2, y2],
"class": "face",
"id": {"type": "long", "minimum": 0},
"liveness": {
"confidence": {"type": "double", "minimum": 0, "maximum": 1},
"info": {
"enum": [
"FACE_NOT_FULLY_FRAMED", "MULTIPLE_FACE_FRAMED",
"FACE_TURNED_RIGHT", "FACE_TURNED_LEFT", "FACE_TURNED_UP",
"FACE_TURNED_DOWN", "BAD_IMAGE_LIGHTING", "BAD_IMAGE_NOISE",
"BAD_IMAGE_BLUR", "BAD_IMAGE_FLARE", "NOT_COMPUTED"
]
},
"value": {
"enum": ["REAL", "FAKE"]
}
}
}]
}
*/
Модификация 4
1. Создание Liveness Estimator
1.1 Для создания Liveness Estimator выполните шаги 1-3, описанные на странице Создание Processing Block и укажите следующие значения:
"LIVENESS_ESTIMATOR"
for the"unit_type"
key- An empty string
""
for the"model_path"
key
- C++
- Python
configCtx["unit_type"] = "LIVENESS_ESTIMATOR";
configCtx["modification"] = "v4";
// optional, default values are specified after "="
// paths specified for examples located in <sdk_dir>/bin
configCtx["sdk_path"] = "..";
configCtx["facerec_conf_dir"] = sdk_dir + "/conf/facerec";
configCtx["dll_path"] = "facerec.dll"; // for Windows
// or
configCtx["dll_path"] = sdk_dir + "/lib/libfacerec.so"; // for Linux
configCtx = {
"unit_type": "LIVENESS_ESTIMATOR",
"modification": "v4",
# optional, default values are specified after ":"
# paths specified for examples located in <sdk_dir>/bin
"sdk_path": "..",
"facerec_conf_dir": sdk_path + "/conf/facerec/",
"dll_path": "facerec.dll", # for Windows
# or
"dll_path": sdk_dir + "/lib/libfacerec.so" # for Linux
}
1.2 Создание процессинг-блока Liveness Estimator:
- C++
- Python
- Flutter
pbio::ProcessingBlock livenessEstimator = service->createProcessingBlock(configCtx);
livenessEstimator = service.create_processing_block(configCtx)
ProcessingBlock livenessEstimator = service.createProcessingBlock({
"unit_type": "LIVENESS_ESTIMATOR",
"modification": "v4"
});
2. Оценка лиц
2.1 Перед применением блока Liveness Estimator следует создать и применить к изображению блоки Face Detector (модификация ULD) и Face Fitter (модификация tddfa).
2.2 Вызовите livenessEstimator
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
- Flutter
livenessEstimator(ioData);
livenessEstimator(ioData)
Context result = livenessEstimator(ioData);
Если на изображении обнаружено несколько лиц, будет обработано только одно из них (случайным образом).
Метод livenessEstimator()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
Формат выходных данных представляет собой список объектов доступный по ключу "objects"
. Каждый объект списка имеет ключ "class"
со значением "face"
.
По ключу "liveness" доступен объект Context, содержащий 2 элемента:
- ключ
"confidence"
со значением типа double в диапазоне [0,1] - ключ
"value"
со значением типа string, которое соответствует одному из двух состояний: "REAL" или "FAKE"
/*
{
"objects": [{ "liveness": {
"confidence": {"type": "double", "minimum": 0, "maximum": 1},
"value": {
"enum": ["REAL", "FAKE"]
}
}
}]
}
*/