Je teste une détection d'objet avec SURF et SIFT .
SURF prétend être plus rapide et plus robuste que SIFT mais j’ai trouvé dans mon test que ce n’est pas vrai. SIFT avec des images moyennes (600 * 400) a la même vitesse que SURF et reconnaît assez bien les objets (peut-être même mieux que SURF).
Est-ce que je fais quelque chose de mal?
[Modifier]
Veuillez noter qu’il existe un article expliquant comment SURF pourrait être beaucoup plus rapide avec un peu de modification du code ouvert.
Si vous connaissez un développeur opencv actif, veuillez le laisser le voir.
Lors de sa conception, il devait être plus rapide, mais les différences ne sont en réalité pas pertinentes pour les applications en temps réel avec des caméras standard. En passant, le détecteur FAST est plus rapide et en fait assez robuste.
Je programme pour la réalité augmentée en temps réel sur les téléphones et nous utilisons une combinaison de SIFT (initialisation) et de FAST (FAST pyramidale pour la détection de fonctions en temps réel) lors de l'exécution de l'application. FAST est en fait plus rapide et implémenté dans OpenCV. Si vous ne voulez pas vous en tenir à SURF, essayez-le. Je n'ai pas vu d'articles récents qui utilisent SURF en temps réel, mais j'ai vu des versions modifiées de SIFT, avec moins de pixels pour les descripteurs et d'autres types de modifications. aussi loin qu'on le pensait. C'est juste mon avis, de toute façon.
OpenCV n’a pas la meilleure implémentation de SURF pour la rapidité ou la stabilité. SURF est fondamentalement plus rapide et plus rapide que EIPD si vous comptez FLOPS de deux implémentations bien écrites. SIFT calcule une pyramide d'images en convolvant plusieurs fois l'image avec de gros noyaux gaussiens, tandis que SURF réalise une approximation de celle-ci en utilisant des images intégrales.
Pour voir une comparaison de plusieurs implémentations de SURF, regardez ma page ici:
http://boofcv.org/index.php?title=Performance:SURF
Il est regrettable qu'OpenCV ait rejeté le correctif lié à l'arrondi en raison de problèmes inter-plateformes. Peut-être que le correctif sera modifié et soumis de nouveau. Dans mon propre travail, j'ai remarqué que round () à usage général était très lent et l'a remplacé par une fonction personnalisée.
Pour ce qui est du détecteur FAST, mentionné par Jav_Rock, je ne l’utilise qu’en dernier recours. Il est beaucoup moins stable que tout autre détecteur, mais c’est vraiment rapide.
SURF devrait être plus rapide, tandis que SIFT plus robuste. Astor a raison de dire que 600 * 400 est une petite image par rapport aux normes actuelles; bien que.
Cela dit, SURF devrait être beaucoup plus rapide que SIFT de plusieurs ordres de grandeur.
Sans aucun changement, si vous appliquez SIFT et SURF dans OPENCV, SIFT semble plus rapide que SURF, mais ce n'est pas le cas. Pour prouver que je les ai testés sur une image de 393 * 387 pixels. Après avoir exécuté la même extraction 100 fois et obtenu leur temps moyen, le résultat est
SIFT: 0.0983946 (s)
SURF: 0.183372 (s)
Cependant, le nombre de points clés a une grande différence, SIFT: kpsize = 671 rangée = 671 d-col = 128
SURF: kpsize = 1156 rangées = 1156 d-colonnes = 64
SURF renvoie presque le double du nombre de points clés de SIFT. Il est donc injuste de dire que SIFT est plus rapide que SURF.
Lorsque nous avons utilisé le Fast comme détecteur, appliquez le SIFT, SURF:
SIFT: 0.199448 (s)SURF: 0.0613682 (s)
SIFT: kpsize = 2362 rangées = 2362 d-colonnes = 64
SURF: kpsize = 2362 rangées = 2362 d-colonnes = 64
Ici, SURF est trois fois plus rapide que SIFT.
Veuillez utiliser l’implémentation originale de SURF pour les tests. CV ouvert est plus lent.
En comparant les implémentations originales de SIFT et SURF, vous obtiendrez des résultats beaucoup plus rapides avec SURF . Vous pouvez obtenir encore plus rapidement d'un ordre de grandeur en modifiant les paramètres. Cependant, la robustesse pourrait en souffrir. Tout dépend de votre cas d'utilisation.
En général, SURF est aussi robuste que SIFT. En fonction de l'ensemble de données, vous obtiendrez peut-être des résultats différents, mais en gros, ils sont identiques en termes de robustesse.
Il existe également des implémentations GPU de SURF qui sont considérablement plus rapides que mon implémentation initiale.
J'ai augmenté la vitesse de mon détecteur de fonctions Surf en ne l'appliquant pas sur toutes les images, mais toutes les 6 images, ce n'était pas grave pour mon application. faire un compteur i, faire une instruction if si (i% 6 == 0), mettre votre code sous cette instruction if, la vitesse augmentera