DIDAMATICA 2015 Python per la Visione Artificiale: ricerca e didattica - Home page di Angelo ...

Pagina creata da Rebecca Di Lorenzo
 
CONTINUA A LEGGERE
DIDAMATICA 2015 Python per la Visione Artificiale: ricerca e didattica - Home page di Angelo ...
Python per la Visione Artificiale: ricerca e didattica
                DIDAMATICA 2015
                                 Angelo Monfroglio

                                     ITIS OMAR

                          Via Beldì 19, 28068 Romentino (NO)
                           angelomonfroglio@mclink.it
                         angelo.monfroglio@istruzione.it

Lavoro di ricerca (Full Paper)
Tipologia: Esperienze e casi di studio
Area tematica: Intelligenza artificiale, Interazione Persona-Calcolatore;
Sistemi robotici nella didattica e per il lavoro

Vengono descritte esperienze di ricerca e didattica sulla Visione Artificiale
(Computer Vision) utilizzando le librerie Open Source SimpleCV (e OpenCV) in
linguaggio Python. Si spiega l’importanza della scelta di Python come linguaggio
di programmazione Open Source, multipiattaforma (PC, tablet e smartphone,
schede a microcontrollore). Si esaminano due progetti: riconoscimento del
contenuto di frutta o verdura in un sacchetto di plastica al supermercato; e
riconoscimento di facce di studenti e docenti all’ingresso della scuola.

   1. Introduzione

La visione artificiale (Computer Vision) è la trasformazione di dati da una foto o
video digitali in una rappresentazione o una decisione (ad esempio, muoversi in
avanti, a destra, ecc.). La trasformazione è volta al raggiungimento di uno o più
obiettivi. I dati in ingresso possono comprendere anche informazioni contestuali
come la distanza del soggetto inquadrato, ottenute per mezzo di sensori, come
localizzatori a LED, Laser, ultrasuoni, ecc. Un sistema elementare di visione (si
veda([Mon, 2011]) è così costituito:
1.1 Cattura delle immagini con un sensore CCD o CMOS, come nelle foto e
video camere digitali. Le immagini sono memorizzate in matrici a 2
dimensioni, con le coordinate X e Y, e i valori 0 e 1; oppure un valore
per la scala di grigi; oppure un valore a colori (RGB). Un insieme di
operatori chiamati filtri: ad esempio, la media sui valori dei pixel; oppure
la soglia: 0 tutti i valori al di sotto della soglia, 1 sopra; cambiamento di
contrasto e di luminosità
1.2 Algoritmo di rilevazione del contorno o perimetro (edge detection). E’ il
primo algoritmo fondamentale e, in alcuni semplici casi, l’unico
                                          1
DIDAMATICA 2015 Python per la Visione Artificiale: ricerca e didattica - Home page di Angelo ...
necessario. Si estrae l’oggetto dal fondo, determinando lati, angoli, ecc.
L’algoritmo è basato sul calcolo del gradiente (discreto) per ogni pixel
lungo le direzioni vicine. Ad esempio: ordina i pixel nella matrice; per
ogni pixel, analizza ognuno degli 8 pixel vicini; memorizza il valore più
basso (scala dei grigi, o dei colori base RGB) e il più alto e il più basso;
se (valore più alto – valore più basso) > soglia riscrive il valore del pixel
come 1 altrimenti scrive 0.
1.3 Rilevazione di una forma e riconoscimento di una configurazione (Shape
Detection e Pattern Recognition). Un caso comune è l’isolamento di una
faccia e il riconoscimento di una identità. Si costruisce un data base di
forme: si esegue il rilevamento dei contorni (passo precedente); si
calcola il numero di lati contigui: un cambiamento repentino nella
direzione significa linea diversa; se si identificano tre lati allora è un
triangolo, se 4 un quadrato, se la linea è continua un cerchio, ecc
1.4 Centro di massa e rilevamento di blob (macchia di colore). L’algoritmo di
Blob detection si usa per determinare se un gruppo di pixel sono tra loro
correlati. Se c’è solo un blob, il centro di massa è facilmente
determinabile. Se ce ne sono di più occorre etichettare ogni singolo
blob.
1.5. Correlazione di immagini (Template Matching) e Riconoscimento
facciale: si costruisce un data base di caratteristiche (features) e si calcola
l’intensità di somiglianza. Un caso molto noto è il riconoscimento di una
faccia.
Si vedano [Sze, 2011],[Dem, 2012].
Riassumendo, un sistema per la Visione Artificiale prevede:
      1. Filtraggio dei dati iniziali, sottraendo le informazioni non necessarie o che non è
          possibile elaborare per le limitazioni dell’hardware, e esaltando le informazioni
          utili riducendo i disturbi
      2. Estrazione delle caratteristiche necessarie (Pattern Recognition).

2. Perché Python?
Python è stato creato negli anni ’90 da Guido van Rossum. È un linguaggio moderno:
multi paradigma, multipiattaforma e open source. È estremamente conciso ma, al tempo
stesso molto leggibile. Un programma Python di solito è lungo un terzo di un
programma Java o C++. Ha un ambiente di sviluppo facile da usare: editor e interprete
integrati. E’ uno dei pochissimi linguaggi che gira su PC (Windows e Linux), tablet e
smartphone Android, scheda Arduino, ecc. Può essere usato come semplice linguaggio
per un corso introduttivo di Informatica, o per corsi avanzati sulla programmazione
orientata agli oggetti. Ancora, è uno dei pochissimi linguaggi a infinita precisione, come
il LISP, che tuttavia è poco diffuso, difficile e costoso. Infinita precisione significa che
Python è in grado di allocare la quantità di memoria necessaria al calcolo in atto,
                                             2
avendo come limite solo quello della memoria fisicamente disponibile. Si veda [Lut]. Va
notato che è molto significativo per la didattica in Informatica far riflettere gli studenti
sulla effettiva precisione di calcolo dei PC e delle calcolatrici. Se si opera con numeri
interi molto grandi e si vogliono tutte le cifre e non un’approssimazione con una
mantissa e un esponente, i linguaggi comuni o le calcolatrici non forniscono i risultati
desiderati. Basta far calcolare un fattoriale con un numero non piccolo, anche solo 20 o
30,e si vede che le cifre esatte ottenute si fermano presto. L’infinita precisione di calcolo
di Python si rivela indispensabile per alcune applicazioni di Matematica, come la
compilazione di tabelle per calcoli esponenziali o logaritmici, ad esempio in campo
statistico.
 Il seguente esempio di un programma Python per calcolare e visualizzare i numeri di
Fibonacci, mostra che è impossibile scrivere un programma più corto e chiaro.

a,b,f=1,0

n=input("Quanti numeri di Fibonacci? ")

while f < n:

        m=a+b
        a=b
        b=m
        f=f+1
        print m

    Python è un linguaggio di programmazione ad alto livello Open Source con un
    ambiente di programmazione semplice e completo, che sta guadagnando ampia
    popolarità: oggi è già tra i più utilizzati nel mondo. La sua filosofia è multi
    paradigma: object and functional oriented, structured. È inoltre di facile leggibilità
    e molto conciso. Dispone di un ambiente di sviluppo (IDE) che integra editor,
    compiler e debugger. Fra le molte applicazioni di Python, si segnalano le interfacce
    grafiche, la visione artificiale e applicazioni di matematica. Ad esempio, una ragazza
    ha presentato agli esami di Stato del 2014, un’applicazione di Python per la
    costruzione di tavole per la funzione di probabilità gaussiana con un numero di
    cifre di precisione mai finora realizzato. Esiste anche una versione per Android,
    per sviluppare app. Forniamo un esempio di programmazione per la fattorizzazione
    intera di un numero dispari non quadrato.

                                             3
Un altro esempio: trovare i due fattori primi interi di un numero dispari con
    l’algoritmo di Fermat

num = input ("Numero da fattorizzare ")

x= int(math.sqrt(num))

x= x + 1

k=2*x+1

r = x ** 2 - num

while math.floor(math.sqrt(r)) != math.sqrt(r):

           r=r+k

           k=k+2

else:

           x= (k - 1)/2

           y = math.sqrt(r)

           m=x-y

           n=x+y

           print("Divisibile per ",int(n),int(m))

2.1 Python per tutti

Un esempio del classico saluto (Hello World) creando una nuova finestra.

class LabelDemo(Frame):

               def __init__(self):
                    Frame.__init__(self)
                    self.master.title("Demo")
                    self.grid()
                    self._label = Label(self, text = "Hello   World")
                     self._label.grid()
           def main():
                                                    4
LabelDemo().mainloop()
          main()

Può essere eseguito anche su tablet o smartphone Android, con lievi modifiche:

     a.   Entrare nel servizio SL4A (Scripting Layer for Android)
     b.   Lanciare il Server
     c.   Lanciare Python
     d.   Eseguire import android
     e.   Eseguire il programma qui riportato (senza la prima riga)

Un esempio di uso di OpenCV SimpleCV con il sistema operativo Android:

from tkinter import *

          3. Python per la visione artificiale: Simple CV
Nel 1999 la ricerca Intel ha reso disponibile OpenCV, una libreria di funzioni in
linguaggio C e C++ per la Computer Vision. È molto ricca di algoritmi già pronti per
l’uso, dalle funzioni più semplici per le elaborazioni e il filtraggio dei dati iniziali da
immagini registrate e in tempo reale da WevCam, fino alle funzioni avanzate di
estrazione di caratteristiche. Tuttavia, non è di semplice utilizzo in una Scuola Media
Superiore. Fortunatamente, è da poco disponibile SimpleCV, una libreria in linguaggio
Python, che si appoggia allo strato sottostante di OpenCV, e che, come suggerisce il
nome, è di facile utilizzo. Il pacchetto Open Source di installazione installa
automaticamente anche OpenCV, oltre ai pacchetti di supporto in Python NumPy (una
libreria potente di algoritmi di elaborazione numerica che sfrutta le caratteristiche di
Python), SciPy, e Python Setup Tools.

Ecco un esempio di programma che visualizza                      in tempo reale un’immagine dalla
WebCam di un PC portatile:

                                                     5
from SimpleCV import Camera,Display,Image
cam = Camera()
display = Display()
img = cam.getImage()
img.save(display)

 Effetto prodotto dall’esecuzione del programma che crea un istogramma del colore per la
faccia su un PC portatile con WebCam incorporata

        4. Il progetto
Il progetto educativo coinvolge gli indirizzi di Elettronica (Robotica) e Informatica(con
Telecomunicazioni). È previsto l’insegnamento del linguaggio di programmazione
Python in terza e quarta(programmazione ad oggetti). In quinta viene sviluppata
l’applicazione di Visione Artificiale (Computer Vision).
Sono stati proposti e sperimentati, in due quinte, il progetto di riconoscimento della frutta
o verdura in un sacchetto di plastica presso un supermercato, e il riconoscimento delle
facce di studenti e docenti (e personale di segreteria), al cancello di ingresso della
scuola.
Per entrambi i progetti si è sviluppata la realizzazione su PC desktop, PC portatile e
(parzialmente) su tablet (o smartphone), e su microcontrollore Beaglebone (compatibile
con Arduino).

4.1 Un’applicazione: sacchetto della frutta e verdura in un
supermercato
                                             6
Una situazione comune nei supermercati è quella di inserire frutta o verdura in sacchetti
di plastica trasparente, selezionare il numero corrispondente al prodotto scelto, e
battere il numero sulla pesa ottenendo lo scontrino con il prezzo da appiccicare sul
sacchetto. Per errore, o più spesso per intento truffaldino, è comune il caso in cui il
cliente sceglie un numero corrispondente a un prodotto di minore prezzo, danneggiando
ovviamente il supermercato. Infatti, alla cassa, non è quasi mai possibile, anche per la
fretta, verificare la corrispondenza dell’etichetta con il prodotto effettivamente presente
nel sacchetto. Si è pensato allora di installare accanto alla spesa un sistema di Visione
Artificiale in grado di riconoscere la merce nel sacchetto e bloccare l’erogazione
dell’etichetta se il numero impostato non corrisponde al prodotto scelto.
Abbiamo sperimentato la necessità di operare nello spazio di colore additivo HSV
(conosciuto anche come HSB Hue = tinta, Saturation = saturazione, Brightness =
intensità) invece dello spazio RGB usato comunemente, perché i risultati di
riconoscimento sono più accurati e sicuri.

4.2 Un’altra applicazione: riconoscimento della faccia di uno
    studente o professore
Il caso esaminato è quello del cancello di ingresso per studenti e docenti (e personale di
segreteria o bidelli) della scuola. Alcuni istituti hanno installato un sistema di video
sorveglianza che si dimostra tuttavia alquanto scomodo: il portinaio deve ogni volta
controllare a distanza la persona o le persone che vogliono entrare, e aprire il cancello.
Si è pensato dunque di ricorrere ad un sistema di Visione Artificiale che riconosce la
faccia o le facce di chi sta per entrare. Bisogna subito distinguere il Riconoscimento di
una Faccia (Face Recognition) dalla Rivelazione della presenza di un Faccia (Face
Detection). Quest’ultima, ormai presente in molte fotocamere e videocamere digitali, si
limita a rilevare la presenza di una faccia, ma non è in grado di riconoscere la persona
                                            7
corrispondente. La Face Recognition è un compito molto arduo. Per fortuna, SimpleCV
mette a disposizioni alcune funzioni molto utili: riconoscimento di profili, nasi, occhi,
bocche e orecchie.Questi caratteri singoli sono combinati per il Template Matching, il
confronto con immagini registrate per arrivare ad un certo grado di probabilità di
riconoscimento. Sono queste le funzioni che abbiamo utilizzato.

                                                  Caratteristiche per il riconoscimento di un
    volto e il relativo programma

    import numpy as np
    import cv2
    import cv2.cv as cv
    from video import create_capture
    from common import clock, draw_str

    help_message = '''
    USAGE: facedetect.py [--cascade ] [--nested-cascade ]
    []
    '''

    def detect(img, cascade):
      rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags
    = cv.CV_HAAR_SCALE_IMAGE)
      if len(rects) == 0:
          return []
      rects[:,2:] += rects[:,:2]
      return rects

    def draw_rects(img, rects, color):
      for x1, y1, x2, y2 in rects:
         cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

    if __name__ == '__main__':
       import sys, getopt
                                                     8
