Уязвимость Dlib для обнаружения лица на C++, хорошая в python, почему?

75
7

Я пытаюсь написать простой алгоритм обнаружения лиц, используя OpenCV для захвата камеры и Dlib для обнаружения лиц (используя алгоритм Histogram of Oriented Gradients).

Используя Python, я получаю приличную производительность со скоростью около 20 кадров в секунду. Тем не менее, тот же самый код в C++ имеет очень низкую производительность, при этом каждый процесс обнаружения dlib занимает около 4 секунд.

Кто-нибудь знает, что происходит?

Я сделал некоторую оптимизацию, но ничто действительно не улучшало показатели:

    снижается изображение до 640x480 Я скомпилировал dlib с инструкциями AVX Я также попытался скомпилировать флаг -0fast...

Спасибо за помощь.

EDIT: решение найдено! Мне удалось достичь аналогичной хорошей производительности в C++ путем компиляции с использованием команд в конце этого сообщения. До этого я использовал компилятор из Jetbrain CLion IDE, и он не работал должным образом, даже если компилятор отправил положительное сообщение "AVX intructions enabled". Инструкции AVX были ответом на мою проблему.

Вот коды:

В C++:

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing.h>

using namespace dlib;
using namespace std;

int main(){

cv::VideoCapture cap(0);
vector<cv::Rect> facesCV;
vector<rectangle> faces;
frontal_face_detector detector = get_frontal_face_detector();
cv::namedWindow("test");
cv::Mat frame, small;

if (!cap.isOpened()) {
cerr << "Unable to connect to camera" << endl;
return 1;
}

while (true) {
// Grab a frame
if (!cap.read(frame)) {
break;
}
cv::resize(frame, small, {640, 480});
cv_image<rgb_pixel> cimg(small);

// Detect faces
faces = detector(cimg);
for (auto &f : faces) {
facesCV.emplace_back(cv::Point((int) f.left(), (int) f.top()), cv::Point((int) f.right(), (int) f.bottom()));
}

for (auto &r : facesCV) {
cv::rectangle(small, r, {0, 255, 0}, 2);
}
cv::imshow("test", small);
cv::waitKey(1);
faces.clear();
facesCV.clear();
}
}

В Python:

import argparse
import cv2
import dlib

#initialize face detector
detector = dlib.get_frontal_face_detector()

#initialize video source
cam = cv2.VideoCapture(0)
window = cv2.namedWindow("camera")

while True:
ret, image = cam.read()
if ret is True:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray =cv2.resize(gray, (640, 480))

for r in detector(gray, 0):
cv2.rectangle(image, (r.left(), r.top()), (r.right(), r.bottom()), (0, 255, 0), 2)

cv2.imshow(window, image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

else:
break

cam.release()
cv2.destroyAllWindows()

Для компиляции C++ я использую cmake, это мой CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(FaceDetection)

set(CMAKE_CXX_STANDARD 14)
set(GCC_COVERAGE_COMPILE_FLAGS " -Ofast")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

add_subdirectory(/path/to/dlib/dlib-19.14/dlib dlib_build)
find_package( OpenCV REQUIRED)

add_executable(FaceDetection main.cpp)
target_link_libraries( FaceDetection ${OpenCV_LIBS} dlib::dlib)

Я запускаю компиляцию со следующими командами:

cmake . -DUSE_AVX_INSTRUCTIONS=ON
cmake --build . --config Release

спросил(а) 2021-01-19T12:48:13+03:00 2 месяца, 4 недели назад
1
Решение
86

Проблема возникла из CMakeLists.txt. Оптимизация AVX должна быть установлена в CMakeLists.txt следующим образом:

cmake_minimum_required(VERSION 3.10)
project(FaceDetection)

set(CMAKE_CXX_STANDARD 14)

## Add Lib Dlib
# HERE IS THE AVX OPTIMIZATION
set(USE_AVX_INSTRUCTIONS ON CACHE BOOL "Use AVX instructions")
set(DLIB_USE_LAPACK ON CACHE BOOL "Use Lapack library")
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/dlib-19.14/dlib" dlib_build)

find_package( OpenCV REQUIRED)

add_executable(FaceDetection main.cpp)
target_link_libraries( FaceDetection ${OpenCV_LIBS} dlib::dlib)

ответил(а) 2021-01-19T12:48:13+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема