Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2: 16 βήματα (με εικόνες)
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2: 16 βήματα (με εικόνες)
Anonim
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2
Είναι αυτό ένα χέρι; (Raspberry Pi Camera + Neural Network) Μέρος 1/2

Πριν από λίγες ημέρες, τραυματίστηκα στον καρπό του δεξιού χεριού μου στο γυμναστήριο. Στη συνέχεια κάθε φορά που χρησιμοποιούσα το ποντίκι του υπολογιστή μου, προκαλούσε πολύ πόνο λόγω της απότομης γωνίας του καρπού.

Τότε με χτύπησε "δεν θα ήταν υπέροχο αν μπορούσαμε να μετατρέψουμε οποιαδήποτε επιφάνεια σε trackpad" και δεν ξέρω γιατί, αλλά για κάποιο λόγο την σκέφτηκα, την ταινία HER, θα σας αφήσω παιδιά να το καταλάβετε έξω. Anταν μια συναρπαστική σκέψη αλλά δεν ήξερα αν θα μπορούσα να το κάνω, αποφάσισα να το δοκιμάσω.

Αυτό το άρθρο αποτυπώνει τι προέκυψε από αυτό.

Πριν ξεκινήσουμε έχω μια αποποίηση ευθύνης-

«Στο τέλος αυτού του άρθρου, δεν μπορούσα να μετατρέψω καμία επιφάνεια σε trackpad, αλλά δεν έμαθα πολλά και πρόσθεσα μεγάλα εργαλεία στο οπλοστάσιό μου. Ελπίζω να συμβεί και σε εσάς »

Ας αρχίσουμε.

Βήμα 1: Βίντεο

Image
Image

Ακολουθεί ένα μικροσκοπικό βίντεο 5 λεπτών που καλύπτει όλα τα βήματα. Ρίξε μια ματιά.

Βήμα 2: Υλικό

Σκεύη, εξαρτήματα
Σκεύη, εξαρτήματα

Στήνω ένα βατόμουρο πι μαζί με κάμερα βατόμουρου πι σε ύψος περίπου 45 εκατοστών. Αυτό μας δίνει περιοχή παρακολούθησης περίπου 25x25 cm κάτω από την κάμερα.

Το Raspberry pi και το raspberry pi camera είναι εύκολα διαθέσιμα, απλώς ψάξτε το στο google και θα πρέπει να μπορείτε να βρείτε ένα τοπικό κατάστημα.

Ρίξτε μια ματιά σε αυτόν τον σύνδεσμο ή σε μια λίστα αναπαραγωγής μου στο Raspberry pi για να ξεκινήσει να λειτουργεί το ακέφαλο pi σας.

Μετά από αυτήν τη ρύθμιση, χρειαζόμαστε ένα κομμάτι κώδικα που αποφασίζει εάν υπάρχει ένα χέρι στην περιοχή που παρακολουθεί η κάμερα και αν ναι πού είναι.

Βήμα 3: Κομμάτι κώδικα

Κομμάτι κώδικα
Κομμάτι κώδικα
Κομμάτι κώδικα
Κομμάτι κώδικα

Ένα κομμάτι κώδικα που μας επιτρέπει να αποφασίσουμε αν υπάρχει ένα χέρι στην περιοχή ενδιαφέροντος χρησιμοποιεί κάτι που ονομάζεται Νευρωνικό Δίκτυο. Εμπίπτουν στην κατηγορία προγραμματισμού όπου δεν καθορίζουμε κανόνες για τη λήψη αποφάσεων, αλλά δείχνουμε νευρωνικά δίκτυα αρκετά δεδομένα ώστε να καταγράφει κανόνες από μόνος του.

Στην περίπτωσή μας, αντί να κωδικοποιούμε πώς μοιάζει το χέρι, δείχνουμε εικόνες νευρωνικών δικτύων που έχουν ληφθεί από βατόμουρο pi που περιέχει χέρι και που δεν περιέχει χέρι. Αυτή η φάση ονομάζεται εκπαίδευση νευρωνικού δικτύου και οι εικόνες που χρησιμοποιούνται ονομάζονται εκπαιδευτικά σύνολα.

Βήμα 4: Λήψη εικόνων

Λήψη εικόνων
Λήψη εικόνων

Συνδέθηκα απομακρυσμένα στο raspberry pi μου και τράβηξα δέσμη εικόνων χρησιμοποιώντας την ακόλουθη εντολή.

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

