De laatste twee jaar is er veel gebeurd op gebied van 'Embedded Machine Learning'. We spreken over 'Embedded Machine Learning' wanneer een model kan draaien op een microcontroller (zoals een Arduino) en niet meer op een computer. Stilaan wordt het eenvoudiger om een getraind model te gaan gebruiken in een Arduino-project via de gewone programmeeromgeving van Arduino.
Voorlopig is er nog geen betaalbare Arduino met een camera, maar de ESP-32 CAM biedt wel mogelijkheden voor wat experimenten.
Een eerste optie is dat we een AI-model laten draaien via de browser die verbonden is met onze ESP-32 CAM. Zo kunnen we een getraind model van Teachable Machine dan in de browser gebruiken. We gebruiken hiervoor een stukje code dat we gevonden hebben via Youtube.
In het filmpje hiernaast wordt getoond hoe je je link van je project kan ingeven in je project met de ESP-32 cam. Als je nog nooit gewerkt hebt met de ESP-32 cam, kijk dan eerst even op de pagina over dit board op de Arduino-site van onze STEM-klas. De ESP-32 cam kan je programmeren met de Arduino programmeeromgeving. Probeer minstens vooraf even de CameraWebServer voorbeeldcode bij de voorbeelden voor ESP-32 cam in Arduino te testen.
De basiscode: Voor onze eerste test waar we een model van Teachable Machine gaan gebruiken met de ESP-32 cam vertrekken we van de code van dit project op Github.
Die code kan je gewoon kopiëren naar Arduino. Je moet eigenlijk enkel de naam van je wifi-netwerk ingeven en het bijhorende paswoord. Dat vraag je best even aan je leerkracht.
De code doorsturen: Ga nu net als in de voorbeeldcode 'CameraWebServer' eerst je code doorsturen naar je ESP-32 cam. Na het uploaden mag je de draad van GPIO0 naar GND verwijderen en even op de knop van je board drukken.
Je ziet dan in de Serial Monitor het webadres verschijnen dat je kan ingeven in je browser.
Het browsermenu gebruiken: Wanneer je de pagina met dit adres opent zal je zien dat die er iets anders uitziet dan bij de CameraWebServer. Bovenaan in het menu heb je een vak 'Model Path'. Hier geef je de link in die je kopieerde van het blauwe vak Upload (Your shareable link) in Teachable Machine .
Nu kan je op de knop 'Start Recognition' klikken. Als alles goed gaat kan je nu je model gaan gebruiken op je ESP-32 cam.
De link die je moet kopiëren vind je hier:
Geef die daarna in in het vak 'Model Path' in je browser:
Je model gebruiken op de ESP-32cam, het beeld in je browser:
We hebben ons nog niet echt verdiept in alle mogelijkheden, maar een ML project wordt natuurlijk pas echt leuk als je op basis van je model bepaalde zaken kan aansturen. Voorlopig hebben we als test enkel een LED laten knipperen wanneer onze ESP-32 cam een steen (vuist) zag.
Hiervoor zijn we beginnen experimenteren in de buurt van regel 500 van de code. Hier kan je alvast van vertrekken voor je eigen experimenten. Vergeet natuurlijk niet bovenaan ook je pin 12 als een OUTPUT aan te geven in void setup.
De ESP-32 CAM kost een kleine €10 en is dus beperkt van geheugen en rekenkracht, maar met wat creativiteit kunnen we hierop een getraind model installeren dat beelden kan klasseren op het toestel zelf. In een blogpost van survivingwithandroid vonden we een stappenpln dat we als basis nemen voor de werkwijze hieronder.
Het verzamelen van data en het trainen van ons model doen we op Edge-Impulse. Op een andere pagina werken we de stappen uit om je data-set te maken.
Na het importeren van je data zou je dus een verzameling moeten hebben waarin je je gelabelde beelden hebt zitten.
Op de 'Impulse design' pagina zie je voor je je model gaat trainen 3 blokken.
In het blok Image data gaan we nu echt de beelden naar het minimum herleiden: 48 pixels op 48 pixels. Het geheugen van onze ESP-32 CAM is immers beperkt. Wanneer we met RGB werken (drie kleuren) dan komen we al op 48x48x3 pixels die verwerkt moeten worden.
Links: origineel, rechts 48x48 pixels
In het blok Image wordt onze data verwerkt zodat het trainen efficiënter kan verlopen.
In het blok Tranfer Learning wordt kan je het geschikte learning block kiezen om je model te trainen.
Hieronder zie je een deel van de 'Data Acquisition' pagina nadat je je gelabelde data hebt verzameld.
Hieronder zie je de 'Impulse design' pagina.
Wanneer je dan naar het tabblad transfer learning gaat, dan kan je de opbouw van je neural network en het verloop van de training zelf aanpassen.
De 'Number of training cycles' is hier met 300 vrij hoog.
Van 'Learning rate' blijven we af.
De 'Minimum confidence rating' is de grenswaarde die we ons model geven om een beeld in een bepaalde klasse te ordenen. Hou dat voorlopig ook op 0.60.
In onze Output layer kiezen we voor het kleinste model onderaan MobileNetV2 0.05.
Als dit gebeurt is kunnen we de Arduino-library downloaden via Edge Impulse. Bij de voorbeeldcode hier gaan we naar de 'static buffer' code bij examples in de map die we net gedwonload hebben.
We moeten ook de esp-32 camera library toevoegen als dat nog niet gebeurd is.