Детекция лиц, тел и объектов
В этом разделе вы узнаете, как интегрировать детектор лица, тела и детектор объектов в ваш проект на 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] }]
}
*/