如何提高dnn_mmod_face_detection示例的速度

时间:2019-07-12 10:39:05

标签: c++ opencv dlib

我正在创建程序来模糊视频中人们的脸,我想使用 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);

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的结果是使用不带GPU支持的Dlib的DNN的典型结果。没有有意义的方法来加快实际代码的速度。它已经是多线程的,并且SIMD / AVX已优化。要进一步加快速度,将需要大量的精力,并且可能需要一些汇编代码。

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

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

detector(image,0)

这将表明您不想对输入图像进行任何放大。我目前暂无文档,但我相信无需放大即可检测到的最小尺寸的人脸为80px x 80px,这可能适合您的情况。

另一种方法是在处理之前对图像进行下采样。假设您在每个维度上对图像进行2倍采样并使用detector(image,0)进行调用,您将只能检测到160px x 160px的面部。但是处理速度应该快4倍。

如果可以概括面部永远不会出现的地方,则可以将图像裁剪到相关区域并进行检测。然后,只需修改检测框即可使作物倒转。

如果不能一概而论,则可以使用另一个更快的“前置检测器”,就像OpenCV的全身和上身曲线一样。然后使用这些预先检测的输出将图像裁剪为较小的图像,并对这些作物执行DNN检测。