File size: 17,519 Bytes
6979863
 
99d5510
6979863
 
 
 
 
 
 
 
 
99d5510
9cb2fe3
e3ef569
6979863
 
9cb2fe3
99d5510
6979863
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
053a285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6979863
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9cb2fe3
 
 
6979863
 
 
053a285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6979863
 
e3ef569
6979863
e3ef569
6979863
e3ef569
6979863
 
e3ef569
 
6979863
 
 
 
 
e3ef569
6979863
 
 
 
 
 
 
 
e3ef569
6979863
 
 
 
 
 
 
 
 
 
1893e17
 
6979863
1893e17
6979863
 
1893e17
 
 
 
6979863
 
 
 
 
 
1893e17
6979863
1893e17
6979863
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9cb2fe3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99d5510
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6979863
 
 
 
b1a81d0
6979863
 
 
99d5510
9cb2fe3
 
 
7b1c987
9cb2fe3
b1a81d0
 
 
6979863
 
 
 
8eef667
 
 
 
 
 
 
 
6979863
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
# GraphoLab — Guida ai Laboratori

Guida pratica ai laboratori dimostrativi di GraphoLab sulla grafologia forense assistita dall'AI (8 lab).

---

## Panoramica

La grafologia forense è l'esame scientifico della scrittura a mano e delle firme a supporto delle indagini legali. L'AI e il machine learning possono automatizzare e scalare molti compiti che gli esperti svolgono tradizionalmente in modo manuale:

| Compito | Approccio AI | Applicazione Forense |
|---------|-------------|----------------------|
| Trascrizione di testo manoscritto | Transformer OCR (TrOCR / EasyOCR) | Lettere anonime, documenti storici |
| Autenticità della firma | Siamese Neural Network (SigNet) | Assegni, contratti, testamenti |
| Localizzazione firma nei documenti | Object Detection (Conditional DETR) | Pipeline di analisi documentale |
| Identificazione dello scrittore | Estrazione feature + classificatore | Paternità contestata |
| Analisi caratteristiche grafologiche | OpenCV + ML | Profiling, analisi comparativa |
| Riconoscimento entità nominate | Classificazione token (BERT-NER) | Persone, luoghi, organizzazioni nei documenti |
| OCR profondo (corsivo italiano) | Vision-Language Model (dots.ocr 1.7B) | Testamenti, corsivo, documenti complessi |

---

## Lab 01 — Introduzione: AI e Grafologia Forense

**File:** `notebooks/01_intro_forensic_graphology.ipynb`

Notebook in stile presentazione, senza codice eseguibile. Tratta:

- Cos'è la grafologia forense e perché è importante
- I limiti dell'analisi puramente manuale
- Come l'AI/ML può potenziare il lavoro dell'esperto
- Mappa concettuale dell'intera pipeline: acquisizione → preprocessing → analisi AI → referto forensico
- Panoramica di tutti i laboratori successivi

**Prerequisiti:** Nessuno.
**Destinatari:** Tutti i livelli, inclusi stakeholder non tecnici.

---

## Lab 02 — Riconoscimento del Testo Manoscritto (HTR/OCR)

**File:** `notebooks/02_handwritten_ocr_trocr.ipynb`

Utilizza **TrOCR** (`microsoft/trocr-base-handwritten` su Hugging Face) per trascrivere automaticamente testo manoscritto da immagini.

**Cosa imparerai:**
- Come funziona l'OCR basato su Transformer (encoder visivo BEiT + decoder testuale RoBERTa)
- Come caricare ed eseguire un modello HTR pre-addestrato tramite la libreria `transformers`
- Come preprocessare immagini di testo manoscritto per il modello
- Come interpretare e visualizzare l'output della trascrizione

**Flusso della demo:**
1. Caricare un'immagine di testo manoscritto da `data/samples/`
2. Eseguire l'inferenza con TrOCR
3. Visualizzare l'immagine originale affiancata al testo trascritto
4. (Opzionale) Confrontare con la trascrizione di riferimento e calcolare il CER (Character Error Rate)

