Sommario:

È una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2: 16 passaggi (con immagini)
È una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2: 16 passaggi (con immagini)

Video: È una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2: 16 passaggi (con immagini)

Video: È una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2: 16 passaggi (con immagini)
Video: Теперь вы будете готовить ПЕЧЕНЬ только так! Отбивные, Биточки с луком и гречкой 2024, Novembre
Anonim
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2
è una mano? (Fotocamera Raspberry Pi + Rete Neurale) Parte 1/2

Qualche giorno fa mi sono infortunato al polso destro in palestra. In seguito, ogni volta che ho usato il mouse del mio computer, ha causato molto dolore a causa dell'angolo ripido del polso.

È stato allora che mi è venuto in mente "non sarebbe bello se potessimo convertire qualsiasi superficie in un trackpad" e non so perché ma per qualche motivo ho pensato a lei, al film HER, ve lo farò capire ragazzi fuori. È stato un pensiero eccitante ma non sapevo se potevo farlo, ho deciso di provarlo.

Questo articolo cattura ciò che ne è uscito.

Prima di iniziare ho un disclaimer-

' Alla fine di questo articolo, non sono riuscito a convertire alcuna superficie in un trackpad, ma non ho imparato molto e ho aggiunto grandi strumenti al mio arsenale. Spero che succeda anche a te'

Iniziamo.

Passaggio 1: video

Image
Image

Ecco un piccolo video di 5 minuti che copre tutti i passaggi. Guarda.

Passaggio 2: hardware

Hardware
Hardware

Ho installato un Raspberry Pi insieme a una fotocamera Raspberry Pi ad un'altezza di circa 45 cm. Questo ci dà un'area di monitoraggio di circa 25x25 cm sotto la telecamera.

La fotocamera Raspberry Pi e Raspberry Pi sono facilmente disponibili, basta cercarla su Google e dovresti essere in grado di trovare un negozio locale.

Dai un'occhiata a questo link o a una delle mie playlist Raspberry pi per far funzionare il tuo pi senza testa.

Seguendo questa configurazione, abbiamo bisogno di un pezzo di codice che decida se c'è una mano nell'area che la telecamera sta monitorando e, in caso affermativo, dove si trova.

Passaggio 3: pezzo di codice

Pezzo di codice
Pezzo di codice
Pezzo di codice
Pezzo di codice

Il pezzo di codice che ci consente di decidere se c'è una mano nell'area di interesse utilizza qualcosa chiamato Rete neurale. Rientrano nella categoria della programmazione in cui non definiamo regole per prendere decisioni, ma mostriamo alla rete neurale dati sufficienti per determinare le regole da sola.

Nel nostro caso, invece di codificare l'aspetto della mano, mostriamo le immagini della rete neurale catturate da raspberry pi che contiene la mano e che non contiene la mano. Questa fase è chiamata training della rete neurale e le immagini utilizzate sono chiamate training dataset.

Passaggio 4: ottenere immagini

Ottenere immagini
Ottenere immagini

Ho effettuato l'accesso remoto al mio Raspberry Pi e ho catturato un sacco di immagini usando il seguente comando.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg

Ho catturato 80 immagini con la mano e 80 immagini che non contengono la mano. 160 immagini non sono sufficienti per addestrare adeguatamente una rete neurale, ma dovrebbero essere sufficienti per la verifica del concetto.

Oltre a 160 immagini, ne ho catturate altre 20 per testare la nostra rete una volta addestrata.

Una volta che il set di dati era pronto, ho iniziato a scrivere il codice per la rete neurale.

Passaggio 5: strumenti e lingua utilizzati

Strumenti e lingua utilizzati
Strumenti e lingua utilizzati
Strumenti e lingua utilizzati
Strumenti e lingua utilizzati

Ho scritto la mia rete neurale nella libreria di deep learning Python chiamata Keras e il codice è scritto sul notebook jupyter da anaconda navigator.

Passaggio 6: preparazione del set di dati per la formazione

Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione
Preparazione del set di dati per la formazione

