Riconoscimento ottico dei caratteri (1° parte)
Cos'è il riconoscimento ottico dei caratteri?
1° Parte
Facciamo un semplice esempio. Avete un bloccaccio di carta dove ci
sono degli appuntacci scritti a mano che volete riportare su PC. Avete
due possibilità:
- Memorizzare il documento in un formato grafico (ad
esempio miofile.jpg) acquisendo l’immagine con uno
scanner
- Ricopiare manualmente il documento facendo uso di un
programma di elaborazione testi (Word ad esempio)
La prima soluzione è certamente più rapida ma, non permette,
ne’ di effettuare modifiche, ne’ di effettuare ricerche
sul testo in quanto gli appunti sono stati memorizzati in un formato
grafico e vengono trattati dalla macchina alla stessa stregua di un’immagine.
La seconda soluzione invece, è certamente più elegante
ma, ha l’inconveniente di costringerci a fare il lavoro di leggere
e riscrivere il testo. Bene, il riconoscimento ottico dei caratteri
o OCR (Optical Character Recognition) è un campo dove si studia
come sia possibile sostituire la macchina a noi in questo noioso lavoro
di copiatura. I sistemi OCR, in pratica, sono programmi dedicati alla
conversione di un’immagine contenente testo in testo modificabile
con un normale programma di videoscrittura. Solitamente le immagini
sono acquisite da uno scanner di immagini o da un sistema digitale
(telecamera o macchina fotografica). Il testo viene convertito in
codici ASCII o Unicod (codifiche standardizzate per la memorizzazione
dei caratteri) o, nel caso dei sistemi più avanzati, in un formato
in grado di contenere anche l' impaginazione del documento. Per far
questo i programmi OCR si avvalgono di tecniche di Intelligenza
Artificiale.
Cosa è possibile fare e cosa è ancora un sogno?
Mentre il riconoscimento esatto di testo scritto in alfabeto latino
è oramai considerato un problema risolto quasi perfettamente,
il riconoscimento di testi a scritti mano libera ed il riconoscimento
degli alfabeti non latini è un problema che tuttora non ha trovato
delle soluzioni realmente soddisfacenti e infatti, è ancora oggetto
di studi e ricerche.
In parole povere, allo stato attuale, potete acquistare software
che da una pagina di giornale letta da uno scanner vi restituisca
un bel documento in formato testo (ad esempio Word), sollevandovi
dall’incarico di digitarlo a mano ma, non potete “dar
in pasto” quattro scarabocchi presi di fretta magari in una
lezione all’università ed aspettarvi che un programma OCR
vi fornisca un bel documento di testo pulito e ben scritto. Questo
purtroppo è ancora un sogno!
Un settore dove gli studi stanno dando buoni risultati, con l’impiego
di Reti neurali artificiali, è il riconoscimento di caratteri
singoli scritti a mano libera. Tali studi trovano applicazione, ad
esempio, sui palmari dove i software integrati al loro interno permettono
all’utente, dopo un’opportuna fase di addestramento, (tipica
di quasi tutti i sistemi basati su reti neurali) di riconoscere i
caratteri tracciati con un’accuratezza che supera il 98%.
Perché il riconoscimento del testo a mano libera è così
difficile da effettuare?
Il problema principale che si pone quando dobbiamo riconoscere un
carattere è che questo non possiede mai la stessa geometria e/o
le stesse caratteristiche contraddistintive. Una lettera può
variare nella forma, nelle dimensioni, nell’accuratezza con
cui è definita e, non da meno, può variare in base a chi
scrive!
Se a scrivere sono io, ad esempio, altro che riconoscimento di caratteri,
ci vorrebbe un riconoscimento di scarabocchi!
Se poi, invece di riconoscere i caratteri, dobbiamo riconoscere parole
appartenenti ad un testo, scritte in corsivo ed a mano libera,
le cose si complicano enormemente. E’ molto difficile, infatti,
arrivare ad isolare i singoli caratteri perché non è facile
capire dove ne finisce uno e dove ne inizia un altro. In questi casi,
la ricerca è indirizzata verso il riconoscimento della parola
a nel suo complesso. Per far ciò si affiancano al sistema OCR
motori di analisi grammaticale,ortografica e contestuale. Conoscere
il contesto dello scritto consente di eliminare molte ambiguità,
per esempio un documento che parla di storia conterrà molte date
e quindi in una frase del tipo : “La seconda guerra mondiale
inizio nel 197S” il sistema ipotizzerebbe che la curva accanto
al 197 sia un 5 e non una S.
Il Software
Il software che svilupperemo non vuole certo competere con i potenti
tool che ci sono in circolazione; lo scopo è puramente didattico,
ed è quello di mostrare come sia possibile impiegare una rete
neurale artificiale per la realizzazione di un programma OCR.
Il linguaggio che useremo sarà il VB6. Qualcuno mi potrebbe
dire :”Vuoi utilizzare un linguaggio che possieda un ambiente
di sviluppo rapido ok; ma almeno utilizza il Vb.net! ”
Beh il punto è che, sinceramente, ancora non me lo sono’
studiato sto nuovo ambiente di Zio Bill! Qui di tempo ce ne è
sempre poco!! Bah, lasciamo perdere il tempo, altrimenti ci tocca
tirare in ballo pure la relatività! Torniamo a noi. Si
parte.
L’interfaccia del nostro programma è quella riportata
nella figura in alto. Bella ma come si usa?
Allora, la prima cosa da fare è scaricare il file eseguibile
ovviamente!
Utilizzo del programma
La prima cosa da fare è addestrare la rete a riconoscere i caratteri
da voi definiti. Potete procedere in due modi: Caricare un addestramento
precedente oppure effettuarne uno da zero.
-Carichiamo l’addestramento (contenuto nel file supply.
txt) premendo il bottone LOAD
-Addestriamo la rete a riconoscere i caratteri “ i ”,
“ L “,
” C “,” E “,”F”
(caricati al passo precedente) premendo il bottone ADDESTRA.
-La rete è ora pronta a riconoscere i quattro caratteri.
Premete il bottone "CLEAR MATRIX"
-Disegnate la lettera F sulla matrice 5 x 6 (come in Fig1).
Per disegnare:
spostate il mouse sulla matrice tenendo premuto il
bottone sinistro del mouse oppure, fate click su un
determinato punto per annerirlo.
Per cancellare:
tenere premuto il tasto shift sulla tastiera e muovere
il
mouse sulla griglia tenendo premuto il tasto sinistro
oppure, sempre tenendo lo shift premuto, fate click
su
un determinato punto per renderlo bianco.
-Premete il tasto RICONOSCI per effettuare il
riconoscimento. Se tutto “fila liscio” nel
riquadro
arancione comparirà la lettera “F”.
Potete provare a disegnare la “ i ” o la “
E ” o la “ L ” o la “C” per verificare
che la rete riesce a riconoscere questi caratteri. Infine, potete,
provare a corrompere i caratteri in qualche punto, per vedere, fino
a quando la rete riesce a discriminare un dato carattere.
OSS1:
La rete è molto rudimentale non possiede moduli software che
effettuano l’autocentratura, la scalatura o la rotazione dei
caratteri quindi, è necessario disegnarli sempre in modo che
occupino il massimo dello spazio sulla matrice. E’ necessario
inoltre, che lettere come la “ i ”, vengano posizionate
sempre al centro della matrice!
Curiosità: Le operazioni di roto-traslazione vengono
effettuate normalmente anche da noi quando muoviamo gli occhi. Il
riconoscimento di una data immagine da parte del cervello, infatti,
deve essere indipendente dalla posizione che l’immagine stessa
questa occupa sulla nostra retina. Gli organismi biologici evoluti,
come noi, hanno sviluppato una rete neurale in grado di apprendere
questa trasformazione da coordinate Retiniche a coordinate Cranio
Centriche. Questo tipo di rete può essere simulata artificialmente
mediante un tipo particolare di apprendimento per rinforzo.
Si tratta di una variante dell’algoritmo ARP (associative Reward-Penality
– Mazzoni, Andersen e jordan 1991)
Disegno da memoria e corruzione del carattere
Se volete, potete disegnare velocemente un carattere selezionandolo
dalla lista di quelli disponibili. Per far questo dovete selezionare
un carattere dalla lista che riporta la dicitura “N° Cicli”
. Il carattere selezionato verrà disegnato direttamente nella
matrice.
Ora potete provare a “Rovinare” il carattere per vedere
fino a che punto la rete è in grado di riconoscerlo. Il Riconoscimento,
come prima, si effettua premendo il tasto RICONOSCI
Addestramento della rete
Se non vi siete già rotti le scatole, potete effettuare un
nuovo addestramento (invece di caricare quello con cui mi sono divertito
io). Procedete nel seguente modo:
1.Re-Avviate il programma
2.Disegnate un carattere a vostro piacimento nella matrice
3.Inserite nella casella di testo, sottostante alla griglia, il
carattere che volete associare. Questo verrà riportato
nel
box arancione.
4.Premete memo per effettuare l’associazione. Il carattere
verrà riportato nelle liste “N° Cicli”
e “Neuroni associati”.
5.Ripetere i passi 2,3,4 per ogni carattere da far
apprendere alla rete
6.Premere il tasto ADDESTRA per addestrare la rete.
L’addestramento verrà confermato dalla dicitura:
“Addestramento Neuroni completato”
Verifica:
Dovete verificare se le associazioni sono state apprese correttamente.
Selezionate il primo carattere dalla lista “N° Cicli”
e premete il bottone “Riconosci”. Se il carattere che
compare nel box arancione è corretto andate avanti e ripetete
l’operazione per il successivo carattere. Se il carattere non
viene riconosciuto correttamente significa che la rete non è
riuscita ad apprendere la trasformazione. E’ necessario quindi
fornirgli un altro esempio dello stesso carattere. Per far questo
procedete nel seguente modo:
1. Assicurarsi che il carattere specificato sia visualizzato
nella matrice altrimenti selezionarlo dalla lista “ N°
Cicli ”. Supponiamo questo sia un “ 7 ”.
2. Digitare il carattere “7” nella casella
di testo sotto la griglia
3. Modificare il carattere “7” nella griglia
in modo da fornire alla rete un esempio simile per lo stesso
carattere oppure, lasciate il carattere inalterato (se non volete
che la rete apprenda una variante per il carattere considerato).
4. Premere il tasto memo per effettuare l’associazione
(ora nella lista N° Cicli compaiono due esempi per lo stesso
carattere).
5. Premere ADDESTRA per effettuare l’addestramento.
6. Selezionate uno dei due “7”, poi premere
il tasto “Riconosci” e verificate se il carattere viene
riconosciuto correttamente. In caso negativo bisogna ripetere questa
procedura fino a quando il carattere non viene riconosciuto correttamente.
Una volta verificato che tutti i caratteri sono riconosciuti correttamente
se volete potete salvare le associazioni premendo il tasto SAVE. Il
Salvataggio aggiorna il File Supply.txt (o ne crea uno
nuovo se questo non esiste) . Se ci tenete a non perdere il file Supplì.txt
relativo ad un precedente addestramento, rinominate preventivamente
il file Supply.txt. con supplyold.txt ad esempio. Quando avrete bisogno
di ricaricare il vecchio addestramento sarà sufficiente ridare
a supplyold.txt il suo nome originario!
NB: La lista N° Cicli può essere lunga al massimo 21 elementi
Limiti della Rete
La rete Neurale utilizzata è molto semplice (è ad un solo
strato di neuroni).
Aumentando il numero di caratteri aumenta la probabilità che
più neuroni si attivino contemporaneamente in risposta ad un
determinato stimolo di ingresso .Questo fenomeno va sotto il nome
d’interferenza. Per eliminarlo è necessario presentare
alla rete più volte la stessa coppia di addestramento. In questo
modo però, se da una parte si aumenta la selettività della
rete, dall’altro si diminuiscono le capacità della rete
di generalizzare, ossia, si diminuiscono le capacità della rete
di riconoscere caratteri corrotti!
Per ovviare a queste limitazioni è necessario ricorrere a rete
neurali più potenti (ma anche più complesse) come
il Back Propagation.
Bene nel resto dell’articolo chiarirò brevemente il funzionamento
del programma ed il tipo di rete neurale utilizzata. Riguardo questa
non scenderò in dettaglio, pure perché ci vorrebbero molte
pagine e troppo tempo. Il tempo è una risorsa preziosa!
Ad ogni modo per chi non è interessato agli aspetti tecnici
l’articolo finisce qui!
Se volete invece, prendere la via che ho preso io, ossia quella verso
la pazzia, andate avanti e non pensateci più!
2° Parte
Roma, 15/07/2007
By Fabio Pacioni