Entscheidungshilfe

Entscheidungshilfe

CPU oder FPGA für die Bildverarbeitung?

Da immer mehr Bildverarbeitungssysteme mit der neuesten Generation von Multicore-CPUs und leistungsstarken FPGAs ausgestattet sind, ist es wichtig, sich mit den Vor- und Nachteilen beider Verarbeitungselemente auseinanderzusetzen. Dabei geht es nicht nur um die passenden Algorithmen für das jeweilige Zielsystem, sondern auch um die am besten geeigneten Verarbeitungsarchitekturen.

 Aufgrund der hohen inhärenten Parallelität von FPGAs bieten diese teilweise deutliche Leistungssteigerungen gegenüber CPUs. (Bild: National Instruments Germany GmbH)

Bild 1 | Aufgrund der hohen inhärenten Parallelität von FPGAs bieten diese teilweise deutliche Leistungssteigerungen gegenüber CPUs. (Bild: National Instruments Germany GmbH)

Bevor es um die Auswahl der Algorithmen geht, sollte zunächst die am besten geeignete Verarbeitungsarchitektur für die jeweilige Anwendung ermittelt werden. Bei einem heterogenen Bildverarbeitungssystem mit CPU und FPGA kommen zwei Verarbeitungsmöglichkeiten in Frage: Co-Processing oder Inline-Verarbeitung. Beim FPGA-basierten Co-Processing teilen sich FPGA und CPU die Verarbeitungslast. Diese Architektur findet sich in der Regel bei Systemen mit GigE-Vision- und USB3-Vision-Kameras, da deren Erfassungslogik einfacher mit einer CPU implementiert werden kann. Das Bild wird zunächst mit der CPU erfasst und dann per direktem Speicherzugriff (Direct Memory Access, DMA) an den FPGA übertragen, auf dem anschließend Operationen wie Filterung oder das Entfernen von Farbebenen durchgeführt werden. Für weitere Verfahren wie z.B. OCR oder Musterabgleiche kann das Bild wieder zurück an die CPU gesendet werden. In manchen Fällen lassen sich auch alle Verarbeitungsschritte auf dem FPGA durchführen und nur die Ergebnisse an die CPU rückübertragen. Damit stehen mehr CPU-Ressourcen für andere Vorgänge wie Bewegungssteuerung, Netzwerkkommunikation und Bildanzeige zur Verfügung. Bei der FPGA-basierten Inline-Verarbeitung wird die Kameraschnittstelle dagegen direkt mit den FPGA-Pins verbunden, sodass die Bildelemente auf unmittelbarem Weg von der Kamera auf den FPGA übertragen werden. Diese Architektur kommt hauptsächlich bei Systemen mit Camera-Link-Kameras zum Einsatz, da die Erfassungslogik für diesen Kameratyp am einfachsten über die digitalen Schaltungen des FPGAs implementiert werden kann. Die Architektur bietet zwei Vorteile: Zu einem wird bei der Inline-Variante, ähnlich dem Co-Processing, ein Teil der Verarbeitungslast von der CPU auf den FPGA verlagert, indem einige Vorverarbeitungsfunktionen auf dem FPGA ablaufen. So lassen sich beispielsweise Filter- und Schwellenwertverfahren auf dem FPGA durchführen, bevor die Bildelemente weiter an die CPU gesendet werden. Da auf diese Weise nur Bildelemente aus relevanten Bereichen übertragen werden, muss die CPU weniger Daten verarbeiten, was den Gesamtdurchsatz des Systems erhöht. Zum anderen lassen sich auch Hochgeschwindigkeitssteuerungen und -regelungen direkt auf dem FPGA durchführen, ohne dafür die CPU in Anspruch zu nehmen. FPGAs eignen sich besonders gut für Steuer- und Regelanwendungen, da sie sehr schnelle und hochgradig deterministische Zykluszeiten ermöglichen. Ein Beispiel hierfür ist die Hochgeschwindigkeitssortierung, bei welcher der FPGA Impulse an einen Aktor sendet, der Teile auf einem Förderband dann entsprechend sortiert bzw. auswirft.

