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