Πίνακας περιεχομένων:
- Βήμα 1: Βίντεο
- Βήμα 2: Υλικό
- Βήμα 3: Κομμάτι κώδικα
- Βήμα 4: Λήψη εικόνων
- Βήμα 5: Εργαλεία και γλώσσα που χρησιμοποιούνται
- Βήμα 6: Προετοιμασία δέσμης δεδομένων για εκπαίδευση
- Βήμα 7: Νευρωνικό δίκτυο
- Βήμα 8: Εκπαίδευση νευρωνικού δικτύου
- Βήμα 9: Δοκιμή νευρωνικού δικτύου
- Βήμα 10: Αποτέλεσμα και επόμενο μέρος…
- Βήμα 11: Ανίχνευση αντικειμένου
- Βήμα 12: Βίντεο
- Βήμα 13: Επισήμανση
- Βήμα 14: Επισήμανση GUI
- Βήμα 15: Απαιτούνται βιβλιοθήκες
- Βήμα 16: Υπολειπόμενα κύτταρα
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Πριν από λίγες ημέρες, τραυματίστηκα στον καρπό του δεξιού χεριού μου στο γυμναστήριο. Στη συνέχεια κάθε φορά που χρησιμοποιούσα το ποντίκι του υπολογιστή μου, προκαλούσε πολύ πόνο λόγω της απότομης γωνίας του καρπού.
Τότε με χτύπησε "δεν θα ήταν υπέροχο αν μπορούσαμε να μετατρέψουμε οποιαδήποτε επιφάνεια σε trackpad" και δεν ξέρω γιατί, αλλά για κάποιο λόγο την σκέφτηκα, την ταινία HER, θα σας αφήσω παιδιά να το καταλάβετε έξω. Anταν μια συναρπαστική σκέψη αλλά δεν ήξερα αν θα μπορούσα να το κάνω, αποφάσισα να το δοκιμάσω.
Αυτό το άρθρο αποτυπώνει τι προέκυψε από αυτό.
Πριν ξεκινήσουμε έχω μια αποποίηση ευθύνης-
«Στο τέλος αυτού του άρθρου, δεν μπορούσα να μετατρέψω καμία επιφάνεια σε trackpad, αλλά δεν έμαθα πολλά και πρόσθεσα μεγάλα εργαλεία στο οπλοστάσιό μου. Ελπίζω να συμβεί και σε εσάς »
Ας αρχίσουμε.
Βήμα 1: Βίντεο
Ακολουθεί ένα μικροσκοπικό βίντεο 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: Βίντεο
Ένα βίντεο 3 λεπτών που εξηγεί όλα τα υπόλοιπα βήματα. Ρίξε μια ματιά.
Βήμα 13: Επισήμανση
Εάν θέλετε ένα νευρωνικό δίκτυο να εξάγει τη θέση του χεριού, πρέπει να το εκπαιδεύσουμε με τέτοιο τρόπο, δηλαδή σε αντίθεση με το προηγούμενο νευρωνικό δίκτυο όπου κάθε εικόνα χαρακτηριζόταν είτε με το χέρι είτε χωρίς χέρι. Αυτή τη φορά όλες οι εικόνες με το χέρι θα έχουν τέσσερις ετικέτες που αντιστοιχούν σε διαγώνιες συντεταγμένες του πλαισίου οριοθέτησης γύρω από το χέρι σε αυτήν την εικόνα.
Η συνημμένη εικόνα του αρχείου csv περιέχει ετικέτα για κάθε εικόνα. Λάβετε υπόψη ότι οι συντεταγμένες κανονικοποιούνται με τη διάσταση της εικόνας, δηλαδή εάν η άνω συντεταγμένη Χ είναι στο 320ο εικονοστοιχείο στην εικόνα με πλάτος 640 εικονοστοιχεία, θα την χαρακτηρίσουμε ως 0,5.
Βήμα 14: Επισήμανση 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 ξεκινάμε την εκπαίδευση του νευρωνικού μας δικτύου μόλις εκπαιδεύσουμε έτρεξα αυτό το μοντέλο σε δοκιμαστικό σετ για να λάβω προβλέψεις για το πλαίσιο οριοθέτησης στις συντεταγμένες επικάλυψης του κουτιού οριοθέτησης που έμοιαζαν αρκετά ακριβείς.
Ευχαριστώ για την ανάγνωση.