首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV GAPI的性能不像预期的那样好

OpenCV GAPI的性能不像预期的那样好
EN

Stack Overflow用户
提问于 2020-03-11 04:36:14
回答 2查看 1.6K关注 0票数 2

但是,我做了下面的测试,结果并不好,因为我希望GAPI能够有很大的改进。我不知道我是否做错了什么,我希望你能帮我纠正,非常感谢!

我的测试环境是OpenCV4.2正式构建,Windows 10 x64,VS2019 Releasex64,i7-8700K。

代码语言:javascript
运行
复制
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>

std::string image_path = "1.png";
cv::Mat GAPITEST(const cv::Mat& input_frame)
{
    cv::Mat output_frame;

    cv::GMat in;
    cv::GMat vga = cv::gapi::resize(in, cv::Size(), 0.5, 0.5);
    cv::GMat gray = cv::gapi::BGR2Gray(vga);
    cv::GMat blurred = cv::gapi::blur(gray, cv::Size(5, 5));
    cv::GMat out = cv::gapi::Canny(blurred, 32, 128, 3);
    cv::GComputation ac(in, out);

    int64 t0 = cv::getTickCount();
    for(int i=0;i<200;i++)
        ac.apply(input_frame, output_frame);
    int64 t1 = cv::getTickCount();
    std::cout <<__func__<< "\t seconds:" << (t1 - t0) / cv::getTickFrequency()<<std::endl;

    return output_frame;
}

cv::Mat TraditionalTEST(const cv::Mat& input_frame)
{
    cv::Mat output_frame;
    cv::Mat vga;
    cv::Mat gray;
    cv::Mat blurred;

    int64 t0 = cv::getTickCount();
    for (int i = 0; i < 200; i++)
    {
        cv::resize(input_frame,vga, cv::Size(), 0.5, 0.5);
        cv::cvtColor(vga, gray, cv::COLOR_BGR2GRAY);
        cv::blur(gray, blurred,cv::Size(5,5));
        cv::Canny(blurred,output_frame,32,128,3);
    }
    int64 t1 = cv::getTickCount();
    std::cout << __func__ << "\t seconds:" << (t1 - t0) / cv::getTickFrequency()<<std::endl;
    return output_frame;
}
int main()
{
    cv::Mat input_frame = cv::imread(image_path);
    cv::imshow("input_frame",input_frame);
    cv::waitKey(100);
    auto result1 = GAPITEST(input_frame);
    auto result2 = TraditionalTEST(input_frame);
    //check result whether identical or not.
    bool eq = cv::countNonZero(result1 != result2) == 0;
    std::cout << "result equal  "<< eq;
    return 0;
}

外突

代码语言:javascript
运行
复制
GAPITEST         seconds:4.92153
TraditionalTEST  seconds:4.68761
result equal  1
EN

回答 2

Stack Overflow用户

发布于 2020-03-11 07:17:12

GAPI还处于早期开发阶段,它在一台机器上的性能非常糟糕。GAPI本身并不主要用于直接计算算法,因此它使用后端库来执行计算。默认的是OpenCV的默认后端,这有点糟糕。您可以用流体后端代替它,据说它在执行算法时具有更好的缓存局部性,但它在我的几个测试中仍然很糟糕。

这些后端非常缺乏基本OpenCV函数的实现(例如,Fluid只支持用于盒过滤器的3x3内核)和GComputation::apply将在使用不受支持的操作时不正常地崩溃,通常没有任何有用的错误消息。

GAPI的伟大之处在于它实现的图形模型与硬件无关。您可以使用它生成的图形并将其放到具有多个GPU、CPU之类的云计算或分布式计算系统上,它将自动充分利用提供给它的资源。

如果您希望在一台机器上具有快速的性能,我建议使用cv::cuda::GpuMat。我本人经常使用这种方法,而且它在许多手术中都非常迅速。它省去了编写定制的CUDA内核的麻烦。

我不能保证UMat或其他GPU的实现质量,因为我只在Nvidia卡上使用过OpenCV。

您还可以查看如何编译具有OpenCV支持的OpenMP以提高性能。

不管怎样,这是个猎枪的回答。有关GAPI和比较多个后端的更完整测试程序的更详细信息,请访问此处:https://docs.opencv.org/master/d3/d7a/tutorial_gapi_anisotropic_segmentation.html

票数 4
EN

Stack Overflow用户

发布于 2020-04-29 21:14:49

G-API小组正在待命!

正如Alex所提到的,将默认执行的G与OpenCV模拟代码进行比较,目前还不能提高您的性能。

流体后端使技巧,但到目前为止,它仍然是单线程。这意味着,对于默认多线程的常规OpenCV代码,它不会有多大的优势。

您可能需要尝试流体后端,但是使用setNumThreads(1)进行测试以注意两者之间的差异。您的输入图像越大(就分辨率而言),您应该看到更多的效果。

此外,我鼓励大家阅读这些新的教程:

  1. https://docs.opencv.org/4.3.0/d8/d24/tutorial_gapi_interactive_face_detection.html
  2. https://docs.opencv.org/4.3.0/d4/d48/tutorial_gapi_face_beautification.html

目前,我们更加注重CV/DL混合执行和面向视频流的处理。

添加了

G附带了一个简单的测试来说明上述“G-效果”,尽管测试不是OpenCV或OpenVINO的常规(二进制)发行版的一部分:

https://github.com/opencv/opencv/blob/master/modules/gapi/perf/perf_bench.cpp

如果您自己构建OpenCV (或者仅仅是一个目标opencv_perf_gapi),您将能够运行如下所示

代码语言:javascript
运行
复制
./bin/opencv_perf_gapi --gtest_filter="Benchmark*"

我想看看你在你的机器上得到的号码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60629331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档