Innanzitutto (Immagine #1) ho incluso tutte le librerie necessarie per questo progetto, che include PIL, matplotlib, numpy, os e Keras. Nella seconda cella del notebook Python (Immagine n. 2) definisco i percorsi per il set di dati e stampo il conteggio dei campioni. Ora dobbiamo caricare tutte le immagini in un array numpy, quindi nella terza cella (Immagine #2) ho creato un array numpy di 82 (numero di campioni manuali) + 75 (numero di campioni non manuali) cioè 157x100x100x3. 157 è il numero totale di immagini che ho, 100x100 è la nostra dimensione dell'immagine ridimensionata e 3 è per i livelli di colore rosso, verde e blu nell'immagine.

Nella quarta e quinta cella, carichiamo immagini che contengono mano seguite da immagini che non contengono mano nell'array numpy. Nella sesta cella, dividiamo ogni valore per 255, limitando così l'intervallo di valori da 0 a 1. (Immagine n. 3)

Mi scuso se le immagini allegate non sono abbastanza buone. Ecco il link al repository GITHUB per guardare il codice. Non dimenticare di sostituire i nomi dei percorsi delle directory con il tuo percorso:).

Andando avanti.

Quindi dobbiamo etichettare ogni immagine, quindi creiamo un array numpy unidimensionale di 157 di lunghezza. Le prime 82 voci sono impostate su 1 e le restanti 75 voci sono impostate su 0 trasmettendo la rete neurale che le prime 82 immagini provengono da una classe e le rimanenti da un'altra. (Immagine #4)

Ora creiamo una rete neurale.

Passaggio 7: rete neurale

Rete neurale
Rete neurale
Rete neurale
Rete neurale

Nella nona cella, definiamo la nostra rete neurale. Contiene tre ripetizioni di layer di convoluzione seguite da layer maxpool con rispettivamente 8, 12 e 16 filtri di convoluzione. In seguito abbiamo due reti neurali dense. Allego due immagini per questo passaggio. Il primo è lo snap del codice che crea la rete neurale e il secondo è la rappresentazione pittorica della rete neurale con la dimensione dell'output e le operazioni annotate.

Passaggio 8: formazione della rete neurale

Rete neurale di formazione
Rete neurale di formazione

Nella decima cella, configuriamo l'ottimizzatore di rete neurale su "adam" e la funzione di perdita su "binary_crossentropy". Svolgono un ruolo importante nel modo in cui vengono aggiornati i pesi di rete. Alla fine, quando eseguiamo l'undicesima cella, la rete neurale inizia ad allenarsi. Mentre la rete si sta allenando, osserva la funzione di perdita e assicurati che stia diminuendo.

Passaggio 9: test della rete neurale

Test della rete neurale
Test della rete neurale

Una volta che la rete neurale è stata addestrata, dobbiamo preparare il set di dati di test. Ripetiamo la procedura eseguita per preparare il set di allenamento nella 3a, 4a, 5a e 6a cella sui dati di test per creare il set di test. Prepariamo anche l'etichetta per il set di test, ma questa volta eseguiamo il modello su questi set di dati per ottenere previsioni e non per eseguire l'addestramento.

Passaggio 10: risultato e parte successiva…

Risultato e parte successiva…
Risultato e parte successiva…

Ho ottenuto una precisione del test dell'88%, ma prendilo con un pizzico di sale poiché il set di dati utilizzato per addestrare e testare questo modello è molto, molto, molto piccolo e inadeguato per addestrare correttamente questo modello.

Comunque spero che questo articolo ti sia piaciuto. Il mio intento dietro questo esercizio non è ancora completo e fai attenzione alla seconda parte. Lo caricherò appena possibile.

Nella parte successiva, addestreremo un'altra rete neurale che ci dirà la posizione della mano in un'immagine rilevata dalla mano.

Tutte le domande sono benvenute.

Se qualcuno è interessato a utilizzare il mio piccolo set di dati, me lo faccia sapere nei commenti. lo metterò a disposizione.

