Я работаю над программой на 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, кажется, не является трудным для обработки. Может ли кто-нибудь помочь мне с?
Вы можете выполнить несколько действий, чтобы Dlib работал быстрее, прежде чем предполагать, что он медленный. Вам нужно только прочитать больше документации и попробовать.
Dlib способен обнаруживать лица на очень маленьких участках (80×80 пикселей). Вероятно, вы отправляете необработанные кадры веб-камеры с разрешением приблизительно 1280×720, что не является необходимым. По своему опыту я рекомендую уменьшить кадры примерно на четверть исходного разрешения. Да, 320×180 отлично подходит для Dlib. В результате вы получите 4x скорость.
Как уже упоминалось в комментариях, включив оптимизацию компиляции при сборке Dlib, вы значительно улучшите скорость.
Dlib работает быстрее с изображениями в оттенках серого. Вам не нужен цвет на рамке веб-камеры. Вы можете использовать OpenCV для преобразования в оттенки серого ранее уменьшенного размера кадра.
Dlib не торопится с поиском лиц, но очень быстро находит ориентиры на лицах. Только если ваша веб-камера обеспечивает высокую частоту кадров (24-30 кадров в секунду), вы можете пропустить некоторые кадры, потому что лица обычно не двигаются так сильно.
Учитывая эту оптимизацию, я уверен, что вы получите обнаружение как минимум в 12 раз быстрее.
Других решений пока нет …