Inhoudsopgave:
- Stap 1: Objectdetectiemodelarchitectuur uitgelegd
- Stap 2: Bereid de omgeving voor
- Stap 3: Train een objectdetectiemodel met Keras
- Stap 4: Converteer het naar.kmodel-formaat
- Stap 5: Uitvoeren op Micropython Firmware
- Stap 6: Samenvatting
Video: Objectdetectie met Sipeed MaiX-kaarten (Kendryte K210) - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
Als vervolg op mijn vorige artikel over beeldherkenning met Sipeed MaiX Boards, besloot ik om nog een tutorial te schrijven, gericht op objectdetectie. Er is onlangs interessante hardware verschenen met de Kendryte K210-chip, waaronder Seeed AI Hat voor Edge Computing, M5-stack M5StickV en DFRobot's HuskyLens (hoewel die eigen firmware heeft en meer gericht is op complete beginners). Vanwege de lage prijs heeft Kendryte K210 mensen aangesproken die computervisie aan hun projecten willen toevoegen. Maar zoals gebruikelijk bij Chinese hardwareproducten, ontbreekt de technische ondersteuning en dit is iets dat ik probeer te verbeteren met mijn artikelen en video's. Maar houd er rekening mee dat ik niet deel uitmaak van het Kendryte- of Sipeed-ontwikkelaarsteam en niet alle vragen met betrekking tot hun product kan beantwoorden.
Met dat in gedachten, laten we beginnen! We beginnen met een kort (en vereenvoudigd) overzicht van hoe CNN-modellen voor objectherkenning werken.
UPDATE MEI 2020: Toen ik zag hoe mijn artikel en video over objectdetectie met K210-borden nog steeds erg populair zijn en tot de topresultaten op YouTube en Google behoren, 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: Objectdetectiemodelarchitectuur uitgelegd
Modellen voor beeldherkenning (of beeldclassificatie) nemen de hele afbeelding als invoer en geven een lijst met waarschijnlijkheden af voor elke klasse die we proberen te herkennen. Het is erg handig als het object waarin we geïnteresseerd zijn een groot deel van de afbeelding inneemt en we niet veel om de locatie geven. Maar wat als ons project (bijvoorbeeld een gezichtsvolgcamera) vereist dat we niet alleen kennis hebben van het type object in de afbeelding, maar ook van de coördinaten ervan? En hoe zit het met het project waarbij meerdere objecten moeten worden gedetecteerd (bijvoorbeeld om te tellen)?
Dit is wanneer objectdetectiemodellen van pas komen. In dit artikel zullen we de YOLO-architectuur (je kijkt maar één keer) gebruiken en de uitleg richten op de interne mechanica van deze specifieke architectuur.
We proberen te bepalen welke objecten in de afbeelding aanwezig zijn en wat hun coördinaten zijn. Omdat machine learning geen magie is en geen "denkende machine", maar slechts een algoritme dat statistieken gebruikt om de functie (neuraal netwerk) te optimaliseren om een bepaald probleem beter op te lossen. We moeten dit probleem parafraseren om het meer "optimaliseerbaar" te maken. Een naïeve benadering hier zou zijn om het algoritme het verlies (verschil) tussen de voorspelling en de juiste coördinaten van het object te minimaliseren. Dat zou best goed werken, zolang we maar één object in de afbeelding hebben. Voor meerdere objecten kiezen we een andere benadering - we voegen het raster toe en laten ons netwerk de aanwezigheid (of afwezigheid) van het object (en) in elk raster voorspellen. Klinkt geweldig, maar laat nog steeds te veel onzekerheid voor het netwerk - hoe de voorspelling uit te voeren en wat te doen als er meerdere objecten met een middelpunt in één rastercel zijn? We moeten nog een beperking toevoegen - zogenaamde ankers. Ankers zijn initiële afmetingen (breedte, hoogte) waarvan sommige (het dichtst bij de objectgrootte) worden aangepast aan de objectgrootte - met behulp van enkele uitvoer van het neurale netwerk (definitieve kenmerkkaart).
Dus, hier is een overzicht op het hoogste niveau van wat er gebeurt wanneer het neurale netwerk van de YOLO-architectuur een objectdetectie op de afbeelding uitvoert. Volgens kenmerken die zijn gedetecteerd door het functie-extractornetwerk, wordt voor elke rastercel een reeks voorspellingen gedaan, waaronder de ankersoffset, ankerwaarschijnlijkheid en ankerklasse. Dan negeren we de voorspellingen met een lage waarschijnlijkheid en voila!
Stap 2: Bereid de omgeving voor
aXeleRate is gebaseerd op een prachtig project van penny4860, SVHN yolo-v2 digit detector. aXeleRate tilt deze implementatie van YOLO-detector in Keras naar een volgend niveau en gebruikt zijn handige configuratiesysteem om training en conversie uit te voeren van beeldherkenning/objectdetectie en beeldsegmentatienetwerken met verschillende backends.
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:
PASCAL-VOC Objectdetectie Colab Notebook
Het lokaal trainen van uw model en het exporteren voor gebruik met hardwareversnelling is nu ook veel gemakkelijker. Ik raad u ten zeerste aan om alle benodigde afhankelijkheden in de Anaconda-omgeving te installeren om uw project gescheiden te houden van anderen en conflicten te voorkomen.
Download hier het installatieprogramma.
Nadat de installatie is voltooid, maakt u een nieuwe omgeving aan:
conda create -n yolo python=3.7
Laten we de nieuwe omgeving activeren
conda activeer yolo
Er verschijnt een prefix voor je bash-shell met de naam van de omgeving, wat aangeeft dat je nu in die omgeving werkt.
Installeer aXeleRate op uw lokale computer met
pip install git+https://github.com/AIWintermuteAI/aXeleRate
En voer dit vervolgens uit om scripts te downloaden die u nodig hebt voor training en gevolgtrekking:
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 3: Train een objectdetectiemodel met Keras
Nu kunnen we een trainingsscript uitvoeren met het configuratiebestand. Aangezien de Keras-implementatie van de YOLO-objectdetector behoorlijk ingewikkeld is, zal ik in plaats van elk relevant stukje code uit te leggen, uitleggen hoe de training moet worden geconfigureerd en ook relevante modules beschrijven, voor het geval u er zelf wat aan wilt wijzigen.
Laten we beginnen met een speelgoedvoorbeeld en een wasbeerdetector trainen. Er is een configuratiebestand in de map /config, raccoon_detector.json. We kiezen MobileNet7_5 als architectuur (waarbij 7_5 de alfaparameter is van de originele Mobilenet-implementatie, de breedte van het netwerk regelt) en 224x224 als invoergrootte. Laten we eens kijken naar de belangrijkste parameters in de configuratie:
Type is model-frontend - Classifier, Detector of SegnetArchitecture is model-backend (functie-extractor)
- Volledige Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Voor meer informatie over ankers, lees hier
Labels zijn labels die aanwezig zijn in uw dataset. BELANGRIJK: vermeld alle labels die aanwezig zijn in de dataset.
object_scale bepaalt hoeveel een verkeerde voorspelling van het vertrouwen van objectvoorspellers moet worden bestraft
no_object_scale bepaalt hoeveel verkeerde voorspelling van vertrouwen van niet-objectvoorspellers moet worden bestraft
coord_scale bepaalt hoeveel voorspellingen van verkeerde positie en grootte worden bestraft (x, y, w, h)
class_scale bepaalt hoeveel verkeerde klassenvoorspelling moet worden bestraft
augmentatie - het vergroten van de afbeelding, vergroten, verkleinen, verschuiven en vervagen van de afbeelding om overfitting te voorkomen en een grotere variatie in dataset te hebben.
train_times, validation_times - hoe vaak de dataset moet worden herhaald. Handig als je augmentatie hebt
ingeschakeld
first_trainable_layer - hiermee kunt u bepaalde lagen bevriezen als u een vooraf getraind functienetwerk gebruikt
Nu moeten we de dataset downloaden, die ik heb gedeeld op mijn Google Drive (originele dataset), een dataset voor wasbeerdetectie met 150 geannoteerde foto's.
Zorg ervoor dat u de regels in het configuratiebestand (train_image_folder, train_annot_folder) dienovereenkomstig wijzigt en start de training met het volgende commando:
python axelerate/train.py -c configs/raccoon_detector.json
train.py leest de configuratie uit het.json-bestand en traint het model met het axelerate/networks/yolo/yolo_frontend.py-script. yolo/backend/loss.py is waar de aangepaste verliesfunctie wordt geïmplementeerd en yolo/backend/network.py is waar het model wordt gemaakt (invoer, functie-extractor en detectielagen samen). axelerate/networks/common_utils/fit.py is een script dat het trainingsproces implementeert en axelerate/networks/common_utils/feature.py bevat functie-extractors. Als je een getraind model met K210-chip en Micropython-firmware wilt gebruiken, kun je vanwege geheugenbeperkingen kiezen tussen MobileNet (2_5, 5_0 en 7_5) en TinyYolo, maar ik heb ontdekt dat MobileNet een betere detectienauwkeurigheid geeft.
Omdat het een speelgoedexemplaar is en slechts 150 afbeeldingen van wasberen bevat, zou het trainingsproces behoorlijk snel moeten zijn, zelfs zonder GPU, hoewel de nauwkeurigheid verre van geweldig zal zijn. Voor werkgerelateerd project heb ik een verkeersborddetector en een nummerdetector getraind, beide datasets bevatten meer dan een paar duizend trainingsvoorbeelden.
Stap 4: Converteer het naar.kmodel-formaat
Met aXeleRate wordt modelconversie automatisch uitgevoerd - dit is waarschijnlijk het grootste verschil met de oude versie van trainingsscripts! Bovendien krijg je de modelbestanden en trainingsgrafiek netjes opgeslagen in de projectmap. Ik ontdekte ook dat de nauwkeurigheid van de validatie soms geen schatting geeft van de werkelijke prestaties van het model voor objectdetectie en daarom heb ik mAP toegevoegd als een validatiestatistiek voor objectdetectiemodellen. U kunt hier meer lezen over mAP.
Als de mAP, gemiddelde gemiddelde precisie (onze validatiemetriek) gedurende 20 tijdperken niet verbetert, zal de training voortijdig stoppen. Elke keer dat mAP 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".
Nu naar de laatste stap, het daadwerkelijk draaien van ons model op Sipeed-hardware!
Stap 5: Uitvoeren op Micropython Firmware
Het is mogelijk om inferentie uit te voeren met ons objectdetectiemodel met C-code, maar voor het gemak zullen we in plaats daarvan Micropython-firmware en MaixPy IDE gebruiken.
Download MaixPy IDE van hier en micropython-firmware van hier. U kunt het python-script kflash.py gebruiken om de firmware te branden of hier een aparte GUI-flashtool downloaden.
Kopieer model.kmodel naar de root van een SD-kaart en steek de SD-kaart in Sipeed Maix Bit (of een ander K210-apparaat). Als alternatief kunt u.kmodel naar het flashgeheugen van het apparaat branden. Mijn voorbeeldscript leest.kmodel uit het flashgeheugen. Als je een SD-kaart gebruikt, verander dan deze regel
taak = kpu.load (0x200000)
tot
taak = kpu.load("/sd/model.kmodel")
Open MaixPy IDE en druk op de verbindingsknop. Open het raccoon_detector.py script uit de map example_scripts/k210/detector en druk op de Start-knop. Je zou een livestream van de camera moeten zien met begrenzingsvakken eromheen … nou ja, wasberen. U kunt de nauwkeurigheid van het model vergroten door meer trainingsvoorbeelden te geven, maar houd er rekening mee dat het een sprookjesachtig klein model is (1,9 M) en dat het problemen zal hebben met het detecteren van kleine objecten (vanwege de lage resolutie).
Een van de vragen die ik ontving in opmerkingen bij mijn vorige artikel over beeldherkenning, is hoe de detectieresultaten via UART/I2C naar een ander apparaat kunnen worden verzonden dat is aangesloten op Sipeed-ontwikkelborden. In mijn github-repository kun je een ander voorbeeldscript vinden, raccoon_detector_uart.py, dat (je raadt het al) wasberen detecteert en de coördinaten van begrenzingsvakken via UART verzendt. Houd er rekening mee dat pinnen die worden gebruikt voor UART-communicatie verschillen van verschillende borden, dit is iets dat u zelf moet controleren in de documentatie.
Stap 6: Samenvatting
Kendryte K210 is een solide chip voor computervisie, flexibel, zij het met beperkt beschikbaar geheugen. Tot nu toe hebben we in mijn tutorials het gebruik ervan besproken voor het herkennen van aangepaste objecten, het detecteren van aangepaste objecten en het uitvoeren van enkele op OpenMV gebaseerde computervisietaken. Ik weet zeker dat het ook geschikt is voor gezichtsherkenning en met wat knutselen zou het mogelijk moeten zijn om posedetectie en beeldsegmentatie te doen (je kunt aXeleRate gebruiken om semantisch segmentatiemodel te trainen, maar ik heb de inferentie nog niet geïmplementeerd met K210). Voel je vrij om aXeleRate-repositoryproblemen te bekijken en een PR te maken als je denkt dat er enkele verbeteringen zijn die je kunt bijdragen!
Hier zijn enkele artikelen die ik heb gebruikt bij het schrijven van deze tutorial, kijk eens als je meer wilt weten over objectdetectie met neurale netwerken:
Begrenzingsdoosobjectdetectoren: YOLO begrijpen, je kijkt maar één keer
YOLO begrijpen (meer wiskunde)
Zachte gids over hoe YOLO Object Localization werkt met Keras (deel 2)
Realtime objectdetectie met YOLO, YOLOv2 en nu YOLOv3
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.
Voeg me toe op LinkedIn als je vragen hebt en abonneer je op mijn YouTube-kanaal om op de hoogte te blijven van meer interessante projecten op het gebied van machine learning en robotica.
Aanbevolen:
Digitale klok met netwerktijd met behulp van de ESP8266: 4 stappen (met afbeeldingen)
Digitale netwerkklok met de ESP8266: we leren hoe we een schattige kleine digitale klok kunnen bouwen die communiceert met NTP-servers en de netwerk- of internettijd weergeeft. We gebruiken de WeMos D1 mini om verbinding te maken met een wifi-netwerk, de NTP-tijd te verkrijgen en deze weer te geven op een OLED-module. De video hierboven
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
Objectdetectie met Dragonboard 410c of 820c met OpenCV en Tensorflow: 4 stappen
Objectdetectie met Dragonboard 410c of 820c met behulp van OpenCV en Tensorflow.: Deze instructie beschrijft hoe OpenCV, Tensorflow en machine learning-frameworks voor Python 3.5 moeten worden geïnstalleerd om de toepassing Objectdetectie uit te voeren
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
Start uw diavoorstelling met vakantiefoto's met een vleugje magie! 9 stappen (met afbeeldingen)
Lanceer uw diavoorstelling met vakantiefoto's met een vleugje magie!: In de loop der jaren heb ik de gewoonte ontwikkeld om een klein beeldje mee te nemen op reis: ik koop vaak een kleine, lege artoy (zoals die op de foto) en verf het past bij de vlag en het thema van het land dat ik bezoek (in dit geval Sicilië). T