Classificazione di immagini con l’ESP32-CAM

In alcuni precedenti articoli abbiamo affrontato il problema dell'implementazione e distribuzione di modelli di Machine Learning su microcontrollori  a bassissimo consumo elettrico. In particolare, abbiamo addestrato la scheda Arduino Nano 33 BLE Sense a discriminare il suono di due o più parole. Tutto ciò è stato possibile grazie alla piattaforma Edge Impulse, che mette a nostra disposizione un ambiente intuitivo e allo stesso tempo potente per creare modelli ML e poi distribuirli su dispositivi con forti vincoli in termini energetici e di risorse. In generale, la distribuzione del modello si può fare anche senza Edge Impulse con un procedimento molto più lungo e laborioso. In questo articolo faremo un piccolo passo avanti, continuando ancora ad avvalerci della piattaforma, ma cercando di distribuire il modello su un dispositivo non ancora ufficialmente supportato dalla stessa.

Introduzione

In questo articolo andremo a descrivere come distribuire un modello di Machine Learning per la classificazione di immagini su un dispositivo embedded con pesanti vincoli in termini di risorse. Distribuire un modello di Machine Learning in grado di eseguire l'inferenza su un dispositivo a microcontrollore così limitato è conosciuto in gergo come TinyML. Rispetto a precedenti esperienze di TinyML descritte in questo blog, la differenza con la nuova applicazione che andremo a trattare sta nel fatto che il modulo che utilizzeremo, ovvero l'ESP32-CAM, non è ancora ufficialmente supportato dalla piattaforma Edge Impulse. Scriviamo "ufficialmente" perché alcuni sviluppatori hanno pensato di implementare una soluzione temporanea per supplire a questa mancanza. Detto questo, il procedimento che andremo a descrivere risulterà più laborioso rispetto alla formula tradizionale.

Per implementare l'applicazione utilizzeremo:

  • un modulo ESP32-CAM, nel nostro caso particolare si è trattato della scheda AI-Thinker dotata di videocamera OV2640. Inoltre, un convertitore seriale UART-USB può facilitare la vita durante il caricamento del firmware;
  • un account Edge Empulse, gratuito;
  • un account Google, gratuito;
  • l'editor Arduino IDE, gratuito.

Data la complessità dell'implementazione, non descriveremo nel dettaglio il modulo ESP32-CAM né tutte le fasi di configurazione e interfacciamento con l'editor Arduino IDE. Il modulo è stato ampiamente descritto in un precedente articolo di Fulvio De Santis, quindi rimandiamo il lettore alla lettura dello stesso, per preparare l'ambiente di lavoro prima di procedere con l'implementazione odierna.

Anche la piattaforma di sviluppo Edge Impulse è stata ampiamente trattata in un altro articolo precedente. In questo articolo forniremo comunque le istruzioni necessarie per muoversi all'interno dell'ambiente, ma per chi ne volesse sapere di più rimandiamo al link. In Figura 1 vengono indicate sommariamente le fasi attraverso le quali ci muoveremo per implementare l'applicazione. I dati per l'addestramento verranno trasferiti da un repository verso la piattaforma Edge Impulse, utilizzando Google Colab. All'interno di Edge Impulse avverrà l'addestramento del modello e la preparazione di quest'ultimo per la distribuzione su microcontrollore. Infine, utilizzeremo l'IDE Arduino per caricare lo sketch comprensivo del modello sul modulo ESP32-CAM.

Figura 1: Breve descrizione delle fasi per giungere alla distribuzione del modello ML sul modulo ESP32-CAM

Google Colab e Kaggle

La prima cosa da fare è creare un nuovo progetto all'interno dell'account Edge Impulse. Appena creato, comparirà una procedura guidata di cui però non avremo bisogno, quindi chiudiamola. Poiché il modulo ESP32-CAM non è supportato da Edge Impulse, non potremo utilizzare la scheda per acquisire i dati come invece abbiamo fatto nei precedenti articoli. Per tale motivo, importeremo i dati direttamente in Edge Impulse, attraverso Google Colab. Colaboratory, per chi non lo conoscesse, è uno strumento gratuito messo a disposizione da Google, che permette di scrivere codice Python, condividerlo ed eseguirlo sfruttando risorse remote messe a disposizione dalla compagnia. Per utilizzare Colab occorre possedere un account Google. Una volta autenticati nel proprio account Google sarà possibile aprire il seguente link: https://colab.research.google.com/drive/1n-VFqIye7h16IOj3OmcfYcY4Bm_QEzJz

Si aprirà un file con cui scaricare i dati di addestramento nel nostro progetto. Analizziamo i blocchi in cui è suddiviso il codice.

import os

Come al solito, nelle prime righe vengono importate le dipendenze. Il modulo os, in particolare, permette di interfacciarsi con il sistema operativo:

!pip install -q kaggle
os.environ['KAGGLE_USERNAME']='andreagarrapa'
os.environ['KAGGLE_KEY']='1935c217383134efa5773a8b7c1554bd'
!kaggle datasets download -d alxmamaev/flowers-recognition
!unzip flowers-recognition.zip

Passando al secondo blocco, nella prima riga avviene l'installazione dell'API ufficiale per accedere a Kaggle utilizzando uno strumento a riga di comando implementato in Python. Kaggle è una piattaforma online usata da chi si occupa di data science, e dalla quale scaricheremo il dataset di addestramento. Le due righe successive permettono l'autenticazione. La quarta riga, invece, si occupa di scaricare il dataset, mentre l'ultima esegue la decompressione del file zip. Il dataset contiene 4242 immagini di fiori. La raccolta dei dati si basa su dati Flickr, immagini Google, immagini Yandex. È possibile utilizzare questo set di dati per riconoscere i fiori dalle foto. Le immagini sono divise in cinque classi: margherita, tulipano, rosa, girasole, dente di leone. Per ogni classe ci sono circa 800 foto. Le foto non sono ad alta risoluzione, circa 320x240 pixel.

!npm cache clean -f
!npm install -g npm
!n stable
!npm install -g --unsafe-perm edge-impulse-cli

Il terzo blocco, senza addentrarci in particolari, consente di utilizzare i comandi della CLI (Command Line Interface) di Edge Impulse nell'ambiente di runtime Node.js.

train_paths = '/content/flowers/rose/*.jpg'
!edge-impulse-uploader \
    --category training \
    --label rose\
    --api-key API_KEY \
    --silent \
    {train_paths}

Gli ultimi due blocchi avviano l'effettivo trasferimento dei dati verso la piattaforma Edge Impulse. Assume fondamentale importanza il fatto di sostituire il termine API_KEY con la chiave del proprio progetto. La chiave si trova nella sezione "Dashboard", facendo click su "Keys". Per mantenere le cose il più possibile semplici, abbiamo deciso di scaricare solo due tipologie di fiori: rose e girasoli. Il file è quindi pronto, non resta altro che fare click su "Run" e quindi "Esegui tutte le celle". Il file dovrebbe iniziare a scaricare i dati del dataset verso il progetto presente in Edge Impulse. Nella scheda "Data acquisition" è possibile verificare l'avvenuta ricezione dei dati.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2073 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend