Il Machine Learning per tutti con KNN

Gli algoritmi di machine learning (ML) sono disponibili in tutte le forme e dimensioni, ognuno con i propri compromessi. Per quanto riguarda Arduino, oltre a potenti framework di deep learning come TensorFlow Lite, esistono anche approcci ML classici per dispositivi integrati adatti a set di dati più piccoli che sono utili e facili da capire: uno dei più semplici è KNN. Continuiamo la nostra esplorazione di TinyML su Arduino con uno sguardo alla libreria KNN di Arduino.

Introduzione

Un vantaggio di KNN è che una volta che Arduino ha alcuni dati di esempio, è immediatamente pronto per classificare. Il team di Arduino ha rilasciato una nuova libreria Arduino in modo da poter includere KNN negli sketch in modo rapido e semplice, senza addestramento off-device o strumenti aggiuntivi richiesti. KNN è un approccio più rapido e leggero rispetto al deep learning, ma non scala altrettanto bene con set di dati più grandi e complessi.

In questo articolo, analizzeremo uno sketch che è in grado di stabilire se un oggetto appartiene ad una determinata classe attraverso la rilevazione del colore dell’oggetto. In particolare prenderemo in esame tre tipologie di frutto: mela, lime ed arancia. Dopo aver mostrato all’algoritmo vari esempi di ogni tipologia di frutto, esso sarà in grado di stabilire con una certa precisione se un nuovo esempio sia classificabile come mela, lime o arancia.

Vedremo quindi come classificare gli oggetti per mezzo del loro colore usando la libreria Arduino_KNN sulla scheda Arduino Nano 33 BLE Sense. Per iniziare, è necessario avere quanto segue:

  • La scheda Arduino Nano 33 BLE Sense poichè dotata di un sensore di colore integrato.
  • Un cavo Micro USB per caricare lo sketch sulla scheda.
  • Arduino IDE.

Quindi occorre installare la libreria Arduino_KNN. Per farlo basta avviare l’IDE e selezionare “Strumenti>Gestione librerie” cercare quindi Arduino_KNN ed installare. Adesso selezionare “ColorClassifier” da “File> Esempi> Arduino_KNN”. Lo sketch ora è pronto per essere compilato e caricato sulla scheda Arduino.

La libreria Arduino_KNN

Lo sketch di esempio fa uso della libreria Arduino_KNN. La libreria fornisce un’interfaccia semplice per utilizzare KNN:

#include <Arduino_KNN.h>
// Create a new KNNClassifier
KNNClassifier myKNN(INPUTS);

Nel nostro esempio INPUTS= 3 in quanto tre sono i valori di rosso, verde e blu in dal sensore di colore.

Campionando i colori degli oggetti

Una volta aperto il Serial Monitor si dovrebbe visualizzare il seguente messaggio:

Arduino KNN color classifier
Show me an example Apple

La scheda Arduino è pronta per campionare il colore di un oggetto. Occorre tener presente che il sensore di colore funziona meglio in una stanza ben illuminata su oggetti opachi, non lucidi e ciascuna classe deve avere colori distinti.

Quando si avvicina la scheda Arduino all’oggetto, essa campiona il colore e lo aggiunge agli esempi KNN insieme a un numero che identifica la classe a cui appartiene l’oggetto (ovvero i numeri 0,1 o 2 che rappresentano Mela, Lime e Arancia). Le tecniche ML in cui si forniscono dati di esempio etichettati sono anche chiamate apprendimento supervisionato. Il codice nello sketch per aggiungere i dati di esempio alla funzione KNN è il seguente:

readColor(color);
// Add example color to the KNN model
myKNN.addExample(color, currentClass);

Anche i livelli di rosso, verde e blu del campione di colore vengono emessi sul monitor seriale (fgura 1). Lo sketch prende 30 campioni di colore per ogni classe di oggetti. Uno stesso oggetto può essere usato per campionare il colore 30 volte, non c’è bisogno di 30 mele distinte ai fini di questo esempio (Sebbene un set di dati più ampio renderebbe il modello più generalizzato.)

Classificazione

Dopo aver addestrato il modello con gli esempi, ora lo sketch è pronto ad indovinare (classificare) nuovi oggetti appartenenti alle tre classi. L’esempio legge il sensore di colore usando la stessa funzione utilizzata per acquisire i dati di addestramento. La differenza sta nel fatto che viene chiamata la funzione di classificazione per indovinare la classe dell’oggetto una volta rilevato il colore.

