Оценка лиц
Обзор
Для оценки лиц в Face SDK процессинг-блоки оценки.
Процессинг-блоки оценки лица
На текущий момент существуют следующие блоки оценки:
AGE_ESTIMATOR
— блок для оценки возрастаGENDER_ESTIMATOR
— блок для оценки полаEMOTION_ESTIMATOR
— блок для оценки эмоций человкаMASK_ESTIMATOR
— блок для оценки наличия медецинской маскиEYE_OPENNESS_ESTIMATOR
— блок для оценки открытости глаз
Модификации и версии
- AGE_ESTIMATOR
- GENDER_ESTIMATOR
- EMOTION_ESTIMATOR
- MASK_ESTIMATOR
- EYE_OPENNESS_ESTIMATOR
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** | Точность, лет(средняя погрешность) |
---|---|---|---|---|---|
light | 1 | 3.19 | 1 | 2 | 5.5 |
2 | 1 | 2 | 4.9 | ||
heavy | 1 | 3.19 | 1 | 2 | 4.7 |
2 | 1 | 2 | 3.5 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию - heavy
.
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** | Точность, % |
---|---|---|---|---|---|
light | 1 | 3.19 | 1 | 2 | 95 |
2 | 1 | 2 | 96 | ||
heavy | 1 | 3.19 | 1 | 2 | 96 |
2 | 1 | 2 | 97 | ||
3 | 3.20 | 1 | 2 | 97.5 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию - heavy
.
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** | Точность, % |
---|---|---|---|---|---|
heavy | 1 | 3.19 | 28 | 4 | 80 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию - heavy
.
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** |
---|---|---|---|---|
light | 1 | 3.19 | 1 | 2 |
2 | 1 | 2 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию - light
.
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** |
---|---|---|---|---|
light | 1 | 3.21 | 3 | 1 |
** - GPU (NVIDIA GTX 10xx серия)
Модификация по умолчанию - light
.
Спецификация процессинг-блока оценки лица
Входной контейнер 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:
- AGE_ESTIMATOR
- GENDER_ESTIMATOR
- EMOTION_ESTIMATOR
- MASK_ESTIMATOR
- EYE_OPENNESS_ESTIMATOR
[{
"age": {"type": "long", "minimum": 0}
}]
[{
"gender": {
"enum": ["FEMALE", "MALE"]
}
}]
[{
"emotions" : [
"confidence": {"type": "double", "minimum": 0, "maximum": 1},
"emotion": {
"enum": ["ANGRY", "DISGUSTED", "SCARED", "HAPPY", "NEUTRAL", "SAD", "SURPRISED"]
}
]
}]
[{
"has_medical_mask": {
"confidence": {"double", "minimum": 0, "maximum": 1}, // числовое значение уверенности в наличии/отсутствии маски на лице
"value": {"type": "boolean"} // true - человек в маске, false - человек без маски. Значение параметра "value" определяется по значению ключа `confidence_threshold`
}
}]
[{
"is_left_eye_open": {
"confidence": {"double", "minimum": 0, "maximum": 1}, // числовое значение уверенности в открытости левого глаза
"value": {"type": "boolean"} // true - глаз открыт, false - глаз закрыт. Значение параметра "value" определяется по значению ключа `confidence_threshold`
},
"is_right_eye_open": {
"confidence": {"double", "minimum": 0, "maximum": 1}, // числовое значение уверенности в открытости правого глаза
"value": {"type": "boolean"} // true - глаз открыт, false - глаз закрыт. Значение параметра "value" определяется по значению ключа `confidence_threshold`
}
}]
Пример работы с процессинг-блоком оценки
Для оценки атрибутов лица на изображении выполните следующие действия:
Создайте конфигурационный Context-контейнер и укажите значения
"unit_type"
,"modification"
,"version"
, интересующего вас блока Пример создания процессинг-блока вы можете найти на странице Работа с процессинг-блоком. Перечень настраиваемых параметров процессинг-блоковПередайте Context-контейнер, полученный после работы процессинг-блоков детекции лица и фиттера.
Вызовете процессинг-блок оценки.
Получите результат работы процессинг-блока.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
auto configCtx = service->createContext();
configCtx["unit_type"] = "AGE_ESTIMATOR";
pbio::ProcessingBlock blockEstimator = service->createProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector(ioData);
faceFitter(ioData);
blockEstimator(ioData);
long age = ioData["objects"][0]["age"].getLong();
configCtx = {"unit_type": "AGE_ESTIMATOR"}
blockEstimator = service.create_processing_block(configCtx)
#------------------
# создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
#------------------
faceDetector(ioData)
faceFitter(ioData)
blockEstimator(ioData)
age = ioData["objects"][0]["age"].get_value()
ProcessingBlock blockEstimator = service.createProcessingBlock({"unit_type": "AGE_ESTIMATOR"});
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockEstimator.process(ioData);
int age = ioData["objects"][0]["age"].get_value();
Dictionary<object, object> configCtx = new();
configCtx["unit_type"] = "AGE_ESTIMATOR";
ProcessingBlock blockEstimator = service.CreateProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.Invoke(ioData);
faceFitter.Invoke(ioData);
blockEstimator.Invoke(ioData);
long age = ioData["objects"][0]["age"].GetLong();
Context configCtx = service.createContext();
configCtx.get("unit_type").setString("AGE_ESTIMATOR");
ProcessingBlock blockEstimator = service.createProcessingBlock(configCtx);
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData);
faceFitter.process(ioData);
blockEstimator.process(ioData);
long age = ioData.get("objects").get(0).get("age").getLong();
val configCtx = service.createContext()
configCtx["unit_type"].string = "AGE_ESTIMATOR"
val blockEstimator = service.createProcessingBlock(configCtx)
//------------------
// создание процессинг-блока оценки лица и Context-контейнера с бинарным изображением
//------------------
faceDetector.process(ioData)
faceFitter.process(ioData)
blockEstimator.process(ioData)
val age = ioData["objects"][0]["age"].long