Computerkomplexität der Korrelation zwischen Zeit und Multiplikation im Frequenzraum

12

Ich arbeite mit 2d Korrelation für Bildverarbeitungstechniken (Mustererkennung etc ...). Ich habe mich gefragt, ob es einen theoretischen Ansatz gibt, wie man erkennt, wann Multiplikation im Frequenzraum über Korrelation im Zeitraum angewendet wird. Bei Größen von 2 x ist der Frequenzraum natürlich schneller, aber wie wäre es mit kleinen Primzahlen wie z. B. 11?

Moe
quelle

Antworten:

10

Ich gehe davon aus, dass dies auf einer herkömmlichen CPU geschieht, einem Kern, der einen einfachen Thread ausführt, keine ausgefallene Hardware. Wenn mehr los ist, kann dies wahrscheinlich mit Anpassungen der Argumentation für ein einfacheres System erklärt werden. Es kann nicht viel mehr gesagt werden, ohne entweder ein bestimmtes System zu diskutieren oder ein ganzes Lehrbuch oder ein Forschungspapier, um eine Reihe von Möglichkeiten abzudecken.

Ich würde mir keine Sorgen um Größen mit zwei Potenzen machen. Es spielt keine Rolle. FFT-Algorithmen mit den Butterfly-Einheiten und allem, was für Faktoren von 3 oder eine beliebige kleine Zahl, nicht nur für 2, existiert. Es gibt auch clevere Algorithmen für Datenreihen mit Primzahlgröße. Ich zitiere Wikipedia wegen seiner Vergänglichkeit nicht gern , aber trotzdem:

Es gibt FFTs mit O (N log N) -Komplexität für alle N, auch für Primzahl N

Implementierungen von FFTs für beliebiges N können in der GPL-Bibliothek FFTW gefunden werden .

Die einzig zuverlässige Methode für seriöses Engineering ist das Bauen und Messen, aber wir können mit Sicherheit eine Vorstellung von der Theorie bekommen, um die Beziehungen zwischen Variablen zu erkennen. Wir benötigen Schätzungen, wie viele arithmetische Operationen für jede Methode erforderlich sind.

Das Multiplizieren ist bei den meisten CPUs immer noch langsamer als das Addieren, auch wenn die Differenz im Laufe der Jahre enorm geschrumpft ist. Zählen wir also einfach die Multiplikationen. Die Berücksichtigung von Additionen erfordert ein bisschen mehr Nachdenken und Nachverfolgung.

Eine einfache Faltung, die tatsächlich mit dem Faltungskern multipliziert und addiert wird und sich für jedes Ausgabepixel wiederholt, benötigt W² · K²-Multiplikationen, wobei W die Anzahl der Pixel entlang einer Seite des Bildes ist (der Einfachheit halber quadratisch angenommen) und K die Größe des Faltungskerns als Pixel entlang einer Seite. Es sind K²-Multiplikationen erforderlich, um ein Ausgabepixel unter Verwendung des Kernels und des gleich großen Teils des Eingabebilds zu berechnen. Wiederholen Sie diesen Vorgang für alle Ausgabepixel, die dieselbe Nummer wie im Eingabebild haben.

(N mults ) direct = W² · K²

Um die Aufgabe im Fourierraum zu erledigen, müssen wir das Bild Fourier-transformieren. Dies erfolgt durch Anwenden einer FFT auf jede Spalte separat und dann auf jede Zeile. Die FFT für N Datenpunkte benötigt ungefähr 2N · log (N) Multiplikationen; wir wollen, dass N W ist, die Länge einer Spalte oder Zeile. Alle Logarithmen sind hier Basis zwei.

Es gibt W Zeilen und W Spalten. Nachdem alle FFTs durchgeführt wurden, haben wir 2W · (2W · log (W)) Multiplikationen durchgeführt. Verdoppeln Sie das, denn nachdem wir mit der Fourier-Transformation des Kernels multipliziert haben, müssen wir die Daten invers-fourieren, um zu einem vernünftigen Bild zurückzukehren. Das sind 8 W² · log (W). Natürlich muss eine Multiplikation mit der Fourier-Transformation des Kernels durchgeführt werden, eine weitere W²-Multiplikation. (Einmal erledigt, nicht einmal pro Ausgabepixel, pro Zeile oder so.) Dies sind komplexe Multiplikationen, das sind also echte 4W²-Multiplikationen.

Also, es sei denn, ich habe überlegt (und ich habe es wahrscheinlich getan), wir haben

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

Wann wollen wir die Dinge direkt erledigen? Wenn K klein genug ist, um W² · K² kleiner als 4W² · (2 ​​· log (W) + 1) zu machen. Ein gemeinsamer Faktor von W² wird leicht herausgerechnet. Wir können wahrscheinlich das "+1" fallen lassen, da es sich um idealisierte Schätzungen handelt. +1 geht wahrscheinlich bei Fehlern im Vergleich zu tatsächlichen Implementierungen verloren, da Additionen, Schleifen-Overheads usw. nicht gezählt werden. Das lässt:

K² < 8·log(W)

Dies ist die ungefähre Bedingung für die Wahl eines direkten Ansatzes gegenüber einem Frequenzraumansatz.

Es ist zu beachten, dass die Korrelation von zwei Bildern gleicher Größe genau so ist, als würde man sich mit einem Kernel der Größe K = W falten. Fourier-Raum ist immer der Weg, dies zu tun.

Dies kann verfeinert und umstritten werden, um Overhead, Pipelining von Opcodes, Float vs.

DarenW
quelle