Cpu of fpga voor beeldverwerking: welke tool is het meest geschikt?

Dankzij krachtige fpga’s en de laatste generatie multicore cpu’s kunnen visionsystemen steeds sneller en beter hun werk doen. Maar welke van de twee het beste werkt, hangt af van de toepassing. Brandon Treece van National Instruments legt uit waar je als ontwikkelaar op moet letten.

Brandon Treece is productmarketingmanager voor data-acquisitie en control met specialisme machinevision bij National Instruments in Austin, VS.

4 mei 2018

Industriële automatiseringssystemen maken dankbaar gebruik van de ontwikkelingen in machinevision of computervision om productiekwaliteit te verbeteren en de snelheid op te voeren. Camera’s zijn de afgelopen jaren gemeengoed geworden in onze omgeving – computers, mobiele apparaten, auto’s – maar de grootste vooruitgang is te danken aan de toegenomen rekenkracht.

Dankzij de verdubbeling van de processorkracht iedere twee jaar en de focusverschuiving naar parallelle architecturen kunnen sensoren met steeds hogere resolutie en groter dynamisch bereik worden ingezet en kan de beeldacquisitiesnelheid steeds omhoog. Maar bovendien kunnen gegevens steeds sneller worden verwerkt. Beslissingen op basis van visuele data kunnen sneller dan ooit tevoren worden genomen.

Figuur 1 – Wordt de fpga ingezet als coprocessor, dan wordt het beeld door de cpu binnengehaald en vervolgens via een dma-operatie naar de fpga gestuurd.

Moderne visionsystemen worden steeds vaker uitgerust met de laatste generatie multicore cpu’s en krachtige fpga’s. Voor ontwerpers is het dus belangrijk de voor- en nadelen van deze technologieën te begrijpen. Daarmee kunnen ze bepalen welk algoritme het beste waar kan draaien. Ook de architectuur van het systeem is een belangrijke keuze.

Inline versus coprocessing

Wat architecturen betreft, zijn er twee mogelijke aanpakken om een fpga in te zetten: als coprocessor of inline. Bij een coprocessor is de cpu in het systeem verantwoordelijk voor de data-acquisitie, en worden de gegevens via dma (direct memory acces) naar de fpga gestuurd. De fpga voert dan bewerkingen zoals filtering of kleurextractie uit, en het bewerkte beeld wordt weer teruggestuurd naar de cpu voor geavanceerde analyses zoals patroonherkenning of interpreteren van geschreven teksten (ocr). Deze architectuur wordt meestal toegepast in combinatie met GigE-vision en usb3-camera’s, omdat de acquisitielogica het meest geschikt is voor een cpu.

Figuur 2 – Bij een inline-architectuur wordt de camera rechtstreeks aangesloten op de fpga, die de pixels begint te verwerken op het moment dat de camera ze verstuurt.

Bij een inline-architectuur wordt de camera-interface rechtstreeks op de pinnen van de fpga aangesloten. Deze architectuur wordt geregeld gebruikt bij Camera Link-sensoren omdat de acquisitielogica eenvoudig in de fpga kan worden geïmplementeerd. Deze architectuur heeft twee belangrijke voordelen. Ten eerste kan de hoeveelheid informatie voor de cpu aanzienlijk worden gereduceerd wanneer de fpga zorgt voor het vinden van een region of interest. Ten tweede kunnen zeer snelle besturings- en regellussen in de fpga worden uitgevoerd zonder de cpu te betrekken. Fpga’s kunnen namelijk extreem snel en binnen een vaste tijd gegevens verwerken. Bij het sorteren van onderdelen bijvoorbeeld kan de fpga direct pulsen naar een actuator sturen om componenten door te laten of juist uit te werpen op het moment dat ze de camera passeren.

Sysarch online wenibinar

Algoritme op cpu of fpga?

Om te bepalen of we een algoritme op de cpu of de fpga willen draaien, is wat basiskennis nodig over de manieren waarop ze van elkaar verschillen. Cpu’s voeren de bewerkingen sequentieel uit, een voor een. In een beeldverwerkingspijplijn moet eerst de ene stap volledig worden afgerond voordat de volgende kan worden gestart. Heb je bijvoorbeeld een pijplijn van vier stappen, en elke stap duurt zes milliseconden, dan neemt de hele procedure 24 ms in beslag.

Een fpga werkt echter van nature parallel. Elk van de vier stappen kan gelijktijdig op verschillende delen van het beeld worden uitgevoerd. Dit betekent dat de eerste bewerkte pixel al na twee milliseconden beschikbaar is en het hele beeld in vier milliseconden is verwerkt, waarmee de totale procedure in zes milliseconden is afgerond.

