【问题标题】:How to increase speed of dnn_mmod_face_detection example如何提高 dnn_mmod_face_detection 示例的速度
【发布时间】:2019-11-22 02:56:32
【问题描述】:

我正在创建程序来模糊视频中的人脸,我想使用 http://dlib.net/dnn_mmod_face_detection_ex.cpp.html 作为人脸识别的基础,因为它具有很好的效果并且使用起来非常简单。但问题是 - 处理单个图像大约需要 75 秒,而且相当长。 dlib 库是在未启用 cuda 的情况下编译的。我的 GPU 是 nvidia geforce gtx 560 ti - 它支持 cuda,但不支持 cudnn,只要知道,如果没有这两个库,就不可能用 cude 支持编译 dlib。那么,因为我不能原生使用 GPU 加速,有什么办法可以提高程序的速度吗?我对 OpenMP 有一些经验,但我不知道我是否可以在这里使用,因为示例中最长的部分 - 这一行
auto dets = net(img);

【问题讨论】:

    标签: c++ opencv dlib


    【解决方案1】:

    您的结果是在没有 GPU 支持的情况下使用 Dlib 的 DNN 的典型结果。没有任何有意义的方法可以加速实际代码。它已经是多线程和 SIMD / AVX 优化的。要进一步加快速度,需要付出巨大的努力,可能还需要一些汇编代码工作。

    但可能还有其他选择...下面的许多建议取决于您的要求(例如要捕捉的最小面部尺寸、相机设置等)

    根据源视频的分辨率和要捕获的最小人脸尺寸,您可以使用 0 作为第二个参数调用检测:

    detector(image,0)
    

    这表明您不想对输入图像进行任何放大。目前我面前没有文档,但我相信在没有放大的情况下可以检测到的最小尺寸为 80px x 80px,这可能适用于您的情况。

    与此相同的另一种选择是在处理之前对图像进行下采样。假设您在每个维度中将图像向下采样两个并使用detector(image,0) 调用进行调用,您将只能检测到大小为 160px x 160px 的人脸。但是处理速度应该快4倍。

    如果您可以概括出人脸永远不会出现的位置,则可以将图像裁剪到相关区域并执行检测。然后只需修改检测框即可反转裁剪。

    如果您无法概括,那么您可能会使用更快的不同“预检测器”,例如 OpenCV 的全身和上半身 haarcascades。然后使用这些预检测的输出将图像裁剪成更小的图像,并对这些裁剪执行 DNN 检测。

    【讨论】:

      【解决方案2】:

      我只有一个建议,但您是否尝试过简单地使用 OpenCV 库来模糊人脸? 它支持GPU加速。您可以在此处阅读有关UMat 课程的更多信息:https://jeanvitor.com/opencv-opencl-umat-performance/。您可以简单地使用GaussianBlurMedianBlur 或任何您喜欢的对象来轻松使用这些对象。

      【讨论】:

      • 好吧,对于“模糊”,我确实使用 OpenCV。但在此之前,我需要在视频中找到面孔。为此,我使用 dlib,因为级联检测比 dlib 的网络更糟糕。我知道,我可以训练级联,但如果我已经有好的人脸检测器(dlib 的网络),我不想这样做。
      • 那么我猜这就是dlib 算法的工作原理。我认为除非使用级联,否则我们无能为力。我认为 HOG 级联只使用 int 类型的值来检测,所以它应该足够快。不过我不确定。
      猜你喜欢
      • 2015-12-20
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2020-09-06
      • 2022-01-11
      相关资源
      最近更新 更多