Progettazione e realizzazione di un sistema di …2009/04/22 · esperienza in questo settore mi...
Transcript of Progettazione e realizzazione di un sistema di …2009/04/22 · esperienza in questo settore mi...
Universita degli Studi di Parma
Facolta di Scienze Matematiche Fisiche e Naturali
Corso di Laurea in Informatica
Progettazione e realizzazione di
un sistema di visione artificiale
per il riconoscimento di
movimenti residui
Candidato: Relatore:Fabio Sozzi Chiar.mo Prof. Federico Bergenti
Anno Accademico 2007/2008
.
.
Quando sei a un bivio e trovi
una strada che va in su e una che va in giu,
piglia quella che va in su.
E piu facile andare in discesa,
ma alla fine ti trovi in un buco.
A salire c’e piu speranza.
Tiziano Terzani
Indice
1 Prefazione 7
2 Sindrome di Locked-In 11
2.1 Cenni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Casistica e diagnosi . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Gianpiero Steccato . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Altri casi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.1 Manuel Longo . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.2 Severino Mingroni . . . . . . . . . . . . . . . . . . . . . 16
2.4.3 Daniela Ferraro . . . . . . . . . . . . . . . . . . . . . . 17
3 Visione Artificiale 19
3.1 Intelligenza Artificiale . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1 Le origini delle IA . . . . . . . . . . . . . . . . . . . . . 20
3.1.2 Precursori delle IA . . . . . . . . . . . . . . . . . . . . 21
3.1.3 Alan Turing . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1.4 Applicazioni pratiche delle IA . . . . . . . . . . . . . . 22
3.2 Visione: dalla Biologia all’Elettronica . . . . . . . . . . . . . . 23
3.3 Il processo di formazione delle immagini . . . . . . . . . . . . 24
3.3.1 Aspetti geometrici . . . . . . . . . . . . . . . . . . . . 25
3.3.2 Aspetti radiometrici . . . . . . . . . . . . . . . . . . . 26
3.4 Il processo di digitalizzazione . . . . . . . . . . . . . . . . . . 28
3.4.1 Il campionamento . . . . . . . . . . . . . . . . . . . . . 28
3.4.2 La quantizzazione . . . . . . . . . . . . . . . . . . . . . 31
3.5 Elaborazione delle immagini . . . . . . . . . . . . . . . . . . . 32
3.5.1 Acquisizione delle immagini . . . . . . . . . . . . . . . 33
5
6 INDICE
3.5.2 Preelaborazione . . . . . . . . . . . . . . . . . . . . . . 35
3.5.3 Estrazione delle caratteristiche . . . . . . . . . . . . . . 37
3.5.4 Segmentazione . . . . . . . . . . . . . . . . . . . . . . 39
3.5.5 Elaborazione ad alto livello . . . . . . . . . . . . . . . 40
3.6 Analisi delle scene . . . . . . . . . . . . . . . . . . . . . . . . . 40
4 Interprete di Movimenti Residui 41
4.1 Descrizione generale . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.1 Esperimento 1: traccia del movimento . . . . . . . . . 43
4.1.2 Esperimento 2: conteggio dei pixel tramite
marcatore . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.3 Esperimento 3: conteggio dei pixel significativi della
bocca . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.4 Elaborazione delle immagini in IMR . . . . . . . . . . 46
Acquisizione dell’immagine . . . . . . . . . . . . . . . . 46
Pre-elaborazione . . . . . . . . . . . . . . . . . . . . . 48
Estrazione delle proprieta . . . . . . . . . . . . . . . . 50
Segmentazione . . . . . . . . . . . . . . . . . . . . . . 54
Elaborazione ad alto livello . . . . . . . . . . . . . . . 56
4.2 Implementazione . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2.1 Main.cpp . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2.2 Buffer.cpp . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.2.3 Avi.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.2.4 Player.cpp . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.5 Filter.cpp . . . . . . . . . . . . . . . . . . . . . . . . . 65
5 Risultati 69
5.1 Criteri di decisione delle soglie . . . . . . . . . . . . . . . . . . 69
5.1.1 Soglia del valore di “nero” . . . . . . . . . . . . . . . . 70
5.1.2 Soglia sulla variabile rapporto contatore . . . . . . . 70
5.2 Stima delle prestazioni . . . . . . . . . . . . . . . . . . . . . . 73
Bibliografia 77
Capitolo 1
Prefazione
L’incontro con il signor Gianpiero Steccato e avvenuto per caso. Conoscen-
do uno dei volontari che gli presta settimanalmente assistenza, sono stato
sollecitato piu volte a studiare un modo per automatizzare il suo metodo di
comunicazione, permettendogli cosı di non dover dipendere da una perso-
na per potersi esprimere. Ho deciso quindi di incontrare Steccato per poter
capire se le mie conoscenze informatiche potessero offrigli un qualche tipo
di aiuto, conscio del fatto che entravo in un campo, quello degli ausili per
disabili, da me ancora poco conosciuto. Il rischio era che la mia limitata
esperienza in questo settore mi portasse a proporre la realizzazione di un
ausilio che si sarebbe potuto rivelare infattibile in termini pratici, deludendo
quindi le aspettative di Steccato.
Le perplessita sulla fattibilita di questo progetto si sommavano ad una
sorta di paura immotivata nei confronti di una disabilita fisica cosı seria, che
nemmeno la mia esperienza di volontario in una associazione per disabili 1
poteva in parte sostenere.
Tuttavia gia dal nostro primo incontro, tutti i miei timori sono state dis-
solti dalla spinta vitale che anima Gianpiero: in un anno di lavoro insieme
a lui non l’ho mai sentito lamentarsi della sua condizione, ne cercare com-
miserazione da parte dei volontari che lo circondano. Anzi, e sempre stato
lui a fare la battuta nei momenti giusti, a riportare il buonumore quando la
1Attivita di volontariato svolta presso l’associazione AS.SO.FA., una ONLUS che lavorasul territorio piacentino per offrire sostegno alle famiglie di persone affette da handicap
7
8 CAPITOLO 1. PREFAZIONE
giornata sembrava davvero essere infruttuosa e a darmi preziosi consigli per
migliorare il mio lavoro.
In un periodo in cui si parlava tanto del diritto a morire (ancora oggi di
estrema attualita) delle persone affette da sindromi degenerative, mi trovavo
di fronte ad una persona che affermava con forza il suo diritto a vivere, quasi
una voce fuori dal coro rispetto al panorama mediatico proposto all’epoca.
Grazie a Gianpiero ho potuto entrare in contatto con una realta nuova, fatta
di persone che vivono giorno dopo giorno la loro disabilita con dignita, con-
sapevoli che la loro identita non non e data solo da quello che riescono o non
riescono a fare.
In una societa che tende a discriminare chi non e uguale ed omologato
agli altri, in cui si maschera spesso con la pieta un sentimento di paura
nei confronti dei diversi, la normalita e la semplicita con cui queste persone
vivono la vita di tutti i giorni rappresentano il miglior esempio di cio che
rende davvero la vita degna di essere vissuta. Non un lavoro appagante e
ben retribuito, non un fisico perfetto, ma piuttosto il fatto di essere amato,
di avere qualcuno che riconosce il tuo valore come uomo, come padre, come
fratello, e non nonostante la tua diversita ma piuttosto attraverso la tua
diversita.
E necessario rendersi conto che dipendere da qualcuno (come tra l’altro
siamo “costretti a fare” in almeno due periodi della nostra vita, l’infanzia e la
vecchiaia) non ci rende meno degni di essere al mondo, bisogna vedere le cure
e le attenzioni di chi ci circonda solo come un gesto d’amore. Questo e quello
che lentamente ho imparato condividendo con Gianpiero questa esperienza.
La sua schiettezza, la passione che ci accomuna per la tecnologia e una
certa convergenza di pensiero hanno spostato il nostro rapporto da un piano
prettamente lavorativo ad uno piu personale, piu di una volta abbiamo tra-
lasciato il nostro lavoro per parlare della vita di tutti i giorni, intervallando
i “discorsi seri” con una ricerca su Internet, un acquisto su eBay e un gossip
familiare. Abbiamo fatto cose normali, che potrei fare con un qualsiasi amico
normodotato e in perfetta salute.
Il valore aggiunto che questo lavoro ha acquisito nasce dal piacere di vivere
un rapporto umano vero, senza la necessita di indossare una maschera per
sembrare diversi e migliori di come si e realmente, consapevoli che la persona
9
davanti a te sa capire e accettare le tue fragilita e i tuoi difetti.
Trovarsi di fronte ad una persona come Gianpiero, che nonostante le enor-
mi difficolta riesce a dare un senso alla sua vita e a renderla piena e degna di
essere vissuta, e un’esperienza davvero speciale, che spinge alla riflessione e
permette di vedere con piu chiarezza i doni che la vita ci regala ogni giorno
e che noi a volte non siamo capaci di riconoscere.
In questo lavoro di tesi verra presentato il progetto IMR, un interprete di
movimenti residui sviluppato per il signor Gianpiero Steccato, affetto dalla
Sindrome Locked-In. Nonostante per questa sindrome esistano gia comuni-
catori in commercio, il signor Steccato da circa tre anni ha perso l’uso della
vista, e quindi e stata necessaria l’ideazione di un comunicatore che fosse
adatto a persone non vendenti.
Ispirati dall’Articolo 21 della Costituzione Italiana:
Tutti hanno diritto di manifestare liberamente il proprio pensiero
con la parola, lo scritto e ogni altro mezzo di diffusione
abbiamo percio cercato, nel nostro piccolo, di garantire a Steccato una sorta
di “diritto alla comunicazione”, nella forma di un comunicatore software
adatto alle sue problematiche e costruito in base alle sue specifiche richieste
(per renderne piu pratico e immediato l’utilizzo).
Il nostro obiettivo e stato quello di automatizzare i due processi principali
che vengono messi in atto dai volontari che si occupano di far comunicare
Steccato: riconoscimento del movimento e scansione delle lettere. Il primo
processo consiste nel distinguere in maniera esatta i movimenti volontari della
bocca da quelli involontari; il secondo invece comporta la giusta temporiz-
zazione della scansione dell’alfabeto per non stancare troppo Steccato con
movimenti ripetuti troppo ravvicinati.
Quello che abbiamo ottenuto in un anno di lavoro e stata una tecnica per
riconoscere in maniera efficace i movimenti del labbro di Steccato, eliminando
tutti i falsi positivi che inizialmente si proponevano.
Questo prototipo puo essere la base per un comunicatore futuro, e se verra
ulteriormente sviluppato potra garantire all’utente finale un’interazione piu
articolata con l’ambiente domestico. Espandendo la parte del software che si
10 CAPITOLO 1. PREFAZIONE
occupa di scandire l’alfabeto, si riuscirebbe facilmente a inserire nuove “ma-
crofunzioni” atte a controllare alcuni automatismi in una casa di nuova con-
cezione (con opportuni interventi di domotica), come regolare l’illuminazione
o la temperatura.
Affiancando inoltre un vocalizzatore come quelli attualmente in commer-
cio (ad esempio Loquendo2), sara anche possibile la comunicazione verbale
con i volontari, la rilettura del testo appena composto o di documenti di testo
di vario genere (ad esempio la posta elettronica ricevuta).
E necessario infine precisare che il software realizzato non si pone come
obiettivo quello di “snellire” il processo di comunicazione, ma ha lo scopo
di rendere non piu necessaria la presenza di un volontario ogni volta che
Steccato ha la necessita di scrivere un testo.
2http://www.loquendo.com/it
Capitolo 2
Sindrome di Locked-In
Ho appena scoperto che a parte il mio occhio ho altre due cose che
non sono paralizzate: la mia immaginazione e la mia memoria
Jean Dominique Bauby, malato di LIS
In questo capitolo verra descritta in maniera accurata la Sindrome Locked-
In, una malattia molto rara che interessa il tronco encefalico e che rende le
persone “chiuse dentro il proprio corpo”, prigioniere di un involucro che non
riescono piu a controllare e impossibilitati a comunicare con l’esterno. Verra
in particolar modo affrontato il caso di Gianpiero Steccato, per cui ho rea-
lizzato l’ausilio software trattato in questa Tesi di Laurea, un piacentino che
da 9 anni e affetto da questa malattia.
2.1 Cenni generali
La sindrome locked-in (o sindrome del chiavistello, da ora LIS) viene definita
come “una condizione nella quale il paziente e cosciente e sveglio, ma non puo
muoversi oppure comunicare a causa della completa paralisi di tutti i muscoli
volontari del corpo” 1. Chi e affetto da questa sindrome sa esattamente
dove si trovano le braccia e le gambe e riesce ancora a percepire sensazioni
tattili e dolorifiche: questo se da un lato puo essere uno svantaggio visti i
1fonte: Wikipedia
11
12 CAPITOLO 2. SINDROME DI LOCKED-IN
disagi fisici che l’immobilita prolungata puo causare, dall’altro puo fungere
da campanello d’allarme per evitare possibili piaghe da decubito.
Recenti ricerche si sono interessate anche alla condizione psicologica dei
pazienti affetti da LIS, in particolare alle sensazioni derivate dall’imprigiona-
mento forzato a cui sono costretti: quello che ne risulta e che la maggioranza
dei soggetti dicono di sentirsi piuttosto tranquilli, e questo sembra contrario
al panico e al terrore che si potrebbe supporre ovvio in persone coscienti che
non possono muoversi o parlare.
Questo indica, anche se non se ne ha la piu assoluta certezza scientifica,
che probabilmente le emozioni sono dovute a interpretazioni delle sensazio-
ni corporee, e quindi lo scarso senso della corporeita (propriocezione) eviti
fenomeni di crisi o panico nei pazienti affetti da LIS.
2.2 Casistica e diagnosi
La LIS e una patologia relativamente recente, conseguenza del miglioramen-
to tecnologico che ha interessato le tecniche di rianimazione. Per questo
motivo le statistiche sono ancora abbastanza approssimative e parziali, e la
classificazione della LIS come ’rare disease’ 2 (1 caso su 200.000 persone) po-
trebbe essere soggetta a successive modifiche; di fatto comunque, almeno
nella realta italiana, i casi di Locked-In dichiarati sono ancora relativamente
pochi, e interessano prevalentemente la popolazione maschile (rapporto 3:1).
La diagnosi di questa sindrome non e facile: la tetraplegia3 e l’anartria4
potrebbero in un primo momento far pensare ad uno stato di coma, e senza
la presenza di uno specialista che riconosca la presenza di movimenti residui
il paziente non verra sottoposto alla terapia riabilitativa che potrebbe por-
tare a risultati eccezionali nell’ambito della riacquisizione del controllo della
muscolatura.
2fonte: National Institute of Neurological Disorders and Stroke3La tetraplegia e un disturbo del movimento e della sensibilita a livello dei quattro arti
(superiori e inferiori)4L’anartria consiste nell’assenza, nella diminuzione e/o alterazione dei movimenti
complessi e finalizzati all’espressione fono-articolatoria verbale
2.3. GIANPIERO STECCATO 13
Uno dei segnali piu evidenti che permettono di distinguere questa sindro-
me dalle forme di coma e proprio la presenza di questi “movimenti residui”,
che sopravvivono al danno del tronco encefalo: spesso si tratta di movimenti
molto limitati, quali la possibilita di sbattere le palpebre, muovere i globi
oculari o qualche dito. Basta inserire questi movimenti in un sistema di co-
municazione booleano (ad esempio sbattere una volta l’occhio per dire di no,
due per dire di si) per aprire un canale di comunicazione con il paziente, par-
tendo da domande elementari (“Hai fame?”, “Hai sete”, “Hai freddo?”, “Hai
caldo?”) fino a costruire un dialogo piu ricco, che prende in considerazione
anche il pensiero e i sentimenti dell’individuo.
Questa che viene descritta non e una realta utopica, ma quello che accade
ogni giorno negli ospedali che effettuano riabilitazione ad alta intensita, grazie
a medici preparati che riescono a fare una breccia nel muro di silenzio che la
sindrome locked-in innalza intorno alle sue vittime.
E anche nei casi in cui alla trombosi non sopravvivono movimenti residui,
sono stati studiati ausili informatici per rendere possibile la comunicazione
mediante la lettura dell’encefalogramma del paziente, il quale riesce ad espri-
mersi attraverso alcuni tipi di pensieri particolarmente facili da “leggere”.
Si tratta sicuramente di metodi sperimentali che permettono una comuni-
cazione lenta e non priva di errori, ma che rappresentano il filo a cui sono
attaccate le speranze di molte persone.
2.3 Gianpiero Steccato
Quella che ora andiamo a presentare non e una descrizione “da manuale”
della Sindrome Locked-in, ma bensı gli effetti che quest’ultima ha avuto sul-
la persona specifica di Gianpiero Steccato. Questo perche gli effetti della LIS
variano da soggetto a soggetto, quindi i movimenti residui di un paziente
possono non essere gli stessi di un altro paziente. In particolare alcune per-
sone riescono a muovere la testa per azionare interruttori e pulsanti, mentre
altre possono sfruttare la vista per comporre parole grazie a tecnologie di
eye-tracking.
Steccato e stato colpito da un primo ictus mentre si trovava a Roma in
vacanza per festeggiare l’anniversario di matrimonio, il 7 Gennaio 1999, e
14 CAPITOLO 2. SINDROME DI LOCKED-IN
dopo il ricovero in ospedale ha avuto un successivo ictus due giorni dopo.
Viene poi trasferito all’ospedale “Giuseppe Verdi” di Villanova d’Arda, noto
centro riabilitativo situato tra la provincia di Piacenza e quella di Parma. In
quel periodo grazie alle sedute di fisioterapia aveva ricominciato a vestirsi da
solo e a muovere qualche passo in maniera autonoma, ma il 10 Aprile viene
colpito dalla terza recidiva dell’ictus, che danneggia il tronco encefalico.
Rimasto “chiuso dentro” il proprio corpo, per circa 6 mesi Steccato sfrutto
la palpebra dell’occhio destro per rispondere in maniera affermativa alle do-
mande che gli venivano poste. Un metodo sicuramente semplice e immediato,
ma che obbligava Lucia, la moglie di Gianpiero, a passare in rassegna tutti
i possibili bisogni del marito per potergli porre la domanda giusta. La vera
rivoluzione fu utilizzare una scansione dell’alfabeto per permettere a Steccato
di selezionare, tramite il battito della palpebra, le lettere delle parole pensa-
te. Questo gli permise di esprimersi in maniera piu libera, non limitandosi
solo a comunicare a chi gli stava intorno i suoi bisogni primari.
Circa quattro anni fa pero la perdita della vista ha obbligato Steccato a
rivedere completamente il suo modo di comunicare: chi dialoga con lui deve
scandire le lettere dell’alfabeto 5 a voce e interrompere la scansione quando
Gianpiero inarca l’angolo destro della bocca: questo segnale indica che la
lettera appena pronunciata e quella che serve per comporre la parola, quindi
si ricomincia da capo per individuare la lettera successiva.
Questa suddivisione dell’alfabeto in gruppi e solo una delle tante che pos-
sono essere utilizzate per ottimizzare la comunicazione e aumentare il numero
di parole composte per unita di tempo. Altre suddivisioni attualmente in uso
nell’ambito della LIS ordinano l’alfabeto in base a studi sulla frequenza con
cui ogni lettera viene usata nella lingua del paziente, in modo da proporre
prima le lettere che statisticamente si usano piu spesso.
A causa di questa sopravvenuta cecita i comunicatori attualmente in com-
mercio non sono adatti all’uso, visto che la maggior parte di questi richiede
necessariamente l’interazione visiva del soggetto per poter essere utilizza-
ti. Proprio da questa necessita e nata l’idea del progetto IMR, che sfrutta
la Visione Artificiale per creare un interprete esperto che sa riconoscere i
movimenti del volto e che propone una scansione vocale dei gruppi di lettere.
5Suddivise in 4 gruppi: vocali, primo, secondo e terzo gruppo di consonanti
2.4. ALTRI CASI 15
2.4 Altri casi
Come e stato precisato nella sezione precedente, il quadro clinico dei pazienti
colpiti da trombosi al tronco encefalico e variabile, e dipende strettamente
dall’estensione del danno neurologico e dalle aree che vengono colpite dal
trombo.
Di seguito verranno presentati alcuni casi di persone affette da Sindrome
Locked-In che hanno deciso di rendere note le loro condizioni di salute, per
sensibilizzare l’opinione pubblica sul problema e spesso (come nel caso del
signor Manuel Longo) per suggerire possibili soluzioni tecniche per affrontare
al meglio questa sindrome.
2.4.1 Manuel Longo
Il primo caso che affrontiamo e quello di Manuel Longo, nato nel 1962 da
madre italiana e padre maltese, che e stato colpito dalla trombosi del tronco
encefalo il 21 Settembre 2000. Sposato, due figli, Longo gestiva una piccola
impresa di impianti elettrici ed idraulici, ed e proprio durante un viaggio
di lavoro in Italia che e stato colpito dalla sindrome. Dopo essere stato
ricoverato per una settimana in terapia intensiva in Italia (quattro giorni dei
quali era in coma), le sue condizioni di salute hanno permesso il trasporto in
ospedale a Malta, dove e rimasto altri 30 giorni.
Mancando a Malta strutture per ospitare disabili di giovane eta, ha tra-
scorso 16 mesi alla San Vincent de Paule Residence, un ospizio per anziani.
Durante la degenza in questo ricovero e riuscito a riacquisire il movimento
della testa, che e diventato il fulcro su cui sono stati creati tutti gli ausili con
cui riesce a interagire con il mondo che lo circonda.
Dei momenti intercorsi tra la crisi e il coma Longo conserva ancora me-
moria, essendo rimasto cosciente fino all’ultimo, sebbene impossibilitato a
parlare e a muovere i muscoli del corpo.
Longo introduce un aspetto interessante legato alla Sindrome di Locked-
In, ovvero quello del controllo della temperatura corporea: quest’ultima e
difficilmente gestibile per chi e affetto da questa patologia, in quanto la rego-
lazione della temperatura avviene tramite la contrazione dei vasi sanguigni
delle braccia e delle gambe ad opera di appositi muscoli. Essendo lesa la
16 CAPITOLO 2. SINDROME DI LOCKED-IN
comunicazione tra il cervello e i muscoli, questa regolazione difficilmente av-
viene, anche se comunque le sensazioni estreme di caldo e freddo vengono in
generale percepite.
Per spostarsi, Longo utilizza una sedia a rotelle studiata appositamente
per essere controllata tramite movimenti residui. Inizialmente i fisioterapisti
pensavano di utilizzare come controllo l’emissione di aria (in pratica si gesti-
va il movimento aspirando o soffiando aria in un apparecchio), ma visto che
Longo (come quasi tutte le persone affette da Locked-In) non riesce a con-
trollare la respirazione hanno deciso di optare per una barra da controllare
con la pressione del mento. Il metodo, sebbene efficace, puo in alcuni casi
creare problemi, poiche in caso di oscillazione della sedia a rotelle (causate
ad esempio da una buca), Longo rischia di premere inavveritamente la barra
di comando aumentando di conseguenza l’instabilita della carrozzina.
Per utilizzare il computer Longo ha inizialmente pensato ad un sistema
di controllo del movimento del mouse tramite interruttori al mercurio, ma il
problema principale era il click del mouse, che nel caso fosse stato affidato
ad un sensore a morso non permetteva comunque di simulare la pressione
del tasto destro. La soluzione definitiva e stata raggiunta con LUCY, una
tastiera utilizzabile insieme ad un normale PC i cui tasti vengono “premuti”
da un raggio laser applicabile alla testa o alla montatura degli occhiali del
soggetto. In questo modo Longo riesce ad usare facilmente il computer e a
comunicare tramite un vocalizzatore associato al programma.
2.4.2 Severino Mingroni
Severino Mingroni viene colpito il 23 Ottobre del 1995 da trombosi dell’arteria
basilare destra. Dopo 5 giorni di pre-coma, si risveglia all’ospedale di Chieti,
perfettamente immobile e muto, capace di muovere solo la palpebra destra.
Anche a lui, come a Steccato, fin da subito venne proposta la possibilita di
comunicare sbattendo due volte la palpebra per rispondere affermativamente
e una per rispondere negativamente.
Col tempo Mingroni ha pero riacquisito in parte la mobilita del collo, che
ora riesce a sorreggere la testa, e grazie a questa possibilita comunica tramite
2.4. ALTRI CASI 17
un ausilio hardware denominato HeadMouse 6, che consiste in un rilevatore
di movimento e di una fascia da applicare intorno alla testa munita di un
catarinfrangente argentato. Muovendo la testa Mingroni riesce a muovere
il puntatore del mouse, e grazie ad un particolare software (Dragger) riesce
anche a cliccare sugli elementi presenti sul desktop.
In questo modo ha la possibilita di comunicare con il mondo esterno, di
scrivere e-mail e di aggiornare il blog su cui tratta argomenti di attualita
come le cellule staminali (che molti ricercatori ritengono fondamentali nella
cura di queste malattie).
Per quanto riguarda la nutrizione, Mingroni riesce a introdurre in bocca
(tramite una siringa) alimenti pressoche liquidi, e pur non controllando la
lingua riesce a inghiottire muovendo leggermente all’indietro la testa. Per
richiamare l’attenzione dei genitori ha a disposizione un bottone, posizionato
sul poggiatesta della sedia, che preme con la testa azionando un campanello.
2.4.3 Daniela Ferraro
La vicenda di Daniela Ferraro nasce da un evento speciale: insieme al ma-
rito Luigi era in ospedale per dare alla luce il secondo figlio. A poche ore
dal parto la signora Ferraro lamentava dolori alla testa, e successivamente
andava in coma, costrigendo i medici ad operarla d’ urgenza per rimuovere
i danni provocati dall’emorragia celebrale che l’aveva colpita. Le possibilita
di sopravvivenza erano poche, ma alla fine le condizioni di Daniela si so-
no stabilizzate ed e stata trasferita dal reparto di terapia intensiva ad altre
strutture.
Inizialmente la diagnosi era quella piu comune: coma. Ma il marito Luigi
si era accorto che in qualche modo sua moglie sembrava cosciente, e proprio
la sua insistenza ha permesso ai medici di cambiare la diagnosi da quella di
coma a quella di LIS. In questo modo e stato possibile aprire un canale di
comunicazione con Daniela, che ora puo esprimersi muovendo gli occhi in
alto e in basso.
Insieme al marito, Daniela ha creato l’associazione “Amici di Daniela”,
per dare sostegno e assistenza alle famiglie colpite da LIS.
6http://www.orin.com
18 CAPITOLO 2. SINDROME DI LOCKED-IN
Capitolo 3
Visione Artificiale
In questo capitolo verra introdotta la Visione Artificiale, una branca dell’In-
telligenza Artificiale che mira a creare un modello approssimato del mondo
reale (3D) partendo da immagini bidimensionali (2D).
3.1 Intelligenza Artificiale
Prima di addentrarci nel campo della Visione Artificiale, e necessario fornire
alcune nozioni di base del settore dell’informatica da cui essa nasce, ovvero
quello dell’Intelligenza Artificiale (da ora IA).
Bisogna fin da subito specificare che l’IA non si occupa di portare a ter-
mine compiti impossibili per l’uomo, quanto piuttosto di sfruttare la potenza
dei moderni calcolatori per eseguire gli algoritmi associati ad un particola-
re compito in maniera molto piu efficace di quanto potrebbe fare un essere
umano.
Un esempio particolarmente significativo di questo requisito dell’IA puo
essere l’applicazione delle IA alla Teoria dei giochi: sono state infatti rea-
lizzati programmi software che permettono di risolvere in poche decine di
secondi problemi altamente complessi come quello del riempimento delle ta-
belle del Sudoku, oppure che riescono a tenere testa nel gioco degli scacchi a
campioni mondiali1.
1si fa riferimento alla partita tra il campione mondiale di scacchi Kasparov e il softwareIBM Deep Blue
19
20 CAPITOLO 3. VISIONE ARTIFICIALE
3.1.1 Le origini delle IA
Generalmente si tende a ritenere che questa materia sia relativamente giova-
ne, e strettamente legata alla nascita degli elaboratori moderni, ma in effetti
gia nell’antichita esisteva il concetto di “macchina intelligente”, da cui gli
studiosi del nostro secolo hanno tratto spunto nella progettazione delle IA.
Omero era a conoscenza del concetto di IA (800 anni prima di Cristo),
e lo storico antico Polibio credeva persino che Nabis, un dittatore di Sparta
vissuto intorno al 200 A.C., usasse un robot per costringere i cittadini ricchi
ma recalcitranti a pagare le tasse.
Sicuramente la fonte maggiore di innovazione nell’ambito tecnologico e
stata l’immaginazione, che ha gettato le basi (spesso parecchi secoli prima)
di alcune invenzioni che hanno rivoluzionato la nostra vita. La macchina
volante di Leonardo sarebbe sicuramente stata inutile nella Prima Guerra
Mondiale, ma ha sicuramente detto qualcosa di importante sul volo umano.
Analizzando i miti mediorientali e le principali religioni, si puo considerare
che furono le divinita stesse i primi a creare quelli che oggi chiameremmo
“robot”. Il Dio Giudeo-Cristiano creo l’uomo utilizzando l’argilla, mentre
nella tradizione Talmudica la polvere venne racchiusa in un masso (golem)
prima che da esso venissero formate le membra e gli venisse infusa un’anima.
Il mito greco di Prometeo racconta che, dopo aver rubato il fuoco agli Dei,
l’eroe lo utilizzo per dare la vita a due statue di argilla raffiguranti il primo
uomo e la prima donna.
La nascita del termine robot deriva invece dall’opera di Karel Capek2, che
nella sua commedia R.U.R. (Rossum’s Universal Robots) parla di un brillante
scienziato che crea una famiglia di robot per preservare l’uomo dalla fatica (il
termine robot deriva infatti dal vocabolo Cecoslovacco lavoratore). La com-
media, pubblicata poi nel 1921, si conclude con la distruzione dell’umanita
da parte dei robot, a cui un collega dello scienziato aveva fornito capacita
emotive.
2Karel Capek (Male Svatonovice, 9 gennaio 1890 – Praga, 26 dicembre 1938) e statoun giornalista e scrittore ceco.
3.1. INTELLIGENZA ARTIFICIALE 21
3.1.2 Precursori delle IA
Cosı come abbiamo visto che nell’immaginazione si possono trovare numerosi
precursori delle moderne IA, anche nella storia possiamo trovare artefatti -
giocattoli, automi - che, pur essendo privi di intelligenza, suggerirono tramite
metafore la possibilita di realizzare macchine intelligenti.
In quasi tutte le culture sono stati infatti realizzati modelli mobili per
emulare creature viventi. La storia Cinese dell ottavo secolo descrive un
monaco meccanico che diceva “Elemosina, elemosina” e metteva le monete
in un sacchetto. Sempre in Cina negli anni tra il 790 e l’890 d.C. vennero
realizzati una lontra in legno che si diceva fosse in grado di catturare i pesci
e un gatto capace di catturare i topi e danzare.
Lo stesso Leonardo da Vinci costruı un leone automatico in onore di Luigi
XII: il leone si avvicino al sovrano, aprı lo scrigno del re con un artiglio e
si chino davanti al fiordaliso dell’arma di Francia. Anche Rene Descartes
costruı un automa, battezzato “mia figlia Francine”, che era talmente simile
ad una bambina da venire gettato in mare da un capitano di una nave per
superstizione.
Arrivando ai giorni nostri, si puo citare Euphonia, una “Turca bardata”
esposta alla Egyptian Hall in Piccadilly che riusciva a fare o rispondere a dei
quesiti, ridere, sospirare e cantare; Elektro, prodotto dalla Westinghouse per
la Fiera di New York del 1939, che poteva eseguire ventisei movimenti diversi
e rispondere a comandi parlati.
La vera rivoluzione nella realizzazione di questi artefatti si e avuta pero
con l’avvento dell’elettronica, che ha permesso di passare da modelli non
intelligenti azionati secondo i normali principi della meccanica a esemplari
capaci di dimostrare un potenziale intellettivo. La capacita di calcolo fornita
dall’elettronica ha dato la possibilita agli scienziati di creare macchine capa-
ci di eseguire calcoli matematici complessi, elaborare informazione ottenute
tramite sensori e persino di conservare una base di conoscenza in continuo
aggiornamento per simulare i processi di apprendimento.
22 CAPITOLO 3. VISIONE ARTIFICIALE
3.1.3 Alan Turing
Una delle figure di maggior rilievo nell’ambito dell’informatica e stata quella
di Alan Turing (Londra 1912 - Wilmslow 1954), che oltre a svolgere un im-
portante ruolo come crittografo durante la Seconda Guerra Mondiale per il
Department of Communications inglese, con la sua macchina universale
di Turing getto le basi teoriche su cui vennero descritti tutti i calcolatori
elettronici a venire.
Traendo spunto dal lavoro che svolse all’interno del progetto ACE (Au-
tomatic Computing Engine = Motore di Calcolo Automatico) al Laborato-
rio Fisico Nazionale di Teddington, Turing scrisse un articolo, profetico per
l’epoca, in cui teorizzava la capacita di una macchina elettronica di pensare
in modo simile a quello degli esseri umani.
Introdusse inoltre quello che egli definı gioco d’imitazione (oggi noto co-
me Test di Turing), in cui un inquisitore dialoga con una persona tramite un
terminale, e ad un certo punto della conversazione la persona viene sostitui-
ta da una macchina. Se l’inquisitore non si accorge del “cambio”, allora si
puo affermare che siamo di fronte ad una macchina intelligente (o che rie-
sce a svolgere con intelligenza quel paricolare compito almeno quanto una
persona).
Nonostante le molte obiezioni che le sue teorie sollevarono, la maggior
parte delle quali e stata smentita con l’avanzare della ricerca in questo settore,
Turing si dimostro lungimirante nel suo lavoro, infatti le sue teorie sulle
macchine intelligenti sono tutt’ora molto usate nell’informatica.
3.1.4 Applicazioni pratiche delle IA
Sebbene molti dei primi obiettivi che gli studiosi delle IA si erano posti sono
ancora irrealizzati (come ad esempio un traduttore universale di linguaggio),
molti progressi sono stati fatti in un certo numero di campi diversi; tra questi:
• giochi (scacchi, bridge, poker, sudoku, etc.)
• dimostrazione di teoremi
• lettura di caratteri manoscritti o stampati
3.2. VISIONE: DALLA BIOLOGIA ALL’ELETTRONICA 23
• apprendimento di nozioni matematiche
• composizione di melodie musicali e armonizzazioni
• riconoscimento di facce umane all’interno di immagini
Tra questi il riconoscimento dei volti nelle immagini (tecnologia imple-
mentata di recente nelle macchine fotografiche compatte) e trattato dalla
branca dell’IA che si occupa della cosidetta Visione Artificiale.
E interessante notare che i compiti elencati sono tutti riconducibili (in
maniera piu o meno immediata) a particolari algoritmi di lavoro: questo per
la natura intrinseca dei calcolatori, che eseguono programmi sequenziali con
un numero finito (ma potenzialmente illimitato) di istruzioni.
3.2 Visione: dalla Biologia all’Elettronica
La Visione Artificiale si occupa di acquisire, registrare ed elaborare imma-
gini provenienti da un supporto elettronico (ad esempio una Webcam) allo
scopo di riconoscere determinate caratteristiche dell’immagine per varie fina-
lita di controllo, classificazione e selezione. Queste operazioni avvengono in
maniera quasi immediata in tutte le forme viventi altamente evolute, mentre
invece per i calcolatori e necessaria una complessa procedura preliminare di
rielaborazione e standardizzazione dei dati in ingresso. Per questo motivo e
molto difficile riuscire a ricreare un sistema visivo informatico che sia anche
in minima parte simile a quello di un essere umano.
Per poter avvicinare il mondo dell’informatica, fondato sull’elettronica, a
quello della visione animale, fondato sulla biologia e sulla chimica, dobbiamo
chiederci come i nostri occhi ricevono informazioni dall’esterno.
Se ci troviamo di fronte ad un oggetto rosso percepiamo subito una sensa-
zione visiva, sebbene ne l’oggetto ne un fascio di luce rossa abbiano investito
il nostro nervo ottico. Quello che accade e che l’oggetto ha riflesso luce di una
certa frequenza, causando sulla retina una serie di cambiamenti fotochimici,
che a loro volta sono stati tradotti in appropriati impulsi neuronali che il
nervo ottico ha trasportato ai centri visivi del cervello. Da un certo punto di
vista gli impulsi nervosi sono simboli che rappresentano l’oggetto rosso, che il
24 CAPITOLO 3. VISIONE ARTIFICIALE
nostro cervello puo decodificare per avere una rappresentazione piu accurata
del mondo esterno.
Tralasciando la trattazione approfondita del funzionamento della vista
negli animali e comunque facile notare che ci sono fondamentali differenze
tra il sistema visivo biologico e quello sviluppato per le macchine. Innanzitut-
to le cellule nervose nella retina e nella corteccia celebrale trattano stimoli
sia chimici che elettrici, mentre i circuiti in silicone non hanno possibilita
di elaborazioni chimiche. Secondariamente le connessioni tra neuroni sono
molto numerose e distribuite in tre dimensioni, mentre invece i componen-
ti di un calcolatore digitale hanno molte meno connessioni e queste sono
principalmente sviluppate su due dimensioni.
Nel trattare l’argomento della visione non possiamo pero tralasciare altri
aspetti fondamentali come la questione algoritmica (ovvero trovare la sequen-
za corretta di passi per portare a compimento un atto visivo) e quella com-
putazionale (ovvero quale attivita di calcolo e richiesta agli algoritmi stessi),
che sono comunque interdipendenti dall’apparato hardware a disposizione.
Un algoritmo efficiente ed elegante e inutile se l’hardware (sia biologico che
elettronico) non e in grado di eseguirlo; d’altro canto e possibile che gli algo-
ritmi che compongono un particolare processo visivo - e sono singolarmente
efficaci - non possano poi coesistere nella medesima struttura hardware.
Questi tre aspetti della visione introducono molte variabili nell’ambito
della realizzazione di software che simula la visione biologica, e cio aumenta
di molto la complessita computazionale necessaria a svolgere anche la piu
semplice attivita percettiva.
3.3 Il processo di formazione delle immagini
Prima di approfondire le tecniche con cui andiamo ad elaborare le immagini
in input, ci dobbiamo occupare del problema di digitalizzazione, ovvero il
processo di conversione che porta da un’immagine analogica a un’immagine
digitale. L’analisi di questo processo richiede considerazioni di due tipi: di
ordine geometrico e di ordine radiometrico. Le prime riguardano le relazioni
che sussistono tra le dimensioni e la posizione degli oggetti nel mondo reale
e quelle delle loro rappresentazioni. Le seconde invece si riferiscono alle
3.3. IL PROCESSO DI FORMAZIONE DELLE IMMAGINI 25
modalita con le quali il campo d’energia luminosa si traduce nell’intensita
luminosa osservata nella scena.
3.3.1 Aspetti geometrici
Le relazioni tra scena reale ed immagine sono studiate in base ai due principali
strumenti di formazione attualmente in uso: l’apparecchio fotografico e il
terminale video. Il primo e costituito da una camera oscura, dotata di un
apertura nella quale e posizionata una lente biconvessa.
Quest’ultima focalizza i raggi luminosi provenienti dall’esterno e li fissa
su una pellicola fotosensibile.
Figura 3.1: Geometria del processo di sintesi delle immagini in una macchinafotografica
Nella Figura 3.1 e rappresentata la geometria dell’apparecchio fotogra-
fico, nella quale il piano xy coincide con il fondo della camera oscura (in
cui e sistemata la pellicola) e il punto L rappresenta la lente biconvessa, di
distanza focale f.
Le relazioni tra il mondo reale e l’immagine fotografata sono fornite dalle
leggi dell’ottica geometrica, e consistono in un semplice processo di proiezione
26 CAPITOLO 3. VISIONE ARTIFICIALE
attraverso il punto L. Un ipotetico punto P, di coordinate (x0, y0, z0) viene
proiettato in un punto P’ nel piano xy le cui coordinate sono date da:
xif
= − x0
z0−f , yif
= − y0z0−f , zi = 0
Si puo notare dalla Figura 3.1 che l’oggetto considerato si deve trovare
anteriormente alla macchina fotografica; risulta evidente inoltre che l’imma-
gine ottenuta e capovolta come messo in luce dal segno di (xi, yi), opposto
a quelli di (x0, y0). Un’altra caratteristica del processo di proiezione consi-
ste nel fatto che esso non e univoco: tutti i punti della retta PL vengono
proiettati sul punto P’.
Mentre tramite la fotografia si produce l’immagine di oggetti reali, nel ca-
so della grafica con l’elaboratore si realizzano sul video le immagini di oggetti
la cui descrizione geometrica e codificata nell’hardware. La costruzione del-
l’immagine, rappresentata in Figura 3.2, viene ottenuta tramite un processo
molto simile al precedente. Il punto L coincide con la posizione dell’occhio
dell’osservatore, mentre il piano xy su cui si forma l’immagine coincide con
lo schermo del terminale. Le formule del punto P’ ottenuto saranno:
xif
= x0
z0+f, yi
f= y0
z0+f, zi = 0
Le differenze di segno rispetto alle formule precedenti sottolineano che in
questo caso non sono presenti il capovolgimento e la specularita dell’imma-
gine prodotta rispetto alla scena reale inquadrata.
3.3.2 Aspetti radiometrici
Gli aspetti radiometrici si riferiscono a come il flusso di energia luminosa pro-
veniente dalla scena interagisce con il sistema di formazione delle immagini.
Come per ogni fenomeno di tipo ondulatorio, il campo di energia luminosa e
definito da due grandezze: intensita e fase. Nei sistemi di formazione usuali
viene registrata solo l’intensita, mentre viene perduta l’informazione di fase,
in cui sono contenute le informazioni riguardo la profondita della scena. La
relazione tra il campo di energia che agisce sul sistema di formazione (indica-
to con f(ξ, η)) e l’immagine registrata (indicata con g(x, y)) e definita dalla
seguente equazione:
3.3. IL PROCESSO DI FORMAZIONE DELLE IMMAGINI 27
Figura 3.2: Geometria del processo di formazione delle immagini in terminalevideo
g(x, y) =∫∞−∞
∫∞−∞ h(x, y, ξ, η)f(ξ, η)dξdη
la quale esprime il concetto che un punto dell’immagine g(x,y) viene otte-
nuto tramite la sovrapposizione degli effetti dovuti ai singoli punti di f(ξ, η).
Il principale campo di applicazione di questo modello sta nelle tecniche di
restauro delle immagini, ovvero l’insieme di procedimenti per ovviare ai difet-
ti insiti nel sistema di formazione dell’immagine, o per problemi accidentali
nella ripresa.
Tuttavia l’equazione che abbiamo presentato non rappresenta in maniera
completa il processo di formazione delle immagini, in quanto non tiene conto
del rumore. Si supponga infatti di riprendere attraverso una telecamera una
scena rigorosamente statica, ossia tale che durante il periodo di osservazione
non presenta ne variazioni della struttura e della posizione degli oggetti, ne
fluttuazioni del valore dell’illuminazione. Supponendo di poter misurare il
valore di g in un determinato pixel, a questo punto sulla base dell’equazio-
ne precedente i valori del pixel nel tempo dovrebbero essere sempre uguali.
Sperimentalmente pero si osserva che questo non avviene, e il movimento
fluttuante del valore viene attribuito al rumore.
28 CAPITOLO 3. VISIONE ARTIFICIALE
Le ragioni di questo fenomeno sono molto numerose e difficili da analizzare
separatamente. La normale variabilita del campo di energia luminosa puo
influire su questo fenomeno, come anche la natura del sistema di formazione,
i cui circuiti elettronici generano il segnale elettrico che misura l’intensita
luminosa. Il discorso e analogo per l’immagine raccolta su una pellicola
fotografica, la quale e affetta da rumore a causa del processo fotochimico
impiegato per fissare l immagine sul supporto.
3.4 Il processo di digitalizzazione
I sistemi di formazione presi in esame forniscono l’intensita luminosa dei vari
punti dell’immagine sotto forma di segnali analogici.
Sara necessario quindi provvedere a convertire questi segnali, tramite un
processo di digitalizzazione, per ottenere un’immagine elaborabile dal cal-
colatore. Questa operazione avviene attraverso due passi consecutivi: il
campionamento e la quantizzazione.
3.4.1 Il campionamento
La digitalizzazione di un segnale monodimensionale e schematizzata in Figura
3.3. Ovviamente non si potra rappresentare il segnale analogico nella sua
interezza, ma ci limiteremo a prendere un numero limitato di campioni e
procedere alla loro quantizzazione.
Almeno a livello teorico il procedimento consistera nel sovrapporre una
griglia all’immagine e misurare l’intensita luminosa in ogni singolo quadrati-
no. Ognuno di questi quadrati viene comunemente chiamato pixel.
Viene naturale quindi chiedersi come possa influire sul risultato finale la
scelta della griglia di campionamento. Una considerazione immediata porte-
rebbe a scegliere la dimensione del lato del pixel uguale alle dimensioni dei
piu piccoli dettagli degli oggetti che si vuole conservare, mentre le considera-
zioni quantitative3 e sperimentali hanno dimostrato che i passi di campiona-
mento dovranno necessariamente essere uguali alla meta delle corrispondenti
dimensioni dei piu piccoli oggetti presenti.
3considerazioni che derivano dal teorema di Shannon sul campionamento
3.4. IL PROCESSO DI DIGITALIZZAZIONE 29
Figura 3.3: Schema della digitalizzazione. Campionamento e quantizzazioneper un segnale monodimensionale
Se non si segue infatti questa regola, il risultato che si ottiene e quello di
inserire nell’immagine il fenomeno dell’aliasing4, che porta a rappresentare
una funzione che oscilla a frequenza diversa della funzione originaria.
Il fenomeno si presenta quindi anche nelle immagini, come e visibile nella
Figura 3.4, dove al ridursi dei passi di campionamento si ottiene il tipico
effetto a scacchiera dovuto alle dimensioni dei pixel.
4per aliasing si intende il fenomeno per il quale due segnali analogici diversi possonodiventare indistinguibili una volta campionati
30 CAPITOLO 3. VISIONE ARTIFICIALE
Figura 3.4: Influenza del passo di campionamento. Le immagini sono sta-te digitalizzate rispettivamente su griglie 512x512, 256x256, 128x128, 64x64,32x32, 16x16
3.4. IL PROCESSO DI DIGITALIZZAZIONE 31
3.4.2 La quantizzazione
Questa seconda fase del processo di digitalizzazione e dovuta alla necessita
di convertire i campioni dell’immagine dalla rappresentazione analogica (e
quindi continua) a quella discreta richiesta dall’elaboratore digitale.
L’operazione di quantizzazione, rappresentata nella Figura 3.3 per un
segnale monodimensionale, consiste nello stabilire dei livelli di decisione
d0, d1, ..., dk e rappresentare ciasciun campione mediante il livello piu vici-
no. L’insieme dei campioni ottenuto rappresenta a tutti gli effetti il segnale
digitalizzato.
L’unica differenza che si ha passando da un segnale monodimensionale
ad un’immagine sta nel fatto che l’intensita luminosa e una funzione di due
variabili spaziali. Nel caso delle immagini i livelli vengono rappresentati nel-
l’elaboratore mediante numeri interi compresi tra 0 e un’opportuna potenza
di 2. Pertanto il valore massimo dell’intensita dk e dato da:
dk = 2m
dove m rappresenta il numero di bit utilizzati per rappresentare i campioni.
Maggiore e il numero di bit, tanto piu e accurata la rappresentazione e tanto
minore e l’errore commesso, detto rumore di quantizzazione.
I risultati ottenuti variando il numero di bit utilizzati nella quantizzazione
sono riportati, nel caso di immagini in bianco e nero, in Figura 3.5.
Nella foto in alto a sinistra dell’Immagine (a) sono stati usati 256 livelli,
e questo numero e stato dimezzato procedendo da sinistra verso destra e
dall’alto verso il basso. Analogo procedimento e stato adottato nell’Immagine
(b) della Figura 3.5, partendo pero da 16 livelli nell’immagine in alto a
sinistra. Si osserva che al ridursi del numero dei livelli aumenta il fenomeno
dei falsi contorni, piu evidenti nelle zone in cui l’intensita luminosa varia
con gradualita. In queste aree infatti la quantizzazione produce dei salti nei
valori dell’intensita luminosa che l’occhio percepisce molto distintamente.
Nelle aree in cui sono presenti bordi questo fenomeno non si percepisce, in
quanto viene mascherato dalla presenza di marcate variazioni di intensita che
fanno parte della struttura dell’immagine.
Si puo notare facilmente che in termini qualitativi non c’e molta differenza
tra l’immagine quantizzata con 256 livelli e quella quantizzata con 64 livelli,
32 CAPITOLO 3. VISIONE ARTIFICIALE
(a) Livelli iniziali = 256 (b) Livelli iniziali = 16
Figura 3.5: Quantizzazione di un’immagine. Procedendo da sinistra a destrae dall’alto verso il basso essi vengono dimessati per ciascuna immagine.
mentre invece si nota un drastico calo della qualita dell’immagine passando
da 16 a 2 livelli (come mostrato in Figura 3.5). Nella pratica corrente le
immagini vengono quantizzate con 256 livelli, soprattutto in vista del fatto
che le memorie degli elaboratori sono organizzate in gruppi da 8 bit. Piu
complessa risulta invece la scelta della risoluzione spaziale, che dipende dal
tipo di immagine trattata. Nel caso delle immagini televisive, ossia di me-
dia qualita, sono normalmente richiesti 700 campioni in orizzontale e 500 in
verticale.
Per le immagini a colori si procede invece digitalizzando separatamente
le tre bande (R,G,B), allo scopo di minimizzare la distorsione cromatica
dell’immagine ricostruita.
3.5 Elaborazione delle immagini
Come precedentemente specificato, questa fase riguarda la trasformazione
dell’immagine originale in una piu adatta alla fase di analisi della scena.
Questo avviene tramite varie operazioni di filtraggio orientate a ridurre il
rumore, ad evidenziare i contorni e ad identificare regioni dell’immagine.
In base al compito che dobbiamo far eseguire al nostro agente sceglieremo
3.5. ELABORAZIONE DELLE IMMAGINI 33
attentamente le operazioni che renderanno piu semplice il calcolo delle azioni
da compiere ad ogni iterazione. Un generico sistema di visione artificiale
elabora le immagini tenendo conto di 5 fasi:
• Acquisizione delle immagini
• Preelaborazione
• Estrazione delle proprieta
• Segmentazione
• Elaborazione di alto livello
3.5.1 Acquisizione delle immagini
Un’immagine digitale e ottenuta tramite l’utilizzo di vari tipi di sensori come
squelli sensibili alla luce, sensori tomografici, radar, sensori ad ultrasuoni. In
base al tipo di sensore usato l’immagine puo assumere la rappresentazione di
un ordinaria immagine 2D, un volume in 3D o una sequenza di immagini.
All’interno dell’acquisizione delle immagini distingueremo una parte
hardware (piu inerente al supporto fisico di acquisizione) e una parte software
(che riguardera invece le librerie che si occupano di interpretare in segnale in
input dal sensore).
Il primo passo nella visione artificiale consiste nel creare l’immagine di
una scena su una matrice di dispositivi fotosensibili, come ad esempio le
fotocelle di una telecamera. Attraverso una proiezione prospettica della scena
si crea un immagine della scena inquadrata, che poi verra convertita dalle
fotocelle in una matrice bidimensionale tempo-variante dei valori di intensita
dell’immagine. Nel caso della visione a colori invece di una sola matrice se
ne formano tre, una per ognuno dei tre colori primari.
Pur riducendo il campo alle immagini monocromatiche statiche, ad un
ipotetico agente reattivo guidato dalla visione rimane comunque il compito
di elaborare la matrice di partenza per ottenere o un modello iconico della
scena attorno a se o un insieme di informazioni sull’ambiente con cui calcolare
un’azione.
34 CAPITOLO 3. VISIONE ARTIFICIALE
Bisogna pero precisare che la proiezione prospettica e una trasformazione
di tipo “molti-a-uno”, e quindi molte scene differenti possono tradursi nella
medesima immagine. A complicare ulteriormente le cose puo esserci inoltre
un forte rumore dovuto a bassi livelli di luce ambientale, che rende piu difficile
identificare univocamente le entita che compongono la scena. Di conseguen-
za non sara possibile “invertire” l’immagine per ricostruire la scena, ma sara
necessario avere conoscenze aggiuntive degli oggetti presenti nella scena e del-
le proprieta delle loro superfici, in particolare di come l’illuminazione venga
riflessa da quest’ultime verso le telecamera.
L’immagine ottenuta tramite il sensore in uso e debitamente campionata
e quantizzata e il punto di partenza delle operazioni di elaborazione da effet-
tuare. Per lavorare con uno stream video (che non e altro che una sequenza
finita di immagini) sono disponibili vari pacchetti software, tra cui uno dei
piu famosi e sicuramente Video for Windows.
Video for Windows (da ora VfW) e stato introdotto da Microsoft nel
1992 come risposta alla tecnologia QuickTime di Apple Computer’s.
Rilasciato come add-on per Windows 3.1, venne poi integrato in maniera
definitiva a partire da Windows 95. L’introduzione di VfW comporto la
creazione di uno standard per memorizzare file video, ovvero l’Audio Video
Interleave (AVI) e la possibilita da parte degli sviluppatori di software di
includere nei loro prodotti funzioni di editing e riproduzione video.
Oltre a questo, VfW includeva anche una suite di applicazioni come:
• Media Player
• VidCap
• VidEdit
• BitEdit
• WavEdit
3.5. ELABORAZIONE DELLE IMMAGINI 35
3.5.2 Preelaborazione
In questa fase l’immagine viene elaborata in modo da rendere piu facile
il successivo riconoscimento delle caratteristiche fondamentali della scena.
Operazioni standard che interessano questa fase sono:
• Ricampionamento (per assicurarsi che le informazioni non siano insuf-
ficienti o ridondanti)
• Rimozione del rumore
• Riduzione/aumento del contrasto (per assicurare la corretta individua-
zione delle informazioni rilevanti)
A questo scopo verranno di seguito illustrati alcuni filtri che si occupano di
normalizzare l’immagine in input.
• Media mobile. Supponiamo che l’immagine originale sia rappresen-
tata come una matrice m·n, I(x,y), di numeri, chiamata matrice di
intensita dell’immagine. I numeri rappresentano i valori dell’intensita
della luce nei singoli pixel) che compongono questa matrice.
Certe irregolarita riscontrabili nell’immagine possono essere ridotte tra-
mite un operazione di media che si avvale di una maschera di media
mobile. Questa operazione consiste nel centrare questa maschera su
ogni pixel, e calcolare successivamente la somma pesata di tutti i valori
dei pixel all’interno della maschera. Questa somma andra a sostituire il
valore originario di quel pixel. Se vogliamo poi che la matrice contenga
solo valori binari (generalmente 0 e 1), basta confrontare questo valore
di somma con una soglia prestabilita e settare il pixel a 0 se il valore e
inferiore alla soglia, a 1 altrimenti.
L’effetto che si ottiene da questa tecnica e quello di “smussare” gli an-
goli dell’immagine, eliminando granelli di rumore isolati ma allo stesso
tempo sacrificando parte della vividezza dell’immagine e alcuni piccoli
particolari. La funzione piu comunemente usata per svolgere questa
operazione e quella gaussiana a due dimensioni:
36 CAPITOLO 3. VISIONE ARTIFICIALE
Figura 3.6: Operazione di media mobile tramite funzione rettangolare eoperazione di soglia
G(x, y) = 12πσ2 e
−x2+y2
2σ2
La superficie descritta da questa funzione e a forma di campana. La de-
viazione standard σ determina il grado di smussamento dell’immagine
originale.
• Filtro a massima frequenza. Consiste nel sostituire il pixel con quel-
lo che in un opportuno intorno presenta la massima frequenza. Questo
filtro viene usato per ridurre il rumore ottenuto dalle operazione di ac-
quisizione di immagini binarie, come quelle di testi. In tali immagini
il rumore produce solitamente contorni molto irregolari che il metodo
aiuta a regolarizzare.
• Filtro mediano. Consiste nel sostituire al valore del pixel in esame
quello mediano dell’intorno. Quest’ultimo e definito come quello tale
che meta dei pixel dell’intorno ha un valore maggiore di esso e l’altra
meta un valore minore. Il vantaggio di questo filtro e da trovarsi nella
capacita di conservare i bordi dell’immagine (producendo uno sfoca-
mento nettamente inferiore a quelli inerenti nelle operazioni di media)
3.5. ELABORAZIONE DELLE IMMAGINI 37
al prezzo di un tempo di calcolo considerevole a causa delle ripetute
operazioni di ordinamento richieste.
• Filtro a massima omogeneita. In questo caso piuttosto che di un
singolo filtro si tratta di una classe molto ampia caratterizzata dal fatto
che il pixel in esame viene sostituito con la media dei pixel contenuti nel
suo intorno che soddisfano una condizione fissata a priori. Un esempio
consiste nello scegliere un certo numero di pixel per i quali e minima
la media o la deviazione standard.
• Filtro superspike. Fa uso dell’istogramma dell’immagine e sostitui-
sce al pixel in esame una media aritmetica dei pixel dell’intorno che
soddisfano contemporaneamente due condizioni. La prima e che la loro
frequenza globale nell’immagine sia superiore di quella del pixel preso
in considerazione. La seconda richiede invece che l’istogramma presen-
ti la stessa concavita in corrispondenza del livello di grigio nel pixel
in esame e in tutti quelli prescelti sulla base della prima condizione.
Questa condizione e stata introdotta per essere sicuri di includere nella
media solo pixel dello stesso tipo.
3.5.3 Estrazione delle caratteristiche
Questa fase si occupa di ricavare dall’immagine normalizzata le informa-
zioni che servono all’algoritmo durante la fase successiva di segmentazione.
Caratteristiche interessanti da estrarre in questa fase sono:
• Linee e bordi (compresi i contorni)
• Punti di interesse locali (ad esempio angoli)
Caratteristiche piu complesse sono il riconoscimento di movimento, forme
o particolari texture.
Dalla natura stessa di molti dei problemi di visione artificiale nasce la
tecnica di estrazione dei contorni. Qualora infatti un agente dovesse muoversi
in un ambiente o raccogliere alcuni oggetti al suo interno, dovrebbe conoscere
la forma degli ostacoli o degli oggetti da raccogliere.
38 CAPITOLO 3. VISIONE ARTIFICIALE
Una volta estratti, i contorni vengono utilizzati per convertire l’immagine
in un insieme di linee, le quali a loro volta verranno confrontare con una base
di conoscenza fatta di prototipi di figure tipiche che la scena potrebbe conte-
nere. In questo modo l’agente e capace di rinoscere figure solide all’interno
della scena e compiere azioni specifiche in base allo scopo per cui e stato
realizzato.
Per definizione, un contorno e un qualsiasi confine tra parti dell’immagine
aventi valori differenti di una certa proprieta, come ad esempio l’intensita.
Figura 3.7: Tipi di profilo di livello di grigio in prossimita dei contorni. a)Caso ideale (a gradino); b) lo stesso in un caso reale (presenza di rumore);c-d) caso di contorni con variazione piu regolare della luminosita; e-f) striscedi separazione fra due regioni a luminosita costante; g-h) come c-d), ma convariazioni piu brusche della luminosita
Limitandoci al caso di immagini in bianco e nero, le tipologie di livelli di
grigio in prossimita dei contorni sono illustrate in Figura 3.7. La condizione
“ideale” di contorno e quella presentata nel caso a), che in una situazione
reale pero sara riconducibile al caso b) a causa del rumore. Questa situazione
si verifica in corrispondenza degli spigoli dei corpi presenti nella scena nel
momento in cui la sorgente luminosa e ad una notevole distanza dagli oggetti
stessi. Nel caso in cui la sorgente luminosa sia piu vicina agli oggetti si
verificano situazioni come quelle riportate in c) o in d), in cui il livello di
grigio subisce variazioni piu regolari.
I casi in cui le regioni adiacenti si trovano a livelli di grigio praticamente
uguali tra loro, ma sono separati da strice piu o meno larghe di pixel a livello
di grigio diverso, sono riportate nei casi e-h).
In Figura 3.8 e possibile vedere gli effetti dell’estrazione dei contorni su
una generica immagine.
3.5. ELABORAZIONE DELLE IMMAGINI 39
(a) Immagine originale (b) Immagine elaborata tramite le tecnichedi estrazione dei contorni
Figura 3.8: Estrazione dei contorni.
3.5.4 Segmentazione
Questa fase di occupa di selezionare le aree dell’immagine in cui saranno
rilevate particolari caratteristiche d’interesse, eventualmente attraverso la
suddivisione dell’immagine in piu regioni. Questa tecnica, detta regiona-
lizzazione, risulta complementare all’estrazione dei contorni, in quanto tutte
e due queste tecniche sono caratterizzate da un’alta sensibilita al rumore.
Andiamo ora a definire cosa si intende per regione dell’immagine. Una
regione e un’insieme di pixel connessi che soddisfano due proprieta principali:
1. La regione e omogenea. Un esempio di omogeneita si ottiene imponendo
che la differenza tra i valori di intensita dei pixel nella regione non sia
maggiore di un determinato ε
2. Per nessuna coppia di regioni (omogenee) adiacenti l’unione di tutti i
pixel di queste due regioni soddisfa la proprieta di omegeneita.
Un esempio di algoritmo di regionalizzazione e il dividi-e-unisci. Si parte
da un unica regione (che coincide con l’immagine e che non soddisfa la pro-
prieta di omogeneita) e la si suddivide in quattro nuove regioni. Si verifichera
se ognuna di queste regioni candidate soddisfa la proprieta di omogeneita,
40 CAPITOLO 3. VISIONE ARTIFICIALE
e nel caso non la soddisfi verra a sua volta divisa in altre quattro regioni.
Quando non e piu possibile effettuare divisioni sulla regione presa in conside-
razione, le regioni candidate adiacenti vengono unite se i loro pixel soddisfano
la proprieta di omogeneita.
3.5.5 Elaborazione ad alto livello
In quest’ultima fase l’input e ridotto ad un insieme di punti o regioni di im-
magine che si presuppone contenga un oggetto. Questi dati verranno sfruttati
per eseguire operazioni “ad alto livello”, tra cui:
• Verificare che il modello contenuto nell’input possieda le specifiche del
modello base o della classe.
• Stimare i parametri specifici tipo la posizione o la dimensione.
• Classificare oggetti in piu categorie
3.6 Analisi delle scene
Dopo che l’immagine e stata elaborata con le tecniche descritte nelle sezioni
precedenti, si puo cercare di estrarre da esse le informazioni necessarie ri-
guardanti la scena. Poiche, come abbiamo gia accennato, la trasformazione
della scena in immagine e un processo del tipo molti-a-uno, questa fase di
analisi richiede spesso o immagini addizionali (come nel caso della visione
stereoscopica) o informazioni generali sui tipi di scene che si puo incontrare.
In questo secondo caso la conoscenza richiesta puo essere di tipo molto
generale (ad esempio la proprieta di riflettivita delle superfici degli oggetti)
o specifica (ad esempio il fatto che la scena contiene un certo numero di
oggetti disposti in un particolar modo). Altri elementi di informazione pos-
sono essere la collocazione della telecamera, la disposizione delle sorgenti di
illuminazione, il fatto che la scena sia all’aperto o all’interno di un edificio.
La conoscenza delle caratteristiche di riflettivita delle superfici permette
ad esempio di determinare la forma di oggetti lisci presenti nelle scene.
Capitolo 4
Interprete di Movimenti
Residui
In questo capitolo presenteremo le funzionalita principali del progetto IMR
(Interprete di Movimenti Residui).
4.1 Descrizione generale
Innanzitutto e necessario specificare che il software prodotto e a tutti gli effet-
ti un prototipo, in quanto la sua natura “artigianale” comporta la mancanza
delle certificazioni necessarie (ISO, CEE) per una diffusione del software in
ambito sanitario. Questo limite rappresenta un “collo di bottiglia” importan-
te nell’attivita di sviluppo di ausili per disabili, soprattutto se si considera che
un ausilio standard difficilmente si adatta al 100% alle necessita dell’utente
finale.
Basta infatti che alla patologia principale se ne affianchi anche una se-
condaria (come ad esempio la cecita) per rendere necessaria una modifica
hardware/software. Se questa modifica non e presente nella lista ufficiale di
personalizzazioni possibili relative al particolare ausilio allora gli specialisti
di settore non possono in alcun modo intervenire, in quanto si andrebbero
a violare le certificazioni originali del prodotto. Questo problema ha com-
portato una sorta di situazione di stallo all’interno del settore e spesso sono
41
42 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
state accantonate idee potenzialmente efficaci proprio per l’impossibilita di
proporre al pubblico i manufatti che vengono realizzati.
Fatta questa premessa, lo scopo del progetto non e comunque lo svilup-
po di un software immediatamente utilizzabile da un ipotetico utente fina-
le, quanto piuttosto la ricerca di una metodologia efficace per riconoscere i
movimenti labiali di un soggetto impossibilitato a comunicare.
Prima di iniziare la creazione del software e stato necessario un periodo
di studio dei movimenti residui di Steccato, allo scopo di definire quello
piu adatto per creare un canale di comunicazione con il software. Fin da
subito abbiamo identificato i due movimenti candidati per la nostra ricerca:
il movimento labiale e lo spostamento laterale dell’indice della mano sinistra.
Il movimento labiale viene attualmente utilizzato per comunicare: se ad
esempio Steccato deve comporre la parola “Ciao”, fermera la scansione del-
l’alfabeto inarcando verso destra il labbro ogni volta che sentira una delle
lettere che compone la parola in questione.
Il movimento dell’indice invece serve (tramite un sensore a fibra ottica
collegato a un segnale acustico) per richiamare l’attenzione di chi lo assiste.
Il richiamo acustico e di vitale importanza per Steccato (serve infatti a co-
municare la necessita di venire broncoaspirato1 o di cambiare la posizione di
alcune parti del corpo dolenti), e se venisse integrato in un software com-
plesso e sperimentale si rischierebbe, in caso di bug o blocco del software,
di impedire a Steccato di avvisare i volontari circa un’ipotetica situazione di
disagio. Abbiamo quindi preferito concentrarci sul movimento del labbro sia
per evitare questa situazione che per non obbligare Steccato a sfruttare per
la comunicazione un movimento predisposto ad un altro compito.
Stabilito il nostro obiettivo, tramite una Webcam abbiamo registrato
una serie di movimenti del labbro per poterla analizzare e stabilire quale
caratteristica dovesse venire estratta per identificare il movimento.
1per broncoaspirazione si intende la rimozione meccanica delle secrezioni dall’alberotracheobronchiale per mezzo di una fonte aspirante e di un sondino inserito nelle vie aereetramite una via naturale (Bocca, Naso) o artificiale (Tracheotomia)
4.1. DESCRIZIONE GENERALE 43
4.1.1 Esperimento 1: traccia del movimento
Senza addentrarci troppo nei particolari 2, possiamo dire che inizialmente
abbiamo cercato di misurare la “lunghezza” del movimento che l’angolo del
labbro copriva nel tempo.
Per fare questo abbiamo applicato un marcatore adesivo di colore verde
acceso sopra il labbro di Steccato, in modo da facilitarne il riconoscimento
da parte del software (si trattava infatti di un colore che non era presente in
altre parti dell’immagine). Dopo aver trovato il pixel che secondo la rappre-
sentazione RGB aveva la componente verde massima, abbiamo fissato una
maschera quadrata centrata in quel punto e all’interno di questa abbiamo
calcolato il baricentro tramite media pesata inserendo nel calcolo solo i punti
che avevano la componente verde superiore ad una soglia prestabilita. Le
coordinate del baricentro sono state memorizzate in una coda, e ogni volta
che veniva inserito un nuovo baricentro (uno per ogni frame delle immagini
provenienti dalla Webcam) si ricavava l’area del piu piccolo rettangolo che
conteneva tutti i baricentri inseriti nella coda.
In questo modo, supponendo di avere un frame rate di 25 frame per
secondo, con una coda di 25 elementi avevamo gli spostamenti del baricen-
tro nell’arco di un secondo. Se l’area del rettangolo era piccola significava
che il labbro era rimasto fermo, mentre invece in caso di forti differenze di
coordinate del baricentro si poteva supporre che il labbro si era inarcato.
Questo approccio era potenzialmente efficace, ma gia dai primi test ne
abbiamo verificato i limiti: a causa del rumore intrinseco dello stream video
la ricerca del baricentro non era mai precisa e anche in caso di un’immagine
statica il baricentro che veniva riconosciuto in un frame non era lo stesso
dell’immagine successiva. Il movimento del labbro causava quindi una varia-
zione dell’area del rettangolo in cui erano contenuti i baricentri molto simile
a quella prodotta dal rumore, per questo motivo i due tipi di movimenti non
erano distinguibili.
2Che verranno trattati in maniera piu completa nella sezione relativa alla segmentazione
44 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
4.1.2 Esperimento 2: conteggio dei pixel tramite
marcatore
Abbiamo quindi deciso di cambiare approccio, contando i pixel dell’immagine
che si trovavano in un appropriato intorno dell baricentro e che avevano un
valore di verde superiore alla soglia introdotta precedentemente.
Sfruttando una limitazione tipica dei sistemi di acquisizione basati su
lenti (la caduta di luce verso i bordi3) abbiamo centrato la fotocamera sul
marcatore verde e osservato le variazioni del numero di pixel “verdi” 4 rico-
nosciuti in ogni frame dal programma. Visto che il movimento del labbro
spostava il baricentro verso una zona piu esterna del fotogramma, si riduce-
vano il numero di pixel verdi riconosciuti, e questo criterio e stato sfruttato
per stabilire una soglia al di sotto della quale si poteva ritenere avvenuto il
movimento.
Questa tecnica si e rivelata sicuramente piu efficace della precedente, ma
e stata comunque accantonata poiche il suo punto di forza (la caduta di
luce) costituiva anche il suo punto debole. Per poter infatti far spostare
il baricentro verso una zona esterna dell’immagine bisognava posizionare la
Webcam molto vicino al volto di Steccato, e questo riduceva notevolmente il
numero di pixel verdi riconosciuti dalla stessa (a causa della distanza minima
di messa a fuoco della Webcam che era superiore a quella necessaria per
sfruttare la caduta di luce ai bordi).
4.1.3 Esperimento 3: conteggio dei pixel significativi
della bocca
Partendo da questo approccio e stato sviluppato il metodo attuale di rico-
noscimento del movimento, che si svincola dalla necessita di applicare un
marcatore per concentrarsi sul conteggio dei pixel neri che compongono nel-
3questo fenomeno implica che la migliore resa dell’obiettivo si ha al centro del foto-gramma, con una perdita di qualita tanto maggiore quanto piu ci si allontana dal centrodell’immagine
4per stabilire se il pixel in questione e verde abbiamo convertito i suoi valori RGBnello spazio HSV e verificato se rispettavano determinate condizioni, come mostrato nellasezione di Segmentazione
4.1. DESCRIZIONE GENERALE 45
l’immagine l’interno della bocca di Steccato. Si superano cosı i problemi di
posizionamento e di dimensionamento del marcatore, che sicuramente sareb-
bero stati di difficile gestione per un ipotetico utente finale, e il fastidio che
puo comportare una superficie adesiva sul volto dell’utente.
A causa della particolare conformazione della dentatura di Steccato, quan-
do la bocca rimane immobile l’area nera al suo interno e ben visibile, mentre
invece in caso di movimento essa si riduce notevolmente fino a scompari-
re. Invece di cercare il punto piu verde abbiamo cercato il punto piu nero
dell’immagine, costruito su di esso il baricentro e infine contato i pixel signi-
ficativi all’interno della maschera centrata nel baricentro 5, ovvero quelli che
rispondono alle condizioni di colore imposte.
Per ogni frame abbiamo cosı ottenuto il conteggio dei pixel effettivamente
neri, e questo valore viene a questo punto confrontato con quello del frame
precedente. Questo rapporto ci permette di identificare in maniera affidabile
il movimento, in quanto quando il suo valore scende sotto una determina-
ta soglia (fissata a 0.85, valore dimostrato sperimentalmente nel capitolo
Risultati) sappiamo che l’area nera si e ridotta.
Dopo aver verificato la correttezza del nostro approccio tramite un’accu-
rata serie di test, abbiamo integrato questo software con quello che si occupa
della scansione: quest’ultimo consiste in un player di file MP3 che riproduce
in maniera continua la serie di file audio che compongono la struttura di
comunicazione rappresentabile da un albero a due livelli, come mostrato in
Figura 4.1) utilizzata da Steccato.
Quando prototipo di visione riconosce il movimento, provvede a fermare
la scansione sul gruppo o sulla lettera appena pronunciata: nel primo caso il
passo successivo sara quello di “scendere di un livello” ed elencare le lettere
che compongono quel gruppo, mentre nel secondo caso la lettera verra giu-
stapposta alle altre presenti nel box di testo presente nella GUI e la scansione
verra ricominciata partendo dal livello superiore.
5la definizione di “pixel nero” e analoga a quella fatta per i pixel verdi, con la differenzache in questo caso abbiamo effettuato i controlli sui valori relativi allo spazio RGB
46 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Figura 4.1: Riorganizzazione dell’alfabeto su due livelli per velocizzare lacomposizione
4.1.4 Elaborazione delle immagini in IMR
Il progetto IMR e stato modellizzato basandoci sulla struttura standard dei
progetti di Visione Artificiale presentata nel capitolo precedente. Analizze-
remo ora ognuna delle 5 fasi del modello, illustrando e motivando adeguata-
mente le scelte che abbiamo fatto in ognuna di queste fasi.
Acquisizione dell’immagine
Per l’acquisizione delle immagini ci siamo appoggiati a Video for Windows,
che fin dal rilascio di Windows 95 si e imposto come framework per l’editing di
stream video. Ogni singolo frame proveniente dalla Webcam viene scomposto
in pixel, e le componenti RGB (R = rosso, G = verde, B = blu) dei pixel
vengono inserite in un array monodimensionale di dimensione pari a 38400
(ovvero 240*160). Per ogni pixel oltre alle componenti RGB viene anche
assegnato un byte ‘extra’ che non da alcuna informazione di colore.
... R G B S ...︸︷︷︸n−esimopixel
4.1. DESCRIZIONE GENERALE 47
Supponendo quindi che il numero naturale i rappresenti la componen-
te R dell’i-esimo pixel, per accedere alle informazioni di colore del pixel
utilizzeremo il seguente frammento di codice:
1 BYTE r = imageData [ i + 0 ] ;
2
3 BYTE g = imageData [ i + 1 ] ;
4
5 BYTE b = imageData [ i + 2 ] ;
In pratica rispetto alla posizione i dell’array, che rappresenta la compo-
nente R, troveremo in posizione i+1 la componente G e a i+2 la componente
B. L’incremento da applicare alla variabile i per ottenere il pixel successivo
sara pari a 4, in quanto composto da 3 posizioni per le informazioni sul colore
e una posizione per il pixel “extra”.
L’utilizzo di Video for Windows permette di sfruttare funzioni particolar-
mente utili all’elaborazione degli stream video, come ad esempio la funzione
capGetVideoFormatSize():
1 DWORD capGetVideoFormatSize ( hwnd ) ;
che come parametro prende hwnd6, ovvero un handler associato alla fine-
stra di cattura delle immagini, e ritorna la dimensione (in byte) del video in
acquisizione; oppure la funzione capCreateCaptureWindow() che viene
utilizzata per creare una finestra di acquisizione video:
1 HWND VFWAPI capCreateCaptureWindow (
2 LPCTSTR lpszWindowName ,
3 DWORD dwStyle ,
4 int x ,
5 int y ,
6 int nWidth ,
7 int nHeight ,
8 HWND hWnd ,
9 int nID
10 ) ;
6hwnd e l’abbreviazione di handleOnWindow
48 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
che prende come parametri:
• lpszWindowName, che contiene il nome della finestra di acquisizione.
• dwStyle, che rappresenta lo stile della finestra.
• x e y, le coordinate dell’angolo superiore sinistro della finestra.
• nWidth e nHeight, le dimensioni della finestra.
• HWnd, l’handler della finestra “padre” di riferimento
• nID, l’identificatore
e restituisce, in caso di successo, un handler alla finestra appena definita.
Pre-elaborazione
Ottenuta una rappresentazione interna all’elaboratore delle immagini in in-
put, di norma e necessario effettuare alcune operazioni fondamentali sui frame
prima di procedere alla fase di estrazione delle caratteristiche.
Bisogna innanzitutto, qualora non lo fosse, portare la dimensione del
frame in ingresso ad una risoluzione nota, per facilitare le operazioni aritme-
tiche effettuate sull’array che rappresenta l’immagine. Se infatti quest’ultima
fosse piu piccola della risoluzione standard di 240*160, durante l’esecuzione
dell’algoritmo di Visione Artificiale andremmo ad indicizzare l’array su valori
non significativi; al contrario, se l’immagine di partenza avesse dimensioni
maggiori di quelle standard il programma andrebbe a considerare solo una
porzione dell’immagine, ovvero quella di 240*160 pixel indicizzata partendo
dal pixel in alto a sinistra.
C’e poi, come anticipato parlando degli aspetti radiometrici della for-
mazione delle immagini, il problema del rumore. Appositi filtri sono sta-
ti studiati per ridurre questo problema e il loro corretto utilizzo permette
di aumentare in maniera sensibile le prestazioni dell’algoritmo di Visione
Artificiale.
Infine si potra provvedere alla ricolorazione dell’immagine per renderla
indipendente dall’illuminazione della scena e per aumentarne il contrasto. In
4.1. DESCRIZIONE GENERALE 49
(a) Immagine originale (b) Immagine normalizzata
Figura 4.2: Procedimento di normalizzazione
questo modo riusciremo a garantire il funzionamento del software anche in
presenza di fonti di luce artificiale o particolarmente intense (ad esempio la
luce che filtra dalle finestre in pieno giorno).
Questi procedimenti comportano la “normalizzazione” delle immagini in
input, come mostrato in Figura 4.2.
La nostra scelta di non effettuare queste operazioni in fase di pre-elaborazione
e stata dettata dai seguenti motivi:
• Le immagini in input sono gia in formato standard.
• Il rumore e presente, ma la sua riduzione non fornisce un sensibile mi-
glioramento di prestazioni se relazionato all’aumento della complessita
del codice.
• Dopo rilevamenti effettuati durante vari momenti della giornata, ab-
biamo riscontrato che l’illuminazione non influisce in maniera determi-
nante. Questo e dovuto anche al fatto che l’interno della bocca rimane
sempre in ombra, essendo la fonte di luce principale posizionata alle
spalle di Steccato.
50 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
(a) Immagine originale (b) Immagine risultante
Figura 4.3: Procedimento di estrazione dei contorni
Estrazione delle proprieta
Ottenuta un’immagine utile all’elaborazione, provvederemo ora a estrarre le
proprieta necessarie all’algoritmo per riconoscere i movimenti labiali. Gli
approcci possibili in questo ambito sono principalmente due: estrazione dei
contorni ed estrazione della luminanza.
L’estrazione dei contorni e stata descritta ampiamente nel capitolo pre-
cedente, e i risultati di questo metodo sono visibili sulla nostra immagine di
riferimento in Figura 4.3.
Le informazioni ottenute dai bordi dell’immagine possono essere combina-
te con quelle relative alla luminanza (Figura 4.4) per identificare con certezza
la zona della bocca, assicurando una parziale indipendenza dall’illuminazione
e dalla posizione della telecamera.
Una volta identificata all’interno dell’immagine la bocca, dobbiamo sce-
gliere i criteri con cui decidere se un determinato pixel e candidato ad essere
contato come valido dall’algoritmo. Per fare questo, nell’Esperimento 3 si e
sfruttato il sistema standard RGB mentre nell’Esperimento 1 e 2 del progetto
si era preferito usare lo spazio colorimetrico HSV.
Lo spazio colorimetrico RGB si basa sulla sintesi additiva dei tre colori
primari, ovvero rosso, verde e blu. E stato studiato per la prima volta da J.
Guild e W.D. Wright, che facendo sovrapporre le tre sorgenti luminose colo-
4.1. DESCRIZIONE GENERALE 51
(a) Immagine originale (b) Immagine risultante
Figura 4.4: Procedimento di estrazione della luminanza
rate (con proporzioni 1: 4.6 : 0.006) riuscirono ad ottenere il colore bianco.
Partendo da questa scoperta fecero variare i rapporti fra le tre sorgenti per
ottenere un’equivalenza con i vari colori presi in esame, che di volta in volta
venivano proiettati su una zona adiacente dello schermo.
Preso un ipotetico colore C, questo verra ottenuto miscelando i 3 colori
primari secondo la seguente formula:
C ≡ aR(C)R + aG(C)G+ aB(C)B
dove i simboli adoperati vanno intesi nel senso proprio del contesto in cui ci
stiamo muovendo; per esempio il simbolo ≡ rappresenta l’equivalenza per-
cettiva, come il segno + va inteso nel senso di miscela e non di ordinaria ad-
dizione aritmetica; con i simboli aR(C),aG(C) e aB(C) si intende le frazioni
delle tre componenti da utilizzare per ottenere il colore C.
La proprieta piu importante di questo modello e quella dell’additivita la
quale esprime il concetto che ogni colore puo essere ottenuto sommando le
relative frazioni di ciascun colore primario che servono per ottenerlo. Una
rappresentazione geometrica dei colori nel sistema RGB e visibile in Figura
4.5.
La scelta del sistema RGB e dovuta al fatto che la ricerca del colore nero
e risultata piu semplice da effettuare in questo spazio colorimetrico, mentre
la ricerca del colore verde ha richiesto il passaggio al sistema HSV.
52 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Figura 4.5: Rappresentazione geometrica dei colori nello spazio RGB
Il sistema HSV si basa invece sulle proprieta dei colori legate alla loro
percezione da parte dell’uomo.
In questo sistema i colori sono tutti contenuti in una piramide (vedere
Figura 4.6) a base esagonale, il cui vertice si trova nell’origine e rappresenta
il nero. Sulla base della piramide troviamo i colori a valore di intensita
massimo (con valore V = 1), disposti secondo il “cerchio di Goethe”. La
saturazione S e la tonalita H sono coordinate polari nei piani ortogonali a V.
I livelli di grigio, che hanno saturazione nulla, sono disposti lungo l’altezza
della piramide, il nero occupa il vertice e il bianco il centro della base. I
colori a saturazione intermedia si troveranno lungo le congiungenti il bianco
con i colori a saturazione massima.
Attraverso le seguenti definizioni:
M = max(R,G,B)
m = min(R,G,B)
rd = (M −R)/(M −m)
gd = (M −G)/(M −m)
bd = (M −B)/(M −m)
si ottiene la trasformazione dallo spazio RGB a quello HSV:
4.1. DESCRIZIONE GENERALE 53
H = (π/6) ×
bd− gd se M = R
2 + rd− bd se M = G
4 + gd− rd se M = B
V = M
S = (M−m)M
Analizzando queste equazioni, risulta evidente che la saturazione e nulla
quando M = m, il che si verifica quando R = G = B ossia nel caso acromatico.
La scelta del sistema HSV e stata motivata dal fatto che esso rappresenta
i colori in un modo molto simile a quello con cui l’uomo li percepisce. Questo
ci ha permesso di definire con maggiore precisione il concetto di “pixel verde”
su cui andare a discriminare per calcolare il numero di pixel da utilizzare per
rilevare il movimento labiale.
Figura 4.6: Rappresentazione geometrica dei colori nello spazio HSV
54 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Segmentazione
Fissato lo spazio colorimetrico da utilizzare, sara necessario decidere quale
set di punti di interesse andare ad analizzare tramite il nostro algoritmo di
visione. Tralasciando momentaneamente le differenze di approccio tra l’E-
sperimento 1 e i successivi, possiamo comunque trovare dei punti di contatto
tra i due metodi utilizzati:
• Ricerca del punto di “massimo” del colore da tracciare
• Costruzione del baricentro
La ricerca del punto che risulta piu verde (o in maniera analoga piu nero)
avviene confrontando la componente G del sistema RGB di ogni pixel con
quella del pixel che fino a quel momento ha la componente G massima. 7
Il pixel attuale diventera il nuovo pixel massimo se:
• la componente verde del pixel attuale e maggiore di quella del pixel di
massimo
• le altre due componenti del pixel attuali sono minori delle rispettive
componenti del pixel di massimo.
In tutte le versioni del progetto in questa fase non e stata sfruttata la
conversione da RGB a HSV, in quanto avrebbe implicato un numero molto
maggiore di operazioni da eseguire per ogni frame senza apportare effettivi
vantaggi.
Per la costruzione del baricentro si utilizza il pixel ottenuto nella fase
precedente, e si fissa intorno ad esso una maschera quadrata di lato 40 pixel.
Tutti gli elementi dell’array presenti in questa maschera vengono esaminati
e, se vengono ritenuti significativi (in base alle condizioni imposte sul colore)
vengono utilizzati dalla funzione per il calcolo del baricentro. Quest’ultimo
viene ricavato tramite una media pesata, ovvero una funzione che prima di
sommare tra di loro i valori li moltiplica per il peso a loro assegnato. Il peso
7In maniera analoga, nel caso della ricerca del colore nero per poter dichiarare il pi-xel attuale come pixel massimo si e imposto che le tre componenti R, G e B fosserocontemporeamente minori di quelle del pixel di massimo.
4.1. DESCRIZIONE GENERALE 55
puo essere inteso come l’importanza (oggettiva o soggettiva) che il singolo
valore riveste nella distribuzione, e nel nostro caso e rappresentato dal valore
della componente G del pixel.
La formula generale che restituisce le coordinate del baricentro nel caso
di una matrice bidimensionale e:
xb =Pi xi · fiPi fi
, yb =Pi yi · fiPi fi
dove il valore di i e preso tra tutti i pixel della maschera che rispettano le
condizioni imposte sul colore.
A questo punto pero possiamo trovare la differenza fondamentale tra il
primo Esperimento e i successivi: nel primo caso i dati del baricentro vengono
memorizzati in una struttura dati per tracciarne il movimento nel tempo,
mentre nelle altre due versioni il baricentro viene sfruttato per andare a
contare i pixel di un determinato colore in una nuova maschera centrata su
di esso.
Tracciamento del movimento
Nell’Esperimento 1 sono state introdotte funzioni specifiche che permettono
di costruire, partendo dall’array fornito da Video for Windows, una matrice
di dimensioni 240*160 pixel che rappresenta geometricamente l’immagine.
In particolare sono state implementate funzioni che, fissata la dimensione
della finestra di acquisizione, ricavano le coordinate matriciali di ogni pixel
partendo dall indice che esso aveva nell’array.
In questo modo, dopo aver memorizzato in una coda 25 valori di bari-
centro (che corrispondono all’incirca a 1 secondo di stream video), abbiamo
confrontato le coordinate di questi 25 punti e abbiamo calcolato la minima
area che li conteneva tutti. Valutando come essa variava nel tempo ab-
biamo cercato di ottenere una stima attendibile del movimento, che veniva
aggiornata ad ogni frame preso in esame.
Conteggio dei pixel
Dato che tracciare il movimento del baricentro non ha dato buoni risultati,
abbiamo pensato di limitarci a sfruttare il baricentro per riapplicare una
56 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
maschera su di esso e contare quali pixel potessero essere definiti “verdi”
(o “neri”) all’interno di essa. Abbiamo ridotto drasticamente il numero di
calcoli necessari per ogni frame da elaborare, utilizzando solo una variabile
contatore da confrontare con un’altra che tiene traccia del contatore del frame
precedente. Qualora questo rapporto scenda sotto la soglia sperimentalmente
determinata, allora potremo dire con buona approssimazione che il labbro si
e mosso.
Elaborazione ad alto livello
Quest’ultima fase e la piu semplice all’interno del progetto, e si occupa di
interagire con la parte di software che scandisce vocalmente le lettere del-
l’alfabeto. Il riconoscimento del movimento effettuato durante la fase di
segmentazione e sostanzialmente un segnale booleano utilizzato nell’elabora-
zione di alto livello per fermare il player sulla lettera o sul gruppo appena
pronunciato. A questo punto, se l’elemento selezionato e una lettera la si
aggiunge alla sequenza di lettere gia composte e si fa ripartire da capo la
scansione, mentre se si tratta di un gruppo si passa a scandire le lettere che
lo compongono.
4.2. IMPLEMENTAZIONE 57
4.2 Implementazione
Andremo ora ad analizzare la struttura del progetto IMR, esaminando il co-
dice prodotto per realizzare le sue funzioni principali. Il progetto e composto
dai seguenti file sorgenti:
• Main.cpp
• Buffer.cpp
• Avi.cpp
• Player.cpp
• Filter.cpp
In particolare, i file Buffer.cpp, Grabber.cpp e Avi.cpp si occupano della
parte di Visione Artificiale, Filter.cpp realizza l’algoritmo per riconoscere il
movimento mentre Player.cpp si occupa della scansione vocale delle lettere
dell’alfabeto.
4.2.1 Main.cpp
Questo file, come e facile intuire dal nome, e il file principale del progetto, e
si occupa di gestire tutte le funzioni dell’IMR. Prima di commentare le sue
funzioni, vediamo qualche costante particolarmente interessante:
1 #define PREVIEW WIDTH (320)
2 #define PREVIEW HEIGHT (240)
3
4 #define OUTPUT WIDTH (320)
5 #define OUTPUT HEIGHT (240)
Queste costanti definiscono le dimensioni dell’input e dell’output del proget-
to.
58 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Introduciamo ora le funzioni, a partire da OnInit(HWND hWndDlg):
1 LRESULT OnInit ( HWND hWndDlg ) {2 hWndDialog = hWndDlg ;
3 aviFirstFrameTime = 0 ;
4
5 InitPlayer ( ) ;
6
7 imageWidth = PREVIEW_WIDTH ;
8 imageHeight = PREVIEW_HEIGHT ;
9
10 [ . . . ]
11
12 usingFrameGrabber = FALSE ;
13
14 if ( InitFrameGrabber ( ) ) {15 RECT rect ;
16
17 rect . left = PREVIEW_LEFT ;
18 rect . right = PREVIEW_RIGHT ;
19 rect . top = PREVIEW_TOP ;
20 rect . bottom = PREVIEW_BOTTOM ;
21
22 if ( MapDialogRect ( hWndDlg , &rect ) ) {23 usingFrameGrabber = CreatePreviewWindow ( rect . left , rect . top , rect .
right − rect . left , rect . bottom − rect . top , hWndDlg , IDC_PREVIEW ) ;
24 }25 }26
27 return TRUE ;
28 }
che tramite la funzione InitPlayer() fa partire la scansione vocale, e nel
caso in cui sia collegata la Webcam 8 crea una struttura dati di tipo RECT
delle dimensioni dell’input per poterla utilizzare per il riconoscimento del
movimento.
8il programma per motivi di testing funziona anche senza la Webcam, riproducendo unfile apposito chiamato test.avi
4.2. IMPLEMENTAZIONE 59
La funzione OnPaint(HWND hWndDlg) invece gestisce le operazioni
grafiche sulla finestra di output:
1 LRESULT OnPaint ( HWND hWndDlg ) {2 PAINTSTRUCT ps ;
3
4 HDC hdc = BeginPaint ( hWndDlg , &ps ) ;
5 HDC hdcBitmap = CreateCompatibleDC ( hdc ) ;
6 [ . . ]
in questo modo viene preparata la finestra di output per essere disegnata e
viene creata una struttura PAINTSTRUCT con le informazioni sul di-
segno. Se la Webcam non e collegata, viene eseguito questo frammento di
codice:
1 if ( ! usingFrameGrabber ) {2 RECT rect ;
3
4 rect . left = PREVIEW_LEFT ;
5 rect . right = PREVIEW_RIGHT ;
6 rect . top = PREVIEW_TOP ;
7 rect . bottom = PREVIEW_BOTTOM ;
8
9 [ . . . ]
10
11 HDC hdcOutputBitmap = CreateCompatibleDC ( hdc ) ;
12
13 HBITMAP hOldOutputBitmap = ( HBITMAP ) SelectObject ( hdcOutputBitmap ,
GetOutputBufferBitmap ( ) ) ;
14
15 rect . left = OUTPUT_LEFT ;
16 rect . right = OUTPUT_RIGHT ;
17 rect . top = OUTPUT_TOP ;
18 rect . bottom = OUTPUT_BOTTOM ;
19
20 [ . . . ]
che copia l’immagine dal RECT di origine al RECT di destinazione, ef-
fettuando eventualmente un ridimensionamento nel caso le dimensioni non
siano le stesse. Dato che non c’e nessuna sorgente di input, il programma si
occupera di creare tutte e due le immagini su cui lavorare (sia quella originale
che quella filtrata).
60 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Nel caso in cui invece la Webcam sia collegata, verra eseguito questo
frammento di codice:
1 else {2 RECT rect ;
3
4 [ . . . ]
5 StretchDIBits ( hdcBitmap , 0 , 0 , OUTPUT_WIDTH , OUTPUT_HEIGHT , 0 , 0 ,
OUTPUT_WIDTH , OUTPUT_HEIGHT , lpData , lpbi , DIB_RGB_COLORS , SRCCOPY ) ;
6 FilterImage ( ) ;
7
8 rect . left = OUTPUT_LEFT ;
9 rect . right = OUTPUT_RIGHT ;
10 rect . top = OUTPUT_TOP ;
11 rect . bottom = OUTPUT_BOTTOM ;
12
13 [ . . . ]
14 }
in cui l’immagine originale da elaborare viene fornita dalla Webcam e il
programma creera soltanto l’immagine filtrata.
La funzione StretchDIBits(...) copiera le informazioni sul colore di un
rettangolo dell’immagine (in caso sia stato scelto di considerare solo parte
dell’immagine) in un altro rettangolo, mentre la funzione FilterImage()
eseguira sull’input l’algoritmo di Visione Artificiale.
La funzione OnFrameAvaiable() permette invece di effettuare dei
refresh parziali dell’immagine, specificando la parte dell’immagine di cui fare
l’update:
1 void OnFrameAvailable ( ) {2 InvalidateRect ( GetPreviewWindow ( ) , NULL , FALSE ) ;
3
4 RECT rect ;
5
6 rect . left = OUTPUT_LEFT ;
7 rect . right = OUTPUT_RIGHT ;
8 rect . top = OUTPUT_TOP ;
9 rect . bottom = OUTPUT_BOTTOM ;
10
11 if ( MapDialogRect ( hWndDialog , &rect ) ) InvalidateRect ( hWndDialog , &rect ,
FALSE ) ;
12 }
4.2. IMPLEMENTAZIONE 61
in questo caso, passando a InvalidateRect(...) il parametro NULL si spe-
cifica che l’update deve essere fatto sull’intera immagine, mentre con FALSE
indichiamo che il background dell’immagine rimane invariato.
4.2.2 Buffer.cpp
Questo file viene utilizzato per gestire l’input e trasformarlo in un forma-
to standard per essere elaborato dall’algoritmo. In particolare la funzione
CreateImageBuffer(...) crea una bitmap dalla fonte di input e la salva nel
puntatore imageBufferData:
1 BOOL CreateImageBuffer ( HWND hWnd , int imageWidth , int imageHeight ) {2 HDC hdc = GetDC ( hWnd ) ;
3
4 imageBufferData = ( BYTE ∗) malloc (4 ∗ imageWidth ∗ imageHeight ) ;
5
6 memset ( imageBufferData , imageWidth ∗ imageHeight ∗ 4 , 255) ;
7
8 int size = sizeof ( BITMAPINFO ) + 2 ∗ sizeof ( RGBQUAD ) ;
9
10 BITMAPINFO∗ pBMI = ( BITMAPINFO ∗) malloc ( size ) ;
11
12 memset ( pBMI , 0 , size ) ;
13
14 pBMI−>bmiHeader . biSize = sizeof ( BITMAPINFOHEADER ) ;
15 pBMI−>bmiHeader . biWidth = imageWidth ;
16 pBMI−>bmiHeader . biHeight = imageHeight ;
17 pBMI−>bmiHeader . biPlanes = 1 ;
18 pBMI−>bmiHeader . biBitCount = 32 ;
19 pBMI−>bmiHeader . biCompression = BI_BITFIELDS ;
20
21 pBMI−>bmiColors [ 0 ] . rgbBlue = 0xff ;
22 pBMI−>bmiColors [ 1 ] . rgbGreen = 0xff ;
23 pBMI−>bmiColors [ 2 ] . rgbRed = 0xff ;
24
25 imageBufferBitmap = CreateDIBSection ( hdc , ( BITMAPINFO ∗) pBMI ,
DIB_RGB_COLORS , ( LPVOID ∗)&imageBufferData , NULL , 0) ;
26
27 [ . . . ]
28 }
Per poter utilizzare questa bitmap e stata utilizzata la funzione
GetOutputBufferData(), che ha come valore di ritorno il puntatore di
tipo BYTE* all’immagine ottenuta tramite CreateOutputBuffer(...):
62 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
1 BOOL CreateOutputBuffer ( HWND hWnd , int imageWidth , int imageHeight ) {2 outputBufferWidth = imageWidth ;
3
4 outputBufferHeight = imageHeight ;
5
6 HDC hdc = GetDC ( hWnd ) ;
7
8 outputBufferData = ( BYTE ∗) malloc (4 ∗ imageWidth ∗ imageHeight ) ;
9
10 memset ( outputBufferData , imageWidth ∗ imageHeight ∗ 4 , 255) ;
11
12 int size = sizeof ( BITMAPINFO ) + 2 ∗ sizeof ( RGBQUAD ) ;
13
14 BITMAPINFO∗ pBMI = ( BITMAPINFO ∗) malloc ( size ) ;
15
16 pBMI−>bmiHeader . biSize = sizeof ( BITMAPINFOHEADER ) ;
17 pBMI−>bmiHeader . biWidth = imageWidth ;
18 pBMI−>bmiHeader . biHeight = imageHeight ;
19 pBMI−>bmiColors [ 0 ] . rgbBlue = 0xff ;
20 pBMI−>bmiColors [ 1 ] . rgbGreen = 0xff ;
21 pBMI−>bmiColors [ 2 ] . rgbRed = 0xff ;
22
23 outputBufferBitmap = CreateDIBSection ( hdc , ( BITMAPINFO ∗) pBMI ,
DIB_RGB_COLORS , ( LPVOID ∗)&outputBufferData , NULL , 0) ;
24
25 ReleaseDC ( hWnd , hdc ) ;
26
27 return TRUE ;
28 }
4.2.3 Avi.cpp
Questo file sorgente serve a gestire lo stream video da file, ed e stato svi-
luppato principalmente per effettuare test a posteriori su filmati AVI. Le
operazioni possibili sul file sono definite tramite le seguenti costanti:
1 #define CROP X (10)
2 #define CROP Y (20)
3
4 #define CROP WIDTH (240)
5 #define CROP HEIGHT (192)
6
7 #define INITIAL DELAY (2750)
4.2. IMPLEMENTAZIONE 63
In particolare le parti relative a CROP X, CROP Y, CROP WIDTH
e CROP HEIGHT, definiscono l’inizio delle coordinate dell’immagine da
catturare e l’eventuale ridimensionamento del filmato, mentre la costante
INITIAL DELAY definisce il ritardo nella riproduzione del video (per
poter sincronizzare il filmato alla scansione vocale in fase di test).
Questo ritardo iniziale influisce nella funzione GetFrameAtMillis(...),
che si occupa di estrarre, fornita la posizione temporale in millisecondi, il
frame interessato:
1 BOOL GetFrameAtMillis ( int millis , HDC hdc , int width , int height ) {2 long frame = AVIStreamTimeToSample ( aviStream , millis + INITIAL_DELAY ) ;
3 if ( frame < aviFirstFrame | | frame > aviLastFrame )
4 return FALSE ;
5 [ . . . ]
assicurandosi che il frame da cercare sia all’interno dei frame di input.
4.2.4 Player.cpp
Il file Player.cpp controlla tutti i parametri della scansione vocale, dalla strut-
tura dell’alfabeto alla durata delle pause tra una lettere e l’altra e tra un grup-
po e l’altro. La temporizzazione dell’alfabeto e definita tramite le seguenti
costanti:
1 #define TIMEOUT MENU 1600
2 #define TIMEOUT GROUP 1000
3
4 #define TIMEOUT DELAY 100
5 #define DELAY COUNTER 12
le prime due costanti stabiliscono il tempo espresso in millisecondi che passa
rispettivamente tra due lettere di uno stesso gruppo e la successiva e tra due
gruppi; TIME DELAY e DELAY COUNTER invece determinano la
pausa che intercorre tra la scelta di un gruppo e la pronuncia della prima
lettera dello stesso o tra la selezione di una lettera e la pronuncia del primo
gruppo.
64 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
La struttura dell’alfabeto utilizzato da Steccato e ricostruita utilizzan-
do un array monodimensionale per rappresentare i gruppi e un altro array
bidimensionale per le lettere che li compongono:
1 char∗ menu [ MENU_COUNTER ] = { ” v o c a l i ” , ”pr imo” , ” secondo ” , ” t e r z o ” } ;2
3 char∗ group [ ] [ GROUP_COUNTER ] = {4 { ”a” , ”e” , ” i ” , ”o” , ”u” , ”” } ,
5 { ”b” , ”c” , ”d” , ” f ” , ”g” , ”” } ,
6 { ”h” , ” l ” , ”m” , ”n” , ”p” , ”” } ,
7 { ”q” , ” r ” , ” s ” , ” t ” , ”v” , ”z” }8 } ;
Infine la funzione piu interessante e sicuramente OnPlayerStop(), che an-
dremo ad utilizzare per bloccare la scansione una volta che il movimen-
to e stato riconosciuto. Nel corpo della funzione sono specificati due casi
fondamentali in base al livello in cui ci si trova:
1 INT OnPlayerStop ( ) {2 switch ( level ) {3 case 1 :
4 delay = DELAY_COUNTER ;
5
6 SetDlgItemText ( hWndDialog , IDC_SYMBOL , ”∗” ) ;
7
8 if ( groupCounter >= 0) {9 if ( strlen ( string ) < STRING_LENGTH − 1)
10 sprintf ( string , ”%s%s ” , string , group [ menuCounter ] [ groupCounter ] ) ;
11 else
12 sprintf ( string , ”%s%s ” , &(string [ 1 ] ) , group [ menuCounter ] [
groupCounter ] ) ;
13
14 SetDlgItemText ( hWndDialog , IDC_STRING , string ) ;
15
16 groupCounter = −1;
17 }18
19 SetTimer ( hWndDialog , IDT_PLAYER_TIMER , TIMEOUT_DELAY , ( TIMERPROC ) 0) ;
20
21 menuCounter = 0 ;
22 level = 0 ;
23 groupCounter = −1;
24
25 break ;
4.2. IMPLEMENTAZIONE 65
in questo caso la selezione e avvenuta su un elemento di livello 1 (ovvero una
lettera di un gruppo), quindi il programma aggiunge la lettera nel box di
testo presente nella GUI e riprende a scandire il livello 0.
1 case 0 :
2 level = 1 ;
3 groupCounter = 0 ;
4 delay = DELAY_COUNTER ;
5
6 SetDlgItemText ( hWndDialog , IDC_SYMBOL , ”∗” ) ;
7
8 SetTimer ( hWndDialog , IDT_PLAYER_TIMER , TIMEOUT_DELAY , ( TIMERPROC ) 0) ;
9
10 break ;
11 }12
13 return TRUE ;
14 }
in questo caso invece la selezione e avvenuta su un elemento di livello 0
(ovvero un gruppo), quindi il programma passera al livello 1 e iniziera a
scandire le lettere che compongono il gruppo precedentemente selezionato.
4.2.5 Filter.cpp
Per ultimo andiamo ad esaminare il file sorgente Filter.cpp, che implementa
l’algoritmo di visione sviluppato per il progetto IMR. Per quanto riguarda le
costanti e le variabili introdotte, possiamo trovare:
1 #define MAX ALTEZZA 160
2 #define MAX LARGHEZZA 240
3
4 int posnero = 1 ;
5 int vecchiocontatore = 0 ;
Le prime due costanti determinano la dimensione della finestra di input; la
variabile posnero dichiarata pari a 1 specifica che inizialmente il pixel piu
nero e il primo elemento dell’array, mentre la variabile vecchiocontatore
inizializza la coda da utilizzare per ottenere il rapporto tra il numero di pixel
presente in un frame e quello dei pixel del frame precedente.
66 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
La funzione principale di questo sorgente e FilterImage(), che viene lan-
ciata per ogni frame dello stream video. Nella prima parte, FilterImage()
effettua una ricerca del pixel piu nero all’interno dell’immagine:
1 void FilterImage ( ) {2 [ . . . ]
3
4 for ( int i = 0 ; i < 4∗ imageWidth∗imageHeight −4; i += 4) {5 BYTE r = imageData [ i + 0 ] ;
6
7 BYTE g = imageData [ i + 1 ] ;
8
9 BYTE b = imageData [ i + 2 ] ;
10
11 int pixel = ( int ) ( i /4) ;
12
13 if ( e_nero ( pixel ) && r <= valrosso && g <= valverde && b <= valblu )
{14 posnero = i + 1 ;
15 valrosso = r ;
16 valverde = g ;
17 valblu = b ;
18 }19 }20 [ . . . ]
Per decidere se un pixel e significativo, abbiamo utilizzato la funzione
booleana e nero(int pixel):
1 inline bool e_nero ( int pixel ) {2 BYTE∗ imageData = GetOutputBufferData ( ) ;
3 float r = ( float ) imageData [ ( pixel ∗4) ] ;
4 float g = ( float ) imageData [ ( pixel ∗4) +1] ;
5 float b = ( float ) imageData [ ( pixel ∗4) +2] ;
6
7 if ( r < 25 && g < 25 && b < 25) return true ;
8 else return false ;
9
10 }
che considera come significativo ogni colore che ha tutte e tre le componenti
R,G e B in valore numerico inferiori a 23.
Una volta ottenuto il pixel piu nero, su di esso viene centrata una ma-
schera quadrata di lato 40 pixel per costruire il baricentro:
4.2. IMPLEMENTAZIONE 67
1 int calcola_baricentro ( int coor_x , int coor_y ) {2 [ . . . ]
3 for ( int j = coor_y − 20 ; j < coor_y + 20 ; j++) {4 for ( int i = coor_x − 20 ; i < coor_x + 20 ; i++) {5 [ . . . ]
6 if ( e_nero ( pixel ) ) {7 sum_xb = sum_xb + i ∗( int ) ( imageData [ ( pixel ∗4) +1]) ;
8 sum_yb = sum_yb + j ∗( int ) ( imageData [ ( pixel ∗4) +1]) ;
9 sum_val_verde = sum_val_verde + ( int ) ( imageData [ ( pixel ∗4) +1]) ;
10 }11 }12 }13 }14 if ( sum_val_verde != 1) {15 xb = ( int ) ( sum_xb / sum_val_nero ) ;
16 yb = ( int ) ( sum_yb / sum_val_nero ) ;
17 pixattuale = yb ∗ MAX_LARGHEZZA + xb ;
18 return pixattuale ;
19 }20 }21 else return 0 ;
22 }
tramite la funzione di media pesata descritta precedentemente.
Le coordinate di questo baricentro saranno poi sfruttate dalla funzione
colora area(...), che riapplichera al baricentro una maschera quadrata di
lato 60 pixel per andare a contare all’interno di essa tutti i pixel che rispettano
i criteri fissati nella funzione e nero():
1 int colora_area ( int coor_x , int coor_y ) {2 BYTE∗ imageData = GetOutputBufferData ( ) ;
3 for ( int j = coor_y − 30 ; j < coor_y + 30 ; j++) {4 for ( int i = coor_x − 30 ; i < coor_x + 30 ; i++) {5 [ . . . ]
6 if ( pixel > ( MAX_LARGHEZZA−1)∗( MAX_ALTEZZA−1) | | coor_x >
MAX_LARGHEZZA | | coor_y > MAX_ALTEZZA ) break ;
7 else {8 if ( e_nero ( pixel ) ) {9 imageData [ ( pixel ∗4)+1] = 255 ;
10 imageData [ ( pixel ∗4) ] = 0 ;
11 imageData [ ( pixel ∗4)+2] = 0 ;
12 contatore++;
13 }14 [ . . . ]
15 return contatore ;
16 }
68 CAPITOLO 4. INTERPRETE DI MOVIMENTI RESIDUI
Il valore di ritorno di questa funzione e il numero di pixel che sono da
considerarsi effettivamente neri. Per ogni nuovo valore della variabile con-
tatore si procede ad effettuare il rapporto tra quest’ultimo e il valore del
contatore del frame precedente (salvato in vecchiocontatore), per otte-
nere un valore su cui discriminare i movimenti labiali (tramite la variabile
rapporto contatore).
Se il rapporto scende sotto il valore 0.85 (memorizzato nella variabile
val soglia), vuol dire che tra il frame precedente e quello attuale c’e stato
un calo sensibile di pixel neri, e quindi un conseguente movimento della bocca.
1 double rapporto_contatore = double ( contatore ) /double ( vecchiocontatore ) ;
2
3 if ( rapporto_contatore < val_soglia && appena_detto == 0) {4 OnPlayerStop ( ) ;
5 cout << rapporto_contatore << endl ;
6 appena_detto = 15 ;
7 }8 else if ( rapporto_contatore < val_soglia && appena_detto > 0) {9 cout << ” Sca r to movimento” << endl ;
10 appena_detto−−;
11 }12 else if ( rapporto_contatore > val_soglia && appena_detto > 0)
13 appena_detto−−;
Allo scopo di impedire che un movimento venisse letto piu volte dal pro-
gramma, che in questo caso oltre a selezionare un gruppo selezionerebbe
automaticamente anche la sua prima lettera, abbiamo introdotto la variabile
appena detto, settata a 15 appena dopo ogni movimento rilevato. Come si
vede dagli ultimi due else if, per i 15 movimenti frame il programma non fer-
mera il player in caso di movimento, limitandosi a decrementare la variabile
appena detto.
Questa scelta e motivata dal fatto che normalmente i movimenti labiali di
Steccato sono separati tra di loro da qualche secondo, tempo sufficiente per
permettere al programma di azzerare la variabile appena detto e assorbire
tutte le fluttazioni del valore di rapporto contatore.
Nel caso in cui il movimento sia stato rilevato e la variabile appena detto
sia pari a 0, il programma potra lanciare la funzione OnPlayerStop() per
fermare la scansione vocale.
Capitolo 5
Risultati
In questo breve capitolo verranno illustrati i risultati sperimentali dei test
effettuati durante la tesi di laurea, e verranno motivate adeguatamente le
scelte fatte circa il valore delle soglie fissate per rilevare i movimenti.
5.1 Criteri di decisione delle soglie
Come gia ampiamente descritto nei capitoli precedenti, per poter determinare
se il labbro di Gianpiero si e mosso sono state introdotte principalmente due
valori di soglia:
• una e stata fissata sulle componenti RGB utilizzate nella funzione
e nero(), per determinare se i singoli pixel devono essere inclusi nel
calcolo del baricentro.
• l’altra soglia sulla variabile rapporto contatore, al di sotto della
quale possiamo essere abbastanza sicuri che il labbro si e mosso.
I valori che abbiamo scelto sono: RGB(25,25,25) per la prima e 0.85 per
la seconda. Questi valori sono frutto di accurate ricerche volte a ottimizzare
il piu possibile il riconoscimento dell’area nera della bocca e il suo relativo
movimento.
69
70 CAPITOLO 5. RISULTATI
5.1.1 Soglia del valore di “nero”
Per poter discriminare tra pixel “neri” e pixel “non neri”, siamo stati obbli-
gati a fissare una soglia nell’ambito della colorazione RGB. Il primo valore
RGB(20,20,20) e stato fissato osservando in maniera macroscopica a video
il colore dell’interno della bocca, ed e stato utilizzato per comodita nelle fasi
preliminari del progetto.
Una volta ottenuti buoni risultati nei test effettuati, ci si e posta la que-
stione di come massimizzare il rendimento di questa variabile al fine di rile-
vare il numero maggiore di pixel dell’interno della bocca senza produrre falsi
positivi.
A questo scopo abbiamo fatto variare le componenti tra RGB(10,10,10)
e RGB(30,30,30) e abbiamo verificato che nel primo caso i pixel rilevati
erano in numero troppo ridotto per essere utilizzate dall’algoritmo, mentre
invece nel secondo caso lo spettro di tonalita di nero era troppo ampio e
rischiava di considerare neri anche pixel che non facevano parte dell’interno
della bocca.
Per questo motivo abbiamo provato a fissare un valore intermedio tra
RGB(30,30,30) e RGB(20,20,20), e dopo qualche ora di test abbiamo
notato che scegliere come soglia di colore RGB(25,25,25) ci dava il numero
massimo di pixel riconosciuti minimizzando il numero di falsi positivi.
I risultati del rilevamento dei pixel della bocca in base alla scelta della
soglia sulle 3 componenti RGB esaminate sono visibili in Figura 5.1.
5.1.2 Soglia sulla variabile rapporto contatore
Una volta che il programma ottiene il rapporto tra il numero di pixel neri
del frame precedente e quello del frame successivo, viene spontaneo chiedersi
con che criterio andare a fissare una soglia su questo rapporto.
Inizialmente per scegliere la soglia e stata realizzata una versione partico-
lare del software che stampava in un’apposita finestra del terminale i valori di
rapporto contatore, e in questo modo abbiamo potuto fissare una prima
soglia pari a 0.75.
5.1. CRITERI DI DECISIONE DELLE SOGLIE 71
(a) Pixel neri con R < 20, G < 20, B < 20
(b) Pixel neri con R < 10, G < 10, B < 10
(c) Pixel neri con R < 25, G < 25, B < 25
Figura 5.1: Variazione dei pixel neri riconosciuti in base al cambiamento deiparametri RGB
72 CAPITOLO 5. RISULTATI
Come nel caso della soglia sulle componenti RGB, una volta ottenuti
risultati soddisfacenti durante il test dell’algoritmo abbiamo proceduto ad
ottimizzare anche questa soglia, apportando un’ulteriore modifica al software.
Invece che stampare i valori di rapporto contatore a video, li abbia-
mo salvati in un file di testo opportunamente formattato, per andarli poi a
graficare con un normale foglio di calcolo. Questi i risultati grafici di una
porzione di 500 valori:
Figura 5.2: Grafico temporale della variabile rapporto contatore
Abbiamo quindi suddiviso i circa 65000 valori contenuti nel file in gruppi
di 1000 elementi, per andare a calcolare in ognuno di essi la media e il minimo.
La media si e attestata intorno al valore 1, ed e quello che ci aspettavamo
visto che il labbro rimane fermo per la maggior parte del tempo. Per quanto
riguarda invece il minimo valore di rapporto contatore, quest’ultimo si
aggirava intorno a 0.70. Dato che fissare la soglia a 0.70 sarebbe stato
sconsigliabile, visto che si rischiava di perdere tutti i movimenti che avevano
un valore leggermente superiore alla soglia, abbiamo deciso di utilizzare come
soglia 0.85, ottenuta tramite:
valore medio + valore minimo2
5.2. STIMA DELLE PRESTAZIONI 73
5.2 Stima delle prestazioni
Andremo ora ad analizzare i risultati ottenuti con il progetto IMR, non limi-
tandoci a valutare solo l’ultimo Esperimento ma comparandola anche con le
due precedenti, giustificando cosı la scelta dell’algoritmo di Visione Artificiale
introdotto con l’Esperimento 3.
Come metodo di valutazione abbiamo sfruttato la possibilita del software
di eseguire l’algoritmo su un file AVI di test: dopo aver registrato una serie di
filmati in cui Steccato scandiva alcune parole di media lunghezza, abbiamo
sottoposto questi filmati alle tre versioni di IMR, contando il numero di
rilevamenti corretti di ognuna delle versioni.
Figura 5.3: Risultati percentuali delle tre versioni di IMR
Il risultato finale, visibile in Figura 5.3, e stato che sebbene i primi due
algoritmi hanno ottenuto un numero di successi inferiori al 20%, l’Esperi-
mento 3 e riuscito a identificare il 90% (con picchi del 95%) dei movimenti
labiali, raggiungendo quindi un livello di funzionalita superiore alle nostre
aspettative. Questo risultato ha confermato ulteriormente le potenzialita del
nostro algoritmo, che con ulteriori modifiche potrebbe diventare a tutti gli
effetti un vero interprete esperto per questa patologia.
74 CAPITOLO 5. RISULTATI
Conclusioni
In questo lavoro di tesi abbiamo presentato il progetto IMR, un interprete
di movimenti residui specifico per Gianpiero Steccato, affetto da 9 anni dalla
sindrome Locked-In.
Abbiamo mostrato le soluzioni implementate per automatizzare il rico-
noscimento del movimento e la scansione delle lettere, le basi teoriche che
ci hanno permesso di realizzare il sistema di Visione Artificiale e i risultati
empirici del software in base al numero di movimenti riconosciuti.
In una prima fase del lavoro ci siamo dedicati all’osservazione del proto-
collo di comunicazione di Steccato, identificando cosı nel movimento labiale il
target del nostro progetto di Visione Artificiale; successivamente tramite tre
esperimenti abbiamo provveduto a sviluppare differenti approcci per identi-
ficare il movimento, come la misurazione della lunghezza dello spostamento
di un marcatore applicato al labbro e il conteggio dei pixel significativi della
bocca.
Dopo varie fasi di test abbiamo scelto come approccio definitivo que-
st’ultimo, in quanto garantiva il corretto riconoscimento di piu del 90% dei
movimenti del labbro. Questo risultato, di molto superiore alle previsioni
iniziali, ci ha assicurato che la tecnica utilizzata e al momento la migliore
soluzione per questo progetto di Visione Artificiale.
Questo prototipo e ovviamente solo un punto di partenza, ma sebbene
non possa ancora essere fruibile da un utente finale sara messo a disposi-
zione tramite licenza open source a tutti quelli che volessero ulteriormente
ampliarlo, ad esempio tramite una tesi di laurea in Intelligenza Artificiale, o
integrarlo in un sistema gia esistente che si occupa di far comunicare persone
affette da patologie simili alla sindrome Locked-In.
75
Bibliografia
[1] Nilsson, Nils J. (2002). Intelligenza artificiale.
[2] Fink, Donald. Mente umana e cervelli elettronici: introduzione
all’intelligenza artificiale.
[3] Ballard, Dana H. - Brown, Christopher M. (1982). Computer Vision.
http://homepages.inf.ed.ac.uk/rbf/BOOKS/BANDB/bandb.htm
[4] Melli, Pietro (1990). L’elaborazione digitale delle immagini.
[5] Simons, G.L. (1985). Intelligenza artificiale: la nuova frontiera
dell’informatica.
[6] Manuel Longo. Blog personale.
http://www.mlongo.net/
[7] Severino Mingroni. Blog personale.
http://xoomer.virgilio.it/severinomingroni/
[8] Amici di Daniela ONLUS.
http://www.amicididaniela.it/
[9] Free Homepage for locked-in patients.
http://www.lockedin.eu/
[10] Wikipedia (2009b). Wikipedia. The free enciclopedia.
http://en.wikipedia.org/wiki/Computer vision
[11] Wikipedia (2009b). Wikipedia. The free enciclopedia.
http://en.wikipedia.org/wiki/Segmentation (image processing)
77
78 BIBLIOGRAFIA
Ringraziamenti
Innanzitutto e obbligatorio un grandissimo GRAZIE al mio “secondo pilota”
Gianpiero: ogni singolo risultato ottenuto in questa tesi e stato raggiunto
anche grazie a lui, alla sua pazienza nel prestarsi ai miei esperimenti e ai suoi
preziosi consigli. Penso che poche persone avrebbero potuto garantirmi la
completa disponibilita che Gianpiero mi ha concesso, e questo mi ha permesso
di far convivere questa esperienza con gli altri mille impegni che affollano le
mie giornate.
Spero di riuscire a portare avanti questo progetto per garantire a Gianpie-
ro tutti i diritti che una persona meravigliosa come lui si merita, anche come
ringraziamento per l’affetto che mi ha dimostrato fidandosi di uno studente
un po folle che sembrava voler combattere contro i mulini a vento.
E ora bisogna ringraziare “l’uomo dietro le quinte”, colui che ha avuto
l’idea da cui e partito il progetto: Fabrizio (e sua mamma). Senza di lui
probabilmente avrei scritto tutta un’altra tesi, e mi sarei perso una delle
esperienze piu belle della mia vita. Non riusciro mai a ringraziarlo abbastanza
per avermi dato questa “spinta” che mi ha aperto gli occhi su tante cose.
Se poi questa tesi ha avuto successo anche dal punto di vista dei risultati,
questo lo devo al Professor Bergenti che mi ha seguito nel mio lavoro sapendo
sempre consigliarmi la strada migliore da percorrere. Lo devo ringraziare
soprattutto per il grande lavoro che ha fatto per “mettere insieme” tutto il
codice prodotto, cosa che forse era al di sopra delle mie possibilita, e per
avermi in parte “rinconciliato” con la programmazione in C++.
Un ringraziamento speciale va anche ai miei genitori, che oltre ad aver
“sopportato” un iter universitario leggermente piu lungo del previsto stanno
riuscendo nell’immane compito di rendermi un uomo. Grazie, se sono quello
che sono lo devo anche al vostro aiuto.
79
80 BIBLIOGRAFIA
Grazie alla “nonna Gianna”, che e stata e sara sempre per me una “se-
conda mamma” (anche se part-time), e alla zia “Tatia”, che mi ha regalato
una grossa fetta della fantasia di cui oggi vado cosı fiero.
Un grazie che viene dal profondo del cuore anche a Sara, che mi e stata
vicino in questa strana avventura e spero che mi rimarra accanto per il resto
della mia vita. A lei devo davvero tanto, e spero di poterle restituire tutto
l’amore che mi sta dando.
Passando alla parte meno seria, voglio dedicare un “Sara pur bella l’In-
formatica, ma anche...” a Ciclo, Tino, Kusu e Ale: grazie a voi ho affrontato
imprese da gigante (come resistere al sonno in tarda primavera durante le ore
di Biologia) sempre col sorriso sulla faccia. In questi anni (non dico quanti,
per non sentirmi in colpa) ci siamo divertiti, e mi dispiace separarmi da voi...
Infine l’ultimo ringraziamento va ad Ale, Luciana e Simonetta (i magici
componenti della Casa Famiglia AS.SO.FA di Verano), che tra alti e bassi
hanno animato e spero che animeranno ancora per tanto tempo le cene di
questi miei tre anni di volontariato.