Inhoudsopgave:

Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2 - Ajarnpa
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2 - Ajarnpa

Video: Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2 - Ajarnpa

Video: Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2 - Ajarnpa
Video: Электрический или водяной полотенцесушитель? Что выбрать? Установка. #25 2024, November
Anonim
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2
Is dat een hand? (Raspberry Pi-camera + neuraal netwerk) Deel 1/2

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

Image
Image

Hier is een kleine video van 5 minuten waarin alle stappen worden behandeld. Kijk eens.

Stap 2: Hardware

Hardware
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

Stukje code
Stukje code
Stukje code
Stukje 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

Afbeeldingen ophalen
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

Gebruikte tools en taal
Gebruikte tools en taal
Gebruikte tools en taal
Gebruikte tools 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

Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset voorbereiden voor training
Gegevensset 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

Neurale netwerk
Neurale netwerk
Neurale netwerk
Neurale 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

Neurale netwerk trainen
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

Neurale netwerk testen
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…

Resultaat en volgende deel…
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

Objectdetectie
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

Image
Image

Een video van 3 minuten waarin alle resterende stappen worden uitgelegd. Kijk eens.

Stap 13: Labelen

Etikettering
Etikettering
Etikettering
Etikettering
Etikettering
Etikettering

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

GUI labelen
GUI labelen
GUI labelen
GUI labelen
GUI labelen
GUI labelen
GUI labelen
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

Bibliotheken nodig
Bibliotheken nodig
Bibliotheken nodig
Bibliotheken nodig
Bibliotheken nodig
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

Resterende cellen
Resterende cellen
Resterende cellen
Resterende cellen
Resterende cellen
Resterende cellen
Resterende cellen
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: