
L’object recognition su dispositivi embedded è oggi una delle applicazioni più interessanti nel campo della computer vision. Il progetto analizzato mostra come sia possibile implementare un sistema completo di riconoscimento oggetti utilizzando una scheda compatta come il Raspberry Pi Zero 2W, combinando modelli leggeri, librerie open source e strumenti ben consolidati, in particolare usando YOLO.
L’approccio adottato è pratico e diretto: si basa su modelli ONNX ottimizzati e sull’utilizzo di YOLOv5n, una versione particolarmente leggera dell’algoritmo YOLO, capace di offrire un buon compromesso tra prestazioni e consumo di risorse.
Architettura del sistema e overview di YOLO
Il progetto si fonda su una configurazione hardware semplice ma efficace. Il Raspberry Pi Zero 2W rappresenta il cuore del sistema, supportato da componenti essenziali come una camera collegata tramite interfaccia CSI-2 e, opzionalmente, un display per la visualizzazione locale.
Dal punto di vista software, l’ambiente è costruito attorno a Python, con l’utilizzo di OpenCV per la gestione delle immagini e onnxruntime per l’esecuzione del modello neurale.
Un aspetto interessante è la possibilità di lavorare sia in modalità headless via SSH, limitandosi all’alimentazione, sia con configurazione completa locale tramite HDMI e periferiche USB. Questa flessibilità rende il progetto facilmente adattabile a diversi scenari.
ONNX: interoperabilità e portabilità
Il formato ONNX (Open Neural Network Exchange) svolge un ruolo centrale. Si tratta di uno standard aperto che consente di rappresentare modelli di machine learning in modo indipendente dal framework di origine.
Questo significa che un modello addestrato in un ambiente può essere esportato e utilizzato altrove senza dover essere riscritto. Nel contesto del progetto, ONNX permette di eseguire il modello YOLOv5n direttamente sul Raspberry Pi, sfruttando un runtime ottimizzato.
La struttura basata su grafi computazionali rende il modello scalabile e compatibile con diversi backend, facilitando l’integrazione in sistemi embedded.

