algorithm - brief - sift opencv python
¿SURF vs SIFT, es SURF realmente más rápido? (6)
Aumenté 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 enunciado if if (i% 6 == 0), poner el código en bajo este enunciado if, la velocidad aumentará
Estoy probando la detección de objetos con SURF y SIFT .
SURF afirma ser más rápido y más sólido que SIFT, pero en mi prueba encontré que esto no es cierto . 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 hay un artículo que explica cómo SURF podría ser mucho más rápido con un pequeño cambio en el código de OpenCV.
Si conoce algún desarrollador activo de OpenCV, por favor déjelo que lo vea.
Cuando se diseñó, se pretendía que fuera 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 usamos 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.
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, eche un vistazo a mi página aquí:
http://boofcv.org/index.php?title=Performance:SURF
Es lamentable que OpenCV haya rechazado el parche relacionado con el 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.
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 debería ser muchos órdenes de magnitud más rápido que SIFT.
Sin cambios, si aplica SIFT y SURF en OPENCV SIFT parece 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 observe de cerca los puntos clave, encontrará que dan puntos clave de diferentes tamaños, en mi experimento,
SIFT: kpsize = 671 d-row = 671 d-col = 128
SURF: kpsize = 1156 d-row = 1156 d-col = 64
Surf ofrece casi dos puntos clave de SIFT, por lo que no es muy científico decir SIFT más rápido que SURF.
Debe usar Fast como detector y luego aplicar SIFT, SURF, en ese caso:
SIFT: 0.199448 (s) SURF: 0.0613682 (s)
SIFT: kpsize = 2362 d-row = 2362 d-col = 64
SURF: kpsize = 2362 d-row = 2362 d-col = 64
En ese caso, SURF tres veces más rápido que SIFT.
Utilice la implementación original de SURF para probar. Abrir CV es más lento.
Al comparar las implementaciones originales de SIFT y SURF, obtendrás resultados mucho más rápidos con 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 lo que respecta a la solidez.
También hay implementaciones de GPU de SURF que son tremendamente más rápidas que mi implementación original.