2012-06-23 14 views
25

Sto testando alcuni oggetti con SURF e SIFT.SURF vs SIFT, SURF è davvero più veloce?

SURF afferma di essere più veloce e più robusto di SIFT ma ho trovato nel mio test che non è vero. SIFT con immagini medie (600 * 400) ha la stessa velocità di SURF e riconosce gli oggetti abbastanza bene (forse anche meglio di SURF).

Sto facendo qualcosa di sbagliato?

[Edit]

Si prega di notare che è an article spiegando come SURF potrebbe essere molto più veloce con un piccolo cambiamento al codice OpenCV.

Se conoscete qualche sviluppatore opencv attivo, fateglielo vedere.

+5

L'immagine 600 * 400 per il computer moderno non è nulla. Prova a provare video o immagini enormi (in 100 volte più grandi delle tue). – ArtemStorozhuk

risposta

27

Quando è stato progettato è stato destinato ad essere più veloce, ma in realtà le differenze non sono rilevanti per le applicazioni in tempo reale con telecamere standard. A proposito, il rilevatore FAST è più veloce e in realtà abbastanza robusto.

Sto programmando per realtà aumentata in tempo reale su telefoni e usiamo una combinazione di SIFT (inizializzazione) e FAST (piramidale FAST per il rilevamento di funzionalità in tempo reale) durante l'esecuzione dell'applicazione. FAST è in realtà più veloce ed è implementato in OpenCV, quindi se non vuoi aderire a SURF provalo. Non ho visto documenti recenti che usano SURF in tempo reale ma ho visto versioni modificate di SIFT, con meno pixel per descrittori e altri tipi di modifiche, quindi sembra che SURF fosse una specie di grande idea che non per quanto si pensava. Questa è solo la mia opinione, comunque.

+2

Grazie per il tuo contributo, comunque riguardo a SURF c'è una piccola ottimizzazione che potrebbe portare a maggiori prestazioni. È descritto qui: http://computer-vision-talks.com/2011/06/a-few-thoughts-about-cvround/ Ho provato a contattare uno sviluppatore opencv senza fortuna :( – dynamic

+1

Ad ogni modo quale estrattore stai usando ? Perché non esiste la dicitura 'FastDescriptorExtractor'. Forse stai usando' OrbDescriptorExtractor() '?Sto usando anche l'ORB – dynamic

+5

mm, usiamo un descrittore SIFT modificato per poter confrontare le caratteristiche di FAST (in tempo reale) con le caratteristiche di SIFT (inizializzazione offline). È simile a quello descritto in questo documento: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5226627&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp % 3 Fattore% 3D5226627 –

5

SURF dovrebbe essere più veloce, mentre SIFT più robusto. Astor ha ragione nel dire che 600 * 400 è una piccola immagine secondo gli standard odierni; anche se.

Detto questo, SURF dovrebbero essere molti ordini di grandezza più veloce di SIFT.

16

OpenCV non ha la migliore implementazione di SURF per la velocità o la stabilità. SURF è fondamentalmente più veloce, di una quantità maggiore, di SIFT se si contano FLOP di due implementazioni ben scritte. SIFT calcola una piramide di immagini convolgendo più volte l'immagine con grossi kernel gaussiani, mentre SURF realizza un'approssimazione di quella utilizzando immagini integrali.

Per vedere un confronto tra diverse implementazioni di SURF, un'occhiata alla mia pagina qui:

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

E 'un peccato che OpenCV respinto la patch relativa a arrotondamento a causa di problemi di cross-platform. Forse la patch verrà ottimizzata e ripresentata. Nel mio lavoro ho notato che lo scopo generale round() era molto lento e lo ha sostituito con una funzione personalizzata.

quanto riguarda il rivelatore veloce, citato da Jav_Rock, io uso solo come ultima risorsa. È molto meno stabile di un rilevatore di qualsiasi altra cosa là fuori, ma è davvero veloce.

+0

Solo per curiosità, è possibile ottenere il link della patch se lo hai inviato online? – Catree

1

Senza alcuna modifica se si applica SIFT e SURF in OpenCV SIFT sembra più veloce di SURF, ma non lo è. Dimostrando che li ho testati su un'immagine di 393 * 387 pixel. Dopo aver eseguito la stessa estrazione di 100 volte e ottenuto il tempo medio, il risultato è

SIFT: 0.0983946 (s)

SURF: 0,183,372 mila (s)

Ma prendere sguardo da vicino-punti chiave, troverete che danno diverse dimensioni punti chiave, nel mio esperimento,

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

SURF: kpsize = 1156 D-row = 1156 D-col = 64

Surf dare quasi il doppio-punti chiave di SIFT, quindi non è del tutto scientifico da dire SIFT più veloce di SURF.

Si dovrebbe usare veloce come rivelatore quindi applicare il SIFT, SURF, in questo caso:

SIFT: 0,199,448 mila (s) SURF: ,0613,682 mila (s)

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

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

In tal caso SURF tre volte più veloce SIFT.

1

Ho aumentato la velocità del mio rilevatore di funzionalità Surf non applicandolo su ogni fotogramma ma su ogni 6 fotogramma, era ok per la mia applicazione. fare un contatore i, make un'istruzione if if (i% 6 == 0), messo codice ur in meno di questo if, la velocità aumenterà

1

Si prega di utilizzare the original implementation of SURF per il test. Apri CV è più lento.

Quando si confrontano le implementazioni originali di SIFT e SURF, you will get much faster results with SURF. È possibile ottenere ancora più velocemente di un ordine di grandezza modificando i parametri. Tuttavia, la robustezza potrebbe risentirne. Tutto dipende dal tuo caso d'uso.

In generale, SURF è robusto come SIFT. A seconda del set di dati potresti ottenere risultati diversi, ma en gros, sono gli stessi quando si tratta di robustezza.

Ci sono anche GPU implementations of SURF che sono tremendamente più veloci della mia implementazione originale.

+0

Con affermazioni come "otterrete risultati molto più veloci con SURF", dovreste eseguirne il backup con test o riferimenti. – muttonUp

+0

Leggere il documento SURF originale confrontando i diversi algoritmi. http://www.vision.ee.ethz.ch/~surf/eccv06.pdf –

Problemi correlati