Оценка лиц
В этом разделе вы узнаете, как интегрировать компоненты для оценки эмоций, пола, возраста и детекции маски в ваш проект на C++ или Python.
Оценка эмоций (C++/Python)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Emotion Estimator
1.1 Для создания Emotion Estimator, выполните шаги 1-3, описанные на странице Создание процессинг-блока и укажите следующие значения:
"EMOTION_ESTIMATOR"
для ключа"unit_type"
;- путь до файла модели Emotion Estimator для ключа
"model_path"
.
- C++
- Python
configCtx["unit_type"] = "EMOTION_ESTIMATOR";
// путь по умолчанию для файла модели Emotion Estimator - "share/faceanalysis/emotion.enc" в корневой директории Face SDK
configCtx["model_path"] = "share/faceanalysis/emotion.enc";
configCtx = {
"unit_type": "EMOTION_ESTIMATOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/faceanalysis/emotion.enc"
}
1.2 Создайте процессинг-блок Emotion Estimator:
- C++
- Python
pbio::ProcessingBlock emotionEstimator = service->createProcessingBlock(configCtx);
emotionEstimator = service.create_processing_block(configCtx)
2. Оценка эмоций
2.1 Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
auto ioData = service->createContext();
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением, выполнив шаги, описанные на странице
Создание контейнера Context c RGB-изображением:
# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}
2.3. Поместите исходное изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4. Выполните обрезку лица. Для этого вы можете воспользоваться блоком Face Detector, сохранить результаты в контейнер faceData
, выполнить обрезку по координатам bbox'а
и передать изображение в контейнер ioData
:
// обрезка изображения
const auto& rectCtx = obj.at("bbox");
int x = std::max(static_cast<int>(rectCtx[0].getDouble()*image.size[1]), 0);
int y = std::max(static_cast<int>(rectCtx[1].getDouble()*image.size[0]), 0);
int width = std::min(static_cast<int>(rectCtx[2].getDouble()*image.size[1]), image.size[1]) - x;
int height = std::min(static_cast<int>(rectCtx[3].getDouble()*image.size[0]), image.size[0]) - y;
pbio::RawSample::Rectangle rect(x, y, width, height);
pbio::RawImage raw_image_crop = input_rawimg.crop(rect);
// сохранение изображения
auto imgCtx = ioData["image"]; // поверхностная копия (референс), "auto" выводится в pbio::Context::Ref
// для создания глубокой копии определите pbio::Context imgCtx = ioData["image"];
pbio::context_utils::putImage(imgCtx, raw_image_crop);
2.5. Вызовите emotionEstimator()
и передайте Context-контейнер ioData
, содержащий обрезанное изображение:
- C++
- Python
emotionsEstimator(ioData);
emotionsEstimator(ioData)
Метод emotionsEstimator()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
Формат выходных данных представляет собой список объектов, доступный по ключу "objects"
.
Каждый объект списка имеет ключ "class"
со значением "face"
.
/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": "face",
"emotions" : [
"confidence": {"type": "double", "minimum": 0, "maximum": 1},
"emotion": {
"enum": ["ANGRY", "DISGUSTED", "SCARED", "HAPPY", "NEUTRAL", "SAD", "SURPRISED"]
}
]
}]
}
*/
Примеры использования Emotion Estimator:
3. Ускорение на GPU
Emotion Estimator может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.
Оценка возраста (C++/Python)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установленный Face SDK пакет windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Age Estimator
1.1 Для создания Age Estimator, выполните шаги 1-3 описанные в Создание процессинг-блока и укажите следующие значения:
"AGE_ESTIMATOR"
для ключа"unit_type"
;- путь до файла модели Age Estimator для ключа
"model_path"
.
- C++
- Python
configCtx["unit_type"] = "AGE_ESTIMATOR";
// путь по умолчанию к файлу модели Age Estimator — "share/faceanalysis" в корневом каталоге Face SDK. Доступны две версии — age_heavy и age_light, отличающиеся размером, качеством и скоростью вывода.
configCtx["model_path"] = "share/faceanalysis/age_heavy.enc";
configCtx = {
"unit_type": "AGE_ESTIMATOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/faceanalysis/age_heavy.enc"
}
1.2 Создание процессинг-блока Age Estimator:
- C++
- Python
pbio::ProcessingBlock ageEstimator = service->createProcessingBlock(configCtx);
ageEstimator = service.create_processing_block(configCtx)
2. Оценка возраста
2.1 Создайте контейнер Context ioData
для ввода/вывода данных, используя метод createContext()
:
auto ioData = service->createContext();
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением, следуя шагам, описанным на
Создание контейнера Context c RGB-изображением:
# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}
2.3 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Выполните обрезку лица и сохраните в контейнер ioData
, см. Оценка эмоций, пункт 2.4.
2.5 Вызовите ageEstimator()
и передайте контейнер ioData
с обрезанным изображением:
- C++
- Python
ageEstimator(ioData);
ageEstimator(ioData)
Результат вызова ageEstimator()
будет помещен в контейнерioData
.
/*
{
"objects": [{ "age": {"type": "long", "minimum": 0},
"class": "face",
"id": {"type": "long", "minimum": 0}
}]
}
*/
Примеры использования Age Estimator:
3. Ускорение на GPU
Age Estimator может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.
Оценка пола (C++/Python)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Gender Estimator
1.1 Для создания Gender Estimator, выполните шаги 1-3, описанные на странице Создание процессинг-блока и укажите следующие значения:
"GENDER_ESTIMATOR"
для ключа"unit_type"
;- путь до файла модели Gender Estimator для ключа
"model_path"
.
- C++
- Python
configCtx["unit_type"] = "GENDER_ESTIMATOR";
// путь по умолчанию к файлу модели Gender Estimator — «share/faceanalysis/» в корневом каталоге Face SDK. Доступны две версии — gender_heavy и gender_light, различающиеся по размеру, качеству и скорости вывода.
configCtx["model_path"] = "share/faceanalysis/gender_heavy.enc";
configCtx = {
"unit_type": "GENDER_ESTIMATOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/faceanalysis/gender_heavy.enc"
}
1.2 Создайте процессинг-блок Gender Estimator:
- C++
- Python
pbio::ProcessingBlock genderEstimator = service->createProcessingBlock(configCtx);
genderEstimator = service.create_processing_block(configCtx)
2. Оценка пола
2.1 Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
auto ioData = service->createContext();
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением, выполнив шаги, описанные на странице
Создание контейнера Context c RGB-изображением:
# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}
2.3 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Выполните обрезку лица и сохраните в контейнер ioData
, см. Оценка эмоций, пункт 2.4.
2.5 Вызовите genderEstimator
и передайте Context-контейнер ioData
, содержащий обрезанное изображение:
- C++
- Python
genderEstimator(ioData);
genderEstimator(ioData)
Метод genderEstimator()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
/*
{
"objects": [{ "class": "face",
"gender": {
"enum": ["FEMALE", "MALE"]
},
"id": {"type": "long", "minimum": 0}
}]
}
*/
Примеры использования Gender Estimator:
3. Ускорение на GPU
Gender Estimator может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.
Детекция маски (C++/Python)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Mask Estimator
1.1 Для создания Mask Estimator, выполните шаги 1-3 описанные в Создание процессинг-блока и укажите следующие значения:
"MASK_ESTIMATOR"
для ключа"unit_type"
;- путь до файла модели Mask Estimator для ключа
"model_path"
; - значение для ключа
"confidence_threshold"
(порог уверенности в наличии/отсутствии маски на лице).
- C++
- Python
configCtx["unit_type"] = "MASK_ESTIMATOR";
// путь по умолчанию к файлу модели Mask Estimator — "share/faceattributes/mask.enc" в корневом каталоге Face SDK.
configCtx["model_path"] = "share/faceattributes/mask.enc";
// значение "confidence_threshold" по умолчанию равно 0,5.
configCtx["confidence_threshold"] = 0.5;
configCtx = {
"unit_type": "MASK_ESTIMATOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/faceattributes/mask.enc",
# опционально, значение по умолчанию указано после двоеточия
"confidence_threshold" = 0.5
}
1.2 Создайте процессинг-блок Mask Estimator:
- C++
- Python
pbio::ProcessingBlock maskEstimator = service->createProcessingBlock(configCtx);
maskEstimator = service.create_processing_block(configCtx)
2. Детекция маски
2.1 Создайте контейнер Context ioData
для ввода/вывода данных, используя метод createContext()
:
auto ioData = service->createContext();
2.2 Создайте Context-контейнер imgCtx
с RGB-изображением, следуя шагам, описанным на
Создание контейнера Context c RGB-изображением:
# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}
2.3 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Выполните обрезку лица и сохраните в контейнер ioData
, см. Оценка эмоций, пункт 2.4.
2.5 Вызовите maskEstimator()
и передайте контейнер ioData
с изображением:
- C++
- Python
maskEstimator(ioData);
maskEstimator(ioData)
Результат вызова maskEstimator()
будет добавлен в контейнер ioData
:
/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": "face",
"has_medical_mask": {
"confidence": {"double", "minimum": 0, "maximum": 1}, // числовое значение уверенности в наличии/отсутствии маски на лице
"value": {"type": "boolean"} // true - человек в маске, false - человек без маски. Значение параметра "value" определяется по значению ключа `confidence_threshold`
}
}]
}
*/
Примеры использования Mask Estimator:
3. Ускорение на GPU
Mask Estimator может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.