Laten we een realistisch voorbeeld nemen van een visietoepassing: deeltjes tellen in een camerabeeld (zie Figuur 4). De eerste stap is een convolutiefilter om de afbeelding te verscherpen. Vervolgens wordt het beeldmateriaal door een drempelfilter gehaald om een binair beeld te verkrijgen, een beeld met slechts twee waardes. Deze bewerking reduceert de hoeveelheid data van acht naar één bit per pixel en maakt het beeld geschikt voor binaire morfologie. Die laatste stap vult eventuele gaten in de deeltjes op.

In een test met een Xilinx Zynq-7020-soc neemt dit 166,7 ms in beslag als dit algoritme enkel en alleen op de cpu wordt uitgevoerd. De convolutiestap moet eerst volledig op de complete afbeelding worden gerealiseerd voordat de drempelstap kan worden gestart, en zo verder voor de opeenvolgende stappen. Wordt hetzelfde algoritme op de fpga uitgevoerd, dan kunnen de stappen deels parallel worden uitgevoerd. De complete verwerking neemt daardoor nog slechts 8 ms in beslag. De toepassing gebruikt de coprocessor-aanpak, dus dit is inclusief de dma-overdracht.

In sommige toepassingen kunnen alle beeldverwerkingsstappen in de fpga worden uitgevoerd en worden alleen de hoogniveauresultaten naar de cpu gestuurd. De cpu houdt dan meer tijd over voor andere taken zoals motioncontrol, netwerkcommunicatie of beeldweergave.

Figuur 3 – Fpga’s werken van nature parallel en bieden daarmee een belangrijke prestatieverbetering ten opzichte van cpu’s.

Moet het bewerkte beeld nog worden teruggestuurd naar de cpu (bijvoorbeeld voor gebruik in andere delen van de applicatie), dan moeten we in het gebruikte voorbeeld nog 0,5 ms optellen. Al met al betekent dit dat de fpga het volledige algoritme bijna twintig maal sneller kan uitvoeren dan de cpu.

De vraag is dus waarom we niet gewoon alle algoritmes op een fpga zouden laten draaien? De afweging is dat niet ieder algoritme van het parallellisme van een fpga kan profiteren. Bij patroonherkenning en ocr bijvoorbeeld moet de totale afbeelding als één geheel worden geanalyseerd. Dan worstelt de fpga met het leveren van goede prestaties. De cpu is dan in het voordeel omdat de kloksnelheid veel hoger ligt. Een fpga draait doorgaans tussen de honderd en tweehonderd MHz, een cpu tikt al snel 3 GHz aan. Daarnaast is er een grote hoeveelheid geheugen nodig om de hele afbeelding vast te houden. Hoewel de fpga direct toegang heeft tot zowel het interne als het externe geheugen, komt de geheugencapaciteit niet in de buurt van de cpu.

Iteratief proces

De afweging hangt met andere woorden samen met de specifieke toepassing, de gebruikte algoritmes, de vereisten rond vertraging en jitter, i/o-synchronisatie en verbruik. Vaak biedt een architectuur met zowel een fpga als een cpu het beste van beide werelden en het komt die het beste uit de bus op het gebied van prestaties, kosten en betrouwbaarheid.

Figuur 4 – Een beeldverwerkingspijplijn om deeltjes te tellen bestaat typisch uit een convolutiefilter, een drempelfilter en een binaire-morfologiestap.

Ontwikkelen van visionalgoritmes is fundamenteel een iteratief proces; voor iedere taak moeten verschillende aanpakken worden uitgeprobeerd. De meeste tijd gaat niet zozeer zitten in het bepalen welke benadering werkt, maar welke het beste werkt. Wat is de juiste drempelwaarde? Hoe groot of klein zijn de te verwerpen deeltjes bij de toepassing van een binair morfologisch filter? Welk voorverwerkingsalgoritme en welke parameters zijn het beste om een beeld op te schonen? Algemene regels zijn hier nauwelijks te geven. Voor de ene toepassing is snelheid essentieel, terwijl de nauwkeurigheid in andere applicaties van belang is.

Helaas is de programmeercomplexiteit van fpga’s een grote uitdaging voor de ontwikkeling van dergelijke systemen. De traditionele benadering voor fpga-ontwikkeling, met lange compilatietijden voor elke verandering, kan ontwikkeling in de weg zitten. Een mogelijkheid om dit probleem te overwinnen is om algoritmeontwikkeltools te gebruiken die zowel de cpu’s als de fpga’s binnen dezelfde omgeving kunnen programmeren, zoals NI Vision Assistant.

Bij de vraag of een fpga of een cpu de beste oplossing is voor beeldverwerking luidt het antwoord simpelweg: ‘Dat hangt af van de toepassing.’ Maar ongeacht de applicatie bieden cpu- en fpga-gebaseerde architecturen de mogelijkheden om machinevisionapplicaties op een hoger niveau te brengen.