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

Детекция лиц, тел и объектов

В этом разделе вы узнаете, как интегрировать детектор лица, тела и детектор объектов в ваш проект на C++ или Python.

Детекция лиц (C++/Python)

Требования

  • Операционная система Windows x86 64-bit или Linux x86 64-bit.
  • Установлен пакет Face SDK windows_x86_64 или linux_x86_64 (см. Начало работы).

1. Создание Face Detector

1.1 Для создания Face Detector, выполните шаги 1-3, описанные на странице Создание процессинг-блока и укажите следующие значения:

  • "FACE_DETECTOR" для ключа "unit_type";
  • путь до файла модели Face Detector для ключа "model_path".
configCtx["unit_type"] = "FACE_DETECTOR";

// путь по умолчанию для файла модели Face Detector - "share/facedetectors/face.enc" в корневой папке Face SDK
configCtx["model_path"] = "share/facedetectors/face.enc";

// опционально, значение по умолчанию 0,5
configCtx["confidence_threshold"] = 0.5;

// опционально, значение по умолчанию 0,5
configCtx["iou_threshold"] = 0.5;

1.2 Создайте процессинг-блок Face Detector:

pbio::ProcessingBlock faceDetector = service->createProcessingBlock(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 Поместите изображение в контейнер данных ввода-вывода:

ioData["image"] = imgCtx;

2.4 Вызовите faceDetector и передайте Context-контейнер ioData, содержащий изображение:

faceDetector(ioData);

Метод faceDetector() добавит результат обработки сэмплов (изображений) в контейнер ioData. Формат выходных данных представляет собой список объектов, доступный по ключу "objects". Каждый объект списка имеет ключ "class" со значением "face". Ключ "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] }]
}
*/

Используйте следующий код для получения результата детекции лиц и отрисовки результата на исходном изображении:

if (ioData.contains("objects"))
for(const auto& obj : ioData["objects"])
{
if(obj["class"].getString().compare("face"))
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();
примечание

Примеры использования Face Detector:

3. Ускорение на GPU

Face Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.

Детекция тел (С++/Python)

Требования

  • Операционная система 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-изображением:

# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}

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} которые являются относительными координатами исходного изображения. Ключ "confidence" содержит число типа double в диапазоне [0,1].

/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": "body",
"confidence": {"double", "minimum": 0, "maximum": 1},
"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();
примечание

Примеры использования Human Body Detector:

3. Ускорение на GPU

Human Body Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.

Детекция объектов (C++/Python)

Требования

  • Операционная система 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-изображением:

# копирование изображения в бинарный формат
input_rawimg = image.tobytes()
# помещение изображения в контейнер
imageCtx = {
"blob": input_rawimg,
"dtype": "uint8_t",
"format": "NDARRAY",
"shape": [dim for dim in img.shape]
}

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} которые являются относительными координатами исходного изображения. Ключ "confidence" содержит число типа double в диапазоне [0,1].

/*
{
"objects": [{ "id": {"type": "long", "minimum": 0},
"class": <class_of_detected_object>,
"confidence": {"double", "minimum": 0, "maximum": 1},
"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();
примечание

Примеры использования Objects Detector:

3. Ускорение на GPU

Objects Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.