YOLO: rilevamento oggetti in tempo reale
YOLO (You Only Look Once) rappresenta uno degli approcci più diffusi per il rilevamento degli oggetti. Nato circa dieci anni fa, è evoluto attraverso numerose versioni fino ad arrivare a implementazioni moderne estremamente efficienti.
La caratteristica principale di YOLO è l’elaborazione in un unico passaggio: l’immagine viene analizzata una sola volta e il modello restituisce contemporaneamente bounding box e classi degli oggetti. Questo lo distingue dai metodi a due stadi, che separano il rilevamento delle regioni dalla classificazione.
Il funzionamento si basa sulla suddivisione dell’immagine in una griglia S×S. Per ogni cella, la rete predice più bounding box e un punteggio di confidenza che indica sia la presenza dell’oggetto sia la qualità della previsione. A questo si aggiungono le probabilità di appartenenza alle diverse classi.
Un elemento chiave è l’uso della metrica IoU (Intersection over Union), che misura quanto la bounding box predetta si sovrappone a quella reale. Questa informazione contribuisce al calcolo della confidenza.
Dal punto di vista architetturale, YOLO è basato su una rete convoluzionale profonda che estrae caratteristiche e produce direttamente le predizioni. La funzione di perdita combina tre componenti: classificazione, localizzazione e confidenza, rendendolo un tipico esempio di apprendimento multi-task.
Grazie alla sua velocità, YOLO è particolarmente adatto ad applicazioni real-time come il monitoraggio del traffico, il tracking sportivo e molti altri scenari embedded.
YOLOv5n: leggerezza ed efficienza
Nel progetto viene utilizzata la variante YOLOv5n, progettata per ambienti con risorse limitate. Questa versione riduce la complessità del modello mantenendo una buona accuratezza.
L’ottimizzazione riguarda sia l’architettura interna sia il bilanciamento tra velocità e precisione. Questo rende YOLOv5n ideale per il Raspberry Pi Zero 2W, dove la capacità computazionale è limitata.
Preparazione dell’ambiente
La fase iniziale prevede l’installazione delle librerie necessarie. OpenCV viene installato tramite il gestore pacchetti del sistema, mentre onnxruntime richiede l’utilizzo di pip.
Nel caso di incompatibilità, è possibile installare manualmente il pacchetto appropriato in formato .whl, scegliendolo in base alla versione di Python e all’architettura del sistema.
È importante verificare l’ambiente con comandi come:
uname -aper informazioni sul sistemapython --versionper la versione del linguaggio
Download e gestione del modello
Il modello YOLOv5n in formato ONNX viene scaricato direttamente dal repository ufficiale. Una volta salvato nella directory locale, può essere caricato dal codice Python.
Questo approccio evita la necessità di training locale, rendendo il progetto immediatamente operativo.
Pipeline di elaborazione
Il flusso di esecuzione segue una pipeline ben definita:
- Caricamento del modello tramite onnxruntime
- Lettura dell’immagine con OpenCV
- Pre-processing (resize, normalizzazione, conversione)
- Inferenza del modello
- Post-processing dei risultati
Durante il pre-processing, l’immagine viene ridimensionata a 640×640 e normalizzata. Dopo l’inferenza, i risultati vengono filtrati in base alla confidenza e convertiti in coordinate utilizzabili.
Post-processing e NMS
Una parte fondamentale è il filtraggio delle predizioni. Vengono eliminate le rilevazioni con confidenza bassa o coordinate non valide.
Successivamente si applica la Non-Maximum Suppression (NMS), che serve a rimuovere bounding box sovrapposte mantenendo solo le più rilevanti.
Questo passaggio è essenziale per ottenere risultati puliti e interpretabili.
Visualizzazione dei risultati
I risultati vengono disegnati direttamente sull’immagine:
- Bounding box colorate per ogni oggetto
- Etichette con nome della classe e confidenza
- Colori distinti per migliorare la leggibilità
Un dettaglio interessante è il calcolo automatico del colore del testo in base allo sfondo, per garantire sempre un buon contrasto.
L’immagine finale viene mostrata in una finestra popup, mentre il terminale stampa informazioni dettagliate sulle rilevazioni.

Esecuzione e dimostrazione
L’esecuzione avviene tramite comando:
Il sistema produce sia un output visivo sia una serie di log nel terminale, inclusi:
- Numero totale di predizioni
- Numero di rilevazioni valide
- Coordinate e confidenza degli oggetti
Questo doppio livello di output è utile sia per debugging sia per analisi.
Considerazioni pratiche
Dai commenti e dall’esperienza generale emergono alcuni aspetti impliciti ma importanti:
- L’uso di modelli leggeri è fondamentale su hardware limitato
- La configurazione dell’ambiente può richiedere attenzione, soprattutto per le dipendenze
- La qualità dei risultati dipende fortemente dal pre-processing
Si percepisce anche come il progetto sia pensato più come dimostrazione tecnica che come soluzione pronta all’uso, ma rappresenta una base solida per sviluppi futuri.
Conclusione
Questo progetto dimostra come sia possibile implementare un sistema di object recognition completo anche su una piattaforma compatta come il Raspberry Pi Zero 2W.
L’integrazione tra ONNX e YOLOv5n consente di ottenere prestazioni adeguate in un contesto embedded, mantenendo semplicità e portabilità. Il risultato è una soluzione accessibile, estendibile e adatta a numerosi scenari applicativi.
Pur trattandosi di una realizzazione essenziale, il lavoro evidenzia chiaramente il potenziale delle tecnologie di deep learning anche su dispositivi a basso consumo, aprendo la strada a ulteriori sperimentazioni e ottimizzazioni.
Iscriviti ai nostri gruppi Telegram
Link utili