Visionalgorithmen für CPU und FPGA

 Die Entwicklung von Algorithmen für FPGA-Zielsysteme mit einem konfigurationsbasierten Tool mit integriertem Leistungsvergleich beschleunigt den Entwicklungsablauf. (Bild: National Instruments Germany GmbH)

Bild 2 | Die Entwicklung von Algorithmen für FPGA-Zielsysteme mit einem konfigurationsbasierten Tool mit integriertem Leistungsvergleich beschleunigt den Entwicklungsablauf. (Bild: National Instruments Germany GmbH)

Jetzt steht die Auswahl der passenden Algorithmen an. Hierfür muss zunächst die Funktionsweise von CPUs und FPGAs näher betrachtet werden. Zur Veranschaulichung dient hier ein theoretischer Algorithmus, der dieselben vier Verarbeitungsschritte einmal auf einer CPU und einmal auf einem FPGA durchführt. Eine CPU arbeitet sequenziell, d.h., dass eine Operation erst vollständig beendet sein muss, bevor der nächste Vorgang gestartet wird. In diesem Beispiel benötigt jeder der vier Verarbeitungsschritte 6ms für die Ausführung, sodass die Gesamtverarbeitungszeit auf der CPU 24ms beträgt. FPGAs hingegen zeichnen sich durch eine hohe Parallelität aus, sodass jeder der vier Verarbeitungsschritte zur selben Zeit an unterschiedlichen Bildelementen durchgeführt werden kann. Damit liegt die Verarbeitungszeit für das erste Bildelement bei nur 2ms und für das gesamte Bild bei 4ms, woraus sich eine Gesamtverarbeitungszeit von 6ms ergibt. Dies ist eine deutliche Steigerung gegenüber der Verarbeitung auf der CPU. Selbst beim FPGA-basierten Co-Processing, bei dem das Bild zur CPU und wieder zurück gesendet wird, liegt die Gesamtverarbeitungszeit, einschließlich der Übertragungszeit, immer noch deutlich unter der einer rein CPU-basierten Verarbeitung. Ein reales Beispiel wäre die Vorbereitung eines Bildes für die Teilchenzählung. Zur Schärfung des Bildes wird zunächst ein Faltungsfilter angewandt. Anschließend wird durch Anwendung eines Schwellenwerts ein Binärbild erzeugt. Durch die Konvertierung eines 8bit-s/w-Bildes in ein Binärbild werden nicht nur die Bilddaten reduziert, das Bild wird auch für die nötigen morphologischen Bildverfahren vorbereitet. Als letzter Schritt wird das Bild im Rahmen der Morphologie der Schließen-Operation unterzogen, um Löcher aus den Segmenten zu entfernen. Wird dieser Algorithmus nur auf der CPU ausgeführt, muss zuerst die Faltungsoperation auf dem kompletten Bild ablaufen, bevor als nächster Schritt dann das Schwellenwertverfahren usw. ausgeführt werden kann. Mit dem Vision Development Module für LabView und dem auf dem All-Programmable SoC (System on a Chip) Zynq-7020 von Xilinx basierenden CompactRIO-Controller cRIO-9068 liegt die Gesamtverarbeitungsdauer hier bei 166,7ms. Wird der gleiche Algorithmus auf einem FPGA ausgeführt, können alle Verarbeitungsschritte parallel ablaufen. Somit dauert die gesamte Verarbeitung auf dem FPGA nur 8ms, wobei auch die DMA-Übertragungszeit zwischen CPU und FPGA enthalten ist. In manchen Fällen muss das verarbeitete Bild möglicherweise für andere Anwendungsbereiche zurück an die CPU gesendet werden. Dadurch dauert der gesamte Prozess etwa 8,5ms. Der Algorithmus wird auf dem FPGA also fast 20-mal schneller als auf der CPU ausgeführt. Das legt natürlich die Frage nahe, warum nicht einfach jeder Algortihmus auf dem FPGA ausgeführt wird. Aber wie so oft, ist auch die FPGA-basierte Verarbeitung mit gewissen Einschränkungen verbunden. Da wären z.B. Taktraten. FPGA-Taktraten bewegen sich in der Regel zwischen 100 und 200MHz und liegen damit deutlich unter denen von CPUs, die ohne weiteres 3GHz oder mehr erreichen. Bei Anwendungen, in denen Bildverarbeitungsalgorithmen iterativ ablaufen müssen und die keine Parallelität benötigen, ermöglicht eine CPU daher eine schnellere Verarbeitung. Im vorangegangenen Beispiel wurde der Algorithmus auf dem FPGA mit der 20-fachen Geschwindigkeit ausgeführt. Da die Verarbeitungsschritte an einzelnen Bildelementen oder kleineren Gruppen von Bildelementen parallel ausgeführt werden, profitiert der Algorithmus von der parallelen Verarbeitung des FPGAs. Bei Algorithmen für den Musterabgleich oder OCR, bei denen das gesamte Bild auf einmal analysiert werden muss, liegt der FPGA bei der Verarbeitungsleistung jedoch nicht mehr vorne. Das liegt zum einen daran, dass keine parallele Verarbeitung stattfindet und zum anderen am enormen Speicherbedarf, der für die Analyse eines vollständigen Bildes im Gegensatz zu einer Binärmatrix notwendig ist. FPGAs haben zwar auch direkten Zugriff auf interne und ggf. auch externe Speicherressourcen, allerdings in deutlich geringerem Maße als CPUs oder als für diese Verarbeitungsschritte erforderlich.

