Inhoudsopgave:
- Stap 1: Video
- Stap 2: Hardware
- Stap 3: Stuk code
- Stap 4: Afbeeldingen ophalen
- Stap 5: Gebruikte hulpmiddelen en taal
- Stap 6: Dataset voorbereiden voor training
- Stap 7: neuraal netwerk
- Stap 8: Neurale netwerk trainen
- Stap 9: Neurale netwerk testen
- Stap 10: Resultaat en volgende deel…
- Stap 11: Objectdetectie
- Stap 12: Video
- Stap 13: Labelen
- Stap 14: GUI labelen
- Stap 15: Bibliotheken nodig
- Stap 16: Resterende cellen
Video: Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2 - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
Een paar dagen geleden blesseerde ik mijn rechterhand op de sportschool. Elke keer dat ik daarna mijn computermuis gebruikte, veroorzaakte het veel pijn vanwege de steile polshoek.
Toen drong het tot me door " zou het niet geweldig zijn als we elk oppervlak in een trackpad konden veranderen " en ik weet niet waarom, maar om de een of andere reden dacht ik aan haar, de film HER, ik zal jullie het laten uitzoeken uit. Het was een opwindende gedachte, maar ik wist niet of ik het kon, ik besloot het te proberen.
Dit artikel legt vast wat eruit kwam.
Voordat we beginnen heb ik een disclaimer-
' Aan het einde van dit artikel kon ik geen enkel oppervlak in een trackpad omzetten, maar ik leer niet veel en heb grote tools aan mijn arsenaal toegevoegd. Ik hoop dat dat bij jou ook gebeurt'
Laten we beginnen.
Stap 1: Video
Hier is een kleine video van 5 minuten waarin alle stappen worden behandeld. Kijk eens.
Stap 2: Hardware
Ik heb een Raspberry Pi samen met een Raspberry Pi-camera op een hoogte van ongeveer 45 cm ingesteld. Dit geeft ons een bewakingsgebied van ongeveer 25x25 cm onder de camera.
Raspberry pi en Raspberry pi-camera zijn gemakkelijk verkrijgbaar, google het gewoon en je zou een lokale winkel moeten kunnen vinden.
Bekijk deze link of een van mijn Raspberry pi-afspeellijsten om je headless pi aan de gang te krijgen.
Na deze opstelling hebben we een stukje code nodig dat bepaalt of er een hand is in het gebied dat de camera bewaakt en zo ja, waar is het.
Stap 3: Stuk code
Een stukje code waarmee we kunnen beslissen of er een interessegebied is, maakt gebruik van iets dat Neural Network wordt genoemd. Ze vallen onder de programmeercategorie waar we geen regels definiëren om beslissingen te nemen, maar we laten het neurale netwerk voldoende gegevens zien om zelf regels te bepalen.
In ons geval tonen we in plaats van te coderen hoe de hand eruitziet, neurale netwerkafbeeldingen die zijn vastgelegd met Raspberry Pi die hand bevat en die geen hand bevat. Deze fase wordt training van het neurale netwerk genoemd en de gebruikte afbeeldingen worden trainingsdataset genoemd.
Stap 4: Afbeeldingen ophalen
Ik logde op afstand in op mijn raspberry pi en legde een aantal afbeeldingen vast met het volgende commando.
sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg
Ik heb 80 afbeeldingen met de hand gemaakt en 80 afbeeldingen zonder hand. 160 afbeeldingen zijn niet genoeg om een neuraal netwerk goed te trainen, maar zouden genoeg moeten zijn voor proof of concept.
Naast 160 afbeeldingen heb ik nog 20 afbeeldingen gemaakt om ons netwerk te testen zodra het is getraind.
Toen de dataset klaar was, begon ik code te schrijven voor het neurale netwerk.
Stap 5: Gebruikte hulpmiddelen en taal
Ik schreef mijn neurale netwerk in de Python deep learning-bibliotheek genaamd Keras en code is geschreven op jupyter-notebook van anaconda navigator.
Stap 6: Dataset voorbereiden voor training
Eerst (Afbeelding #1) heb ik alle bibliotheken toegevoegd die nodig zijn voor dit project, waaronder PIL, matplotlib, numpy, os en Keras. In de tweede cel van python-notebook (afbeelding # 2) definieer ik paden naar de dataset en print ik het aantal monsters uit. Nu moeten we alle afbeeldingen in een numpy-array laden, daarom heb ik in de derde cel (Afbeelding #2) een numpy-array gemaakt van 82 (aantal handmonsters) +75 (aantal niet-handmonsters), d.w.z. 157x100x100x3. 157 is het totale aantal afbeeldingen dat ik heb, 100x100 is onze verkleinde afbeeldingsdimensie en 3 is voor rode, groene en blauwe kleurlagen in de afbeelding.
In de vierde en vijfde cel laden we afbeeldingen die hand bevatten, gevolgd door afbeeldingen die geen hand bevatten in de numpy-array. In de zesde cel delen we elke waarde door 255, vandaar dat het waardebereik van 0 tot 1 wordt beperkt. (Afbeelding #3)
Het spijt me als bijgevoegde afbeeldingen niet goed genoeg zijn. Hier is een link naar de GITHUB-repository zodat u de code kunt bekijken. Vergeet niet de padnamen van mappen te vervangen door uw pad:).
Meebewegen.
Vervolgens moeten we elke afbeelding een label geven, dus we maken een eendimensionale numpy-array van 157 lang. De eerste 82 vermeldingen zijn ingesteld op 1 en de resterende 75 vermeldingen zijn ingesteld op 0, waardoor het neurale netwerk wordt overgebracht dat de eerste 82 afbeeldingen van de ene klasse zijn en de overige van een andere. (Afbeelding #4)
Laten we nu een neuraal netwerk maken.
Stap 7: neuraal netwerk
In de negende cel definiëren we ons neurale netwerk. Het bevat drie herhalingen van convolutielagen gevolgd door maxpool-lagen met respectievelijk 8, 12 en 16 convolutiefilters. Daarna hebben we twee dichte neurale netten. Twee afbeeldingen bijvoegen voor deze stap. De eerste is de snap of code die een neuraal netwerk creëert en de tweede is een picturale weergave van een neuraal netwerk met outputdimensie en geannoteerde bewerkingen.
Stap 8: Neurale netwerk trainen
In de tiende cel configureren we neurale netwerkoptimalisatie naar 'adam' en verliesfunctie naar 'binary_crossentropy'. Ze spelen een belangrijke rol in de manier waarop netwerkgewichten worden bijgewerkt. Eindelijk, wanneer we de elfde cel gebruiken, begint het neurale netwerk te trainen. Kijk tijdens het trainen van het netwerk naar de verliesfunctie en zorg ervoor dat deze afneemt.
Stap 9: Neurale netwerk testen
Zodra het neurale netwerk is getraind, moeten we een testgegevensset voorbereiden. We herhalen de procedure die is gedaan om de trainingsset in de 3e, 4e, 5e en 6e cel voor te bereiden op testgegevens om een testset te maken. We bereiden ook een label voor een testset voor, maar deze keer voeren we een model uit op deze dataset om voorspellingen te krijgen en niet om te trainen.
Stap 10: Resultaat en volgende deel…
Ik heb een testnauwkeurigheid van 88%, maar neem dit met een korreltje zout, aangezien de dataset die wordt gebruikt om dit model te trainen en te testen, heel erg klein is en onvoldoende om dit model goed te trainen.
Ik hoop in ieder geval dat je genoten hebt van dit artikel. Mijn intentie achter deze oefening is nog niet compleet en pas op voor het 2e deel. Ik zal het zo snel mogelijk uploaden.
In het volgende deel zullen we een ander neuraal netwerk trainen dat ons de locatie van de hand zal vertellen in een met de hand gedetecteerd beeld.
Alle vragen zijn welkom.
Als iemand geïnteresseerd is in het gebruik van mijn kleine dataset, laat het me dan weten in opmerkingen. Ik zal het beschikbaar stellen.
Bedankt voor het lezen. Ik zie je snel met het tweede deel. Waarom maak en train je dan geen neuraal netwerk.
Bewerken: - De volgende stappen zijn voor het tweede deel.
Stap 11: Objectdetectie
In eerdere stappen hebben we een NN gemaakt die ons vertelt of de testafbeelding een hand bevat of niet. Wat nu? Als NN een afbeelding classificeert als een hand bevattend, willen we graag de locatie van de hand weten. Dit wordt objectdetectie genoemd in de literatuur over computervisie. Dus laten we NN trainen die precies hetzelfde doet.
Stap 12: Video
Een video van 3 minuten waarin alle resterende stappen worden uitgelegd. Kijk eens.
Stap 13: Labelen
Als je wilt dat een neuraal netwerk de locatie van de hand uitvoert, moeten we het op zo'n manier trainen, d.w.z. in tegenstelling tot het vorige neurale netwerk waar elk beeld werd gelabeld als met de hand en zonder hand. Deze keer hebben alle afbeeldingen met de hand vier labels die overeenkomen met de diagonale coördinaten van het selectiekader rond de hand in die afbeelding.
Bijgevoegde afbeelding van csv-bestand bevat label voor elke afbeelding. Houd er rekening mee dat coördinaten worden genormaliseerd met de afbeeldingsdimensie, d.w.z. als de bovenste X-coördinaat zich op de 320e pixel in de afbeelding bevindt met een breedte van 640 pixels, zullen we deze labelen als 0,5.
Stap 14: GUI labelen
Je vraagt je misschien af hoe ik erin ben geslaagd om alle 82 afbeeldingen te labelen, nou ik heb een GUI in python geschreven die me bij deze taak heeft geholpen. Zodra de afbeelding in de GUI is geladen. Ik klik met de linkermuisknop op de bovenste coördinaat en klik met de rechtermuisknop op de onderste coördinaat van het waarschijnlijke selectiekader rond de hand. Deze coördinaten worden vervolgens naar een bestand geschreven, waarna ik op de knop Volgende klik om de volgende afbeelding te laden. Ik herhaalde deze procedure voor alle 82 trein- en 4 testbeelden. Toen de labels klaar waren, was het tijd voor training.
Stap 15: Bibliotheken nodig
Eerst moeten we alle benodigde bibliotheken laden. Inclusief
- PIL voor beeldmanipulatie,
- matplotlib voor plotten,
- numpy voor matrixbewerking,
- os voor besturingssysteemafhankelijke functionaliteit en
- keras voor neuraal netwerk.
Stap 16: Resterende cellen
In de 2e, 3e, 4e en 5e cel laden we afbeeldingen in een numpy-array en maken we een vierdimensionale array van een csv-bestand om als labels te fungeren. In cel nummer 6 creëren we ons neurale netwerk. De architectuur is identiek aan het neurale netwerk dat wordt gebruikt voor classificatie, behalve de dimensie van de uitvoerlaag die 4 is en niet 1. Een ander verschil komt van de gebruikte verliesfunctie, namelijk de gemiddelde kwadratische fout. In cel nummer 8 beginnen we met het trainen van ons neurale netwerk. Eenmaal getraind, heb ik dit model op een testset uitgevoerd om voorspellingen te krijgen voor de begrenzingsbox op overlappende coördinaten van de begrenzingsbox, ze zagen er behoorlijk nauwkeurig uit.
Bedankt voor het lezen.
Aanbevolen:
Een circuit dat de verandering in de temperatuurwaarde kan voelen: 10 stappen
Een circuit dat de verandering in de temperatuurwaarde kan detecteren: dit circuit meet de temperatuur met behulp van een LM35-temperatuursensor en vergelijkt de ingangsspanning met behulp van een ic-op-amp met de verzamelde informatie, het circuit zal het relais in- en uitschakelen
Nike LED-swoosh! Dit is een geweldig decor voor een kamer. Dit is het enige project dat iedereen kan herhalen: 5 stappen
Nike LED-swoosh! Dit is een geweldig decor voor een kamer. Dit is het enige project dat iedereen kan herhalen.: Gereedschap - meetlint - schroevendraaier - soldeerbout - copingzaag - elektrische boor - schuurpapier Benodigdheden - LED-strip (RGB) 5 m - LED-controller - Voeding 12V 4A-hout 50-50-1500 2x-hout 20-20-3000 2x-multiplex 500-1000mm-schroeven (45mm) 150x-schroeven (35mm) 30x-scr
Een website bouwen op een Raspberry Pi, met Node.js, Express en MongoDB Deel 1: 6 stappen
Een website bouwen op een Raspberry Pi, met Node.js, Express en MongoDB… Deel 1: Welkom bij DEEL 1 van mijn node.js webapp-tutorial. Deel 1 gaat door de benodigde software die wordt gebruikt voor de ontwikkeling van node.js-apps, hoe je port forwarding gebruikt, hoe je een app bouwt met Express en hoe je je app uitvoert. Het tweede deel van dit
Third Hand++: een multifunctionele helpende hand voor elektronica en ander delicaat werk. 14 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Derde Hand++: een multifunctionele helpende hand voor elektronica en ander delicaat werk. In het verleden heb ik de derde handen/helpende handen gebruikt die verkrijgbaar zijn bij elektronicaketens en was gefrustreerd over hun bruikbaarheid. Ik kon de clips nooit precies krijgen waar ik ze wilde hebben of het kostte meer tijd dan nodig was om ze op te zetten
Geleidende lijm en geleidende draad: maak een LED-display en een stoffen circuit dat oprolt. 7 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Geleidende lijm en geleidende draad: maak een LED-display en een stoffen circuit dat oprolt: maak uw eigen geleidende stoffen, draad, lijm en tape en gebruik ze om potentiometers, weerstanden, schakelaars, LED-displays en circuits te maken. en geleidende draad kunt u LED-displays en circuits maken op elke flexibele stof