Complejidad computacional de la correlación en el tiempo frente a la multiplicación en el espacio de frecuencias

12

Estoy trabajando con la correlación 2D para las técnicas de procesamiento de imágenes (reconocimiento de patrones, etc.). Me preguntaba si hay un enfoque teórico sobre cómo saber cuándo usar la multiplicación en el espacio de frecuencia sobre la correlación en el espacio de tiempo. Para tamaños de 2 x el espacio de frecuencia es obviamente más rápido, pero ¿qué hay de tamaños primos pequeños como, por ejemplo, 11?

Moe
fuente

Respuestas:

10

Asumiré que esto se está haciendo en una CPU convencional, un núcleo, ejecutando un subproceso simple, sin hardware sofisticado. Si hay más que eso, probablemente se pueda explicar con ajustes al razonamiento para un sistema más simple. No se puede decir mucho más sin un sistema específico para discutir, o un libro de texto completo o un documento de investigación para cubrir una gama de posibilidades.

No me preocuparía por el poder de dos tamaños. No importa. Algoritmos FFT con las unidades de mariposa y todo lo que existe para factores de 3, o cualquier número pequeño, no solo 2. También hay algoritmos inteligentes para series de datos de primer tamaño. No me gusta citar Wikipedia sobre esto debido a su naturaleza impermanente, pero de todos modos:

hay FFT con O (N log N) complejidad para todo N, incluso para N principal

Las implementaciones de FFT para N arbitraria se pueden encontrar en la biblioteca GPL'd FFTW .

La única forma confiable en términos de ingeniería seria es construir y medir, pero ciertamente podemos tener una idea de la teoría, para ver las relaciones entre las variables. Necesitamos estimaciones de cuántas operaciones aritméticas están involucradas para cada método.

La multiplicación sigue siendo más lenta que la suma en la mayoría de las CPU, incluso si la diferencia se ha reducido enormemente a lo largo de los años, así que cuentemos las multiplicaciones. La contabilidad también para la suma requiere un poco más de reflexión y seguimiento de las cosas.

Una convolución sencilla, que en realidad se multiplica y suma usando el núcleo de convolución, que se repite para cada píxel de salida, necesita multiplicaciones W² · K², donde W es el número de píxeles a lo largo de un lado de la imagen (suponiendo que el cuadrado sea simple), y K es el tamaño del núcleo de convolución, como píxeles a lo largo de un lado. Se necesitan multiplicaciones de K² para calcular un píxel de salida utilizando el núcleo y la porción del mismo tamaño de la imagen de entrada. Repita para todos los píxeles de salida, que son los mismos que en la imagen de entrada.

(N mults ) directo = W² · K²

Para hacer el trabajo en el espacio de Fourier, debemos transformar a Fourier en la imagen. Esto se hace aplicando un FFT a cada columna por separado, y luego a cada fila. La FFT para N puntos de datos toma aproximadamente 2N · log (N) multiplicaciones; queremos que N sea W, la longitud de una columna o fila. Todos los logaritmos aquí son base dos.

Hay W filas y columnas W, por lo que después de que se realizan todas las FFT, hemos hecho multiplicaciones 2W · (2W · log (W)). Duplique eso, porque después de multiplicar por la transformada de Fourier del núcleo, tenemos que invertir los datos de Fourier para volver a una imagen sensible. Eso es 8W² · log (W). Por supuesto, la multiplicación por la transformada de Fourier del núcleo tiene que hacerse, otras multiplicaciones W². (Hecho una vez, no una vez por píxel de salida, por fila o cualquier cosa). Estas son multiplicaciones complejas, por lo que son multiplicaciones reales de 4W².

Entonces, a menos que me haya burlado (y probablemente lo hice) tenemos

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

¿Cuándo queremos hacer las cosas de manera directa? Cuando K es suficientemente pequeño para hacer W² · K² más pequeño que 4W² · (2 ​​· log (W) + 1). Un factor común de W² se puede factorizar fácilmente. Probablemente podamos soltar el "+1" ya que estamos tratando con estimaciones idealizadas. Es probable que el +1 se pierda en los errores relacionados con las implementaciones reales, por no contar las adiciones, los gastos generales del bucle, etc. Eso deja:

K² < 8·log(W)

Esta es la condición aproximada para elegir un enfoque directo sobre un enfoque de espacio de frecuencia.

Tenga en cuenta que la correlación de dos imágenes del mismo tamaño es como convolucionarse con un núcleo de tamaño K = W. El espacio de Fourier es siempre la forma de hacerlo.

Esto se puede refinar y discutir para tener en cuenta los gastos generales, la canalización de los códigos de operación, la flotación frente al punto fijo, y arrojarlos por la ventana con GPGPU y hardware especializado.

DarenW
fuente