SURF与SIFT,SURF真的更快吗?

33

我正在使用 SURFSIFT 进行一些目标检测测试。

SURF声称比SIFT更快、更强大,但在我的测试中,这并不是真的。使用中等大小的图像(600*400),SIFT与SURF速度相同,并且能够很好地识别对象(甚至比SURF更好)。

我做错了什么吗?

[编辑]

请注意,有一篇文章解释了如何通过对opencv代码进行小修改,使SURF变得更快。

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


5
现代计算机的 600*400 像素图像算不上什么,建议尝试测试视频或者大得多的图片(比你们的大100倍)来检验性能。 - ArtemStorozhuk
请尝试使用最新发布的SURF开源版本 https://github.com/herbertbay/SURF - Herbert Bay
6个回答

32

当FAST算法设计时旨在更快,但实际上,在标准摄像头的实时应用中这些差异并不重要。顺便说一句,FAST检测器更快也更鲁棒。

我正在为手机上的实时增强现实进行编程,我们在应用程序执行期间使用SIFT(初始化)和FAST(金字塔FAST用于实时特征检测)的组合。FAST更快,并且它已经被实现在OpenCV中,所以如果你不想坚持使用SURF,可以试试FAST。我没有看到最近有关于SURF的实时论文,但我看到了修改版的SIFT,描述子中像素较少以及其他种类的修改,因此似乎SURF只是一个想法比实际应用价值高的算法。这仅仅是我的观点。


2
感谢您的贡献,关于SURF,有一个小优化可以提高性能。在这里有描述:http://computer-vision-talks.com/2011/06/a-few-thoughts-about-cvround/ 我试图联系OpenCV开发人员,但没有成功 :( - dynamic
1
你用的是哪个特征提取器?因为 FastDescriptorExtractor 不存在。也许你在使用 OrbDescriptorExtractor() ?我也在使用ORB - dynamic
6
我们使用修改后的SIFT描述符,以便能够将FAST(实时)的特征与SIFT(离线初始化)的特征进行比较。这类似于此论文中所描述的方法:http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5226627&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D5226627 - Jav_Rock
1
这根本没有回答问题。 - Bull

18

OpenCV在SURF的速度和稳定性方面并不是最好的实现。如果计算两个写得很好的实现的FLOPS,那么SURF要比SIFT快得多。SIFT通过将图像多次与大型高斯核卷积来计算图像金字塔,而SURF使用积分图的近似方法来完成此操作。

要查看几种SURF实现的比较,请查看我的页面:

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

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

至于FAST检测器,Jav_Rock提到过,我只在最后一步使用它。它比其他任何探测器都不稳定,但确实很快。


只是出于好奇,如果您已经在线提交了补丁,是否可以获取补丁的链接? - Catree

5
请使用SURF的原始实现进行测试,因为Open CV较慢。
与SIFT的原始实现相比,使用SURF可以得到更快的结果。通过调整参数,可能可以使速度快上一个数量级。然而,这样可能会影响鲁棒性。这完全取决于您的用例。
总体而言,SURF与SIFT一样鲁棒。根据数据集的不同,可能会得到不同的结果,但就鲁棒性而言,它们是相同的。
还有GPU实现的SURF,其速度比原始实现要快得多。

1
请阅读原始的 SURF 论文,比较不同的算法。http://www.vision.ee.ethz.ch/~surf/eccv06.pdf - Herbert Bay
顺便提一下,原始的SURF实现现在已经开源了,可以在https://github.com/herbertbay/SURF找到。 - Herbert Bay

5
没有任何改变的情况下,如果您在OPENCV中应用SIFT和SURF,SIFT似乎比SURF更快,但实际上并非如此。为了证明这一点,我将它们应用于一个393*387像素的图像上,并在相同的特征提取操作下进行100次测试并获取其平均时间。结果是:
SIFT: 0.0983946秒 SURF: 0.183372秒
然而,关键点的数量有很大的差异,
SIFT: kpsize = 671 d-row = 671 d-col = 128 SURF: kpsize = 1156 d-row = 1156 d-col = 64
SURF返回的关键点数量几乎是SIFT的两倍,因此不能说SIFT比SURF更快。
当我们使用Fast作为检测器时,然后应用SIFT和SURF:
SIFT: 0.199448秒 SURF: 0.0613682秒
SIFT: kpsize = 2362 d-row = 2362 d-col = 64 SURF: kpsize = 2362 d-row = 2362 d-col = 64
这里,SURF比SIFT快三倍。

5

SURF应该更快,而SIFT更加稳健。Astor在说600*400是按照今天的标准来看一个小图像,不过。

话虽如此,SURF应该比SIFT快几个数量级。


1
我已经通过不在每一帧上应用Surf特征检测器,而是在每六帧上应用来提高其速度,这对我的应用程序来说还可以。制作一个计数器i,创建一个if语句,如果(i%6==0),则将您的代码放在此if语句下面,速度将会提高。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接