Slimme objectteller: eenvoudige beeldherkenning met Edge Impulse
Ontdek hoe je een Raspberry Pi en een camera kunt transformeren in een slimme tool voor het tellen van objecten met behulp van het Edge Impulse-platform! Dit leuke en toegankelijke project laat zien hoe eenvoudig het is om te beginnen met Edge Impulse op een Raspberry Pi. Kijk mee.
Edge Impulse is gespecialiseerd in het leveren van tools en platforms voor het ontwikkelen van machine learning-modellen voor edge computing, met name op embedded apparaten. Edge computing houdt in dat gegevens dichtbij de bron worden verwerkt, in plaats van op een externe server te vertrouwen. Dat kan perfect worden geïmplementeerd op een Raspberry Pi! In dit voorbeeld tellen we kleine objecten – simpele knopen op textiel.
Machine learning-platforms zoals Edge Impulse maken gebruik van zogenaamde modellen. Dat zijn specifieke soorten algoritmen die worden gebruikt voor gegevensanalyse en patroonherkenning. Deze modellen worden getraind om patronen te herkennen, voorspellingen te doen of taken uit te voeren op basis van ingevoerde gegevens.
Objecten classificeren is eenvoudig mogelijk met Edge Impulse-modellen. Je kunt onderscheid maken tussen een mens en dieren of tussen fietsen en auto’s om maar een paar voorbeelden te noemen. Bovendien kun je gemakkelijk een type object tellen temidden van andere soorten objecten. Het enige wat je nodig hebt is een camera van goede kwaliteit, voldoende licht, de juiste scherpstelling en, tot slot, een redelijke computer (een Raspberry Pi 3 of Raspberry Pi 4 is goed genoeg), en je bent klaar om te gaan tellen.
Vanaf het begin was dit project bedoeld voor implementatie op microcontroller-niveau – een Espressif ESP32, een Arduino Nicla vision of iets in die geest. En daarom werd het gebouwd voor een zeer klein telgebied (120 × 120 pixels) met een relatief kleine knoop als object waar we in geïnteresseerd zijn. Uiteindelijk bleek dat zelfs voor zo’n klein gebied een MCU geen partij was. De modellen voor machine learning worden vooraf getraind op de Edge Impulse-servers en daarbij wordt een zogenaamd modelbestand gegenereerd dat wordt opgeslagen op het embedded apparaat. Dit modelbestand zelf is al ongeveer 8 MB groot! Daarom werd het project uiteindelijk geïnstalleerd op een Raspberry Pi computer, waar het probleemloos werkt.
Kennis versus wijsheid
Als je Edge Impulse kent, dan is de helft van het werk al gedaan – geloof me. Voor de rest hoef je alleen maar je model aan te passen zodat een acceptabel prestatieniveau wordt bereikt. Een computer-AI model is als een kind. Als kind leerde je dingen als “A is een appel” en “B is een bal”. Je kreeg een appel te zien vanuit verschillende richtingen en dan leerde je om dat ding “appel” te noemen. Hetzelfde gold voor “bal”. En dan zal een kind vanuit alle mogelijke hoeken vrij gemakkelijk een appel en een bal herkennen! En zo is het ook met AI, die ze gemakkelijk kan identificeren.
Stel je nu eens voor dat er een mand is waar ogenschijnlijk ballen ter grootte van een appel en appels ter grootte van een bal door elkaar liggen, en die er tot overmaat van ramp allemaal hetzelfde uitzien. Wat zou jij als kind doen? Met uitsluitend kennis van “appel” en “bal” zou je ze niet uit elkaar kunnen houden! Hetzelfde geldt voor AI. Maar stel dat die mand is uitgestald door een groente- en fruitverkoper. Naar alle waarschijnlijkheid zitten er dan geen ballen bij! En het zouden best allemaal appels kunnen zijn. Deze ‘truc’ om een appel in verband te brengen met een groente- en fruitverkoper zou je “wijsheid” kunnen noemen, wat je noch van een kind noch van AI kunt verwachten, tenzij het specifiek anders is aangeleerd. De mens heeft in de loop der jaren echter veel meer associaties geleerd die ons uiteindelijk genoeg wijsheid hebben gegeven om een appel met een groente- en fruitverkoper in verband te brengen.
AI wordt echter zo snel zoveel beter dat het ooit met deze ‘wijsheid’ zal kunnen werken. Voorlopig moet je het ML-model voor appels en ballen vanuit alle mogelijke hoeken aanleren om ze zonder enige verwarring te kunnen herkennen (bijvoorbeeld het textuurprofiel van een appel, de steel, de plooien van het vruchtlichaam, de blik van bovenaf en van onderaf en nog veel meer). In elk geval zijn er veel verschillende modellen met verschillende mogelijkheden beschikbaar in Edge Impulse om te testen en om mee te experimenteren.
Aan de slag met Edge Impulse
Open eerst een account in Edge Impulse , waarvoor je een e-mail ID nodig hebt. Zorg dat je een handjevol gelijke knopen bij de hand hebt. Als je de site opent vanaf een Raspberry Pi-computer, kun je met de camera van de Raspberry Pi (aangesloten op USB of cam-poort) beelden van knopen vanuit verschillende hoeken verzamelen (wat nodig is als het model voor daadwerkelijk gebruik wordt uitgerold). Edge Impulse heeft ook voorzieningen om je mobiele telefoon of laptop aan te sluiten als invoerapparaat voor het verzamelen van gegevens, wat ook handiger is voor data-acquisitie in het Edge Impulse-project.
Het project
Het Edge Impulse-project is grofweg onderverdeeld in de volgende stappen, die allemaal moeten worden gevolgd op de Edge Impulse-website.
1. Data-acquisitie: dit kunnen beelden, geluid, temperaturen, afstanden enzovoort. zijn. Een deel van de gegevens wordt apart gehouden als testgegevens, terwijl alle andere gegevens worden gebruikt als trainingsgegevens.
2. Impulse-ontwerp: het belangrijkste deel wordt Create Impulse genoemd. In deze context is een ‘Impulse’ naar een pijplijn of workflow voor het maken van een machine learning-model. Deze Impulse omvat verschillende stadia, waaronder het aanpassen van invoerparameters die zijn gekoppeld aan de zojuist verzamelde gegevens, signaalverwerking, extractie van kenmerken en het machine learning-model zelf. ‘Kenmerken’ zijn individuele meetbare eigenschappen of karakteristieken van een geobserveerd fenomeen. In wezen zijn kenmerken de data-attributen die door modellen worden gebruikt om patronen te detecteren en beslissingen te nemen.
De Impulse-pijplijn is onderverdeeld in:
- invoerparameters: afbeelding (breedte, hoogte), geluid (geluidsparameters);
- verwerkingsblok: hoe de invoergegevens te verwerken;
- leerblok: objectgegevens van dit model.
Je moet deze drie stappen selecteren en configureren.
3. Beeldverwerking: kenmerken genereren van de verzamelde beelden.
4. Objectdetectie: selecteer je neurale netwerkmodel en train het.
Voor het laatste gedeelte – de objectdetectie – is je expertise nodig, of veeleer ‘vallen-en-opstaan’, zodat de nauwkeurigheid van het model 85% of meer gaat bedragen. Soms moet je een aantal slechte afbeeldingen (ook wel uitschieters genoemd) uit het model verwijderen om de efficiëntie te verbeteren.
Er is een handvol modellen waarbij je kunt proberen hoe nauwkeurig het model is. Alles boven de 90% is geweldig, maar het hoeft zeker niet voor 100% nauwkeurig te zijn! Als dat wel zo is, dan is er iets mis met je gegevens. Het kan zijn dat er erg weinig data zijn of dat er onvoldoende kenmerken zijn. Controleer en probeer het in dat geval opnieuw! Voor dit project was de nauwkeurigheid 98,6%. Natuurlijk was ons aantal gegevens (ongeveer 40) klein. Maar voor een instapproject is dit behoorlijk goed (zie figuur 1). De bestanden voor dit project zijn beschikbaar op de Elektor Labs-pagina bij dit artikel.
Test van het model
Je kunt je model eerst testen op de testgegevens. Begin daar en richt je apparaat dan op de echte objecten en kijk of het werkt!
In het dashboard van de openingspagina van Edge Impulse is de testfunctie beschikbaar. Je kunt het model direct in de browser uitvoeren, maar je kunt ook je smartphone gebruiken om het te testen. Hiervoor biedt Edge Impulse een QR-code die je kunt scannen met je smartphone (figuur 2). Richt de camera da op de knopen (figuur 3, figuur 4 en figuur 5) en kijk of ze correct geteld worden.
Raspberry Pi-implementatie
Om het model op een Raspberry Pi computer uit te voeren, moet je het *.eim bestand downloaden. Maar in tegenstelling tot andere hardware (Arduino, Nicla Vision of ESP32, waar je direct kunt downloaden), moet je in het geval van de Raspberry Pi eerst Edge Impulse installeren op de Raspberry Pi-computer. Vanuit die edge-impulse-daemon software moet je dit bestand downloaden. Maar maak je geen zorgen, Edge Impulse heeft een volledige pagina gewijd aan het installeren van Edge Impulse op de Raspberry Pi. Er zijn een paar afhankelijkheden die je eerst moet installeren. Werp eens een blik op , alles is vrij eenvoudig. Het proces is goed beschreven.
OK, dus nadat je Edge Impulse hebt geïnstalleerd op de Raspberry Pi-computer, kan de pret beginnen. Vergeet niet om de Raspberry Pi verbonden te houden met het internet.
Voer het commando edge-impulse-linux-runner uit vanaf de Raspberry Pi-terminal. Dit start een wizard die je vraagt om in te loggen en een Edge Impulse-project te kiezen. Als je later tussen projecten wilt wisselen, voer dan dat commando opnieuw uit met de optie --clean. Dit commando zal automatisch het AI-model van je project compileren en downloaden en vervolgens starten op je Raspberry Pi. Laat de knopen zien aan de camera die is aangesloten op je Raspberry Pi en hij zou ze moeten tellen. Dat is goed! In het volgende zullen we het systeem aanpassen met Python en een spraaksynthesizer die, na het tellen, het aantal knopen noemt.
Model implementeren in Python
In de bovenstaande opstelling werkt alles zoals bedoeld in het Edge Impulse-model. Om het te laten werken voor jouw speciale doel – bijvoorbeeld om een geluidsalarm te laten klinken of een LED te laten oplichten wanneer ‘2 of meer’ knopen zijn geteld – moet je iets anders bedenken! Hier komt Python 3 je te hulp. Linux-sdk-python moet geïnstalleerd zijn op je Raspberry Pi-computer.
De Edge Impulse SDK Software Development Kit (SDK) is beschikbaar voor veel omgevingen, waaronder Python, Node.js, C++ enzovoort. Bekijk daartoe de SDK Python-pagina .
Zodra linux-sdk-python is geïnstalleerd, ga je naar de map linux-sdk-python/examples/image en voer je het Python-bestand voor beeldherkenning uit. Pas op: vergis je niet. In de voorbeeldmap staan drie submappen – één voor audiodata, één voor beelddata en één voor eigen data. In de beelddata-map is het video-classificatiebestand ook beschikbaar voor video-invoerdata. De map voor eigen data is voor het aanpassen van andere soorten gegevens (alleen voor experts!).
Voer nu deze opdracht uit:
python3 classify-image.py /home/bera/downloads/model.eim
Het modelbestand *.eim moet worden geladen vanuit de directory waar het zich bevindt. Je kunt het desgewenst ook naar de SDK-directory kopiëren!
Zo moet je het Python-bestand laden met het gedownloade model.eim-bestand. Het programma vindt automatisch de cameramodule (aangesloten op USB- of Cam-poort) en start. In de linkerbovenhoek wordt een klein 120×120-cameravenster geopend en de geïdentificeerde knopen worden met een kleine rode stip gemarkeerd. De geïdentificeerde nummers worden getoond in de terminal. Zorg ervoor dat er voldoende licht is en dat de camera goed is scherpgesteld op de knopen. Dit is vooral belangrijk voor goedkope camera’s. Als je het model op je smartphone uitvoert, worden veel betere beelden geproduceert en wordt veel sneller geteld. Zorg desondanks voor goed licht en scherpstelling voor het beste resultaat.
In de volgende screenshots van de Raspberry Pi-computer is linksboven het kleine beeldvenster zichtbaar waarin de knopen worden geïdentificeerd en geteld door het model. Zie de duidelijk zichtbare rode markering op alle knoppen!
In figuur 6 worden vier knopen gemist vanwege ontoereikende scherpstelling en verlichting. De hier gebruikte camera kan ook niet op een statief worden vastgezet! Daarom raad ik aan om de camera op een statief te bevestigen (vergelijkbaar met een microscoop). Zorg ervoor dat je met de camera recht op de knopen kijkt.
In figuur 7 heb ik één knoop verwijderd en het model telde in eerste instantie goed. Er werden twee knopen herkend, maar op het moment dat ik op de printscreen-knop drukte, verliep de uitlijning en ging de telling mis. Zorg er ook voor dat de camera een lange kabel (lintkabel – zie mijn prototype in figuur 8) heeft voor de nodige bewegingsvrijheid. Zo’n kabel is verkrijgbaar bij Amazon. Maar als de camera eenmaal op een statief is gemonteerd bij voldoende licht/daglicht, zal hij prima werken.
Aanpassing van het model
Werp eens een blik op het bestand classify-image.py. Het is een eenvoudig Python-bestand dat met weinig moeite aan individuele behoeften kan worden aangepast. In dit Python-bestand heb ik een espeak-module toegevoegd zodat op het moment dat een knoop of knopen worden gedetecteerd, het aantal gedetecteerde knopen wordt uitgesproken. Om espeak op je Raspberry Pi te installeren, moet je het volgende commando uitvoeren:
sudo apt-get install espeak
Zie listing 1 met het Python-bestand inclusief mijn aanpassingen.
Espeak is een zelfstandige tekst-naar-spraak-module voor Python. Voor het gebruik is geen internetverbinding nodig.
Aangepaste uitvoering
Nu heb je het Python-programma aangepast. Als je het nu uitvoert, zal het de knopen vinden (linksboven wordt een klein 120×120-display geopend); de gedetecteerde aantallen zullen worden weergegeven in het terminalvenster en via de luidspreker tekstueel worden genoemd: “Found five buttons / Found two buttons” enzovoort. Als je een relais wilt aansturen, een LED wilt laten branden of iets dergelijks, moet je de GPIO-bibliotheek van Python importeren en de betreffende GPIO activeren voor de gewenste actie. In het geval van een relais moet je echter een drivertransistor gebruiken die de stroom kan verwerken die het relais nodig heeft.
Nasleep
Edge Impulse startte in 2019 met als doel ontwikkelaars in staat te stellen de volgende generatie intelligente apparaten te maken. Sindsdien zijn er AI-gestuurde programma’s en apparaten verschenen voor ESP32, Jetson Nano, Raspberry Pi, Orange Pi, Maixduino, OpenMV, Nicla Vision en nog veel meer. Deze trend zal de komende tijd aanhouden! De dagen van supercomputers of ‘grote’ computermerken zijn voorbij. Kleine modulaire apparaten met een gering stroomverbruik nemen hun plaats in toenemend tempo in. En wie weet – misschien hebben we binnenkort de ingebouwde wijsheid kant-en-klaar in een doosje!
Opmerking redactie: Dit artikel (230575-03) is verschenen in Elektor Maart/April 2024.
Vragen of opmerkingen?
Hebt u technische vragen of opmerkingen hebt naar aanleiding van dit artikel? Stuur een e-mail naar de auteur via berasomnath@gmail.com of naar de redactie van Elektor via redactie@elektor.com.