readColor(color);
 // Classify the object
 classification = myKNN.classify(color, K);

Non resta che provare a mostrargli un oggetto e vedere come funziona. Da notare che la precisione non sarà del 100%, specialmente se la superficie dell’oggetto è variabile o se le condizioni di illuminazione non sono stabili. Al fine di valutare come questi fattori influiscono sui risultati si possono sperimentare un diverso numero di esempi, di valori per k, di oggetti e/o ambienti.

Come funziona KNN?

Anche se la libreria Arduino_KNN esegue i calcoli al posto nostro, è utile capire come funzionano gli algoritmi ML per guidare la nostra scelta per un’applicazione.

In breve, l’algoritmo KNN classifica gli oggetti confrontando quanto sono vicini agli esempi (campionati) visti in precedenza. Per classificare un nuovo oggetto il classificatore KNN cerca i k esempi più simili tra quelli campionati. L’algoritmo lo fa calcolando la distanza tra il nuovo oggetto e ciascuno degli esempi campionati.

Possiamo sintetizzare l’algoritmo in 5 passi:

  • La scelta di k in KNN rappresenta il numero di esempi più vicini che l’algoritmo prende in considerazione. Con k = 3 tiene conto dei tre esempi più vicini.
  • Il nuovo oggetto cosi come gli esempi campionati sono rappresentati da vettori le cui dimensioni sono date dalle caratteristiche scelte per la classificazione.
  • Le distanze tra l’oggetto da classificare e gli esempi della fase di campionamento diventa cosi una semplice distanza tra vettori calcolabile come distanza Euclidea o Manhattan o altro ancora.
  • Gli esempi della fase di campionamento vengono messi in ordine a seconda della loro distanza con il nuovo oggetto.
  • La maggioranza degli esempi campionati appartenenti ad una determinata classe, tra i k più vicini, determina la classe del nuovo oggetto.

Svantaggi di KNN

In un problema di classificazione con solo due input (temperatura, umidità) come quello di figura 2, l’algoritmo è chiamato ad identificare l’oggetto ignoto (“?“) e decidere la stagione (classe) di appartenenza. Ogni esempio campionato è etichettato con una stagione ed è caratterizzato da un valore medio giornaliero di temperatura ed umidità.

Per classificare un nuovo oggetto il classificatore KNN cerca gli esempi campionati più vicini. Con k = 3 l’algoritmo darebbe due voti per la primavera e uno per l’inverno. Il risultato sarebbe quindi la classificazione del nuovo oggetto con la classe primavera. Con k = 1 invece la classificazione darebbe come risultato la classe inverno.

Nell’esempio di classificazione dei colori ci sono tre ingressi (rosso, verde e blu) dal sensore di colore. I colori di ciascun oggetto possono essere pensati come punti nello spazio tridimensionale posizionato sugli assi rosso, verde e blu. Come al solito l’algoritmo KNN classifica i nuovi oggetti controllando quanto essi sono vicini agli esempi della fase di campionamento, ma poiché ci sono tre ingressi deve calcolare le distanze nello spazio tridimensionale.

L’algoritmo KNN risulta quindi molto semplice sia nella teoria che nella pratica, ma presenta anche degli svantaggi:

  • Più dimensioni hanno i dati, più è oneroso il calcolo per ottenere il risultato della classificazione. Il calcolo della distanza in due dimensioni è meno oneroso che in tre dimensioni.
  • Tanto maggiore è la quantità di dati di esempi di addestramento, tanto più tempo è necessario all’algoritmo ogni volta che classifica un oggetto (ogni volta calcola la distanza tra l’oggetto ignoto e tutti gli esempi). Ciò rende KNN meno fattibile per set di dati di grandi dimensioni. Questa rappresenta la grande differenza tra KNN e un approccio basato sull’apprendimento profondo.
  • Elevata sensibilità alla scelta del parametro k. Il risultato può cambiare a seconda della scelta di k.

Conclusioni

Questo è solo un assaggio di ciò che è possibile fare con un approccio KNN. È possibile utilizzare qualsiasi sensore sulla scheda BLE Sense come input e persino combinare KNN con altre tecniche ML. Naturalmente ci sono altre risorse di machine learning disponibili per Arduino, tra cui TensorFlow Lite. La scelta della tecnica da utilizzare corrisponde a pro e contro che vanno soppesati in funzione di una moltitudine di parametri: potenza di calcolo, numero di esempi di addestramento disponibili, accuratezza della classificazione desiderata etc.

Redazione Fare Elettronica