Maak een slimme camera met je Raspberry Pi 4
Kunstmatige intelligentie toepassen in je eigen projecten is niet vanzelfsprekend. De software is doorgaans vrij lastig en je hebt ook heel wat data nodig om je algoritme mee te trainen. Edge Impulse is én gebruiksvriendelijk én laat je heel eenvoudig data verzamelen voor je project. Dit alles werkt in een eenvoudige webinterface. In dit artikel tonen we je hoe je met Edge Impulse van een ip-camera een slimme camera maakt.
Bij kunstmatige intelligentie wil je dat een computer (en dat kan ook je smartphone zijn, een Raspberry Pi of je domoticacontroller) zelf kan leren om taken uit te voeren. Dat aanleren gebeurt vaak onder ‘supervisie’. Neem het voorbeeld van personen herkennen in een camerabeeld: dan neem je foto’s van alle personen die je wilt herkennen, schrijft er hun naam bij (het ‘label’) en geeft als invoer aan het programma de lijst met foto’s en bijbehorende labels. Dat zijn de trainingsdata.
Het algoritme probeert nu patronen te herkennen in foto’s die hetzelfde label hebben, en dat is heel wat rekenwerk. Uiteindelijk heb je dan een ‘model voor machinaal leren’ getraind. Dat model (wat ook een algoritme is) herkent diezelfde patronen in andere foto’s die het nog nooit gezien heeft, en kent aan die foto’s een label toe. Het heeft dus zo geleerd om die specifieke personen te herkennen in foto’s. De prestaties van je model kun je testen door een nieuwe lijst met foto’s aan het model te voeren en te kijken of het label dat het aan die foto’s toekent overeenkomt met het label dat jij daaraan toegekend hebt. Dat zijn de testdata.
01 Gebruiksvriendelijke AI
Dat trainen van een model is veel rekenwerk, maar ook het verzamelen en het toevoegen van labels aan de trainingsdata is een tijdrovend proces. Zijn je trainingsdata niet talrijk en divers genoeg, dan presteert je model niet goed, en ligt je herkenningspercentage veel te laag om in de praktijk bruikbaar te zijn.
In de praktijk schieten heel wat oplossingen voor AI (artificial intelligence) tekort in de ondersteuning van het trainen. Er is een hoge instapdrempel en daardoor werken heel wat AI-toepassingen van hobbyisten niet optimaal. Ook voor dit soort toepassingen wil je dat het algoritme zo goed mogelijk werkt en niet slechts in grote lijnen.
02 Aan de slag met Edge Impulse
Een van die oplossingen die zich focust op het democratiseren van AI en vooral op het gebruiksvriendelijk maken van het trainen, is Edge Impulse. Je kunt hier gratis een account aanmaken, en na de activatie van je account klik je op Click here to build your first ML model!.
Je krijgt nu de wizard van Edge Impulse te zien voor een nieuw project. Je kunt kiezen uit drie standaardtypen, afhankelijk van het type data dat je wilt verwerken: sensordata van een accelerometer, audio of foto’s. Voor gevorderden is er ook de mogelijkheid om een ander type sensor te kiezen, want de architectuur van Edge Impulse is generiek: je kunt er elk type data mee verwerken. Voor dit artikel kiezen we Images.
©PXimport
03 Beeldclassificatie of objectherkenning
In de eerste stap koos je het type data, nu moet je kiezen wat je ermee wilt doen. Voor foto’s zijn er twee mogelijkheden: beeldclassificatie of objectherkenning. Beeldclassificatie is het eenvoudigste: je toont een foto en het algoritme herkent hier één object in. Zo kun je een algoritme trainen dat kan herkennen of er zich een kat, hond of kip in de foto bevindt. Als er zich meerdere objecten tegelijk op een foto bevinden, werkt de herkenning minder goed of wordt er maar één van de objecten herkend, en soms raakt het algoritme zelfs helemaal in de war en herkent het niets meer. Het voordeel van beeldclassificatie is wel dat het ook op apparaten met minder rekenkracht werkt, zoals microcontrollers.
Als je krachtiger hardware hebt, zoals een Raspberry Pi, dan kun je ook meerdere objecten en zelfs hun locatie herkennen in een foto. Rond de herkende objecten op de foto wordt dan een kadertje getekend. Dan spreken we niet meer van classificatie, maar van objectherkenning. Edge Impulse ondersteunt objectherkenning op de Raspberry Pi 4 en de Nvidia Jetson Nano. In deze masterclass gaan we objecten herkennen met een Raspberry Pi 4, dus klik op Classify multiple objects (object detection).
©PXimport
Andere toepassingen
In deze masterclass doen we objectherkenning in camerabeelden, maar Edge Impulse ondersteunt ook andere toepassingen. Je kunt ook geluiden herkennen of patronen in sensordata, zoals van een temperatuursensor of accelerometer. De globale aanpak is hetzelfde, alleen train je het model op een ander type data. Zo kun je in een audiosignaal dierengeluiden herkennen of zelfs woorden, en in een stroom van accelerometerdata van je telefoon kun je herkennen welke bewegingen je telefoon maakt.
©PXimport
04 Bereid je Raspberry Pi 4 voor
Edge Impulse ondersteunt van de Raspberry Pi’s alleen de Raspberry Pi 4. Installeer Raspberry Pi OS op een microSD-kaartje, bijvoorbeeld met behulp van Raspberry Pi Imager. Kies bij voorkeur Raspberry Pi OS Lite, want je hebt geen desktopomgeving op je Raspberry Pi nodig.
Volg daarna de instructies van de Raspberry Pi Foundation om wifi op je Raspberry Pi headless op te zetten. Maak bovendien een leeg bestand genaamd ssh (zonder extensie) in de bootpartitie van de microSD-kaart aan. Ontkoppel daarna het microSD-kaartje en steek het in je Raspberry Pi. Sluit dan eventueel een ethernetkabel aan en indien nodig de Raspberry Pi Camera Module (zie het kader ‘Raspberry Pi Camera Module aansluiten’) of een usb-webcam. Steek tot slot de voedingskabel in je Raspberry Pi en wacht tot je hij is opgestart.
©PXimport
05 Installeer Edge Impulse
Na enkele minuten zou je Raspberry Pi via het netwerk bereikbaar moeten zijn. Log dan via een opdrachtregel met de opdracht ssh in op je Raspberry Pi met hostname raspberrypi.local of het ip-adres dat je in de lijst met DHCP-leases van je DHCP-server (vaak je router) te zien krijgt:
ssh pi@raspberrypi.local
Log in met het wachtwoord raspberry. Upgrade vervolgens alle pakketten:
sudo apt update && sudo apt upgrade
En installeer dan Edge Impulse met de volgende serie opdrachten:
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
sudo apt install -y gcc g++ make build-essential nodejs sox gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps
npm config set user root && sudo npm install edge-impulse-linux -g --unsafe-perm
Als je met de Raspberry Pi Camera Module wilt werken, dan moet je die eerst nog inschakelen. Zie daarvoor het kader ‘Raspberry Pi Camera Module aansluiten’. Bij een ondersteunde usb-webcam is die extra stap niet nodig.
©PXimport
Raspberry Pi Camera Module aansluiten
De Raspberry Pi heeft een CSI-poort (Camera Serial Interface), waarop je de officiële cameramodule kunt aansluiten. Die poort bevindt zich op de Raspberry Pi 4 tussen de analoge audio-uitvoer en een van de twee micro-HDMI-aansluitingen. Trek het zwarte klepje op de poort voorzichtig naar boven. Schuif de lintkabel er voorzichtig in, met de blauwe strook naar de kant van de analoge audio-uitvoer gericht. Druk het klepje voorzichtig weer in, zodat de kabel vastzit. Start je Raspberry Pi op en voer de opdracht sudo raspi-config uit op de opdrachtregel. Navigeer met de cursortoetsen naar Interfacing Options, druk op Enter, selecteer P1 Camera en bevestig met Yes dat je de camera wilt inschakelen. Ga dan met de tabtoets naar Finish en bevestig dat je je Raspberry Pi wilt herstarten.
©PXimport
06 Verbind met Edge Impulse
Nu je Raspberry Pi klaar is, kun je het camerabeeld met Edge Impulse verbinden. Start daarvoor de wizard van Edge Impulse:
edge-impulse-linux
De wizard helpt je om de Edge Impulse-software op je Raspberry Pi te verbinden met je account bij Edge Impulse. Vul dus je gebruikersnaam en wachtwoord bij Edge Impulse in en geef je apparaat een naam waarmee je het in de webinterface wilt zien.
Wanneer de wizard zegt dat je Raspberry Pi 4 met je project verbonden is, klik je in de webinterface van Edge Impulse (de wizard toont je ook de url) links op Devices. Als alles goed is verlopen, zie je hier je Raspberry Pi 4 met als sensors de microfoon en camera.
De opdracht edge-impulse-linux moet overigens blijven draaien zolang je met de cameramodule foto’s wilt nemen via Edge Impulse. Met Ctrl+C sluit je de opdracht (en dus ook de verbinding met Edge Impulse) af.
©PXimport
07 Verzamel foto’s
Dan is het nu tijd om foto’s te verzamelen. Dat kan in het tabblad Data acquisition. Klik je daarop, dan zie je rechts al je Raspberry Pi 4. Je hoeft alleen maar bij Sensor in het uitklapmenu Camera (640x480) te kiezen, een label in te vullen en op Start sampling te klikken. Positioneer de camera nu tot je een collectie hebt van minstens dertig foto’s per type te herkennen object vanuit allerlei gezichtspunten. Fotografeer overigens niet alleen objecten die je wilt herkennen, maar ook onbekende objecten.
Staat je Raspberry Pi 4 wat onhandig om voldoende foto’s te nemen, dan kun je ook je telefoon als apparaat toevoegen. Je hoeft daarvoor zelfs geen app te installeren. Klik in het tabblad Devices van Edge Impulse op Connect a new device en klik dan bij Use your mobile phone op Show QR code. Scan die QR-code op je telefoon en open de url. Tik dan op Collecting images? en geef de webapplicatie toegang tot je camera. Je kunt nu een label invullen en foto’s maken. Maak je geen zorgen als de labels niet altijd kloppen of als er twee typen objecten in het camerabeeld staan: je kunt dit later nog aanpassen.
Een laatste manier om foto’s te verzamelen, is bestaande foto’s uploaden. Klik daarvoor in het tabblad Data acquisition op Show options en dan Go to the uploader.
©PXimport
08 Label foto’s
Nadat je voldoende foto’s hebt, klik je in het tabblad Data acquisition bovenaan op Labeling queue. Je krijgt nu een voor een alle foto’s te zien. Sleep een kader volledig rond het object en vul een label in. Edge Impulse gist overigens al naar de locatie, zodat je na een tijdje alleen maar de getoonde kaders hoeft te bevestigen of iets moet verplaatsen. Klik op Save labels en herhaal het proces voor de volgende foto.
Als je klaar bent, vind je in Training data de gelabelde foto’s waarop je het AI-model traint en in Test data de gelabelde foto’s die Edge Impulse opzij heeft gezet om nadien het getrainde model mee te testen. Standaard splitst Edge Impulse je dataset automatisch op in 80% trainingsdata en 20% testdata.
©PXimport
09 Balanceer je datasets
Edge Impulse toont bovenaan enkele cijfers over de verzamelde data: hoeveel items (foto’s) je hebt en hoeveel labels. Naast het aantal labels zie je ook een taartdiagram van de verschillende labels. Als de verdeling duidelijk onevenwichtig is, maak dan extra foto’s met het label dat minder voorkomt. Als je foto’s met twee labels traint, moet je uiteindelijk voor elk label ongeveer de helft van de foto’s hebben.
Kijk ook nog eens na of ongeveer 20% van je data bij Test data staan. Zo niet, bijvoorbeeld als je die optie om dat automatisch te doen niet had gekozen, klik dan in Dashboard op Rebalance dataset.
©PXimport
10 Maak een impuls
Nu je de data hebt, is het tijd om het algoritme te definiëren. Edge Impulse noemt dit een ‘impuls’. Klik op het tabblad Impulse design. Je krijgt dan enkele blokken te zien die na elkaar worden uitgevoerd. Het eerste blok, Image data, mag je onveranderd houden: je werkt met afbeeldingen van 320 × 320 pixels.
Klik daarna op Add a processing block en klik bij Image op Add. De naam en invoeras (Input axes) mag je onveranderd laten. Klik daarna op Add a learning block en kies Object Detection (Images). Ook hier kun je de standaardinstellingen behouden. Je ziet al dat de labels in je dataset getoond worden onder Output features. Klik tot slot op Save Impulse.
©PXimport
11 Verwerk de data
Klik nu in de linkerzijbalk onder Impulse design op Image. Dit toont de ruwe data en hoe die door de verwerkingsstap van je impuls worden verwerkt. Klik op Save parameters. In het volgende scherm klik je op Generate features, dan wijzigt Edge Impulse de grootte van alle afbeeldingen naar de standaardgrootte, verwerkt de data en maakt het een 3D-visualisatie van je hele dataset.
Zodra je Job completed ziet staan, zie je de 3D-visualisatie in Feature explorer. Die reduceert de dimensies van je data tot drie en toont vergelijkbare foto’s in de buurt van elkaar. In ons voorbeeld van twee objecten zie je geen duidelijke afscheiding tussen beide labels. We kunnen dus al verwachten dat het algoritme moeite zal hebben om de objecten van elkaar te onderscheiden. In het ideale geval had je duidelijk twee afzonderlijke groepjes datapunten gezien. Als je op een bolletje klikt, krijg je overigens de foto te zien die dat punt voorstelt.
©PXimport
12 Start het leerproces
Voor de laatste stap klik je bij Impulse design op Object detection. Voor objectherkenning biedt Edge Impulse één algoritme aan: MobileNetV2 SSD FPN-Lite 320x320. Dit is een bestaand algoritme, dat we deels gaan hertrainen met onze eigen data. Dat gaat sneller dan helemaal van nul een nieuw algoritme te trainen. Probeer eerst of de standaardinstellingen volstaan en klik dan onderaan op Start training.
Je kunt nu rechts alle stappen van de training volgen. Uiteindelijk wordt het model op basis van de trainingsdata gemaakt en krijg je te zien hoe precies het model werkt. Een score van 90% is heel goed. In ons geval haalden we maar 56%. Het model had dus grote moeite om onze twee objecten te herkennen.
©PXimport
13 Verbeter het model
Dit is het moment om de instellingen te finetunen. Het eerste wat je kunt aanpassen, is het aantal trainingscycli. Bij Number of training cycles staat standaard de waarde 25, maar verhoog die naar 100. Dat leverde ons een score van 61% op. Niet zoveel beter dan de eerste poging.
Je kunt ook rechts onderaan een andere Model version kiezen. Standaard toont Edge Impulse de score van een geoptimaliseerd model, Quantized (int8). Kijk eens wat de prestaties van het ongeoptimaliseerde model Unoptimized (float32) zijn. In ons geval was dat minder, maar in andere gevallen kan het weleens meer zijn. Dit model gebruikt meer opslag, maar op onze Raspberry Pi 4 is dat geen probleem.
In een ultieme poging om een beter model te verkrijgen, startten we een training met 200 cycli. Dat leverde maar een minimale verbetering op: 62%. We kunnen dit waarschijnlijk alleen nog significant verhogen door meer data te trainen.
14 Draai op de Raspberry Pi
Start op je Raspberry Pi je impuls:
edge-impulse-linux-runner
Deze opdracht downloadt het model en begint continu naar objecten te zoeken in het camerabeeld. Op de opdrachtregel krijg je de objecten en hun locatie te zien die het algoritme herkent. Als je naar http://raspberrypi.local:4912 surft, krijg je live het camerabeeld te zien met kadertjes voor de herkende objecten.
©PXimport
15 Python-code
Als je nu het model van Edge Impulse in je eigen code wilt gebruiken, kan dat met de Edge Impulse Linux SDK voor Python. Installeer eerst Pythons pakketbeheerder pip, Git en enkele afhankelijkheden die we nodig hebben met de volgende opdracht:
sudo apt install python3-pip git libopenjp2-7 libilmbase23 libopenexr23 libavcodec58 libavformat58 libswscale5 libgtk-3-0 liblapack3 libatlas3-base libportaudio2
Installeer dan de Edge Impulse SDK:
pip3 install edge_impulse_linux
Download het model van Edge Impulse met:
edge-impulse-linux-runner --download model.eim
Download daarna de repository met voorbeeldcode:
git clone https://github.com/edgeimpulse/linux-sdk-python
En voer het voorbeeldprogramma voor objectdetectie uit om te zien of alles werkt:
python3 linux-sdk-python/examples/image/classify.py /home/pi/model.eim
Je zou nu op de opdrachtregel weer de labels en hun locatie moeten te zien krijgen voor het camerabeeld.
©PXimport
16 Slimme ip-camera
Deze voorbeeldcode in Python kun je nu naar hartenlust uitbreiden. We gaan de code aanpassen zodat het beeld niet komt van een lokaal aangesloten Raspberry Pi Camera Module, maar van een willekeurige ip-camera op je netwerk. Op deze manier kun je met Edge Impulse van elke ip-camera een slimme camera maken.
De wijzigingen aan de code daarvoor blijven beperkt, maar vragen wel wat aandacht. De functie get_webcams() die de aangesloten webcams herkent, mag weg. We hoeven ook niet te controleren of er één of meer camera’s aangesloten te zijn. Daarvoor in de plaats interpreteren we het tweede argument dat je aan het script doorgeeft op de opdrachtregel als een RTSP-url (Real Time Streaming Protocol). En het camera-object voor OpenCV maken we niet aan op basis van de device-ID, maar op basis van de url:
camera = cv2.VideoCapture(videoCaptureDeviceUrl)
Het enige wat lastige is dat de methode classifier van de klasse ImageImpulseRunner uit de SDK van Edge Impulse een device-ID van een lokaal aangesloten camera verwacht. Maar dat lossen we op door zelf een functie rtsp_classifier aan te maken waaraan we het runner-object en de RTSP-url doorgeven:
def rtsp_classifier(runner, rtsp_url):
runner.videoCapture = cv2.VideoCapture(rtsp_url)
while not runner.closed:
success, img = runner.videoCapture.read()
if success:
features, cropped = runner.get_features_from_image(img)
res = runner.classify(features)
yield res, cropped
Dit roepen we dan als volgt aan:
for res, img in rtsp_classifier(runner, videoCaptureDeviceUrl):
De rest van de code blijft zo goed als ongewijzigd.
17 Beeldherkenning op afstand
Je kunt de Python-code met deze aanpassingen opslaan onder de naam smart_ipcam.py. Omdat het overtikken van code vaak lastig is, hebben wij de code in een zip-bestand gestopt, dat je kunt downloaden via www.bit.ly/picamcode. Voer de code als volgt uit op je Raspberry Pi:
python3 smart_ipcam.py model.eim rtsp://IP:PORT/PATH
Raadpleeg voor de volledige url de instellingen of documentatie van je ip-camera. Scherm je de toegang af met een gebruikersnaam en wachtwoord, dan heeft de url de vorm rtsp://USER:PASSWORD@IP:PORT/PATH.
Als alles goed gaat, zul je na het verbinden met je ip-camera zien dat het programma weer continu objecten in het beeld probeert te herkennen.
Dit kun je nu nog uitbreiden, zodat je programma bij het herkennen van een label een bericht stuurt via MQTT of realtime een foto met de aangeduide kaders en labels naar je e-mailt. Dat laten we als oefening over aan de lezers. Kijk voor inspiratie eens naar het project van Edge Impulse dat waarschuwingen via Twilio stuurt.
18 En verder
Edge Impulse heeft nog heel wat meer mogelijkheden voor AI. Bekijk zeker de documentatie. Die biedt bijvoorbeeld tips om de prestaties van je model te verbeteren. En als je mobielere toepassingen wilt, dan kun je Edge Impulse ook op je mobiele telefoon draaien. In de webapplicatie schakel je dan over van datacollectie naar classificatie. Ook microcontrollers zoals de Arduino Nano 33 BLE Sense zijn interessant, bijvoorbeeld om patronen in audio of sensordata te herkennen.
©PXimport
Test je data
De splitsing in trainingsdata en testdata betekent dat je na het trainen van je data kunt uitproberen of het model je testdata correct herkent. Dat kun je in Edge Impulse doen door links op Model testing te klikken en dan op Classify all. Van elk van de foto’s in je testdata kijkt Edge Impulse welk object je model erin herkent en vergelijkt dat met het label dat je eraan hebt toegekend. Uiteindelijk krijgt het model een nauwkeurigheidsscore: het percentage foto’s waaraan het model met meer dan 80% precisie het juiste label toekent. In ons geval haalde ons model in de test een nauwkeurigheid van 78%.
©PXimport