【问题标题】:SURF vs SIFT, is SURF really faster?SURF vs SIFT,SURF真的更快吗?
【发布时间】:2012-06-25 17:01:29
【问题描述】:

我正在使用SURFSIFT 测试一些对象检测。

SURF 声称比 SIFT 更快、更健壮,但我在测试中发现 这不是真的。中等图像 (600*400) 的 SIFT 与 SURF 的速度相同,并且可以很好地识别物体(甚至可能比 SURF 更好)。

我做错了吗?

[编辑]

请注意,an article 解释了如何通过对 opencv 代码进行一些更改来更快地实现 SURF。

如果你认识一些活跃的 opencv 开发者,请让他看看。

【问题讨论】:

  • 现代计算机的 600*400 图像什么都不是。尝试测试视频或巨大(比你的大 100 倍)图像。
  • 请尝试使用最新发布的开源版 SURF github.com/herbertbay/SURF

标签: algorithm opencv sift surf


【解决方案1】:

SURF 应该更快,而 SIFT 更健壮。 Astor 说 600*400 在今天的标准下是一个小图像是正确的;不过。

也就是说,SURF 应该比 SIFT 快很多数量级。

【讨论】:

    【解决方案2】:

    设计时它的目的是更快,但实际上,这些差异与标准相机的实时应用程序无关。顺便说一句,FAST 检测器速度更快,而且相当稳健。 我正在为手机上的实时增强现实编程,我们在应用程序执行期间结合使用 SIFT(初始化)和 FAST(用于实时特征检测的金字塔 FAST)。 FAST 速度更快,而且它是在 OpenCV 中实现的,所以如果您不想坚持使用 SURF,可以尝试一下。我还没有看到最近使用 SURF 进行实时的论文,但我看到了 SIFT 的修改版本,描述符和其他类型的修改的像素更少,所以看起来 SURF 是一个没有得到的好主意据认为。无论如何,这只是我的看法。

    【讨论】:

    • 感谢您的贡献,无论如何,关于 SURF 有一些优化可以带来更好的性能。它在这里描述:computer-vision-talks.com/2011/06/a-few-thoughts-about-cvround我试图联系一个没有运气的opencv开发人员:(
    • 您使用的是哪个提取器?因为FastDescriptorExtractor 不存在。也许您正在使用 OrbDescriptorExtractor() ?我也在用 ORB
    • mm,我们使用修改后的 SIFT 描述符来比较 FAST(实时)的特征和 SIFT(离线初始化)的特征。与本文中描述的类似:ieeexplore.ieee.org/xpl/…
    • 这根本不能回答问题。
    【解决方案3】:

    OpenCV 在速度或稳定性方面没有最佳的 SURF 实现。如果您要计算两个编写良好的实现的 FLOPS,SURF 基本上比 SIFT 快得多。 SIFT 通过使用大的高斯核对图像进行多次卷积来计算图像金字塔,而 SURF 使用积分图像完成近似。

    要查看几个 SURF 实现的比较,请在此处查看我的页面:

    http://boofcv.org/index.php?title=Performance:SURF

    很遗憾,OpenCV 由于跨平台问题拒绝了与舍入相关的补丁。也许补丁会被调整并重新提交。在我自己的工作中,我注意到通用的 round() 非常慢,并将其替换为自定义函数。

    至于 Jav_Rock 提到的 FAST 检测器,我仅将其用作最后的手段。它的检测器比其他任何检测器都不稳定,但它确实很快。

    【讨论】:

    • 只是好奇,网上提交的补丁的链接是否可以得到?
    【解决方案4】:

    没有任何改变,如果你在 OPENCV 中应用 SIFT 和 SURF,SIFT 似乎比 SURF 快,但事实并非如此。为了证明我已经在 393*387 像素的图像上测试了它们。在运行相同的特征提取 100 次并得到它们的平均时间后,结果是

    SIFT:0.0983946(s)

    冲浪:0.183372(s)

    但是,关键点的数量有很大的不同, SIFT:kpsize = 671 d-row = 671 d-col = 128

    冲浪:kpsize = 1156 d-row = 1156 d-col = 64

    SURF 返回的关键点数几乎是 SIFT 的两倍,因此说 SIFT 比 SURF 快是不公平的。

    当我们使用 Fast 作为检测器时,然后应用 SIFT,SURF:

    SIFT:0.199448(s) 冲浪:0.0613682(s)

    SIFT:kpsize = 2362 d-row = 2362 d-col = 64

    SURF:kpsize = 2362 d-row = 2362 d-col = 64

    在这里,SURF 比 SIFT 快三倍。

    【讨论】:

      【解决方案5】:

      我提高了我的 Surf 特征检测器的速度,不是在每一帧上都应用它,而是在每 6 帧上应用它,这对我的应用程序来说没问题。 做一个柜台我, 做一个 if 语句 if(i%6==0), 把你的代码放在这个if语句下面,速度会提高

      【讨论】:

        【解决方案6】:

        请使用the original implementation of SURF 进行测试。打开 CV 速度较慢。

        在比较 SIFT 和 SURF 的原始实现时,you will get much faster results with SURF。通过调整参数,您可以更快地提高一个数量级。但是,稳健性可能会受到影响。这一切都取决于您的用例。

        一般来说,SURF 与 SIFT 一样强大。根据数据集的不同,您可能会得到不同的结果,但总的来说,在稳健性方面它们是相同的。

        还有GPU implementations of SURF 比我原来的实现快得多。

        【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2021-06-07
        • 2013-06-21
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多