Детекция лиц, тел и объектов
В этом разделе вы узнаете, как интегрировать детектор лица, тела и детектор объектов в ваш проект на C++ или Python.
Блоки детекции(C++/Python)
Типы блоков детекции для ключа "unit_type"
- FACE_DETECTOR (Детектор лица)
- HUMAN_BODY_DETECTOR (Детектор тела)
- OBJECT_DETECTOR (Детектор объектов)
1. Создание блока детекции
1.1 Для создания блока детекции выполните шаги 1-3, описанные на странице Создание процессинг-блока
и укажите значение интересующего вас блока для ключа "unit_type":
- C++
- Python
- Flutter
configCtx["unit_type"] = "FACE_DETECTOR";
// опционально, значение по умолчанию 0,5
configCtx["confidence_threshold"] = 0.5;
// опционально, значение по умолчанию 0,5
configCtx["iou_threshold"] = 0.5;
configCtx = {
"unit_type": "FACE_DETECTOR",
# опционально, значения по умолчанию указаны после двоеточия
"confidence_threshold": 0.5,
"iou_threshold": 0.5
}
Map<String, dynamic> configCtx = {
"unit_type": "FACE_DETECTOR",
// опционально, значения по умолчанию указаны после двоеточия
"confidence_threshold": 0.5,
"iou_threshold": 0.5
};
1.2 Создайте процессинг-блок детекции:
- C++
- Python
- Flutter
pbio::ProcessingBlock blockDetector = service->createProcessingBlock(configCtx);
blockDetector = service.create_processing_block(configCtx)
ProcessingBlock blockDetector = service.createProcessingBlock(configCtx);
2. Детекция
2.1 Создайте Context-контейнер ioData для данных ввода-вывода, используя метод createContext():
- C++
- Python
- Flutter
auto ioData = service->createContext();
ioData = service.create_context({})
Context ioData = service.createContext({});
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]
}
Map<String, dynamic> imageContext = {
"blob": <массив байт с изображением в RGB формате>,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [<высота изображения в пикселях>, <ширина изображения в пикселях>, 3]
};
2.3 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
- Flutter
ioData["image"] = imgCtx;
ioData["image"] = imageCtx
ioData["image"].placeValues(imageContext);
2.4 Вызовите blockDetector и передайте Context-контейнер ioData, содержащий изображение:
- C++
- Python
- Flutter
blockDetector(ioData);
blockDetector(ioData)
Context ioData = blockDetector.process(ioData);
Метод blockDetector() добавит результат обработки сэмплов (изображений) в контейнер ioData.
Формат выходных данных представляет собой список объектов, доступный по ключу "objects".
Каждый объект списка имеет ключ "class" со значением, соответсвующим классу задетектированного объекта.
Ключ "bbox" (bounding box) содержит массив из 4-х чисел типа double {x1, y1, x2, y2} которые являются относительными координатами исходного изображения.
Ключ "confidence" содержит число типа double в диапазоне [0,1].
/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": "face",
"confidence": {"double", "minimum": 0, "maximum": 1},
"bbox": [x1, y2, x2, y2] }]
}
*/