Οι αλγόριθμοι μηχανικής μάθησης (Machine Learning) συνήθως δεν εκτελούνται απευθείας σε μικροελεγκτές όπως το Arduino λόγω της περιορισμένης μνήμης και ισχύος επεξεργαστή. Η βιβλιοθήκη Arduino_KNN είναι ο τέλειος τρόπος για την ενσωμάτωση της TinyML σε πλακέτες Arduino. Ο αλγόριθμος KNN ταξινομεί τα αντικείμενα συγκρίνοντας πόσο όμοια είναι με προηγούμενα παραδείγματα που έχει εξετάσει.
Εκτός από τα πανίσχυρα συστήματα deep learning όπως το TensorFlow για το Arduino, υπάρχουν επίσης αλγόριθμοι μηχανικής μάθησης (ML) κατάλληλοι για μικρότερο όγκο δεδομένων για χρήση σε ενσωματωμένες συσκευές που είναι χρήσιμοι και εύκολα κατανοητοί – ένας από τους απλούστερους είναι ο KNN.
Ένα πλεονέκτημα του KNN είναι ότι τη στιγμή που το Arduino έχει κάποια ενδεικτικά δεδομένα είναι έτοιμο να τα ταξινομήσει! Η Arduino κυκλοφόρησε μια νέα βιβλιοθήκη ώστε να μπορείτε να ενσωματώσετε τον αλγόριθμο KNN στα sketches σας γρήγορα και εύκολα, χωρίς να απαιτείται εκπαίδευση του μοντέλου εκτός του μικροελεγκτή ή πρόσθετα εργαλεία για την εκμάθηση του μοντέλου.
Σε αυτό το άρθρο, θα ρίξουμε μια ματιά στον αλγόριθμο KNN χρησιμοποιώντας το παράδειγμα της ταξινόμησης χρώματος. Η ταξινόμηση χρώματος είναι ένα καλό παράδειγμα καθώς με τον KNN γίνεται εύκολα μια γρήγορη και ευέλικτη προσέγγιση σε σύγκριση με άλλους πολύπλοκους αλγορίθμους deep learning, αν και το μοντέλο αυτό δεν ανταποκρίνεται τόσο καλά σε μεγαλύτερα και πιο σύνθετα σύνολα δεδομένων.
Sketch παραδείγματος ταξινόμησης χρωμάτων
Σε αυτό το παράδειγμα, θα δούμε πώς να ταξινομήσουμε αντικείμενα με βάση το χρώμα χρησιμοποιώντας τη βιβλιοθήκη Arduino_KNN με το Arduino Nano 33 BLE Sense.
Θα χρειαστείτε:
- Arduino Nano 33 BLE Sense
- Καλώδιο Micro USB
- Το Arduino IDE ή το Arduino Create
- Εγκατεστημένο Arduino_KNN library
- Για τις οδηγίες πηγαίντε στο ColorClassifier ακολουθώντας το Path: File > Examples > Arduino_KNN
- Κάντε Compile στο sketch και μεταφορτώστε το στο Arduino σας!
Η βιβλιοθήκη Arduino_KNN
Το sketch του παραδείγματος χρησιμοποιεί τη βιβλιοθήκη Arduino_KNN. Η βιβλιοθήκη παρέχει ένα απλό περιβάλλον για τη χρήση του KNN στα δικά σας sketches:
#include <Arduino_KNN.h>
// Create a new KNNClassifier
KNNClassifier myKNN(INPUTS);
Στο παράδειγμα INPUTS=3 – για τις τιμές των red, green και blue που δίνει ο αισθητήρας χρώματος.
Δειγματοληψία χρωμάτων για δημιουργία μοντέλου
Ανοίγοντας το Serial Monitor θα πρέπει να εμφανιστεί το ακόλουθο μήνυμα:
Arduino KNN color classifier
Show me an example Apple
Το Arduino σας είναι έτοιμο για τη δειγματοληψία ενός χρώματος αντικειμένου. Αν δεν έχετε ένα μήλο, ένα αχλάδι και ένα πορτοκάλι στη διάθεσή σας, ίσως θέλετε να επεξεργαστείτε το έτοιμο sketch για να βάλετε διαφορετικές ονομασίες στις αντίστοιχες ετικέτες. Κρατήστε κατά νου ότι ο αισθητήρας χρώματος λειτουργεί καλύτερα σε ένα καλά φωτισμένο δωμάτιο, σε ματ αντικείμενα που δεν γυαλίζουν και κάθε κατηγορία αντικειμένου πρέπει να έχει ευδιάκριτα ξεχωριστά χρώματα! (Για παράδειγμα, ο αισθητήρας χρώματος δεν θα μπορέσει να διακρίνει την χρωματική διαφορά μεταξύ ενός πορτοκαλιού και ενός μανταρινιού).
Όταν πλησιάζετε το Arduino κοντά στο αντικείμενο, η πλακέτα συλλέγει δείγμα χρώματος και το προσθέτει στα παραδείγματα KNN μαζί με έναν αριθμό που χαρακτηρίζει την κατηγορία στην οποία ανήκει το αντικείμενο (π.χ. οι αριθμοί 0,1 ή 2 αντιπροσωπεύουν εδώ το μήλο, το πορτοκάλι ή το αχλάδι). Οι τεχνικές μηχανικής μάθησης (ML) στις οποίες παρέχετε τα δεδομένα σε μορφή ονοματισμένων παραδειγμάτων ονομάζονται επίσης supervised learning.
Στο sketch, ο κώδικας για να προσθέσετε τα δείγματα που συλλέξατε στην λειτουργία KNN είναι ο ακόλουθος:
readColor(color);
// Add example color to the KNN model
myKNN.addExample(color, currentClass);
Οι μετρήσεις του έγχρωμου δείγματος εξάγονται επίσης σε σειριακή μορφή σε RGB (βλ επόμενη φωτογραφία).
Το sketch καταγράφει 30 δείγματα χρώματος για κάθε κατηγορία αντικειμένου. Δείχνοντας του ένα αντικείμενο, θα δειγματίσει το χρώμα 30 φορές – που σημαίνει ότι δεν χρειάζεστε 30 μήλα για αυτό το tutorial! (Αν και ένα ευρύτερο σύνολο δεδομένων από διαφορετικά μήλα θα έκανε το μοντέλο πιο γενικευμένο).
Κατηγοριοποίηση
Με τα δείγματα του παραδείγματος που αποκτήθηκαν, το sketch θα μπορεί τώρα να μαντέψει το αντικείμενό σας! Το παράδειγμα αυτό διαβάζει τον αισθητήρα χρώματος χρησιμοποιώντας την ίδια συνάρτηση που χρησιμοποιεί όταν αποκτά τα δεδομένα εκμάθησης του – μόνο που αυτή τη φορά καλεί τη συνάρτηση classify η οποία θα μαντέψει μια κατηγορία αντικειμένου όταν του δείξετε ένα χρώμα:
readColor(color);
// Classify the object
classification = myKNN.classify(color, K);
Μπορείτε να δοκιμάσετε να του δείξετε ένα αντικείμενο και να δείτε πώς θα αντιδράσει:
Let me guess your object
0.44,0.28,0.28
You showed me an Apple
Σημείωση: Το αποτέλεσμα δεν θα είναι 100% ακριβές με την πρώτη προσπάθεια, ειδικά αν η επιφάνεια του αντικειμένου δεν είναι ομοιόμορφη ή οι συνθήκες φωτισμού αλλάζουν κατά την λήψη του δείγματος. Μπορείτε να πειραματιστείτε με διαφορετικούς αριθμούς μεταβλητών, τιμών για το k και διαφορετικών αντικειμένων και περιβάλλοντος για να δείτε πώς αυτό επηρεάζει τα αποτελέσματα.
Πως δουλεύει το KNN?
Αν και η βιβλιοθήκη Arduino_KNN ανταποκρίνεται στην λειτουργία αυτή, είναι χρήσιμο να κατανοήσετε πώς δουλεύουν οι αλγόριθμοι μηχανικής μάθησης (ML) όταν επιλέγετε έναν για την εφαρμογή σας. Με λίγα λόγια, ο αλγόριθμος KNN ταξινομεί αντικείμενα συγκρίνοντας πόσο κοντά είναι σε παραδείγματα που έχει δει προηγουμένως.
Ακολουθεί ένα παράδειγμα σε μορφή γραφικής απεικόνισης με σχετικά σημεία δεδομένων μέσης ημερήσιας θερμοκρασίας και υγρασίας. Κάθε παράδειγμα επισημαίνεται με μια εποχή:
Για να ταξινομήσει ένα νέο αντικείμενο (το “?” στο διάγραμμα), ο αλγόριθμος KNN αναζητά τα κοντινότερα προηγούμενα παραδείγματα που έχει δει. Καθώς υπάρχουν δύο είσοδοι στο παράδειγμά μας, ο αλγόριθμος το κάνει αυτό υπολογίζοντας την απόσταση μεταξύ του νέου αντικειμένου και κάθε ενός από τα προηγούμενα παραδείγματα. Μπορείτε να δείτε ότι το πιο κοντινό παράδειγμα στο παραπάνω διάγραμμα έχει την ετικέτα “Χειμώνας” (winter).
Το k στο KNN είναι απλώς ο αριθμός των πλησιέστερων παραδειγμάτων που εξετάζει ο αλγόριθμος. Με k=3 υπολογίζει τα τρία πλησιέστερα παραδείγματα. Στο παραπάνω διάγραμμα, με k=3, ο αλγόριθμος θα έδινε δύο ψήφους για την Άνοιξη και μία για τον Χειμώνα – οπότε η απόφαση του αλγορίθμου με βάση τα δεδομένα θα ήταν η Άνοιξη.
Ένα μειονέκτημα του KNN είναι ότι όσο μεγαλύτερος είναι ο όγκος των δεδομένων των παραδειγμάτων εκμάθησης του, τόσο περισσότερο χρόνο χρειάζεται για να ελέγχει κάθε φορά που ταξινομεί ένα αντικείμενο. Αυτό καθιστά το KNN λιγότερο εύχρηστο για μεγάλα σύνολα δεδομένων και αποτελεί μια σημαντική διαφορά μεταξύ του KNN και μιας προσέγγισης που βασίζεται περισσότερο στο deep learning.
Ταξινόμηση αντικειμένων με βάση το χρώμα
Στο παράδειγμα της ταξινόμησης χρώματος υπάρχουν τρεις είσοδοι από τον αισθητήρα χρώματος (R,G,B). Τα χρώματα που χρησιμοποιεί το παράδειγμα σαν δείγματα από το κάθε αντικείμενο μπορούν να θεωρηθούν ως σημεία στον τρισδιάστατο χρωματικό χώρο τοποθετημένα στον κόκκινο (R), πράσινο (G) και μπλε (B) άξονα. Όπως εξηγήσαμε, ο αλγόριθμος KNN μαντεύει τα αντικείμενα ελέγχοντας πόσο κοντά είναι οι είσοδοι σε παραδείγματα που έχει δει προηγουμένως, αλλά επειδή υπάρχουν τρεις είσοδοι αυτή τη φορά πρέπει να υπολογίσει τις αποστάσεις σε τρισδιάστατο χώρο. Όσο περισσότερες διαστάσεις έχουν τα δεδομένα τόσο περισσότερη επεξεργασία απαιτεί ο υπολογισμός του αποτελέσματος της ταξινόμησης.
Σύνοψη
Αυτό είναι απλώς ένα γρήγορο παράδειγμα των δυνατοτήτων του KNN. Θα βρείτε περισσότερα παραδείγματα στο φάκελο της βιβλιοθήκης εδώ. Μπορείτε να χρησιμοποιήσετε οποιονδήποτε αισθητήρα στo BLE Sense ως είσοδο και ακόμη και να συνδυάσετε το KNN με άλλες τεχνικές μηχανικής μάθησης (ML).
Φυσικά υπάρχουν και άλλοι τρόποι να συνδυαστεί η μηχανική μάθηση με το Arduino, όπως το TensorFlow Lite με διαθέσιμα library στην Arduino, καθώς και υποστήριξη από επαγγελματικά εργαλεία όπως το Edge Impulse και το Qeexo.
Το Machine Learning γίνεται κάθε μέρα και πιο συμβατό και φιλικό με τους μικροελεγκτές δημιουργώντας νέες δυνατότητες για τον κόσμο του making!