Complessità computazionale della correlazione nel tempo rispetto alla moltiplicazione nello spazio delle frequenze


12

Sto lavorando con la correlazione 2d per le tecniche di elaborazione delle immagini (riconoscimento dei modelli, ecc ...). Mi chiedevo se esiste un approccio teorico su come dire quando usare la moltiplicazione nello spazio di frequenza sulla correlazione nello spazio di tempo. Per dimensioni di 2 x lo spazio di frequenza è ovviamente più veloce, ma che ne dici di piccole dimensioni prime come ad esempio 11?

Risposte:


10

Presumo che ciò avvenga su una CPU convenzionale, un core, eseguendo un thread semplice, nessun hardware sofisticato. Se sta succedendo qualcosa di più, probabilmente può essere spiegato con aggiustamenti al ragionamento per un sistema più semplice. Non si può dire molto di più senza un sistema specifico per discutere, o un intero libro di testo o un documento di ricerca per coprire una serie di possibilità.

Non mi preoccuperei della potenza di due taglie. Non importa Algoritmi FFT con le unità farfalla e tutto ciò che esiste per fattori di 3 o qualsiasi numero piccolo, non solo 2. Esistono algoritmi intelligenti anche per serie di dati di dimensioni primi. Non mi piace citare Wikipedia su questo a causa della sua natura impermanente, ma comunque:

ci sono FFT con complessità O (N log N) per tutte le N, anche per la N primaria

Le implementazioni di FFT per N arbitrario possono essere trovate nella libreria GFT di FPLW .

L'unico modo affidabile in termini di ingegneria seria è costruire e misurare, ma possiamo certamente avere un'idea dalla teoria, per vedere le relazioni tra le variabili. Abbiamo bisogno di stime di quante operazioni aritmetiche sono coinvolte per ciascun metodo.

La moltiplicazione è ancora più lenta dell'aggiunta sulla maggior parte delle CPU, anche se la differenza si è ridotta enormemente nel corso degli anni, quindi contiamo solo le moltiplicazioni. Anche la contabilità per l'aggiunta richiede un po 'più di pensiero e tiene traccia delle cose.

Una convoluzione semplice, che in realtà si moltiplica e si aggiunge usando il kernel di convoluzione, ripetendo per ogni pixel di output, ha bisogno di moltiplicazioni di W² · K², dove W è il numero di pixel lungo un lato dell'immagine (assumendo quadrato per semplicità) e K è la dimensione del kernel di convoluzione, come pixel lungo un lato. Sono necessarie moltiplicazioni di K² per calcolare un pixel di output usando il kernel e la stessa porzione dell'immagine di input. Ripetere l'operazione per tutti i pixel di output, che sono uguali a quelli dell'immagine di input.

(N mults ) diretto = W² · K²

Per fare il lavoro nello spazio di Fourier, dobbiamo trasformare Fourier nell'immagine. Questo viene fatto applicando una FFT a ciascuna colonna separatamente, quindi a ciascuna riga. La FFT per N punti dati richiede circa 2N · log (N) moltiplicazioni; vogliamo che N sia W, la lunghezza di una colonna o riga. Tutti i logaritmi qui sono di base due.

Ci sono W righe e W colonne, quindi dopo aver fatto tutti gli FFT, abbiamo fatto moltiplicazioni 2W · (2W · log (W)). Raddoppiamo questo, perché dopo che ci siamo moltiplicati per la trasformata di Fourier del kernel, dobbiamo invertire-Fourier i dati per tornare all'immagine sensibile. Questo è 8W² · log (W). Naturalmente, bisogna moltiplicare per la trasformata di Fourier del kernel, altre moltiplicazioni di W². (Fatto una volta, non una volta per pixel di output, per riga o altro.) Si tratta di moltiplicazioni complesse, quindi sono 4W² di moltiplicazioni reali.

Quindi, a meno che non mi sia stupito (e probabilmente l'ho fatto) lo abbiamo fatto

(N mults ) Fourier = 4W² · (2 ​​· log (W) + 1)

Quando vogliamo fare le cose nel modo diretto? Quando K è sufficientemente piccolo da rendere W² · K² più piccolo di 4W² · (2 ​​· log (W) + 1). Un fattore comune di W² viene facilmente preso in considerazione. Probabilmente possiamo eliminare il "+1" poiché abbiamo a che fare con stime idealizzate. Il +1 è probabilmente perso negli errori relativi alle implementazioni effettive, dal non contare le aggiunte, i costi generali del loop e così via. Che lascia:

K² < 8·log(W)

Questa è la condizione approssimativa per la scelta di un approccio diretto rispetto a un approccio di spazio di frequenza.

Nota che la correlazione di due immagini della stessa dimensione è proprio come una convoluzione con un kernel della dimensione K = W. Lo spazio di Fourier è sempre il modo di farlo.

Questo può essere perfezionato e discusso per tenere conto di sovraccarico, pipeline di codici operativi, float vs. punto fisso e buttare fuori dalla finestra con GPGPU e hardware specializzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.