Weniger Komplexität bei der Programmierung

Ob ein FPGA einer Bildverarbeitungsanwendung Vorteile bringt, muss von Fall zu Fall beurteilt werden. Dabei kommt es auf Faktoren wie die verwendeten Algorithmen, Anforderungen an Latenz oder Jitter, I/O-Synchronisierung und Stromverbrauch an. In den meisten Fällen ist eine Architektur sowohl mit FPGA als auch mit CPU die beste Option in Bezug auf Leistung, Kosten und Zuverlässigkeit. Eine der größten Hürden bei der Implementierung eines FPGA-basierten Bildverarbeitungssystems ist jedoch häufig die komplexe Programmierung von FPGAs. Die Entwicklung von Visionalgorithmen ist schon von Natur aus ein iterativer Prozess, bei dem von vorneherein klar ist, dass für jede Aufgabe verschiedene Ansätze ausprobiert werden müssen. Meistens geht es dabei nicht darum, ob ein Ansatz funktioniert, sondern welcher Ansatz am besten funktioniert, was wiederum von Anwendung zu Anwendung variiert. Bei manchen Anwendungen zählt die Geschwindigkeit, bei anderen die Genauigkeit. Es müssen jedoch immer mehrere Lösungswege getestet werden, um den besten für eine bestimmte Anwendung zu finden. Für eine höhere Produktivität bei der Entwicklung sollten während des Entwurfsprozesses unmittelbar Feedback und Leistungsvergleiche für die jeweiligen Algorithmen ausgegeben werden und zwar unabhängig von der verwendeten Verarbeitungsplattform. Die Anzeige von Algorithmenergebnissen in Echtzeit spart enorm viel Zeit bei solch iterativen Entwicklungsansätzen. Gängige Entwicklungsfragen, wie, welcher Schwellenwert der richtige ist, ab welcher Größe Teilchen von einem binären morphologischen Filter aussortiert werden sollen oder welcher Vorverarbeitungsalgorithmus und welche Parameter ein Bild am besten bereinigen, sollten umgehend beantwortet und Einstellungen entsprechend angepasst werden können. Der herkömmliche Entwicklungsansatz für FPGAs kann diesen Innovationszyklus jedoch verlangsamen, da nach jeder Änderung am Algorithmus erst wieder neu kompiliert werden muss. Eine Möglichkeit, dies zu umgehen, ist der Einsatz eines Entwicklungstools, mit dem sowohl CPU- als auch FPGA-Bereitstellungen in einer Umgebung entwickelt werden können, ohne dass der Prozess durch die FPGA-Kompilierung verzögert wird. Der Vision Assistant von NI bietet genau diese Funktionalität und ermöglicht das Testen der Algorithmen vor der Kompilierung und Bereitstellung auf dem Zielsystem. Außerdem bietet er einfachen Zugriff auf Daten zum Durchsatz und zur Ressourcenauslastung.

 

National Instruments Germany GmbH

Das könnte Sie auch Interessieren