Захват веб-камеры Dlib с распознаванием лиц и предсказанием формы идет медленно

Я работаю над программой на C ++, которая должна распознавать лица из потока веб-камеры, а затем обрезать их, используя ориентиры лиц, и поменять их местами.

Я запрограммировал распознавание лиц с использованием OpenCV и Viola-Jones. Работает отлично. Чем я искал, как отделить только лицо от ROI. Я пробовал несколько реализаций обнаружения кожи, но ни одна из них не увенчалась успехом.

Чем я обнаружил длиб вех. Я решил попробовать. Просто в начале я столкнулся с проблемами, потому что мне пришлось конвертировать cv::Mat в cv_imageПрямоугольник и т. Д. Поэтому я попытался сделать это только с помощью dlib. Я просто получаю поток, используя cv::VideoCapture и чем я хотел показать, что захватывается с помощью dlib image_window, Но здесь была проблема, это было очень медленно. Вниз используется код. Комментируемые строки — это строки, которые делают то же самое, но с использованием OpenCV. OpenCV намного быстрее, плавнее, непрерывнее, чем код, который не комментируется, как 5 FPS. Это ужасно. Я не могу себе представить, насколько медленно это будет, когда я применяю распознавание лица и ориентиры лица.

Я делаю что-то неправильно? Как я могу сделать это быстрее? Или я должен использовать OpenCV для захвата и показа видео?

cv::VideoCapture cap;
image_window output_frame;

if (!cap.open(0))
{
cout << "ERROR: Opening video device 0 FAILED." << endl;
return -1;
}

cv::Mat cap_frame;
//HWND hwnd;
do
{
cap >> cap_frame;

if (!cap_frame.empty())
{
cv_image<bgr_pixel> dlib_frame(cap_frame);
output_frame.set_image(dlib_frame);
//cv::imshow("output",dlib::toMat(dlib_frame));
}

//if (27 == char(cv::waitKey(10)))
//{
//  return 0;
//}

//hwnd = FindWindowA(NULL, "output");
} while(!output_frame.is_closed())//while (hwnd != NULL);

РЕДАКТИРОВАТЬ:
После перехода в режим Release показ снятых кадров становится нормальным.
Но я продолжаю и пытался сделать распознавание лиц а также прогнозирование формы с dlib как в примере здесь http://dlib.net/face_landmark_detection_ex.cpp.html. Это было довольно медленно. Поэтому я отключил прогнозирование формы. Все еще «отстает».

Поэтому я предположил, что обнаружение лица замедляет его. Так что я пробовал распознавать лица с помощью OpenCV потому что это было значительно лучше детектора dlib. Мне нужно было преобразовать обнаруженный cv :: Rect в dlib :: rectangle. Я использовал это.

std::vector<dlib::rectangle> dlib_rois;
long l, t, r, b;

for (int i = cv_rois.size() - 1; i >= 0; i--)
{
l = cv_rois[i].x;
t = cv_rois[i].y;
r = cv_rois[i].x + cv_rois[i].width;
b = cv_rois[i].y + cv_rois[i].height;
dlib_rois.push_back(dlib::rectangle(l, t, r, b));
}

Но это сочетание OpenCV распознавание лиц а также прогноз формы формы стать жестоким отсталым. Это занимает около 4S для обработки одного кадра.

Я не могу понять, почему. OpenCV распознавание лиц было абсолютно точным, прогнозирование формы dlib, кажется, не является трудным для обработки. Может ли кто-нибудь помочь мне с?

4

Решение

Вы можете выполнить несколько действий, чтобы Dlib работал быстрее, прежде чем предполагать, что он медленный. Вам нужно только прочитать больше документации и попробовать.

  • Dlib способен обнаруживать лица на очень маленьких участках (80×80 пикселей). Вероятно, вы отправляете необработанные кадры веб-камеры с разрешением приблизительно 1280×720, что не является необходимым. По своему опыту я рекомендую уменьшить кадры примерно на четверть исходного разрешения. Да, 320×180 отлично подходит для Dlib. В результате вы получите 4x скорость.

  • Как уже упоминалось в комментариях, включив оптимизацию компиляции при сборке Dlib, вы значительно улучшите скорость.

  • Dlib работает быстрее с изображениями в оттенках серого. Вам не нужен цвет на рамке веб-камеры. Вы можете использовать OpenCV для преобразования в оттенки серого ранее уменьшенного размера кадра.

  • Dlib не торопится с поиском лиц, но очень быстро находит ориентиры на лицах. Только если ваша веб-камера обеспечивает высокую частоту кадров (24-30 кадров в секунду), вы можете пропустить некоторые кадры, потому что лица обычно не двигаются так сильно.

Учитывая эту оптимизацию, я уверен, что вы получите обнаружение как минимум в 12 раз быстрее.

13

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]