print help_message

  args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])
  try: video_src = video_src[0]
  except: video_src = 'synth:bg=../cpp/lena.jpg:noise=0.05'
  args = dict(args)
  cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")
  nested_fn = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")

  cascade = cv2.CascadeClassifier(cascade_fn)
  nested = cv2.CascadeClassifier(nested_fn)

  cam = create_capture(video_src)

  while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist(gray)

     t = clock()
     rects = detect(gray, cascade)
     vis = img.copy()
     draw_rects(vis, rects, (0, 255, 0))
     for x1, y1, x2, y2 in rects:
        roi = gray[y1:y2, x1:x2]
        vis_roi = vis[y1:y2, x1:x2]
        subrects = detect(roi.copy(), nested)
        draw_rects(vis_roi, subrects, (255, 0, 0))
     dt = clock() - t

     draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
     cv2.imshow('facedetect', vis)

     if cv2.waitKey(5) == 27:
        break

Uso di filtri

                                                9
5. Valore didattico e educativo
Il primo progetto descritto è a buon punto. Il secondo richiede più tempo, anche per il
lungo lavoro di registrazione dei dati morfologici e biometrici delle persone da
identificare. Oggi PC, PC portatili, smartphone e tablet sono di uso comune presso gli
studenti che li usano, tra l’altro, per navigare in internet e scaricare applicazioni. Si è
pensato di sviluppare progetti di Visione Artificiale da parte degli studenti che
diventano così protagonisti attivi sia dell’Intelligenza Artificiale, sia del Mobile
Computing. Si può colmare la distanza fra l’informatica spicciola usata dagli studenti nel
gestire gli smart phone, e quella da studiare a scuola. La robotica è poi una disciplina
sufficientemente complessa per educare gli studenti a gestire la complessità del mondo
moderno. Il progetto di Computer Vision si è dimostrato molto coinvolgente per i
partecipanti: studenti e docenti. I progetti qui descritti si inseriscono in un’esperienza di
25 anni relativa alla Robotica ed Intelligenza Artificiale presso l’ITIS Omar di Novara. La
collaborazione con il Politecnico di Torino e quello di Milano, anche per gli allievi che
sostengono il tirocinio presso l’Omar, la collaborazione fra due indirizzi della scuola,
l’uso di linguaggi avanzati di programmazione, rappresentano nelle nostre intenzioni la
migliore realizzazione dello spirito e delle finalità di Didamatica.

6. Bibliografia
[Lutz] M. Lutz, Learning Python, O’Reilly, 2009
[Mon] R. Szeliski, Computer Vision, Algorithms and Applications, Springer, 2011
A.Monfroglio, Visione Artificiale in un IT IS: ricerca e didattica, Didamatica, Torino, 2011
[Dem] K. Demaged, A. Oliver, N. Oostendorp, K. Scott, Practical Computer Vision with
Simple CV, O’Reilly, 2012

L’autore

Angelo Monfroglio si è laureato in Ingegneria Elettronica al Politecnico di Milano, ed è
abilitato in Elettronica, Informatica e Matematica. Ha tenuto relazioni a Didamatica
Milano , Torino e Pisa. Ha pubblicato libri (e ebook) e articoli su ricerca e didattica
informatica, in riviste accademiche specializzate in Italiano e Inglese.

                                             10
Puoi anche leggere