如何提高 dnn_mmod_face_detection 示例的速度

How to increase speed of dnn_mmod_face_detection example

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

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

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

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

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

detector(image,0)

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

另一个选择,沿着相同的路线是在处理之前对图像进行降采样。假设您在每个维度上对图像进行 2 次采样并使用 detector(image,0) 调用进行调用,您将只能检测到大小为 160px x 160px 的人脸。但是处理速度应该快4倍

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

如果您不能概括,那么您可能会使用不同的 "pre-detector",它比 OpenCV 的全身和上半身 haarcascade 更快。然后使用这些 pre-detections 的输出将图像裁剪成更小的图像,并对这些裁剪进行 DNN 检测。