Machine Learning per la trascrizione automatica di manoscritti
Maximilian Ventura ~ 26 Novembre 2017 ~ Tutorial
Il Machine Learning o apprendimento automatico rappresenta un insieme di metodi sviluppati negli ultimi decenni in varie comunità scientifiche che “fornisce ai computer l’abilità di apprendere senza essere stati esplicitamente programmati”.
Applicare questi metodi per la trascrizione automatica di manoscritti vuol dire avere un algoritmo in grado di riconescere i caratteri. Generalmente si parla di OCR (Optical Character Recognition) quando abbiamo bisogno di un programma in grado di estrarre i contenuti in formato testo da un’immagine. Nel caso specifico un OCR avanzato in grado di leggere i testi scritti a mano.
Cosa c’entra quindi il Machine Learning con l’OCR? C’entra molto perché più dati forniamo al nostro programma e maggiore sarà la quantità di lettere che potrà estrapolare dalle immagini.
In questo articolo vedremo come utilizzare alcuni strumenti open source per la trascrizione di manoscritti. Il tool che ho utilizzato si chiama Ocropy, su GitHub sono presenti le specifiche del progetto.
Tutorial per imparare ad usare Ocropy
1. Installazione
Incominciamo installando (su un pc con Ubuntu o su una macchina virtuale) le dipendenze necessarie:
$ mkdir workingcopy/
$ cd workingcopy/
$ sudo apt install git
$ git init .
$ git pull https://github.com/tmbdev/ocropy
$ sudo apt-get install $(cat PACKAGES)
$ wget -nd http://www.tmbdev.net/en-default.pyrnn.gz
$ mv en-default.pyrnn.gz models/
$ sudo python setup.py install
2. Le immagini
Per avere dei buoni risultati sono necessarie immagini .tif con un’alta risoluzione: 300 DPI o più. Per eseguire questo training ho utilizzato le immagini del seguente manoscritto:
Engelberg, Stiftsbibliothek, Cod. 89, f. 1r
De gratia et libero arbitrio Aurelii Augustini et Bernardi Claraevallensis
http://www.e-codices.unifr.ch/it/bke/0089/1r/0/Sequence-172
Le immagini vanno un po’ elaborate: bisogna trasformarle in bianco e nero, tagliare i bordi, in alcuni casi anche rettificarle. Queste operazioni si possono eseguire con un programma di editing di immagini o usando un piccolo programma open source: ScanTailor.
Prendiamo tutte le immagini che abbiamo elaborato e le inseriamo in una cartella di backup (in questo caso manuscript). Con il primo comando trasformiamo le nostre immagini in B/N, (se non lo abbiamo fatto prima) e le inseriamo in una cartella: bke-0089. Con la seconda riga OCRopy inizia a contare e a suddividere le righe del testo.
$ ocropus-nlbin manuscript/* -o bke-0089
$ ocropus-gpageseg bke-0089/*.bin.png
In base al tipo di manoscritto è possibile avere una quantità maggiore o minore di errori dovuta ad un inesatto conteggio delle righe. Non c’è una regola fissa, questi problemi generalmente si risolvono rettificando le immagini.
3. Machine Learning, ground truth
Nell’ambito del machine learning, con ground truth, si fa riferimento ad un set di dati “corretto” che viene poi utilizzato come modello di riferimento per i calcoli successivi. Per creare il nostro set di dati, con la seguente riga, creeremo il file gt.html
$ ocropus-gtedit html -H 30 bke-0089/*/*.bin.png -o gt.html
In questo file sono presenti le immagini delle singole righe che abbiamo creato in precedenza. In corrispondenza di ogni immagine dobbiamo inserire manualmente l’esatta trascrizione del testo. Se l’immagine non ha caratteri perché nel manoscritto sono presenti miniature o perché la suddivisione in righe non è stata fatta correttamente non dobbiamo inserire alcun testo. Una volta terminata questa fase salviamo il file: nel menu del browser scegliete l’opzione salva pagina con nome, se volete potete cambiare nome per evitare equivoci, io l’ho chiamato gt-new.html
3. Training
Estraiamo i dati da gt-new.html con la seguente riga
$ ocropus-gtedit extract gt-new.html
il risultato sarà la creazione di una serie di file in formato testo inseriti in sottocartelle, una per ogni immagine, all’interno della cartella principale bke-0089.
Per cominciare la fase di training creiamo due cartelle: train e test. Nella prima mettiamo il 90% dei nostri file e il rimanente 10% nell’altra cartella, quali file scegliere per fare il test è a nostra discrezione. La cosa importante è avere le immagini ed i testi a cui fanno riferimento nella stessa cartella. Faccio un esempio: all’immagine 01000a.bin.png corrisponde il testo 01000a.gt.txt Entrambi i file devono essere presenti nella stessa sotto cartella.
4. Training – opzioni
Nella riga di comando prima di “myModel”, potete inserire una serie di opzioni che possono migliorare il riconoscimento dei caratteri. La cosa migliore è cercare un equilibrio tra il tempo che avete a disposizione e la quantità di calcoli che volete eseguire, tenendo presente che questo è solo il primo training, ammesso che ne vogliate fare altri, e quindi la quantità di errori per modello non potrà scendere oltre una certa soglia.
-F questo parametro permette di modificare il numero di iterazioni dopo il quale il modello viene salvato (parametro di default: 1000)
-d 1 permette di vedere una visualizzazione grafica del processo di training in corso (se avete una versione desktop di ubuntu)
-S specifica quanti hidden layer vogliamo, quindi quanto deve essere “profonda” la nostra rete neurale (parametro di default: 100)
-N quante righe di training deve calcolare prima di fermare il processo (parametro di default: 1.000.000, sì un milione!)
Ecco perché per eseguire il mio test ho aumentato la quantità di hidden layer ma ho diminuito il numero di righe.
5. Valutazione e scelta dei modelli
Ricordate la cartella test, con il 10% dei file conservati? È arrivato il momento di usarli per valutare i modelli che abbiamo creato. Sulla riga di comando facciamo eseguire questo codice:
for i in *.pyrnn.gz; do
echo "$i" >> modeltest
ocropus-rpred -m $i test/*/*.bin.png
ocropus-errs test/*/*.gt.txt 2>>modeltest
done
In questo modo vengono utilizzati tutti i modelli che abbiamo salvato per riconoscere i caratteri presenti nelle immagini che abbiamo messo nella cartella test. A schermo vengono visualizzati gli errori, come numero totale e come percentuale, per ciascuno modello. Inserendo i dati in un foglio di calcolo otteniamo questo grafico. A partire dal modello 8 notiamo che i valori si stabilizzano su una percentuale di errore pari al 10%. Anche se facciamo calcolare più modelli la percentuale non si abbassa di molto.
6. Utilizzo dei modelli ed estrazione dei dati
Abbiamo creato 26 modelli, tra questi ne scegliamo uno che abbia una bassa percentuale di errore e lo usiamo come base per il riconoscimento. Nella cartella bke-0089 ho inserito le tre immagini ed ho eseguito nuovamente le istruzioni riportate nel paragrafo Preparazione dei dati. Facciamo partire il comando:
$ ocropus-rpred -n -m myModel-00009000.pyrnn.gz bke-0089/*/*.bin.png
per visualizzare il testo estratto possiamo usare:
$ ocropus-hocr bke-0089/*.bin.png -o bke-0089.html
in questo modo creeremo il file bke-0089.html. Per essere precisi si tratta di un tipo particolare di formato chiamato hOCR. Possiamo aprirlo con un browser e vedremo tutte le righe che OCRopy è riuscito ad estrapolare, ma se analizziamo il codice sorgente sono riportate, per ogni linea, le righe di allineamento con il documento originale.
Machine learning e abbreviazioni. Considerazioni finali
I manoscritti presentano generalmente molte abbreviazioni, simboli convenzionali utilizzati al posto di uno o più caratteri, ciò rende la lettura un po’ faticosa per i non addetti ai lavori. A tal proposito vorrei citare il volume di Adriano Cappelli Dizionario di abbreviature latine e italiane, uno dei testi più importanti per lo studio della paleografia.
Del machine learning mi ha positivamente sorpreso proprio questa capacità, riconoscere e sciogliere abbreviazioni che a volte differiscono per poco dalle lettere “normali”.
Nelle considerazioni finali non può mancarare la domanda “è possibile riutilizzare i modelli creati con altri manoscritti?” Sì ma il risultato dipende dal manoscritto utilizzato. Se i caratteri sono morfologicamente simili allora otterremo buoni risultati, altrimenti sarà molto più conveniente creare un altro training di dati.