Перейти к основному содержимому
Версия: 3.15.0

Детекция объектов и человеческих тел

В этом разделе вы узнаете, как интегрировать детектор человеческого тела и детектор объектов в ваш проект 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.