Оценка позы человека
Обзор
Процесс оценки позы человека в Face SDK состоит из нескольких этапов: детекции тела и определения позы.
Детекция тел
Для детекции тел в FaceSDK используются процессинг-блоки:
*HUMAN_BODY_DETECTOR*
(Детектор тел)*OBJECT_DETECTOR*
(Детектор объектов)
Модификации и версии детекторов
Тип | Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | ||
---|---|---|---|---|---|---|
640x480 | 1280x720 | 1920x1080 | ||||
HUMAN_BODY_DETECTOR | ssyv | 1 | 3.19 | 238 | 236 | 237 |
OBJECT_DETECTOR | ssyx | 1 | 3.19 | 2095 | 2031 | 2036 |
Спецификация детекторов
- Входной
- Выходной
- Входной контейнер Context должен содержать изображение в бинарном формате.
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
}
}
- После работы процессинг-блока будет добавлен массив объектов, каждый из которых содержит координаты ограничивающего прямоугольника, уверенность детекции, класс и идентификатор в этом массиве.
{
"image" : {},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "class",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2]
}]
}
Пример детекции тел
Создание процессинг-блоков
Создайте объект процессинг-блок детектора и фиттера с помощью метода FacerecService.createProcessingBlock
, передав в качестве аргумента контейнер Context с установленными параметрами.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
auto detectorConfigCtx = service->createContext();
detectorConfigCtx["unit_type"] = "HUMAN_BODY_DETECTOR";
pbio::ProcessingBlock bodyDetector = service->createProcessingBlock(detectorConfigCtx);
detectorConfigCtx = {"unit_type": "HUMAN_BODY_DETECTOR",}
bodyDetector = service.create_processing_block(detectorConfigCtx)
Map<String, dynamic> configCtx = {"unit_type": "HUMAN_BODY_DETECTOR"};
ProcessingBlock bodyDetector = service.createProcessingBlock(configCtx);
Dictionary<object, object> configCtx = new();
configCtx["unit_type"] = "HUMAN_BODY_DETECTOR";
ProcessingBlock bodyDetector = service.CreateProcessingBlock(configCtx);
Context detectorConfigCtx = service.createContext();
detectorConfigCtx.get("unit_type").setString("HUMAN_BODY_DETECTOR");
ProcessingBlock bodyDetector = service.createProcessingBlock(detectorConfigCtx);
val detectorConfigCtx = service.createContext()
detectorConfigCtx["unit_type"].string = "HUMAN_BODY_DETECTOR"
val bodyDetector = service.createProcessingBlock(detectorConfigCtx)
Запуск детекции
Нужно подать контейнер Context с бинарным изображением в процессинг-блок детектора:
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
ioData["image"] = imgCtx;
bodyDetector(ioData);
ioData["image"] = imageCtx
bodyDetector(ioData)
ioData["image"].placeValues(imageContext);
bodyDetector.process(ioData);
ioData["image"] = imgCtx;
bodyDetector.Invoke(ioData);
ioData.get("image").setContext(imgCtx);
bodyDetector.process(ioData);
ioData["image"].setContext(imgCtx)
bodyDetector.process(ioData)
Результат выполнения детекции лица сохраняется переданный контейнер Context согласно спецификации процессинг-блока.
Оценка позы человека
Для оценки позы человека используется процессинг-блок HUMAN_POSE_ESTIMATOR
Модификации и версии
Модификация | Версия | Версия Face SDK | Время детекции CPU (мс)* | Время детекции GPU (мс)** |
---|---|---|---|---|
heavy | 1 | 3.16 | 193 | 6 |
** - GPU (NVIDIA GTX 10xx серия)
Спецификация процессинг-блока оценки позы человека
- Входной
- Выходной
- Входной контейнер Context должен содержать изображение в бинарном формате и массив объектов, полученных от детектора
{
"image" : {
"format": "NDARRAY",
"blob": "data pointer",
"dtype": "uint8_t",
"shape": [height, width, channels]
},
"objects": [{
"id": {"type": "long", "minimum": 0},
"class": "body",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2]
}]
}
- После работы процессинг-блока каждому объекту будет добавлен ключ
"keypoints"
, который содержит список ключевых точек, каждая из которых содержит значения"proj"
, которые являются относительными координатами точки и"confidence"
(уверенность) в диапазоне [0,1].
{
"keypoints": {
"nose": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_eye": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_eye": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_ear": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_ear": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_shoulder": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_shoulder": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_elbow": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_elbow": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_wrist": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_wrist": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_hip": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_hip": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_knee": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_knee": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"left_ankle": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
"right_ankle": {"proj" : [x, y], "confidence": {"type": "double", "minimum": 0, "maximum": 1}},
}
}
Пример оценки позы человека
- Создайте объект процессинг-блок оценки позы с помощью метода
FacerecService.createProcessingBlock
, передав в качестве аргумента контейнер Context с установленными параметрами.
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
auto configCtx = service->createContext();
configCtx["unit_type"] = "HUMAN_POSE_ESTIMATOR";
pbio::ProcessingBlock humanPoseEstimator = service->createProcessingBlock(configCtx);
configCtx = {"unit_type": "HUMAN_POSE_ESTIMATOR"}
humanPoseEstimator = service.create_processing_block(configCtx)
ProcessingBlock humanPoseEstimator = service.createProcessingBlock({"unit_type": "HUMAN_POSE_ESTIMATOR"});
Dictionary<object, object> configCtx = new();
configCtx["unit_type"] = "HUMAN_POSE_ESTIMATOR";
ProcessingBlock humanPoseEstimator = service.CreateProcessingBlock(configCtx);
Context configCtx = service.createContext();
configCtx.get("unit_type").setString("HUMAN_POSE_ESTIMATOR");
ProcessingBlock humanPoseEstimator = service.createProcessingBlock(detectorConfigCtx);
val configCtx = service.createContext()
configCtx["unit_type"].string = "HUMAN_POSE_ESTIMATOR"
val humanPoseEstimator = service.createProcessingBlock(configCtx)
Выполните обнаружение человека с помощью BodyDetector или ObjectDetector, как описано в разделе Запуск детекции.
Передайте полученный Context-контейнер методу
humanPoseEstimator()
:
- C++
- Python
- Flutter
- C#
- Java
- Kotlin
humanPoseEstimator(ioData);
humanPoseEstimator(ioData)
humanPoseEstimator.process(ioData);
humanPoseEstimator.Invoke(ioData);
humanPoseEstimator.process(ioData);
humanPoseEstimator.process(ioData)