Детекция лиц, тел и объектов
В этом разделе вы узнаете, как интегрировать детектор лица, тела и детектор объектов в ваш проект на 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"
.
- C++
- Python
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;
configCtx = {
"unit_type": "FACE_DETECTOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/facedetectors/face.enc",
# опционально, значения по умолчанию указаны после двоеточия
"confidence_threshold": 0.5,
"iou_threshold": 0.5
}
1.2 Создайте процессинг-блок Face Detector:
- C++
- Python
pbio::ProcessingBlock faceDetector = service->createProcessingBlock(configCtx);
faceDetector = service.create_processing_block(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 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Вызовите faceDetector
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
faceDetector(ioData);
faceDetector(ioData)
Используйте следующий код для получения результата детекции лиц и отрисовки результата на исходном изображении:
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();
Метод 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] }]
}
*/
Примеры использования 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"
.
- C++
- Python
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;
configCtx = {
"unit_type": "HUMAN_BODY_DETECTOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/bodydetectors/body.enc",
# опционально, значения по умолчанию указаны после двоеточия
"confidence_threshold": 0.5,
"iou_threshold": 0.5
}
1.2 Создайте процессинг-блок Human Body Detector:
- C++
- Python
pbio::ProcessingBlock bodyDetector = service->createProcessingBlock(configCtx);
bodyDetector = service.create_processing_block(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 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Вызовите bodyDetector
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
bodyDetector(ioData);
bodyDetector(ioData)
Используйте следующий код для получения результата детекции тел и отрисовки результата на исходном изображении:
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();
Метод 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]
}]
}
*/
Примеры использования 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"
.
- C++
- Python
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;
configCtx = {
"unit_type": "OBJECT_DETECTOR",
# путь указан относительно корневой директории Face SDK
"model_path": "share/objectdetectors/det-object.enc",
# опционально, значения по умолчанию указаны после двоеточия
"confidence_threshold": 0.5,
"iou_threshold": 0.5
}
1.2 Создание Object Detector:
- C++
- Python
pbio::ProcessingBlock objectDetector = service->createProcessingBlock(configCtx);
objectDetector = service.create_processing_block(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 Поместите изображение в контейнер данных ввода-вывода:
- C++
- Python
ioData["image"] = imgCtx;
ioData = {"image": imgCtx}
2.4 Вызовите objectDetector
и передайте Context-контейнер ioData
, содержащий изображение:
- C++
- Python
objectDetector(ioData);
objectDetector(ioData)
Используйте следующий код для получения результата детекции объектов и отрисовки результата на исходном изображении:
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();
Метод 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]
}]
}
*/
Примеры использования Objects Detector:
3. Ускорение на GPU
Objects Detector может быть использован с ускорением на GPU (CUDA). Более подробная информация в разделе Ускорение на GPU.