grapholab / docs /NOTEBOOKS_GUIDE_IT.md
Fabio Antonini
docs: update all YOLOv8 references to Conditional DETR
e3ef569
# 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.