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

时间:2017-11-09 13:18:58

标签: opencv halide

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

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

  • squeezenet_halide:卤化物约24ms,无卤化物约16ms。
  • resnet_ssd_face:卤化物约84ms,无卤化物约36ms。

我按照this tutorial中的说明编译了halide和opencv。 opencv代码是从master branch of the opencv git repository下载的。

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

net.setPreferableBackend(DNN_BACKEND_HALIDE);  // use Halide

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

在调用“前进”功能后,使用此代码测量时间:

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

2 个答案:

答案 0 :(得分:2)

考虑到Dmitry Kurtaev的评论并在OpenCV GitHub帐户中查找wiki,我发现a page其中包含了比较不同方法的基准(我错过了教程中的链接)。< / p>

此外,还有merge request,其中包含类似的基准。

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

我可以假设Halide集成处于早期阶段。此外,作为Zalman Stern注释,Halide调度是一项正在进行的工作,opencv的dnn模块中的原始优化可能比包含的Halide调度更准确。

我希望这些措施可能会在OpenCV的未来版本中发生变化,但就目前来说,这就是性能。

答案 1 :(得分:1)

我的回答虽然无关紧要但很有帮助

用于面部检测+面部对齐:

正常SSD检测时间:50-55ms

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

enter image description here