**Casi d'uso forensi:**
- Trascrizione automatica di lettere minatorie anonime
- Digitalizzazione di documenti giudiziari manoscritti storici
- Fase di pre-elaborazione per pipeline di identificazione dell'autore

**Prerequisiti:** `transformers`, `torch`, `Pillow`

### EasyOCR vs TrOCR — Confronto architetturale

L'app Gradio usa **EasyOCR** invece di TrOCR per l'inferenza interattiva. EasyOCR **non** è un Transformer — utilizza una pipeline classica CNN + RNN:

| | EasyOCR | TrOCR |
|---|---|---|
| Architettura | CNN + BiLSTM + CTC | Transformer encoder-decoder |
| Rilevamento testo | CRAFT (mappa di calore CNN) | — (input a livello di riga) |
| Encoder visivo | CNN VGG-based | BEiT (Vision Transformer) |
| Decoder | LSTM bidirezionale + CTC | RoBERTa |
| Contesto linguistico | Limitato (LSTM locale) | Ampio (self-attention globale) |
| Velocità su CPU | ~1–3 s/immagine | ~10–20 s/immagine |
| Qualità corsivo italiano | Discreta | Migliore |
| Memoria RAM | ~200 MB | ~400 MB |

**Quando usare quale:** EasyOCR è la scelta giusta per le demo interattive (veloce, poco memoria). TrOCR — e soprattutto dots.ocr (Lab 08) — sono preferibili quando la qualità della trascrizione su corsivo italiano complesso è prioritaria.

---

## Lab 03 — Verifica dell'Autenticità della Firma

**File:** `notebooks/03_signature_verification_siamese.ipynb`

Utilizza una **Siamese Neural Network** (architettura SigNet) per confrontare due immagini di firme e determinare se la firma in esame è autentica o contraffatta.

**Cosa imparerai:**
- Il paradigma della rete siamese per il one-shot similarity learning
- Come SigNet codifica le immagini di firme in vettori di feature
- Come calcolare uno score di similarità (o distanza) tra due firme
- Come impostare una soglia decisionale per la classificazione autentica / contraffatta

**Flusso della demo:**
1. Caricare una firma di riferimento e una firma in esame da `data/samples/`
2. Estrarre gli embedding di feature con il codificatore SigNet
3. Calcolare lo score di similarità coseno
4. Visualizzare: verdetto autentica / contraffatta + score di confidenza

**Casi d'uso forensi:**
- Verifica di firme su assegni bancari
- Autenticazione di firme su contratti, testamenti e atti legali
- Rilevamento di firme tracciate o riprodotte digitalmente

**Prerequisiti:** `torch`, `scikit-image`, `Pillow`

**Nota:** I pesi SigNet pre-addestrati (`models/signet.pth`) sono stati addestrati sul dataset di firme **GPDS**. I campioni demo provengono dal database **CEDAR** (`data/samples/genuine_N_M.png` / `forged_N_M.png`) e sono stati pre-selezionati affinché il modello rilevi correttamente la contraffazione.

