首页 文章

具有面部检测和形状预测的Dlib网络摄像头捕获速度很慢

提问于
浏览
4

我正在研究C中的一个程序,该程序应该检测来自网络摄像头流的面部,而不是使用面部标记裁剪它们并交换它们 .

我使用OpenCV和Viola-Jones人脸检测编程了人脸检测 . 工作良好 . 比我搜索如何从ROI分割面部 . 我尝试了很少的皮肤检测实现,但没有一个成功 .

比我发现dlib面临的地标 . 我决定尝试一下 . 刚开始时我遇到了问题,因为我必须将 cv::Mat 转换为 cv_image ,将Rect转换为矩形等等 . 所以我尝试用dlib来做 . 我只是使用 cv::VideoCapture 获取流,而不是我想显示使用dlib image_window 捕获的内容 . 但问题是这个问题很慢 . Down是使用代码 . 注释行是使用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);

EDIT: 切换到释放模式后,显示捕获的帧变得正常 . 但我继续尝试用 dlibface detectionshape prediction ,就像这里的示例http://dlib.net/face_landmark_detection_ex.cpp.html一样 . 这是相当迟钝的 . 所以我关闭了形状预测 . 仍然“滞后 .

所以我假设面部检测正在减慢速度 . 所以我 tried face detection using OpenCV 因为它是 significantly better than dlib detector . 我需要将检测到的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 face detectiondlib shape prediction 的这种组合变得残酷滞后 . 大概需要 4s to process single frame.

我无法弄清楚为什么 . OpenCV人脸检测绝对精细,dlib形状预测似乎并不难处理 . 有人可以帮我吗?

1 回答

  • 13

    在假设Dlib运行缓慢之前,您可以采取多种措施使Dlib运行得更快 . 您只需阅读更多文档并尝试 .

    • Dlib能够在非常小的区域(80x80像素)中检测面部 . 您可能以大约1280x720的分辨率发送原始WebCam帧,这是不必要的 . 根据我的经验,我建议将帧数减少大约原始分辨率的四分之一 . 是的,320x180适用于Dlib . 结果你将获得4倍的速度 .

    • 如评论中所述,通过在构建Dlib时启用编译优化,您将获得显着的速度提升 .

    • Dlib可以更快地处理灰度图像 . 您不需要网络摄像头框架上的颜色 . 您可以使用OpenCV将之前缩小尺寸的帧转换为灰度 .

    • Dlib花时间寻找面孔但是在脸上找到地标非常快 . 只有当您的网络摄像头提供高帧率(24-30fps)时,您才可以跳过一些帧,因为脸部通常不会移动太多 .

    鉴于优化,我相信你的检测速度至少要快12倍 .

相关问题