如果我使用 Halide,为什么 opencv dnn 会变慢?

Why is opencv dnn slower if I use Halide?

我正在测试 opencv 源代码树中一些示例的性能,具体取决于是否使用卤化物。

令人惊讶的是,如果使用卤化物进行计算,性能会更差:

我已经按照 this tutorial. The opencv code was downloaded from the master branch of the opencv git repository 中的说明编译了 halide 和 opencv。

我已经使用示例文件 'resnet_ssd_face.cpp' 和 'squeezenet_halide.cpp' 测试了性能。在这两种情况下,我都在调用 'forward' 之前包含了这些代码行之一,以激活或停用卤化物:

net.setPreferableBackend(DNN_BACKEND_HALIDE);  // use Halide

net.setPreferableBackend(DNN_BACKEND_DEFAULT);   // NOT use Halide

时间是在调用 'forward' 函数后使用此代码测量的:

std::vector<double> layersTimings;
double freq = cv::getTickFrequency() / 1000;
double time = net.getPerfProfile(layersTimings) / freq;
std::cout << "Time: " << time << " ms" << std::endl;

教程中是否遗漏了什么? Halide 应该用不同的参数编译吗?

我的设置是:

OS: Linux (Ubuntu 16.04)
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
GPU: nVidia GeForce GT 730 (Driver Version: 384.90)
Cuda: CUDA Version 9.0.176

考虑到 Dmitry Kurtaev and looking the wiki in the OpenCV GitHub account, I found a page 的评论,其中包含比较不同方法的基准(我错过了教程中的链接)。

此外,还有一个 merge request 包含了类似的基准。

在两者中,时间测量表明使用 Halide 的性能比使用原始 c++ 方法的性能差。

我可以假设 Halide 集成处于早期阶段。此外,正如 Zalman Stern 评论,Halide 调度正在进行中,opencv 的 dnn 模块中的原始优化可能比包含的 Halide 调度更准确。

我希望这个措施能在未来的 OpenCV 版本中有所改变,但就目前而言,这就是性能。

我的回答有点不相关但很有帮助

人脸检测+人脸对齐:

正常 SSD 检测时间:50 - 55 毫秒

使用 Openvino 推理引擎:40 - 45 毫秒