Τράβηξα 80 εικόνες με το χέρι και 80 εικόνες που δεν περιέχουν χέρι. 160 εικόνες δεν είναι αρκετές για να εκπαιδεύσουν σωστά ένα νευρωνικό δίκτυο, αλλά θα πρέπει να είναι αρκετές για την απόδειξη της ιδέας.

Εκτός από 160 εικόνες, τράβηξα 20 ακόμη εικόνες για να δοκιμάσω το δίκτυό μας μόλις εκπαιδευτεί.

Μόλις το σύνολο δεδομένων ήταν έτοιμο, άρχισα να γράφω κώδικα για νευρωνικό δίκτυο.

Βήμα 5: Εργαλεία και γλώσσα που χρησιμοποιούνται

Εργαλεία και γλώσσα που χρησιμοποιούνται
Εργαλεία και γλώσσα που χρησιμοποιούνται
Εργαλεία και γλώσσα που χρησιμοποιούνται
Εργαλεία και γλώσσα που χρησιμοποιούνται

Έγραψα το νευρωνικό μου δίκτυο σε βιβλιοθήκη βαθιάς εκμάθησης python που ονομάζεται Keras και ο κωδικός είναι γραμμένος σε σημειωματάριο jupyter από anaconda navigator.

Βήμα 6: Προετοιμασία δέσμης δεδομένων για εκπαίδευση

Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση
Προετοιμασία συστημάτων δεδομένων για εκπαίδευση

