Детекция объектов и человеческих тел
В этом разделе вы узнаете, как интегрировать детектор человеческого тела и детектор объектов в ваш проект C++.
Детекция тел (C++)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Human Body Detector
1.1. Для создания Human Body Detector, выполните шаги 1-3, описанные на странице Создание процессинг-блока и укажите следующие значения:
"HUMAN_BODY_DETECTOR"
для ключа"unit_type"
;- путь до файла модели Human Body Detector для ключа
"model_path"
.
configCtx["unit_type"] = "HUMAN_BODY_DETECTOR";
// путь по умолчанию для файла модели Human Body Detector - "share/bodydetectors/body.enc" в корневой директории Face SDK
configCtx["model_path"] = "share/bodydetectors/body.enc";
// опционально, значение по умолчанию 0.5
configCtx["confidence_threshold"] = 0.5;
// опционально, значение по умолчанию 0.5
configCtx["iou_threshold"] = 0.5;
1.2. Создайте процессинг-блок Human Body Detector:
pbio::ProcessingBlock bodyDetector = service->createProcessingBlock(configCtx);
2. Детекция тела
2.1. Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
auto ioData = service->createContext();
2.2. Создайте Context-контейнер imgCtx
с RGB-изображением, выполнив шаги, описанные на странице
Создание контейнера Context c RGB-изображением.
2.3. Поместите исходное изображение в контейнер данных ввода-вывода:
ioData["image"] = imgCtx;
2.4. Вызовите bodyDetector
и передайте Context-контейнер ioData
, содержащий исходное изображение:
bodyDetector(ioData);
Метод bodyDetector()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
Формат выходных данных представляет собой список объектов, доступный по ключу "objects"
.
Каждый объект списка имеет ключ "class"
со значением "body"
.
Ключ "bbox"
(bounding box) содержит массив из 4-х чисел типа double {x1, y1, x2, y2}
которые являются относительными координатами исходного изображения.
Ключ "score"
содержит число типа double в диапазоне [0,1].
/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": "body",
"score": <score_value>,
"bbox": [x1, y2, x2, y2] }]
}
*/
Используйте следующий код для получения результата детекции тел и отрисовки результата на исходном изображении:
if (ioData.contains("objects"))
for(const auto& obj : ioData["objects"])
{
if(obj["class"].getString().compare("body"))
continue;
const auto& rectCtx = obj.at("bbox");
cv::Rect rect(cv::Point{rectCtx[0].getDouble()*input_image.cols, rectCtx[1].getDouble()*input_image.rows},
cv::Point{rectCtx[2].getDouble()*input_image.cols, rectCtx[3].getDouble()*input_image.rows});
cv::rectangle(image, rect, {0, 255, 0}, 1);
}
cv::imshow("img", image);
cv::waitKey();
3. Ускорение на GPU
Human Body Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.
Детекция объектов (C++)
Требования
- Операционная система Windows x86 64-bit или Linux x86 64-bit.
- Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).
1. Создание Object Detector
1.1. Для создания Human Body Detector, выполните шаги 1-3, описанные на странице Создание процессинг-блока и укажите следующие значения:
"OBJECT_DETECTOR"
для ключа"unit_type"
;- путь до файла модели Object Detector для ключа
"model_path"
.
configCtx["unit_type"] = "OBJECT_DETECTOR";
// путь по умолчанию для файла модели - "share/objectdetectors/det-object.enc" в корневой директории Face SDK
configCtx["model_path"] = "share/objectdetectors/det-object.enc";
// опционально, значение по умолчанию 0.5
configCtx["confidence_threshold"] = 0.5;
// опционально, значение по умолчанию 0.5
configCtx["iou_threshold"] = 0.5;
1.2. Создание Object Detector:
pbio::ProcessingBlock objectDetector = service->createProcessingBlock(configCtx);
2. Детекция объектов
2.1. Создайте Context-контейнер ioData
для данных ввода-вывода, используя метод createContext()
:
auto ioData = service->createContext();
2.2. Создайте Context-контейнер imgCtx
с RGB-изображением, выполнив шаги, описанные на странице
Создание контейнера Context c RGB-изображением.
2.3. Поместите исходное изображение в контейнер данных ввода-вывода:
ioData["image"] = imgCtx;
2.4. Вызовите objectDetector
и передайте Context-контейнер ioData
, содержащий исходное изображение:
objectDetector(ioData);
Метод objectDetector()
добавит результат обработки сэмплов (изображений) в контейнер ioData
.
Формат выходных данных представляет собой список объектов, доступный по ключу "objects"
.
Каждый объект списка имеет ключ "class"
со значением, соответсвующим классу задетектированного объекта.
Ключ "bbox"
(bounding box) содержит массив из 4-х чисел типа double {x1, y1, x2, y2}
которые являются относительными координатами исходного изображения.
Ключ "score"
содержит число типа double в диапазоне [0,1].
/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": <class_of_detected_object>,
"score": <score_value>,
"bbox": [x1, y2, x2, y2] }]
}
*/
Используйте следующий код для получения результата детекции объектов и отрисовки результата на исходном изображении:
if (ioData.contains("objects"))
for(const auto& obj : ioData["objects"])
{
std::string class_name = obj.at("class").getString();
const auto& rectCtx = obj.at("bbox");
cv::Rect rect(cv::Point{static_cast<int>(rectCtx[0].getDouble()*image.size[1]), static_cast<int>(rectCtx[1].getDouble()*image.size[0])},
cv::Point{static_cast<int>(rectCtx[2].getDouble()*image.size[1]), static_cast<int>(rectCtx[3].getDouble()*image.size[0])});
cv::rectangle(image, rect, {0, 255, 0}, 1);
}
cv::imshow("img", image);
cv::waitKey();
3. Ускорение на GPU
Objects Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.