Оценка Liveness
2D RGB оценка Liveness
Модификации процессинг-блока оценки Liveness
2d
— алгоритмы для определения принадлежности лица реальному человеку по изображению. Подходит для большинства сценариев.2d_light
— более лёгкие и оптимизированные алгоритмы, обеспечивающие высокую скорость работы. Подходят для использования на мобильных устройствах и в условиях ограниченных вычислительных ресурсов.2d_additional_check
— оценка принадлежности лица реальному человеку по изображению с дополнительными проверками.2d_ensemble
— модификация, расширяющая функциональность стандартной модификации2d
. Обеспечивает защиту от атак с использованием 2D и 3D масок.2d_ensemble_heavy
— модификация с более точными и вычислительно тяжёлыми алгоритмами для защиты от атак с использованием 2D и 3D масок. Рекомендуется для применения в сценариях с высокими требованиями к точности и безопасности.2d_ensemble_light
— модификация для защиты от атак с использованием 2D и 3D масок с более легкими и быстрыми алгоритмами.
* - CPU Intel Xeon E5-2683 v4 (1 ядро)Модификация Версия Версия Face SDK Время детекции CPU (мс)* Время детекции GPU (мс)** APCER[BPCER=0.05] 2d 5 3.26 100 10 0.036 2d_light 4 3.25 16 4 0.077 2d_ensemble 3 3.26 116 16 0.037 2d_ensemble_heavy 1 3.25 487 24 0.107 2d_ensemble_light 2 3.25 34 9 0.087
** - GPU (NVIDIA GTX 10xx серия)
Предыдущие версии
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** | APCER[BPCER=0.05] |
---|---|---|---|---|---|
2d_additional_check | 1 | 3.19 | 41 | - | 0.37 |
2d | 1 | 3.19 | 694 | 72 | 0.40 |
2 | 3.21 | 243 | 12 | 0.108 | |
3 | 3.24 | 242 | 12 | 0.111 | |
4 | 3.25 | 242 | 12 | 0.093 | |
2d_light | 1 | 3.21 | 6 | 2 | 0.112 |
2 | 3.24 | 16 | 4 | 0.115 | |
3 | 3.24 | 16 | 4 | 0.125 | |
2d_ensemble | 1 | 3.24 | 487 | 17 | 0.156 |
2 | 3.25 | 250 | 24 | 0.1 | |
2d_ensemble_light | 1 | 3.24 | 34 | 9 | 0.184 |
** - GPU (NVIDIA GTX 10xx серия)
Приведенные результаты 2d, 2d_light не включают 3d mask и 2d mask атаки
Рекомендации по выбору модификации:
- Для стандартных задач с приемлемой защитой и точностью используйте
2d
или2d_ensemble
, в зависимости от того, насколько важно защитить систему от атак с масками. - Если требуется высокая степень защиты от атак с масками и важна максимальная точность, используйте
2d_ensemble_heavy
. - Если приоритетом является производительность, используйте
2d_light
или2d_ensemble_light
.
Параметры конфигурации
- 2d_additional_check
- 2d
- 2d_light
"capturer_config_name"
— конфигурационный файл детектора. По умолчанию используется"common_capturer_uld_fda.xml"
(Перечень конфигурационных файлов объекта Capturer])."config_name"
— конфигурационный файл объекта оценки Liveness. По умолчанию используется"liveness_2d_estimator_v3.xml"
(Класс Liveness2DEstimator]).
"confidence_threshold"
— порог, по которому определяется параметр"value"
(обозначает вердикт: REAL или FAKE).
"confidence_threshold"
— порог, по которому определяется параметр"value"
(обозначает вердикт: REAL или FAKE).
Перечень настраиваемых параметров процессинг-блоков]
Значания параметров по умолчанию
Модификация | Версия | confidence_threshold |
---|---|---|
2d | 1 | 0.8 |
2 | 0.81 | |
3 | 0.81 | |
4 | 0.94 | |
2d_light | 1 | 0.55 |
2 | 0.43 | |
3 | 0.86 | |
4 | 0.87 | |
2d_ensemble | 1 | 0.69 |
2 | 0.81 | |
2d_ensemble_light | 1 | 0.77 |
2 | 0.65 | |
2d_ensemble_heavy | 1 | 0.89 |
Спецификация процессинг-блока
- 2d_additional_check
- 2d
- Входной Context-контейнер должен содержать изображение в бинарном формате.
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
}
}
- Входной 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]]
}
}]
}
- 2d_additional_check
- 2d
- После вызова процессинг-блока добавлен массив объектов, содержащий один объект. В объекте будут находиться координаты ограничивающего прямоугольника (bbox), уверенность детекции, класс и поле
liveness
. По ключу"liveness"
доступен объект Context, содержащий 3 элемента:
- Ключ
"confidence"
со значением типа double в диапазоне [0,1] - Ключ
"value"
со значением типа string, которое соответствует одному из двух состояний: "REAL" или "FAKE" - Ключ
"info"
со значением типа string, которое соответствует одному из состояний pbio::Liveness2DEstimator::Liveness
Спецификация выходного Context-контейнера:
{
"image" : {},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "face",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2],
"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"]}
}
}]
}
- После вызова процессинг-блока, объекту будет добавлено поле
liveness
. По ключу"liveness"
доступен объект Context, содержащий 2 элемента:
- Ключ
"confidence"
со значением типа double в диапазоне [0,1] - Ключ
"value"
со значением типа string, которое соответствует одному из двух состояний: "REAL" или "FAKE" - Ключ
"attack_type"
со значением типа string, вероятный тип атаки (Не доступен в версии 1) - Ключ
"attack_type_scores"
объект Context, содержащий 6 элементов. По ключу (тип атаки) хранится score (Не доступен в версии 1)
Спецификация выходного Context-контейнера:
{
"objects": [{
"liveness": {
"confidence": {"type": "double", "minimum": 0, "maximum": 1},
"value": {"enum": ["REAL", "FAKE"]},
"attack_type": {"type": "string"},
"attack_type_scores": {
"none": {"type": "double", "minimum": 0, "maximum": 1},
"replay": {"type": "double", "minimum": 0, "maximum": 1},
"photo": {"type": "double", "minimum": 0, "maximum": 1},
"regions": {"type": "double", "minimum": 0, "maximum": 1},
"2d-mask": {"type": "double", "minimum": 0, "maximum": 1},
"3d-mask": {"type": "double", "minimum": 0, "maximum": 1},
}
}
}]
}
Для корректной работы алгоритма, необходимо чтобы на изображении находилось ровно одно лицо.
Пример работы процессинг-блока
Для оценки принадлежности лица реальному человеку на изображении выполните следующие действия:
- Создайте конфигурационный Context-контейнер, укажите значения
"unit_type"
,"modification"
,"version"
и другие параметры процессинг-блока. Пример создания процессинг-блока вы можете найти на странице].
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
- NodeJS
- Go
auto configCtx = service->createContext();
configCtx["unit_type"] = "LIVENESS_ESTIMATOR";
configCtx["modification"] = "2d";
pbio::ProcessingBlock blockLiveness = service->createProcessingBlock(configCtx);
configCtx = {
"unit_type": "LIVENESS_ESTIMATOR",
"modification": "2d"
}
blockLiveness = service.create_processing_block(configCtx)
ProcessingBlock blockLiveness = service.createProcessingBlock({
"unit_type": "LIVENESS_ESTIMATOR",
"modification": "2d"
});
Dictionary<object, object> configCtx = new();
configCtx["unit_type"] = "EMOTION_ESTIMATOR";
configCtx["modification"] = "2d";
ProcessingBlock blockLiveness = service.CreateProcessingBlock(configCtx);
Context configCtx = service.createContext();
configCtx.get("unit_type").setString("LIVENESS_ESTIMATOR");
configCtx.get("modification").setString("2d");
ProcessingBlock blockLiveness = service.createProcessingBlock(configCtx);
val configCtx = service.createContext()
configCtx["unit_type"].string = "EMOTION_ESTIMATOR"
configCtx["modification"].string = "2d"
val blockLiveness = service.createProcessingBlock(configCtx)
let configCtx = new facerec.Context();
configCtx.get("unit_type").value = "LIVENESS_ESTIMATOR";
configCtxget("modification").value = "2d";
let blockLiveness = new facerec.ProcessingBlock(configCtx);
configContext, err := facesdk.CreateContext()
context, err := configContext.GetOrInsertByKey("unit_type")
err = context.SetString("LIVENESS_ESTIMATOR")
context, err = configContext.GetOrInsertByKey("modification")
err = context.SetString("2d")
defer configContext.Close()
blockLiveness, err := service.CreateProcessingBlock(configContext)
defer blockLiveness.Close()
- Передайте входной Context-контейнер, соответствующий модификации блока, в метод
"blockLiveness()"
:"2d"
— Context-контейнер, полученный после работы процессинг-блоков детекции лица и фиттера."2d_additional_check"
— Context-контейнер, содежащий изображение в бинарном формате.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
- NodeJS
- Go
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector(ioData);
faceFitter(ioData);
blockLiveness(ioData);
#------------------
# создание процессинг-блока и контейнера Context с бинарным изображением
#------------------
faceDetector(ioData)
faceFitter(ioData)
blockLiveness(ioData)
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockLiveness.process(ioData);
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.Invoke(ioData);
faceFitter.Invoke(ioData);
blockLiveness.Invoke(ioData);
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockLiveness.process(ioData);
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.process(ioData)
faceFitter.process(ioData)
blockLiveness.process(ioData)
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockLiveness.process(ioData);
//------------------
// создание процессинг-блока и контейнера Context с бинарным изображением
//------------------
err := faceDetector.Process(ioData)
err = faceFitter.Process(ioData)
err = blockLiveness.Process(ioData)
- Получите результат работы процессинг-блока
LIVENESS_ESTIMATOR
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
- NodeJS
- Go
auto liveness_results = ioData["objects"][0]["liveness"];
std::string liveness_value = liveness_results["value"].getString();
double liveness_confidence = liveness_results["confidence"].getDouble();
liveness_results = ioData["objects"][0]["liveness"]
liveness_value = liveness_results["value"].get_value()
liveness_confidence = liveness_results["confidence"].get_value()
Context liveness_results = ioData["objects"][0]["liveness"];
String liveness_value = liveness_results["value"].get_value();
double liveness_confidence = liveness_results["confidence"].get_value();
Context liveness_results = ioData["objects"][0]["liveness"];
string liveness_value = liveness_results["value"].GetString();
double liveness_confidence = liveness_results["confidence"].GetDouble();
Context liveness_results = ioData.get("objects").get(0).get("liveness");
String liveness_value = liveness_results.get("value").getString();
double liveness_confidence = liveness_results.get("confidence").getDouble();
val liveness_results = ioData["objects"][0]["liveness"];
val liveness_value = liveness_results["value"].string;
val liveness_confidence = liveness_results["confidence"].double
let liveness_results = ioData.get("objects").get(0).get("liveness");
let liveness_value = liveness_results.get("value").value;
let liveness_confidence = liveness_results.get("confidence").value;
context, err := ioData.GetByKey("objects")
context, err = context.GetByIndex(0)
livenessResults, err := context.GetByKey("liveness")
context, err = livenessResults.GetByKey("value")
livenessValue, err := context.GetString()
context, err = livenessResults.GetByKey("confidence")
livenessConfidence, err := context.GetFloat()