Il rilevamento degli oggetti (object detection o semplicemente OD) rappresenta una delle principali applicazioni dell'intelligenza artificiale, con impieghi sia a livello di machine che di deep learning. Scopriamo in questo articolo come l'unione di TensorFlow con OpenCV possa essere sfruttata da un comune Raspberry Pi per ottenere risultati lusinghieri nel campo dell'OD.
Introduzione
Il rilevamento e identificazione degli oggetti è una tecnica largamente utilizzata in numerose applicazioni di elaborazione delle immagini. A titolo di esempio riassumiamo alcuni utilizzi significativi dell'object detection:
- visione artificiale: un sistema composto da una o più telecamere acquisisce in tempo reale le immagini relative all'ambiente circostante. Una opportuna unità di elaborazione processa tali immagini individuando con un elevato grado di precisione la classe e la posizione degli oggetti posti nelle vicinanze. Questa tecnologia viene ad esempio utilizzata nei robot e nelle auto a guida autonoma e più in generale da diverse tipologie di sistemi per l'assistenza alla guida (ADAS);
- videosorveglianza: in questo caso si è interessati a monitorare il movimento di persone o animali all'interno dell'area controllata. Le moderne telecamere per la videosorveglianza sono infatti dotate di funzionalità automatiche di tracking degli oggetti in movimento, utilizzabili non solo per l'attivazione dei sistemi di allarme, ma anche per eseguire il riconoscimento facciale delle persone;
- home automation: nell'automazione degli edifici il riconoscimento degli oggetti può essere utilizzato per innescare automaticamente determinate operazioni, come ad esempio aprire la porta motorizzata di un garage quando la telecamera rileva l'avvicinarsi di un veicolo la cui targa è abilitata a tale funzionalità (questa è una funzionalità più avanzata, oltre all'oggetto veicolo il sistema deve anche interpretare le immagini per estrarre il numero di targa);
- sistemi per la difesa: l'elaborazione delle immagini viene in questo caso utilizzata per individuare la presenza di possibili minacce. Si possono ad esempio rilevare i droni che stanno per avvicinarsi ad aree sensibili da proteggere;
- settore industriale e alimentare: le tecniche di object detection rilevano automaticamente il corretto passaggio del prodotto su un nastro trasportatore, rimuovendo gli esemplari che non soddisfano gli standard qualitativi richiesti.
In questo articolo vedremo come, seguendo dei semplici passi ben dettagliati, sia possibile implementare un'applicazione OD sul Raspberry Pi basata su TensorFlow. Utilizzando un comune Raspberry Pi 3 e una telecamera (vanno bene sia il camera module originale Raspberry che una comune webcam USB) e seguendo le istruzioni che ora vi daremo, chiunque sarà in grado di eseguire il rilevamento automatico degli oggetti, in tempo reale, sulle immagini acquisite dalla telecamera. In un prossimo articolo vedremo, inoltre, come estendere il progetto qui presentato "addestrando" la rete neurale affinché possa rilevare particolari classi di oggetti, trasformando il Raspberry Pi in un sistema per l'OD unico e altamente personalizzato (potremo ad esempio sapere se davanti casa ci sono parcheggi disponibili, quante carte sono presenti sul tavolo da gioco e altro ancora). Come già anticipato in precedenza, per la realizzazione del progetto di OD avremo bisogno del seguente materiale:
- Raspberry Pi 3 versione B/B+, visibile in Figura 1;
- Raspberry camera module (visibile in Figura 2) oppure una qualunque telecamera o webcam USB supportata dal Raspberry Pi;
- una scheda di memoria SD preferibilmente da almeno 8 Gb di ottima qualità, meglio se ad alta velocità. In Figura 3 è mostrato un modello di questo tipo, con capacità pari a 16 Gb.
Vediamo ora in dettaglio i vari step su cui si articola l'applicazione, partendo dall'installazione e aggiornamento della distribuzione sulla board Raspberry Pi.
Installazione della distribuzione
Utilizzeremo una distribuzione classica per il Raspberry Pi, ovvero la “Raspbian Stretch with desktop and recommended software” che si può scaricare dal sito ufficiale della Raspberry Foundation [1]. Dopo aver eseguito il download del file immagine (Figura 4) dovremo programmare la scheda SD con uno a scelta tra i molti tool disponibili per questo scopo. Consigliamo l'utilizzo dello strumento Etcher [2], consigliato dalla stessa Raspberry Foundation.
In Figura 5 possiamo osservare una fase della programmazione eseguita con Etcher.
Inseriamo ora nel Raspberry Pi la scheda SD programmata con Raspbian Stretch ed eseguiamo il boot. Come consuetudine, occorre procedere poi con un completo aggiornamento della distribuzione, eseguendo da un terminale i seguenti comandi (si osservi la Figura 6):
sudo apt-get update
sudo apt-get dist-upgrade
Non preoccupatevi se il prompt non compare subito: l'operazione di aggiornamento potrebbe infatti richiedere qualche minuto.
Può inoltre risultare utile e conveniente abilitare sul Raspberry Pi la connessione tramite protocollo sicuro SSH e il controllo remoto tramite VNC. Sarà così possibile, ad esempio, visualizzare i frame catturati dalla telecamera direttamente sullo schermo di un PC, collegato alla board tramite VNC Viewer. Le istruzioni per eseguire tali operazioni sono già state fornite in precedenti articoli sul Raspberry Pi e sono comunque disponibili sul sito ufficiale Raspberry [3].
Installazione di TensorFlow
Verifichiamo anzitutto che Python3, necessario per eseguire gli script relativi all’applicazione TensorFlow sia correttamente installato (in realtà è già compreso nella distribuzione che abbiamo utilizzato per programmare la scheda SD). Eseguiamo quindi da terminale il seguente comando:
python3 --version
Se tutto è andato per il verso giusto, dovrebbe apparire l’output visualizzato in Figura 7, in cui viene mostrata la versione corrente di Python3 (nel nostro caso la 3.5.3).
TensorFlow ha come primo prerequisito la presenza della libreria di algebra lineare Atlas (Automatically Tuned Linear Algebra Software), che andrà installata tramite il comando indicato qui sotto. Se durante l’installazione di Atlas vi viene richiesta una conferma, rispondete digitando Y (yes). L’output del comando è visibile in Figura 8.
sudo apt install libatlas-base-dev
Come secondo prerequisito, TensorFlow richiede la presenza di matplotlib, che installeremo tramite il seguente comando (l’output dello stesso è visibile in Figura 9):
sudo pip3 install matplotlib
Possiamo a questo punto installare TensorFlow tramite il gestore dei pacchetti di Python. Il comando da impartire alla shell è il seguente:
pip3 install --user tensorflow
Con una certa sorpresa possiamo constatare come l’installazione sia stata portata a termine in tempi molto ristretti e senza problemi, grazie al lavoro congiunto svolto dal Google Brain Team e dalla Raspberry Foundation. In Figura 10 possiamo osservare l’output prodotto dalla procedura di installazione di TensorFlow.
Per verificare che l’installazione sia andata a buon fine, creiamo un breve script di test, l’equivalente del classico “Hello World!”. Creiamo quindi lo script tftest.py utilizzando l’editor vi (in alternativa si può utilizzare anche nano o un qualunque altro editor):
sudo vi tftest.py
Inseriamo poi il seguente codice all’interno del file:
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
Con vi i comandi per inserire le linee di codice Python nel file script sono i seguenti:
- copiare nel blocco appunti il contenuto dello script;
- aprire vi, premere Esc e poi i (per abilitare la modalità di inserimento del testo);
- nella finestra terminale di vi selezionare la voce di menu Edit->Paste;
- premere ancora Esc e poi :wq per salvare in modo permanente le modifiche al file.
Eseguiamo quindi lo script con Python3 (assumiamo ovviamente che il precedente test sulla presenza di Python3 abbia dato esito positivo):
python3 tftest.py
Se si sta utilizzando Python 3.5 si potranno a questo punto osservare alcuni “runtime warning”. Non preoccupatevi di ciò, è un fatto già noto e il consiglio ufficiale di TensorFlow è quello di ignorare tali warning. Se tutto è andato per il verso giusto (come è lecito aspettarsi), potremo osservare un output del comando analogo a quello visualizzato in Figura 11.
L'installazione di TensorFlow è ora conclusa. Nel prossimo paragrafo affronteremo lo step successivo, ovvero l'installazione di OpenCV.
Installazione di OpenCV
Gli esempi di object detection forniti con TensorFlow utilizzano tipicamente matplotlib per la rappresentazione delle immagini. In questa applicazione, tuttavia, utilizzeremo OpenCV perchè è molto più semplice da gestire e riduce la probabilità di commettere degli errori. L'installazione di OpenCV sul Raspberry Pi richiede come prerequisito alcune dipendenze che andranno installate sulla board tramite il comando apt-get. Qualora qualcuno dei seguenti comandi dovesse fallire, eseguire il comando sudo apt-get update e provare nuovamente. I comandi da impartire nella finestra terminale sono i seguenti (confermare sempre con Y ove richiesto):
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install qt4-dev-tools
Completata l'installazione delle dipendenze, possiamo procedere con l'installazione di OpenCV, che avviene tramite il seguente semplice comando:
pip3 install opencv-python
Compilazione e installazione di Protobuf
Protobuf, abbreviazione di Protocol Buffer, è un pacchetto sviluppato da Google per l'interscambio dati tra applicazioni differenti. Poiché le API del modello object detection di TensorFlow utilizzano Protobuf, dovremo procedere con la sua installazione sul Raspberry Pi. Al momento non esiste un pacchetto Protobuf preconfezionato per il Raspberry, pertanto dovremo eseguire la compilazione e l'installazione sulla board partendo dal codice sorgente. Eseguiamo anzitutto la get dei pacchetti richiesti per la compilazione di Protobuf tramite il seguente comando impartito da una finestra terminale:
sudo apt-get install autoconf automake libtool curl
Scarichiamo poi la seguente release di Protobuf dal repository GitHub tramite il comando:
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.tar.gz
Anche se non si tratta dell'ultima versione disponibile, questa è quella che è stata utilizzata per l'applicazione. Decomprimiamo ora il file, accedendo poi alla cartella di Protobuf:
tar -zxvf protobuf-all-3.5.1.tar.gz
cd protobuf-3.5.1
Configuriamo il build tramite il seguente comando (l'operazione potrebbe richiedere qualche minuto):
./configure
Siamo ora pronti per compilare il pacchetto tramite il seguente comando (attenzione, la compilazione può richiedere qualche decina di minuti): [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2873 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.
Buonasera,
Una volta creata la rete neurale ed addestrata nel riconoscere determinate classi di oggetti È possibile far attivare alla raspberry differenti relè a seconda della tipologia di oggetti rilevati?
Grazie
Sono Interessato anche io per l’attivazione di un relais associato al cambio di stato della Gpio del Raspy… qualcuno mi può aiutare ?
Buonasera,
Cortesemente potete girarci un vostro contatto mail al fine di collaborare assieme allo sviluppo di un progetto di rilevamento oggetti e smistamento automatico degli stessi?
La ringraziamo anticipatamente per la collaborazione.