AI at the Edge: aan de slag met de Maxim Integrated MAX78000FTHR
De MAX78000FTHR van Maxim Integrated is een boardje opgebouwd rond een MicroController Unit (MCU). Deze MCU is bedoeld voor Artificial Intelligence (AI) die “at the edge” draait. Met “at the edge” wordt bedoeld dat de intelligentie zich bevindt op de plek waar de informatie gebruikt wordt of juist dicht bij de sensor en juist niet in een datacentrum ergens ver weg. De edge is, bijvoorbeeld, in uw huis, in uw auto, of zelfs in de kleding die u draagt. Een AI-applicatie die at the edge draait doet zijn werk ter plaatse en met zijn eigen rekenkracht. Daar is een krachtige processor voor nodig. Daarom heeft de MAX78000 een ARM Cortex-M4-processor met een Floating Point Unit (FPU), een Convolutioneel Neuraal Netwerk (CNN) en een RISC-V-rekenkern aan boord.
Apparaten die “at the edge” werken, mogen niet veel energie verbruiken en daarom is de MAX78000 ook ontworpen voor ultra laag stroomverbruik. De MAX78000 is energiezuinig en toch krachtig, en kan volgens de fabrikant AI-inferenties uitvoeren (d.w.z. vragen beantwoorden als “Wie staat er op deze foto?” of “Welk geluid was dat?”) met minder dan 1/100e van de energie die andere embedded oplossingen gebruiken.
Een Convolutioneel Neuraal Netwerk
Een CNN is een speciaal soort neuraal netwerk dat gebruik maakt van convoluties. Een convolutie is een wiskundige bewerking die je vaak tegenkomt in beeld- en signaalverwerking en je kunt het zien als een soort (herkennende) filtering. Een CNN is een verzameling filters die een ingangssignaal onderzoeken op bepaalde kenmerken. CNN’s zijn met name nuttig in geluids- en beeldverwerkingstoepassingen, en het is dan ook niet verwonderlijk dat de MAX78000 ook beschikt over een camera-interface en I2S voor streaming audio. Het CNN is geoptimaliseerd voor 1D- en 2D-berekeningen (respectievelijk voor geluid- en beeldsignalen).
Naast de al genoemde modules en interfaces bevat de MAX78000 de meest gangbare interfaces die doorgaans in een microcontroller zitten en enkele speciale functies die verband houden met IoT-beveiliging, zoals een Random Number Generator (RNG) en een AES-encryptie-module (figuur 1).
Wat zit er aan boord?
De MAX78000FTHR (figuur 2) is een kleine module (66 × 23 mm) met de MAX78000, een kleine VGA-camera, een digitale microfoon, stereo audio I/O, een microSD-kaartslot, 1 MB QSPI-RAM, een SWD debug/programmeerpoort via USB en een LiPo-batterijlader. Er zijn ook twee RGB LED’s en twee drukknoppen voor de gebruiker en uitbreidingsconnectors compatibel met Adafruit’s Feather-vormfactor. Verder is er een afzonderlijke JTAG-connector voor het programmeren en debuggen van de RISC-V-kern.
Als we het board aansluiten op een computer, wordt het herkend als een samengesteld USB-apparaat dat bestaat uit een DAP-link plus CMSIS DAP WebUSB, een apparaat voor massaopslag en een seriële poort. Het board wordt geleverd met een audio KeyWord Spotting (KWS) demo. Als u een seriële terminal opstart en verbindt met de seriële poort, krijgt u instructies voor het gebruik van de demo.
Wat kun je ermee doen?
De demo herkent de Engelse woorden “Zero” t/m “Nine”, “Go”, “Stop”, “Left”, “Right”, “Up”, “Down”, “On” en “Off”. Als hij het woord “Go” herkent, gaat hij in getalherkenningsmodus, waarbij een LED een aantal keren opflitst op commando van de gebruiker. Dus als u “Six” zegt, zal de LED zes keer knipperen. Met “Stop” keert u terug naar de normale modus. Op de seriële monitor wordt weergegeven hoe zeker de demo is over de herkende woorden.
Om verder te gaan dan de standaard demonstratietoepassing (bijvoorbeeld om een systeembesturing te implementeren zoals het schakelen van een GPIO of het verzenden van gegevens via een andere interface), is een ontwikkelomgeving nodig. Maxim heeft daarvoor de Maxim Micros-SDK ontwikkeld, die u gratis kunt downloaden van hun website.
Deze SDK is een op Eclipse gebaseerde toolchain die ook kan worden gebruikt met andere ARM-MCU’s van Maxim. Hij bevat de Eclipse-IDE, MinGW, GCC-toolchains voor ARM- en RISC-V-processoren, OpenOCD en een paar andere utilities. Bovendien bevat de SDK bibliotheken, voorbeelden en documentatie; kortom, alles wat u nodig hebt om onder Windows aan de slag te gaan.
Aan de slag
Start Eclipse MaximSDK en kies of definieer een workspace. Zorg dat er geen spaties in het directorypad voorkomen, anders bestaat er een kans dat Eclipse uw projecten niet kan compileren, of dat uw workspace op een verkeerde plek terechtkomt.
Als de IDE start, ziet u een welkomstscherm, dat u kunt negeren en afsluiten. Daarna kunt u een nieuw project starten of een bestaan project5 importeren.
Om een nieuw project te maken, klapt u de regel C/C++ open en kiest u de wizard Maxim Microcontrollers. Klik dan op Next en voer een naam in voor het project. Klik nogmaals op Next en stel in het volgende dialoogvenster het Chip type in op MAX78000, het board type op FTHR_RevA, en het adaptertype op CMSIS-DAP. Kies als voorbeeldtype iets dat het meeste lijkt op wat u van plan bent te gaan maken en klik op Finish om het project aan te maken (figuur 3).
Kies het juiste board
Nu moet u eerst iets corrigeren aan het project, want hoewel u het MAX78000FTHR-board hebt geselecteerd, is het project gemaakt voor de MAX78000EVKIT. Dat is iets om in de gaten te houden, want bijna alles in de SDK is standaard ingesteld op deze kit. Er zijn twee manieren om het juiste board te selecteren (u kunt zelfs beide manieren toepassen, maar dat zal niet beter werken):
- Activeer onder Specify the board used in de makefile de regel voor het FTHR_RevA-board en commentarieer EvKit_V1 uit (zie Figuur 4).
- Bewerk het bouwcommando, dat toegankelijk is via het eigenschappenvenster van het project in de sectie C/C++ Build. Voeg BOARD=FTHR_RevA toe aan het build-commando (zie figuur 5) en klik op de knop Apply and Close.
Voer voor de zekerheid een Clean uit, voordat u verder gaat. Clean is beschikbaar in het menu Project. U kunt ook met de rechtermuisknop op het project klikken in het venster Project Explorer.
Bouw nu het project en kies voor debuggen of uitvoeren. Klik op Run (de groene cirkel met een wit driehoekje) of op Debug (het insect). Er kan dan een venster verschijnen met de titel Create, manage and run configurations. Als dat het geval is, klap dan de regel GDB OpenOCD Debugging uit en kies uw project voordat u verdergaat.
Als u in debug-modus bent gestart, zal het programma gestopt worden bij het begin van main. Gebruik de commando’s uit het menu Run om door het programma te stappen en variabelen te inspecteren.
Een voorbeeld importeren
Klik in het menu File op Import… om een voorbeeld te importeren. Vouw de eerste regel, General, uit, en kies de wizard Existing Projects into Workspace. Voer de root-directory in. Voor de SDK-voorbeelden is dat MaximSDK\Examples\MAX78000. U krijgt dan een lijst van voorbeelden en u kunt kiezen welke u wilt importeren. U kunt ze zelf allemaal importeren als u dat wilt.
Om verder te gaan met het herkennen van trefwoorden klikken we op Deselect All en vinken dan kws20_demo aan. Klik ook Copy projects into workspace aan, want we willen het voorbeeld gaan aanpassen en door met een kopie te werken, blijft het origineel intact.
Er zijn projecten die bestanden nodig hebben die zich niet in de projectmap bevinden. Die bestanden worden niet meegekopieerd als u een project kopieert en het compileren zal mislukken. U moet òf zelf deze bestanden kopiëren òf de makefile aanpassen om het pad naar deze bestanden te herstellen. Voor het voorbeeldproject cats-dogs_demo is bijvoorbeeld de map Common nodig. Kopieer die map dus ook (werk dus niet met het originele voorbeeld en kies vooral niet de voorbeelddirectory als uw werkmap).
Als u het voorbeeldproject hebt geïmporteerd, pas dan eerst het target-board aan, zoals eerder beschreven. Compileer daarna het voorbeeldproject en probeer het uit. Als dat goed gaat, kunt u uw eigen aanpassingen gaan maken.
Ik heb de KWS-demo zó veranderd dat hij pen P2.3 hoog maakt als hij het woord On herkent en die pen laag maakt als hij het woord Off hoort. Ook de LED doet daarbij mee: die wordt groen (On) of rood (Off). Als een ander sleutelwoord wordt herkend, licht de LED blauw op en verandert de waarde van de outputpen niet. Op pen P2.4 wordt een indicatie gegeven van de confidence: als die te laag is (≤95%), wordt P2.4 laag gemaakt, anders is hij hoog.
Verder heb ik UART2 aan de mix toegevoegd. Deze seriële poort is beschikbaar op de headers aan de rand van het board en kan dus worden aangesloten op een ander systeem om te reageren op de gegevens die via deze verbinding binnenkomen. Alle trefwoorden die met een waarschijnlijkheid van meer dan 95% worden herkend, worden over deze link verzonden. De trefwoorden On en Off worden voorafgegaan door ‘Y,’, de andere sleutelwoorden door ‘N,’. Bij een te laag confidentieniveau wordt het sleutelwoord voorafgegaan door ‘?,’. Natuurlijk zijn dit toevallig de keuzes die goed uitkwamen voor mijn eigen project. Als voor uw toepassing een andere codering handig is, aarzel dan vooral niet om dit aan te passen.
U kunt mijn project downloaden van GitHub. Ook vindt u daar een versie van de kat/hond-detector die een GPIO-pen aanstuurt en extra output geeft via UART2.
Aandachtspunten bij de MAX78000FTHR
Houd bij uw voorbereidingen voor het werken met de MAX78000FTHR rekening met het volgende.- Het spanningsniveau op de I/O-poorten is standaard 1,8 V. U kunt dat per pen veranderen met het veld vssel in de struct mxc_gpio_cfg_t bij het configureren van de pen met de functie MXC_GPIO_Config. Voor 3,3V vult u MXC_GPIO_VSSEL_VDDIOH in (standaard is het MXC_GPIO_VSSEL_VDDIO, zonder de ‘H’ aan het eind).
- Dit probleem met het spanningsniveau geldt ook voor de alternatieve functies van de pennen zoals TX en RX van UART2. Maar de bijbehorende configuratiestructuren zijn alleen maar te lezen, niet te schrijven. Daardoor kunt u de inhoud van het veld vssel niet veranderen. Een workaround is om eerst de datastructuur te kopiëren, de kopie aan te passen en die dan te gebruiken om de pin te (her)configureren zoals elke andere pin. Als u een betere manier weet om dit te doen, laat het me dan weten.
- Met de functie MXC_GPIO_OutPut kon ik de waarde van een pin niet instellen, ik moest MXC_GPIO_OutSet en MXC_GPIO_OutClr gebruiken. De oorzaak lijkt te liggen in de penwaarde die wordt doorgegeven. Nul werkt zoals verwacht, maar één niet. Om het te laten werken, geef ik de waarde door als -1 (min één, d.w.z. 0xffffffff)...
- Maxim heeft op GitHub repositories aangemaakt voor de MAX78000-printen en -tools, waar u de nieuwste versies van alles kunt vinden, inclusief tutorials en voorbeelden.
- De SDK wordt geleverd met MinGW als alternatief voor Eclipse. Dus, als u liever met een console werkt dan met een IDE, kan dat ook.
- Op de kleine camera van de MAX78000FTHR kan wat beschermfolie zitten (figuur 6). Verwijder die, voordat u met de camera gaat werken.
Begin met experimenteren
Nu bent u helemaal klaar om te gaan experimenteren met machinaal leren en kunstmatige intelligentie met de MAX78000FTHR-kaart. We hebben In dit artikel alleen nog maar een vluchtige indruk kunnen geven van de mogelijkheden van dit krachtige board en we willen er graag nog meer diepgaande artikelen aan wijden. Dit keer hebben we laten zien hoe u de ontwikkelomgeving kunt inrichten en hoe u enkele voorbeelden kunt aanpassen, waarmee het gebruik van voorgetrainde AI-netwerken wordt gedemonstreerd.
Een van de onderwerpen die we nog niet hebben aangesneden is het trainen van een netwerk. Dat is een taak die veel tijd en middelen vergt, maar het moet wel gebeuren als u wilt dat een AI-app met uw eigen gegevens werkt. Meer informatie hierover is te vinden in de Maxim repositories op GitHub.
Vertaling: Evelien Snel
Bent u klaar om innovatieve kunstmatige intelligentie (AI) oplossingen te ontwikkelen?
Doe mee aan de MAX78000 AI Design Contest. Integreer de MAX78000 in een creatief ontwerp en maak kans op een mooi geldbedrag! Registreer nu alvast voor een gratis MAX78000FTHR Eval Kit. Deel uw projectvoorstel met ons en wie weet, kunt u al heel snel aan de slag!