**Riferimento:** [luizgh/sigver](https://github.com/luizgh/sigver) — implementazione SigNet e pesi pre-addestrati.

### Generalizzazione a firmatari non presenti nel training set

SigNet utilizza il **metric learning** (rete siamese con contrastive loss), non un classificatore tradizionale. Questa è una distinzione architetturale fondamentale:

- Un **classificatore** impara "chi è la persona X" — non può generalizzare a identità mai viste.
- Un **modello siamese/metrico** impara "queste due firme provengono dalla stessa mano?" — la domanda è indipendente dall'identità e generalizza a qualsiasi firmatario, inclusi quelli mai visti durante il training.

In pratica, SigNet può essere applicata a **qualsiasi coppia di firme**, indipendentemente dal fatto che il firmatario sia presente in GPDS o CEDAR.

**Limitazioni note:**

| Limitazione | Dettaglio |
|---|---|
| Bias culturale/stilistico | GPDS contiene principalmente firme brasiliane/portoghesi; firme italiane o non latine possono uscire dalla distribuzione di training |
| Calibrazione della soglia | La soglia 0.35 (distanza coseno) è ottimizzata su CEDAR; per firmatari con stile insolitamente compatto o elaborato potrebbe richiedere aggiustamenti |
| Tipo di falsificazione | Addestrato su *skilled forgeries* (il falsificatore ha praticato la firma); le performance su falsificazioni rozze sono generalmente migliori, su quelle professionali comparabili a un esperto umano |
| Qualità dell'immagine | Le performance degradano con foto di documenti su carta colorata, piegata o con timbri sovrapposti |

**Indicazione pratica:** Usare SigNet come **strumento di screening di primo livello**. Non è certificato per testimonianza forense legale autonoma; i risultati devono sempre essere revisionati da un esaminatore qualificato.

---

## Lab 04 — Rilevamento Firma nei Documenti (Conditional DETR)

**File:** `notebooks/04_signature_detection_detr.ipynb`

Utilizza un modello **Conditional DETR** fine-tuned per il rilevamento di firme (`tech4humans/conditional-detr-50-signature-detector` su Hugging Face) per localizzare automaticamente le firme all'interno di documenti scansionati.

**Cosa imparerai:**
- Come funziona la rilevazione di oggetti Conditional DETR nel contesto dell'analisi documentale
- Come caricare un modello Hugging Face con la libreria `transformers`
- Come eseguire l'inferenza su immagini di documenti e interpretare i bounding box
- Come visualizzare le regioni rilevate e ritagliarle per l'elaborazione successiva

**Flusso della demo:**
1. Caricare un'immagine di documento scansionato da `data/samples/`
2. Eseguire l'inferenza Conditional DETR
3. Disegnare i bounding box attorno alle firme rilevate
4. Ritagliare e salvare ciascuna firma rilevata per l'uso nel Lab 03

**Casi d'uso forensi:**
- Estrazione automatica di firme da documenti legali multi-pagina
- Primo passo di una pipeline: rileva → estrai → verifica
- Screening di grandi archivi documentali per la presenza di firme

**Prerequisiti:** `transformers`, `timm`, `opencv-python`, `Pillow`

---

## Lab 05 — Identificazione dello Scrittore

**File:** `notebooks/05_writer_identification.ipynb`

Confronta le caratteristiche stilistiche di un campione manoscritto anonimo con un insieme di campioni di riferimento noti per attribuire la paternità del documento.

**Cosa imparerai:**
- Come estrarre feature stilistiche della scrittura: HOG (Histogram of Oriented Gradients), LBP (Local Binary Patterns) e statistiche di run-length orizzontali/verticali
- Come costruire una pipeline di identificazione basata su SVM con scikit-learn (`StandardScaler` + `SVC` con kernel RBF)
- Come valutare l'accuratezza dell'identificazione tramite cross-validation
- Come presentare i risultati come lista ordinata di autori candidati con punteggi di probabilità

**Flusso della demo:**
1. Caricare il database di campioni di riferimento da `data/samples/writer_XX/` (cinque scrittori, 41 campioni ciascuno)
2. Estrarre le feature HOG + LBP + run-length da ciascun campione
3. Addestrare un classificatore SVM (`C=10`, `gamma="scale"`, `probability=True`)
4. Caricare un campione anonimo → lista ordinata di candidati con punteggi di probabilità

**Casi d'uso forensi:**
- Attribuzione di lettere minatorie anonime
- Verifica della paternità di documenti contestati
- Ricerca sulla provenienza di documenti storici

**Prerequisiti:** `scikit-learn`, `scikit-image`, `Pillow`, `numpy`

**Nota sul dataset:** La demo utilizza un database di scrittura sintetica in `data/samples/writer_XX/` (cinque scrittori, 41 campioni ciascuno) generato con font TTF di sistema (Ink Free, Lucida Handwriting, Segoe Print, Segoe Script, Comic Sans) per garantire stili distinti e riproducibili. Per uso in produzione, sostituire con scansioni reali di scrittura a mano. Il [IAM Handwriting Database](https://fki.tic.heia-fr.ch/databases/iam-handwriting-database) è il benchmark forense standard.

---

## Lab 06 — Analisi delle Caratteristiche Grafologiche

**File:** `notebooks/06_graphological_feature_analysis.ipynb`

Estrae e visualizza automaticamente le caratteristiche grafologiche di un campione di testo manoscritto utilizzando la computer vision classica e l'elaborazione del segnale.

**Cosa imparerai:**
- Come segmentare la scrittura in parole e caratteri con OpenCV
- Come misurare: angolo di inclinazione delle lettere, spaziatura parole/caratteri, altezza e larghezza delle lettere, pressione del tratto (distribuzione dell'intensità dei pixel)
- Come costruire una dashboard visiva delle metriche grafologiche
- Come confrontare due campioni ed evidenziare le differenze

**Flusso della demo:**
1. Caricare un'immagine di testo manoscritto da `data/samples/`
2. Pre-elaborare (binarizzare, denoisare, raddrizzare)
3. Segmentare in righe, parole e caratteri
4. Calcolare e visualizzare le metriche con annotazioni sull'immagine
5. (Opzionale) Confrontare due campioni affiancati

**Casi d'uso forensi:**
- Supporto alla testimonianza peritale con misurazioni oggettive e riproducibili
- Rilevamento di indicatori di stress nella scrittura (variazione della pressione del tratto)
- Analisi comparativa tra un campione di riferimento e un documento contestato

**Prerequisiti:** `opencv-python`, `numpy`, `matplotlib`, `scipy`

---

## Lab 07 — Riconoscimento Entità Nominate (NER)

**File:** `notebooks/07_named_entity_recognition.ipynb`

Utilizza un modello **BERT-NER** multilingue (`Babelscape/wikineural-multilingual-ner`) per estrarre automaticamente entità nominate — persone, organizzazioni, luoghi — da qualsiasi testo. Ideale come secondo passo dopo la trascrizione HTR.

**Cosa imparerai:**
- Come funziona la classificazione token BERT (schema BIO)
- Come caricare ed eseguire una pipeline NER multilingue tramite `transformers`
- Come visualizzare gli span di entità con evidenziazione colorata
- Come costruire una pipeline completa HTR → NER per l'analisi di documenti manoscritti

**Flusso della demo:**
1. NER su testo italiano (es. testamento o dichiarazione)
2. NER su testo inglese (supporto multilingue)
3. Pipeline completa: immagine manoscritto → trascrizione TrOCR → estrazione entità NER
4. Analisi della distribuzione delle entità e della confidenza

**Casi d'uso forensi:**
- Identificare automaticamente persone, luoghi e organizzazioni in documenti manoscritti
- Analizzare lettere anonime alla ricerca di nomi propri (nomi, indirizzi)
- Costruire un grafo delle relazioni tra entità in un corpus documentale

**Prerequisiti:** `transformers`, `torch`, `opencv-python`, `Pillow`, `matplotlib`

---

## Lab 08 — dots.ocr: OCR con Vision-Language Model

**File:** `notebooks/08_dots_ocr_vlm.ipynb`

Utilizza **dots.ocr** (`rednote-hilab/dots.ocr`) — un Vision-Language Model da 1,7 miliardi di parametri — per trascrivere testo manoscritto da immagini di documenti. A differenza degli OCR CNN, il componente LLM sfrutta il contesto linguistico per correggere le ambiguità visive, risultando più efficace sul corsivo italiano.

**Cosa imparerai:**

- Come l'OCR basato su VLM si differenzia da TrOCR ed EasyOCR (tabella comparativa delle architetture)
- Come eseguire un check hardware e scegliere la configurazione di inferenza giusta (CPU / GPU)
- Come caricare ed eseguire dots.ocr via `transformers` con dtype e attention adattativi
- Come misurare e confrontare la qualità della trascrizione (CER) tra EasyOCR e dots.ocr

**Flusso della demo:**

1. Check hardware — rileva GPU/RAM e seleziona automaticamente CPU fp32 o CUDA bf16
2. Caricamento dots.ocr da Hugging Face (~3,5 GB bf16, ~7 GB fp32)
3. Trascrizione di un campione writer_00 (immagine singola 320×140)
4. Trascrizione del documento completo `testamento_writer00.png`
5. Trascrizione di campioni reali dal dataset Lorella
6. Confronto EasyOCR vs dots.ocr affiancati + misurazione CER

**Casi d'uso forensi:**

- OCR di alta qualità su scrittura corsiva italiana
- Documenti con tabelle, formule o layout complessi
- Quando i risultati di EasyOCR non sono sufficienti per i requisiti di accuratezza forense

**Prerequisiti:** `transformers>=4.49`, `qwen_vl_utils`, `torch`, `Pillow`, `psutil`, `accelerate`

**Nota hardware:** Su CPU (~7 GB RAM libera), l'inferenza richiede 2–5 min per immagine. Su GPU ≥8 GB VRAM, 5–10 secondi. Non adatto a demo interattive in tempo reale — usare EasyOCR nell'app Gradio.

**Installazione (una tantum — vedi cella nel notebook):**

```bash
git clone https://github.com/rednote-hilab/dots.ocr.git DotsOCR
pip install -e DotsOCR
pip install qwen_vl_utils accelerate
```

**Riferimento:** [arxiv 2512.02498](https://arxiv.org/abs/2512.02498) — RedNote / Xiaohongshu, dic 2024.

---

## Demo Interattiva (Gradio)

**File:** `app/grapholab_demo.py`

Un'applicazione Gradio multi-tab accessibile da browser (completamente in italiano) che aggrega nove funzionalità AI:

| Tab | Funzionalità |
|-----|-------------|
| OCR Manoscritto | Carica un'immagine (riga singola o multi-riga) → testo trascritto (EasyOCR) |
| Verifica Firma | Carica due firme → verdetto autentica / falsa |
| Rilevamento Firma | Carica un documento → immagine annotata con firme rilevate |
| Riconoscimento Entità | Inserisci testo → entità evidenziate + tabella riepilogativa |
| Identificazione Scrittore | Carica un campione di scrittura → lista di autori candidati con punteggi di probabilità |
| Analisi Grafologica | Carica testo manoscritto → dashboard di metriche visive |
| Perizia Forense Automatica | Carica documento (+ firma opzionale) → referto forense completo (7 step: rilevamento firma, HTR, NER, identificazione scrittore, grafologia, verifica firma, sintesi LLM via Ollama) |
| Datazione Documenti | Carica più immagini di documenti → ordinamento cronologico per data estratta (EasyOCR + dateparser) |
| Consulente Forense IA | Chatbot RAG: carica PDF/DOCX per arricchire la knowledge base, poi fai domande con risposta generata da un LLM Ollama locale |

**Avvio in locale:**

```bash
# Crea e attiva un virtual environment (consigliato)
python -m venv .venv

# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activate

pip install -r requirements.txt
python app/grapholab_demo.py
# Apri http://localhost:7860
```

---

## Esecuzione con Docker

```bash
# JupyterLab su http://localhost:8888  (token: grapholab)
docker compose up jupyter

# Demo Gradio su http://localhost:7860
docker compose up gradio

# Entrambi i servizi insieme
docker compose up
```

La cache dei modelli Hugging Face è memorizzata in un volume Docker dedicato (`grapholab-hf-cache`) e condivisa tra i due servizi. I modelli vengono scaricati una sola volta.

---

## Dati di Esempio

Le immagini di esempio si trovano in `data/samples/`:

| File | Usato in |
|------|---------|
| `handwritten_text_*.png` | Lab 02, 05, 06 |
| `signature_genuine_*.png` | Lab 03, 04 |
| `signature_forged_*.png` | Lab 03 |
| `document_with_signature_*.png` | Lab 04 |

È possibile sostituire o integrare questi file con immagini proprie per sperimentare con casi reali.