Πρώτα (Εικόνα #1) Περιέλαβα όλες τις βιβλιοθήκες που απαιτούνται για αυτό το έργο, το οποίο περιλαμβάνει PIL, matplotlib, numpy, os και Keras. Στο δεύτερο κελί του σημειωματάριου python (Εικόνα #2) ορίζω διαδρομές για το σύνολο δεδομένων και εκτυπώνω τον αριθμό δειγμάτων. Τώρα πρέπει να φορτώσουμε όλες τις εικόνες σε έναν αριθμημένο πίνακα, επομένως στο τρίτο κελί (Εικόνα #2) δημιούργησα έναν αριθμημένο πίνακα 82 (αριθμός δείγματος χεριού) +75 (αριθμός δείγματος χωρίς χέρι), δηλαδή 157x100x100x3. Το 157 είναι ο συνολικός αριθμός των εικόνων που έχω, 100x100 είναι η διαστασιολογούμενη διάσταση της εικόνας μας και 3 είναι για κόκκινα, πράσινα και μπλε χρώματα στην εικόνα.

Στο τέταρτο και πέμπτο κελί, φορτώνουμε εικόνες που περιέχουν χέρι ακολουθούμενες από εικόνες που δεν περιέχουν χέρι στον αριθμημένο πίνακα. Στο έκτο κελί, διαιρούμε κάθε τιμή με 255, οπότε περιορίζουμε το εύρος τιμών από 0 έως 1. (Εικόνα #3)

Λυπάμαι αν οι συνημμένες εικόνες δεν είναι αρκετά καλές. Εδώ υπάρχει σύνδεσμος προς το αποθετήριο GITHUB για να δείτε τον κώδικα. Μην ξεχάσετε να αντικαταστήσετε τα ονόματα διαδρομών καταλόγου με τη διαδρομή σας:).

Προχωράω.

Στη συνέχεια πρέπει να επισημάνουμε κάθε εικόνα, έτσι, δημιουργούμε μια μονοδιάστατη αριθμητική συστοιχία μήκους 157. Οι πρώτες 82 καταχωρήσεις έχουν οριστεί σε 1 και οι υπόλοιπες 75 καταχωρήσεις έχουν οριστεί σε 0 μεταφέροντας νευρωνικό δίκτυο, σύμφωνα με τις οποίες οι πρώτες 82 εικόνες προέρχονται από μια τάξη και οι υπόλοιπες προέρχονται από άλλη. (Εικόνα #4)

Τώρα ας δημιουργήσουμε ένα νευρωνικό δίκτυο.

Βήμα 7: Νευρωνικό δίκτυο

Νευρικό σύστημα
Νευρικό σύστημα
Νευρικό σύστημα
Νευρικό σύστημα

Στο ένατο κελί, ορίζουμε το νευρωνικό μας δίκτυο. Περιέχει τρεις επαναλήψεις του στρώματος περιστροφής που ακολουθούνται από στρώματα maxpool με 8, 12 και 16 φίλτρα περιστροφής αντίστοιχα. Στη συνέχεια έχουμε δύο πυκνά νευρωνικά δίχτυα. Επισύναψη δύο εικόνων για αυτό το βήμα. Πρώτο είναι το στιγμιότυπο κώδικα που δημιουργεί νευρωνικό δίκτυο και το δεύτερο είναι εικονογραφική αναπαράσταση νευρωνικού δικτύου με διάσταση εξόδου και σημειώσεις λειτουργιών.

Βήμα 8: Εκπαίδευση νευρωνικού δικτύου

Εκπαίδευση Νευρωνικού Δικτύου
Εκπαίδευση Νευρωνικού Δικτύου

Στο δέκατο κελί, ρυθμίζουμε τη βελτιστοποίηση νευρωνικού δικτύου σε 'adam' και τη λειτουργία απώλειας σε 'binary_crossentropy'. Παίζουν σημαντικό ρόλο στον τρόπο ενημέρωσης των σταθμών δικτύου. Τέλος, όταν τρέχουμε το ενδέκατο κύτταρο, το νευρωνικό δίκτυο αρχίζει να εκπαιδεύεται. Ενώ το δίκτυο εκπαιδεύεται, κοιτάξτε τη λειτουργία απώλειας και βεβαιωθείτε ότι μειώνεται.

Βήμα 9: Δοκιμή νευρωνικού δικτύου

Δοκιμή νευρωνικού δικτύου
Δοκιμή νευρωνικού δικτύου

Μόλις εκπαιδευτεί το νευρωνικό δίκτυο, πρέπει να προετοιμάσουμε ένα σύνολο δεδομένων δοκιμής. Επαναλαμβάνουμε τη διαδικασία που έγινε για την προετοιμασία του σετ κατάρτισης στο 3ο, 4ο, 5ο και 6ο κελί σε δεδομένα δοκιμής για τη δημιουργία συνόλου δοκιμών. Ετοιμάζουμε επίσης ετικέτα για δοκιμαστικό σετ, αλλά αυτή τη φορά τρέχουμε μοντέλο σε αυτά τα σύνολα δεδομένων για να έχουμε προβλέψεις και όχι για προπόνηση.

Βήμα 10: Αποτέλεσμα και επόμενο μέρος…

Αποτέλεσμα και επόμενο μέρος…
Αποτέλεσμα και επόμενο μέρος…

Πήρα ακρίβεια δοκιμής 88%, αλλά πάρτε αυτό με μια πρέζα αλάτι καθώς το σύνολο δεδομένων που χρησιμοποιείται για την εκπαίδευση και τη δοκιμή αυτού του μοντέλου είναι πολύ πολύ πολύ μικρό και ανεπαρκές για να εκπαιδεύσετε σωστά αυτό το μοντέλο.

Τέλος πάντων, ελπίζω να σας άρεσε αυτό το άρθρο. Η πρόθεσή μου πίσω από αυτήν την άσκηση δεν είναι ακόμη ολοκληρωμένη και προσέξτε το 2ο μέρος. Θα το ανεβάσω μόλις μπορέσω.

Στο επόμενο μέρος, θα εκπαιδεύσουμε ένα άλλο νευρωνικό δίκτυο που θα μας πει την τοποθεσία του χεριού σε μια ανιχνευμένη στο χέρι εικόνα.

Όλα τα ερωτήματα είναι ευπρόσδεκτα.

Εάν κάποιος ενδιαφέρεται να χρησιμοποιήσει το μικρό μου σύνολο δεδομένων, ενημερώστε με στα σχόλια. Θα το διαθέσω.

Ευχαριστώ για την ανάγνωση. Θα σας δω σύντομα με το δεύτερο μέρος μέχρι τότε γιατί δεν δημιουργείτε και εκπαιδεύετε ένα νευρωνικό δίκτυο.

Επεξεργασία:- Τα επόμενα βήματα αφορούν το δεύτερο μέρος.

Βήμα 11: Ανίχνευση αντικειμένου

Ανίχνευση αντικειμένων
Ανίχνευση αντικειμένων

Σε προηγούμενα βήματα δημιουργήσαμε ένα NN που μας λέει αν η δοκιμαστική εικόνα περιέχει χέρι ή όχι. Καλά τι μετά; Εάν το NN ταξινομεί την εικόνα ως χέρι που περιέχει, θα θέλαμε να μάθουμε τη θέση του χεριού. Αυτό ονομάζεται ανίχνευση αντικειμένων στη βιβλιογραφία όρασης υπολογιστή. Ας εκπαιδεύσουμε λοιπόν το ΝΝ που κάνει ακριβώς το ίδιο.

Βήμα 12: Βίντεο

Image
Image

Ένα βίντεο 3 λεπτών που εξηγεί όλα τα υπόλοιπα βήματα. Ρίξε μια ματιά.

Βήμα 13: Επισήμανση

Τιτλοφόρηση
Τιτλοφόρηση
Τιτλοφόρηση
Τιτλοφόρηση
Τιτλοφόρηση
Τιτλοφόρηση

Εάν θέλετε ένα νευρωνικό δίκτυο να εξάγει τη θέση του χεριού, πρέπει να το εκπαιδεύσουμε με τέτοιο τρόπο, δηλαδή σε αντίθεση με το προηγούμενο νευρωνικό δίκτυο όπου κάθε εικόνα χαρακτηριζόταν είτε με το χέρι είτε χωρίς χέρι. Αυτή τη φορά όλες οι εικόνες με το χέρι θα έχουν τέσσερις ετικέτες που αντιστοιχούν σε διαγώνιες συντεταγμένες του πλαισίου οριοθέτησης γύρω από το χέρι σε αυτήν την εικόνα.

Η συνημμένη εικόνα του αρχείου csv περιέχει ετικέτα για κάθε εικόνα. Λάβετε υπόψη ότι οι συντεταγμένες κανονικοποιούνται με τη διάσταση της εικόνας, δηλαδή εάν η άνω συντεταγμένη Χ είναι στο 320ο εικονοστοιχείο στην εικόνα με πλάτος 640 εικονοστοιχεία, θα την χαρακτηρίσουμε ως 0,5.

Βήμα 14: Επισήμανση GUI

Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI
Ετικέτα GUI

Mightσως αναρωτιέστε πώς κατάφερα να επισημάνω και τις 82 εικόνες, αλλά έγραψα ένα GUI σε python που με βοήθησε σε αυτό το έργο. Μόλις φορτωθεί η εικόνα στο GUI. Έκανα αριστερό κλικ στην επάνω συντεταγμένη και δεξί κλικ στην κάτω συντεταγμένη του πλαισίου πιθανής οριοθέτησης γύρω από το χέρι. Αυτές οι συντεταγμένες γράφονται στη συνέχεια σε ένα αρχείο μετά από το οποίο κάνω κλικ στο κουμπί επόμενο για να φορτώσει την επόμενη εικόνα. Επανέλαβα αυτή τη διαδικασία και για τις 82 εικόνες τρένου και 4 δοκιμαστικές εικόνες. Μόλις οι ετικέτες ήταν έτοιμες, ήταν ώρα εκπαίδευσης.

Βήμα 15: Απαιτούνται βιβλιοθήκες

Βιβλιοθήκες που χρειάζονται
Βιβλιοθήκες που χρειάζονται
Βιβλιοθήκες που χρειάζονται
Βιβλιοθήκες που χρειάζονται
Βιβλιοθήκες που χρειάζονται
Βιβλιοθήκες που χρειάζονται

Πρώτα πρέπει να φορτώσουμε όλες τις απαραίτητες βιβλιοθήκες. Το οποίο περιλαμβάνει

  • PIL για χειρισμό εικόνας,
  • matplotlib για σχεδίαση,
  • numpy για λειτουργία μήτρας,
  • os για λειτουργικότητα που εξαρτάται από το λειτουργικό σύστημα και
  • keras για νευρωνικό δίκτυο.

Βήμα 16: Υπολειπόμενα κύτταρα

Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα
Υπολειπόμενα κύτταρα

Στο 2ο, 3ο, 4ο και 5ο κελί φορτώνουμε εικόνες σε numpy πίνακα και δημιουργούμε έναν τετραδιάστατο πίνακα από το αρχείο csv για να λειτουργήσουν ως ετικέτες. Στο κελί αριθμός 6 δημιουργούμε το νευρωνικό μας δίκτυο. Η αρχιτεκτονική του είναι πανομοιότυπη με το νευρωνικό δίκτυο που χρησιμοποιείται για την ταξινόμηση, εκτός από τη διάσταση του επιπέδου εξόδου που είναι 4 και όχι 1. Μια άλλη διαφορά προέρχεται από τη συνάρτηση απώλειας που χρησιμοποιείται και είναι το μέσο τετραγωνικό σφάλμα. Στο κελί νούμερο 8 ξεκινάμε την εκπαίδευση του νευρωνικού μας δικτύου μόλις εκπαιδεύσουμε έτρεξα αυτό το μοντέλο σε δοκιμαστικό σετ για να λάβω προβλέψεις για το πλαίσιο οριοθέτησης στις συντεταγμένες επικάλυψης του κουτιού οριοθέτησης που έμοιαζαν αρκετά ακριβείς.

Ευχαριστώ για την ανάγνωση.