- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行以下代码:
cv::Ptr<cv::FastFeatureDetector> fastDetector = cv::FastFeatureDetector::create(100, true, 2);
cv::Ptr<cv::cuda::FastFeatureDetector> gpuFastDetector = cv::cuda::FastFeatureDetector::create(100, true, 2);
std::vector<cv::KeyPoint> keypoints;
std::vector<cv::KeyPoint> gpuKeypoints;
cv::Mat frame;
cv::cuda::GpuMat gFrame;
frame = cv::imread("image1.jpg"); // 4608 x 3456
cv::cvtColor(frame, frame, CV_BGR2GRAY);
gFrame.upload(frame);
gpuFastDetector->detect(gFrame, gpuKeypoints);
std::cout << "FAST GPU " << gpuKeypoints.size() << std::endl;
fastDetector->detect(frame, keypoints);
std::cout << "FAST " << keypoints.size() << std::endl;
输出是:
FAST GPU 2210
FAST 3209
问题一
为什么相同的算法应用于具有相同参数的相同图像会导致检测到不同数量的关键点?
问题二
我在 Windows 上的 Visual Studio 中运行它。使用Debug 配置时,GPU 检测执行得更快。
但是当使用 Release 时,普通 (CPU) 快速检测器执行得更快。此外,无论使用何种配置类型,检测器在 GPU 上的性能都保持不变。但是,与 Debug 配置相比,在 Release 下执行检测时,CPU 上的性能会急剧增加。
(我没有对此处提供的代码进行测量。我知道由于上下文初始化,对某些 OpenCV 函数的第一次调用可能需要更长时间才能执行。)
这很可能与我的旧 question about the FAST detector 有关。BHawk 给出了关于 CPU 上 SIMD 优化的合理解释。
那么,第二个问题是:
SIMD 优化的 CPU 是否有可能比 GPU 更快地执行 FAST 特征检测?这似乎不太可能。
最佳答案
初始化冗长的答案:)
问题 1:
调试编译不使用发布版本使用的代码优化。调试版本会做一些事情,比如保留临时变量数据,以便您可以在调试器中读取数据。这通常意味着通常临时存在于 CPU 寄存器中的数据将溢出并在调试版本中被复制到 RAM 中。当在优化的发布版本中不再需要相同的数据时,它们将被丢弃。如果您在编译设置中禁用代码优化,这种差异可能会消失;我不确定我以前从未尝试过在没有优化的情况下进行编译。
问题 2:
在确定图像处理在 GPU 还是 CPU 上表现更好时,有几个因素在起作用。
1:内存管理
GPU 处理的主要瓶颈是将数据加载到 GPU 以及从 GPU 检索数据。对于非常大的图像(在您的情况下为 16 兆像素),此瓶颈可能成为一个重大障碍。当您将图像加载到 GPU 上,然后将图像留在那里以通过 OpenGL 上下文进行操作和显示时(就像您在 3D 游戏引擎中看到的那样),GPU 的工作效果最佳。
2:串行与并行
GPU 由数千个并行运行的小型处理核心组成。因此,他们能够同时执行许多小任务。另一方面,CPU 经过优化以串行执行复杂任务。这意味着某些任务(大图像上下文、复杂计算、多步骤过程)在 CPU 上的性能可能比在 GPU 上更好。另一方面,使用小图像上下文且不需要多个处理步骤的更简单任务在 GPU 上的执行速度要快得多。更复杂的是,CPU 可以线程化以并行运行,具体取决于可用计算核心的数量。最重要的是,SIMD 优化的 CPU 可以进一步并行化处理。所以一个4核CPU和8个SIMD ALU可以同时处理32条数据。这仍然与 GPU 中存在的 1000 个内核相差甚远,但 CPU 内核通常处理速度更快,因此 4 个内核和 8 个 SIMD 在某些任务上可能执行得更快。当然,如果您使用具有更多内核或更多 ALU 的系统,CPU 速度也会缩放,如果您减少数量,CPU 速度也会降低。
结论
由于内存瓶颈,有些图像处理任务不太适合GPU。数据 IO 抵消了大规模并行化带来的任何速度增益。如果您拥有高度优化的并行化 SIMD CPU 算法,由于算法的性质和/或进出 GPU 的数据 IO,CPU 版本肯定有可能比 GPU 执行得更快。您可能还会发现,在处理小图像时,GPU 版本的速度仍然稍快。
我必须通读源代码才能确切了解此特定函数在 CPU 上的运行速度比 GPU 快的方式和原因,但我对此并不感到惊讶。关于为什么一种实现与另一种实现获得不同数量的功能,这也需要通读,但这可能是为了内存分配或优化目的而不同地改变每个实现的功能。
很抱歉回答很长,但这是一个复杂的讨论话题。
关于c++ - GPU 上的 OpenCV FAST 检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39920813/
我是 opencv 新手,正在尝试实现两个图像之间的图像匹配。为此,我试图了解特征描述符、描述符提取器和描述符匹配器之间的区别。我遇到了很多术语,并试图在 opencv 文档网站上阅读它们,但我似乎无
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在尝试弄清楚如何使用 findbugs 实现检测器。 此外,我不想创建插件,因为 findbugs 已经具有此功能。 我需要我的检测器来检查对 ClassName.getConnection()
在我的 main.cpp 中有一段摘录: Ptr fastDetector = FastFeatureDetector::create(80, true); while (true) { Ma
我想使用 orb 检测器在找到的图像周围绘制边界框,类似于此处使用筛选检测器的示例:SIFT Refrence Linked 示例使用 FlannBasedMatcher。我的代码使用 BFMatch
SURF默认情况下适用于灰色图像。我正在考虑对 HSV 图像进行 SURF。我的方法是把 channel 分成H、S和V。我用S和V做关键点检测。我试图比较 SV 与 RGB 中的关键点数量,并且在
如何使用 NSXMLDetector 查找 HTML 文件中的 RSS 链接,源代码中的标签如下所示: 我需要这个来自动检测 RSS 应用中的 RSS 链接。谢谢! 最佳答案 在您的两个示例中,您
有没有办法检测排行榜是否关闭? 当点击“highscores”时,排行榜会在很短的时间内加载,您仍然可以点击主 UI。有没有办法在单击“highscores”时停止对主 UI 的任何进一步输入? 我当
我正在使用 OpenCV 3.1 和 Visual Studio C++。 目标 我想检测角点,而不是曲线、矩形或圆形。这意味着,我想找到模糊字符的位置。这里是我感兴趣的领域: 红色区域具有更高的优先
我有一张来自显微镜的图像,需要对其进行分析(隔离 Blob )。我一直在尝试很多方法来对图像进行阈值和过滤,这给了我很好的结果,现在我正在努力获得最好的结果。 我一直在阅读拉普拉斯算子,并应用高斯拉帕
当我尝试运行包含 hog 检测器的 opencv 代码时,出现以下错误。 我一直在使用 OpenCV 做其他事情,我只在包含 hog 时遇到错误。 "Debug Assertion Failed"..
有没有办法在 OpenCV 中指定自定义 SIFT 检测器参数? 似乎FeatureDetector constructor不接受任何参数,而似乎可以在 SIFT constructor 中指定这些参
我正在尝试为 Lint 创建一个自定义规则,这将改变现有的弃用警告测试。 到目前为止我读过的文档几乎没有告诉我如何实现一个类(我认为需要)实现 Detector.JavaScanner http://
我想在opencv中实现一揽子单词。在检测器之后-> detect(img,keypoint);当我想使用keypoint.clear()清理关键点时,会检测到关键点;或者当函数想要返回时,将出现以下
我正在使用 Apache 的 Java 库 Tika(tika-core 版本。1.10)。 是否存在用于 CSV 文件的 org.apache.tika.detect.Detector?MIME 类
我正在运行以下代码: cv::Ptr fastDetector = cv::FastFeatureDetector::create(100, true, 2); cv::Ptr gpuFastDete
我致力于训练自己的 SVM。首先我想要训练它来检测人并将结果与在 opencv 中实现的 SVM 进行比较。训练后 SVM 看起来不错(我创建 xml 文件进行检查)但我无法将 svm 检测器设置
我想知道是否有人成功地使用了 Latent SVM Detector (http://docs.opencv.org/modules/objdetect/doc/latent_svm.html) 的
我正在 OpenCV 2.4 中开发一些代码,我想测试 FREAK 检测器,但出现编译错误。我包含了 feature2d.h,我该怎么做才能解决这个问题? 最佳答案 FREAK 包含在 OpenCV
我有很多使用 Lombok 构建器的带有 @NonNull 字段的类。 @Builder class SomeObject { @NonNull String mandatoryField1;
我是一名优秀的程序员,十分优秀!