Inhoudsopgave:
- Stap 1: CNN en Transfer Learning: enige theorie
- Stap 2: Bereid uw omgeving voor
- Stap 3: Installeer AXeleRate en voer tests uit
- Stap 4: Train het model opnieuw, converteer Keras-model naar.kmodel
- Stap 5: Voer het model uit op Sipeed Maix Bit
- Stap 6: Conclusies
Video: Beeldherkenning met K210-kaarten en Arduino IDE/Micropython - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:15
Ik heb al een artikel geschreven over het uitvoeren van OpenMV-demo's op Sipeed Maix Bit en heb ook een video gemaakt van een demo van objectdetectie met dit bord. Een van de vele vragen die mensen hebben gesteld is: hoe herken ik een object waarvoor het neurale netwerk niet is getraind? Met andere woorden, hoe u uw eigen afbeeldingsclassificatie kunt maken en deze kunt uitvoeren met hardwareversnelling.
Dit is een begrijpelijke vraag, aangezien u voor uw project waarschijnlijk bepaalde generieke objecten, zoals katten en honden en vliegtuigen, niet hoeft te herkennen. U wilt iets specifieks herkennen, bijvoorbeeld een hondenras voor dat automatische huisdierluik, of een plantensoort om te sorteren, of andere spannende toepassingen die u maar kunt bedenken!
Ik heb je! In dit artikel zal ik je leren hoe je je eigen aangepaste afbeeldingsclassificator maakt met transfer learning in Keras, het getrainde model converteert naar.kmodel-formaat en het uitvoert op Sipeed-bord (kan elk bord zijn, Bit/Dock of Go) met behulp van Micropython of Arduino-IDE. En alleen je verbeeldingskracht zal de limiet zijn voor taken die je met deze kennis kunt doen.
UPDATE MEI 2020: Toen ik zag hoe mijn artikel en video over beeldherkenning met K210-borden nog steeds erg populair zijn en tussen de topresultaten op YouTube en Google, besloot ik het artikel bij te werken met de informatie over aXeleRate, op Keras gebaseerd framework voor AI op de Rand die ik ontwikkel.
aXeleRate is in wezen gebaseerd op de verzameling scripts die ik heb gebruikt voor het trainen van modellen voor beeldherkenning/objectdetectie - gecombineerd in een enkel raamwerk en geoptimaliseerd voor workflow op Google Colab. Het is handiger in gebruik en meer up-to-date.
Voor de oude versie van het artikel kun je het nog steeds zien op steemit.com.
Stap 1: CNN en Transfer Learning: enige theorie
Convolutionele Neurale Netwerken of CNN is een klasse van diepe neurale netwerken, die meestal worden toegepast voor het analyseren van visuele beelden. Er is veel literatuur op internet over dit onderwerp en ik zal in het laatste deel van het artikel enkele links geven. Kortom, je kunt CNN zien als een reeks filters, toegepast op de afbeelding, waarbij elk filter op zoek is naar een specifiek kenmerk in de afbeelding - op de lagere convolutionele lagen zijn de functies meestal lijnen en eenvoudige vormen en op de hogere lagen de functies kan specifieker zijn, bijv lichaamsdelen, specifieke texturen, delen van dieren of planten, enz. De aanwezigheid van bepaalde kenmerken kan ons een idee geven van wat het object in de afbeelding zou kunnen zijn. Snorharen, twee ogen en een zwarte neus? Moet kat zijn! Groene bladeren, een boomstam? Lijkt wel een boom!
Ik hoop dat je nu een idee krijgt van het werkingsprincipe van CNN. Normaal gesproken heeft een diep neuraal netwerk duizenden afbeeldingen en uren trainingstijd nodig (afhankelijk van de hardware die u voor de training gebruikt) om filters te "ontwikkelen" die handig zijn voor het herkennen van de soorten objecten die u wilt. Maar er is een kortere weg.
Een model dat is getraind om veel verschillende veelvoorkomende objecten te herkennen (katten, honden, huishoudelijke apparaten, transport, enz.) heeft al veel van die handige filters "ontwikkeld", dus we hebben het niet nodig om de basisvormen en onderdelen te leren herkennen van de objecten weer. We kunnen gewoon de laatste paar lagen van het netwerk opnieuw trainen om specifieke klassen objecten te herkennen, die belangrijk voor ons zijn. Dit wordt "transfer learning" genoemd. Je hebt aanzienlijk minder trainingsgegevens en rekentijd nodig met transfer learning, omdat je alleen de laatste paar lagen van het netwerk traint, dat misschien uit een paar honderd neuronen bestaat.
Klinkt geweldig, toch? Laten we eens kijken hoe we het kunnen implementeren.
Stap 2: Bereid uw omgeving voor
Er zijn twee manieren om aXeleRate te gebruiken: lokaal draaien op een Ubuntu-machine of in Google Colab. Bekijk dit voorbeeld om te draaien in Google Colab:
Afbeeldingsclassificatie Colab Notebook
Uw model lokaal trainen en exporteren voor gebruik met hardwareversnelling is nu ook veel eenvoudiger.
Mijn werkomgeving is Ubuntu 16.04, 64bit. U kunt een virtuele machine gebruiken om de Ubuntu-image uit te voeren, aangezien we GPU niet zullen gebruiken voor training. Met enkele aanpassingen kunt u het trainingsscript ook op Windows uitvoeren, maar voor modelconversie moet u het Linux-systeem gebruiken. Dus de voorkeursomgeving om deze tutorial uit te voeren is Ubuntu 16.04, native of in virtuele machine.
Laten we beginnen met het installeren van Miniconda, een omgevingsmanager voor Python. We zullen een geïsoleerde omgeving creëren, zodat we niet per ongeluk iets veranderen in de Python-omgeving van uw systeem.
Download hier het installatieprogramma
Nadat de installatie is voltooid, maakt u een nieuwe omgeving aan:
conda create -n ml python=3.7
Laten we de nieuwe omgeving activeren
conda active ml
Er verschijnt een prefix voor je bash-shell met de naam van de omgeving, wat aangeeft dat je nu in die omgeving werkt.
Stap 3: Installeer AXeleRate en voer tests uit
Installeer aXeleRate op uw lokale computer met
pip install git+https://github.com/AIWintermuteAI/aXeleRate
Om voorbeelden te downloaden, voer je uit:
git clone
U kunt snelle tests uitvoeren met tests_training.py in de map aXeleRate. Het zal training en inferentie uitvoeren voor elk modeltype, getrainde modellen opslaan en converteren. Omdat het slechts voor 5 tijdperken traint en de dataset erg klein is, zul je geen bruikbare modellen kunnen krijgen, maar dit script is alleen bedoeld om te controleren op afwezigheid van fouten.
Stap 4: Train het model opnieuw, converteer Keras-model naar.kmodel
Voor dit speelgoedvoorbeeld zullen we het model trainen om de kerstman en Arduino Uno te herkennen. Uiteraard kun je andere lessen kiezen. Download hier de dataset. Maak een kopie van het classifier.json-bestand in de configuratiemap en wijzig het dienovereenkomstig, vergelijkbaar met het configuratiebestand in de schermafbeelding - zorg ervoor dat het pad naar de trainings- en validatiemappen correct is!
Voer de volgende opdracht uit vanuit de map aXeleRate:
python axelerate/train.py - c configs/santa_uno.json
De opleiding gaat van start. Als de validatienauwkeurigheid (onze validatiemetriek) gedurende 20 tijdperken niet verbetert, zal de training voortijdig stoppen. Elke keer dat de validatienauwkeurigheid verbetert, wordt het model opgeslagen in de projectmap. Nadat de training is afgelopen, converteert aXeleRate automatisch het beste model naar gespecificeerde formaten - u kunt vanaf nu kiezen voor "tflite", "k210" of "edgetpu".
Stap 5: Voer het model uit op Sipeed Maix Bit
Er zijn twee manieren om het model dat u nu hebt op Sipeed Maix-hardware uit te voeren: micropython-firmware en Arduino IDE. Micropython-hardware is gemakkelijker te gebruiken, maar neemt een aanzienlijk deel van het beschikbare geheugen in beslag, dus er is minder ruimte over voor het model. Arduino IDE is in feite C-code, die veel efficiënter is en een kleinere geheugenvoetafdruk heeft. Mijn model is slechts 1,9 Mb, dus beide opties werken ervoor. Je kunt modellen tot 2,9 Mb gebruiken met Micropython, voor alles wat groter is, moet je overwegen om Arduino IDE te gebruiken.
Download OpenMV IDE vanaf hier en minimale micropython-firmware vanaf hier.
Brand de firmware met de tool kflash_gui. Je kunt er ook voor kiezen om het getrainde model ook te flashen, zoals te zien is in de schermafbeelding. Of kopieer het naar de SD-kaart (kopieer in dat geval.kmodel naar de root van een SD-kaart en plaats de SD-kaart in Sipeed Maix Bit)
Open OpenMV IDE en druk op de verbindingsknop. Open santa_uno.py script uit de map example_scripts en druk op de Start-knop. Je zou een livestream van de camera moeten zien en als je Serial Terminal opent, krijg je het beste beeldherkenningsresultaat met de vertrouwensscore!
Voor gebruik met Arduino IDE moet u eerst de procedure volgen voor het toevoegen van Sipeed-kaarten aan Arduino IDE, die hier wordt beschreven. Je Arduino IDE-versie moet minimaal 1.8.12 zijn. Nadat u de borden heeft toegevoegd, opent u de schets mobilenet_v1_transfer_learning.ino en uploadt u deze naar Sipeed Maix Bit. Wijzig de naam van het model op de SD-kaart in "model" (of maak een kopie met deze naam). U kunt de labelnamen wijzigen in names.cpp. Het toont de live camerastream op het Sipeed Maix-scherm samen met het bovenste resultaat van de beeldherkenning.
Stap 6: Conclusies
Hier zijn nog wat materiaal om te lezen over het onderwerp CNN's en transfer learning:
Transfer Learning met Mobilenet en Keras Een goede uitleg van Transfer learning, deze tutorial gebruikt een aangepaste versie van de code uit dat artikel.
Katten en honden en convolutionele neurale netwerken Legt de basis achter CNN's uit en visualiseert enkele van de filters. Met katten!
Train, converteer, voer MobileNet uit op Sipeed MaixPy en MaixDuino! Een tutorial van het Sipeed-team over hoe je Mobilenet 1000-klassen helemaal opnieuw kunt trainen (geen transfer learning). Je kunt hun voorgetrainde model downloaden en uitproberen!
Ik hoop dat je de kennis die je nu hebt kunt gebruiken om geweldige projecten te bouwen met machine vision! Je kunt Sipeed-borden hier kopen, ze behoren tot de goedkoopste opties die beschikbaar zijn voor ML op embedded systemen.
Aanbevolen:
DIY slimme weegschaal met wekker (met wifi, ESP8266, Arduino IDE en Adafruit.io): 10 stappen (met afbeeldingen)
DIY Slimme Weegschaal Met Wekker (met Wi-Fi, ESP8266, Arduino IDE en Adafruit.io): In mijn vorige project ontwikkelde ik een slimme weegschaal met Wi-Fi. Het kan het gewicht van de gebruiker meten, het lokaal weergeven en naar de cloud sturen. U kunt hier meer informatie over krijgen op onderstaande link: https://www.instructables.com/id/Wi-Fi-Smart-Scale-wi
Aan de slag met Stm32 met Arduino IDE: 3 stappen
Aan de slag met Stm32 Arduino IDE gebruiken: STM32 is een vrij krachtig en populair bord dat wordt ondersteund door Arduino IDE. om het te programmeren
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
IoT-portemonnee (slimme portemonnee met Firebeetle ESP32, Arduino IDE en Google Spreadsheet): 13 stappen (met afbeeldingen)
IoT Wallet (slimme portemonnee met Firebeetle ESP32, Arduino IDE en Google Spreadsheet): Eerste prijs in Instructables Pocket-Sized Contest!:DAls je wat geld hebt geïnvesteerd in cryptocurrencies, weet je waarschijnlijk al dat ze zeer volatiel zijn. Ze veranderen van de ene op de andere dag en je weet maar nooit veel 'echt' geld dat je nog in je portemonnee hebt
Aan de slag met MicroPython op de ESP8266: 10 stappen (met afbeeldingen)
Aan de slag met MicroPython op de ESP8266: Wil je een andere manier om de ESP8266-gebaseerde boards te programmeren in plaats van de gebruikelijke methode met Arduino IDE samen met C/C++ programmeertaal? In deze tutorial leren we wie je een ESP8266 moet configureren en besturen bord met behulp van MicroPython.BUIL