Grazie per aver letto. Ci vediamo presto con la seconda parte fino ad allora perché non crei e addestri una rete neurale.

Modifica: - I passaggi successivi sono per la seconda parte.

Passaggio 11: rilevamento di oggetti

Rilevamento di oggetti
Rilevamento di oggetti

Nei passaggi precedenti abbiamo creato un NN che ci dice se l'immagine di prova contiene la mano o meno. Bene e poi? Se NN classifica l'immagine come mano contenente, vorremmo conoscere la posizione della mano. Questo è chiamato rilevamento di oggetti nella letteratura sulla visione artificiale. Quindi addestriamo NN che fa esattamente lo stesso.

Passaggio 12: video

Image
Image

Un video di 3 minuti che spiega tutti i passaggi rimanenti. Guarda.

Passaggio 13: etichettatura

etichettatura
etichettatura
etichettatura
etichettatura
etichettatura
etichettatura

Se vuoi che una rete neurale emetta la posizione della mano, dobbiamo addestrarla in questo modo, cioè a differenza della rete neurale precedente in cui ogni immagine era etichettata come con la mano e senza mano. Questa volta tutte le immagini con la mano avranno quattro etichette corrispondenti alle coordinate diagonali del riquadro di delimitazione intorno alla mano in quell'immagine.

L'immagine allegata del file CSV contiene un'etichetta per ogni immagine. Si prega di notare che le coordinate sono normalizzate con la dimensione dell'immagine, ovvero se la coordinata X superiore è al 320° pixel nell'immagine con una larghezza di 640 pixel, la etichetteremo come 0,5.

Passaggio 14: GUI di etichettatura

GUI di etichettatura
GUI di etichettatura
GUI di etichettatura
GUI di etichettatura
GUI di etichettatura
GUI di etichettatura
GUI di etichettatura
GUI di etichettatura

Ti starai chiedendo come sono riuscito a etichettare tutte le 82 immagini, beh, ho scritto una GUI in Python che mi ha aiutato in questo compito. Una volta caricata l'immagine nella GUI. Ho fatto clic con il tasto sinistro sulla coordinata superiore e clic con il tasto destro sulla coordinata inferiore del probabile riquadro di delimitazione attorno alla mano. Queste coordinate vengono quindi scritte in un file dopo che faccio clic sul pulsante Avanti per caricare l'immagine successiva. Ho ripetuto questa procedura per tutti gli 82 treni e le 4 immagini di prova. Una volta che le etichette erano pronte, era tempo di allenamento.

Passaggio 15: Biblioteche necessarie

Biblioteche necessarie
Biblioteche necessarie
Biblioteche necessarie
Biblioteche necessarie
Biblioteche necessarie
Biblioteche necessarie

Per prima cosa dobbiamo caricare tutte le librerie necessarie. Che include

  • PIL per la manipolazione delle immagini,
  • matplotlib per la stampa,
  • numpy per il funzionamento della matrice,
  • os per funzionalità dipendenti dal sistema operativo e
  • keras per la rete neurale.

Passaggio 16: celle rimanenti

Cellule rimanenti
Cellule rimanenti
Cellule rimanenti
Cellule rimanenti
Cellule rimanenti
Cellule rimanenti
Cellule rimanenti
Cellule rimanenti

Nella 2a, 3a, 4a e 5a cella carichiamo le immagini nell'array numpy e creiamo un array quadridimensionale dal file csv per fungere da etichette. Nella cella numero 6 creiamo la nostra rete neurale. La sua architettura è identica alla rete neurale utilizzata per la classificazione, tranne la dimensione del livello di output che è 4 e non 1. Un'altra differenza deriva dalla funzione di perdita utilizzata che è l'errore quadratico medio. Nella cella numero 8 iniziamo l'addestramento della nostra rete neurale una volta addestrato, ho eseguito questo modello sul set di test per ottenere previsioni per il riquadro di delimitazione sulle coordinate sovrapposte del riquadro di delimitazione che sembravano abbastanza accurate.

Grazie per aver letto.

Consigliato: