2012-06-23 25 views
25

Estoy probando la detección de objetos con SURF y SIFT.SURF vs SIFT, ¿es SURF realmente más rápido?

SURF dice ser más rápido y más robusto que SIFT pero encontré en mi prueba que esto no es verdad. SIFT con imágenes medianas (600 * 400) es la misma velocidad de SURF y reconoce los objetos bastante bien (tal vez incluso mejor que SURF).

¿Estoy haciendo algo mal?

[Editar]

Tenga en cuenta que an article explicando cómo SURF podría ser mucho más rápido con un pequeño cambio al código OpenCV.

Si conoce algún desarrollador de opencv activo, permita que lo vea.

+5

600 * 400 imagen para computadora moderna no es nada. Intenta probar videos o imágenes enormes (en 100 veces más grandes que las tuyas). – ArtemStorozhuk

Respuesta

27

Cuando fue diseñado, fue pensado para ser más rápido, pero en realidad las diferencias no son relevantes para aplicaciones en tiempo real con cámaras estándar. Por cierto, el detector FAST es más rápido y en realidad bastante robusto.

Estoy programando para la realidad aumentada en tiempo real en teléfonos y utilizamos una combinación de SIFT (inicialización) y FAST (FAST piramidal para la detección de características en tiempo real) durante la ejecución de la aplicación. FAST es en realidad más rápido y está implementado en OpenCV, por lo que si no quieres quedarte con SURF, pruébalo. No he visto trabajos recientes que utilicen SURF en tiempo real, pero he visto versiones modificadas de SIFT, con menos píxeles para descriptores y otro tipo de modificaciones, por lo que parece que SURF fue una gran idea que no obtuvo por lo que se pensó. Esa es solo mi opinión, de todos modos.

+2

Gracias por su contribución, de todos modos con respecto a SURF hay una pequeña optimización que podría conducir a un mayor rendimiento. Se describe aquí: http://computer-vision-talks.com/2011/06/a-few-thoughts-about-cvround/ Traté de contactar a un desarrollador de OpenCV sin suerte :( – dynamic

+1

De todos modos, qué extractor estás usando ? Porque 'FastDescriptorExtractor' no existe. ¿Tal vez estás usando' OrbDescriptorExtractor() '?Estoy usando ORB también – dynamic

+5

mm, usamos un descriptor SIFT modificado para poder comparar características de FAST (en tiempo real) con características de SIFT (inicialización fuera de línea). Es similar al descrito en este documento: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5226627&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp % 3Farnumber% 3D5226627 –

5

SURF debe ser más rápido, mientras que SIFT es más robusto. Astor tiene razón al decir que 600 * 400 es una imagen pequeña según los estándares actuales; aunque.

Dicho esto, SURF debe ser muchos órdenes de magnitud más rápido que SIFT.

16

OpenCV no tiene la mejor implementación de SURF para velocidad o estabilidad. SURF es fundamentalmente más rápido, en una cantidad mayor, que SIFT si tuvieras que contar FLOPS de dos implementaciones bien escritas. SIFT calcula una pirámide de imágenes mediante la convolución de la imagen varias veces con núcleos gaussianos grandes, mientras que SURF logra una aproximación de la que utiliza imágenes integrales.

Para ver una comparación de varias implementaciones de SURF, echar un vistazo a mi página aquí:

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

Es desafortunado que OpenCV rechazó el parche relacionado al redondeo debido a problemas de plataforma cruzada. Tal vez el parche sea ajustado y reenviado. En mi propio trabajo noté que la ronda de propósito general() era muy lenta y la reemplacé con una función personalizada.

En cuanto al detector FAST, mencionado por Jav_Rock, solo lo uso como último recurso. Es mucho menos estable de un detector que cualquier otra cosa, pero realmente es rápido.

+0

Solo por curiosidad, ¿es posible obtener el enlace del parche si lo ha enviado en línea? – Catree

1

Sin cambios si aplica SIFT y SURF en OPENCV SIFT parece ser más rápido que SURF, pero no lo es. Para probar que los he probado en una imagen de 393 * 387 píxeles. Después de ejecutar la misma extracción de características 100 veces y obtener un tiempo promedio, el resultado es

SIFT: 0.0983946 (s)

SURF: 0,183372 (s)

Pero tomar mirada cercana en puntos clave, se encuentra que dan diferentes tamaños puntos clave, en mi experimento,

SIFT: kpsize = 671 d-fila = 671 d-col = 128

SURF: kpsize = 1.156 d fila = 1.156 d-col = 64

Surf dan casi el doble de los puntos clave de SIFT, por lo que no es muy científica que decir cribar más rápido que SURF.

Debe utilizar Rápido como un detector luego aplicar el SIFT, SURF, en ese caso:

SIFT: 0,199448 (s) SURF: 0.0613682 (s)

SIFT: kpsize = 2.362 d-fila = 2.362 d-col = 64

SURF: kpsize = 2.362 d-fila = 2.362 d-col = 64

En ese caso SURF tres veces más rápido que SIFT.

1

He aumentado la velocidad de mi detector de funciones de Surf al no aplicarlo en cada cuadro pero en cada 6º cuadro, estaba bien para mi aplicación. hacer un contador i, hacer un if if (i% 6 == 0), puso ur código en virtud de esta sentencia if, la velocidad aumentará

1

Utilice the original implementation of SURF para la prueba. Abrir CV es más lento.

Al comparar las implementaciones originales de SIFT y SURF, you will get much faster results with SURF. Puede obtener aún más rápido, tal vez un orden de magnitud al ajustar los parámetros. Sin embargo, la solidez puede sufrir. Todo esto depende de tu caso de uso.

En general, SURF es tan robusto como SIFT. Dependiendo del conjunto de datos puede obtener resultados diferentes, pero en gros, son los mismos en cuanto a robustez.

También hay GPU implementations of SURF que son tremendamente más rápidos que mi implementación original.

+0

Con afirmaciones como "obtendrá resultados mucho más rápidos con SURF", debe hacer una copia de seguridad con pruebas o referencias. – muttonUp

+0

Lea el papel SURF original comparando los diferentes algoritmos. http://www.vision.ee.ethz.ch/~surf/eccv06.pdf –

Cuestiones relacionadas