Spaces:
Running
A newer version of the Gradio SDK is available: 6.14.0
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:
- Caricare un'immagine di testo manoscritto da
data/samples/ - Eseguire l'inferenza con TrOCR
- Visualizzare l'immagine originale affiancata al testo trascritto
- (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:
- Caricare una firma di riferimento e una firma in esame da
data/samples/ - Estrarre gli embedding di feature con il codificatore SigNet
- Calcolare lo score di similarità coseno
- 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 — 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:
- Caricare un'immagine di documento scansionato da
data/samples/ - Eseguire l'inferenza Conditional DETR
- Disegnare i bounding box attorno alle firme rilevate
- 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+SVCcon 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:
- Caricare il database di campioni di riferimento da
data/samples/writer_XX/(cinque scrittori, 41 campioni ciascuno) - Estrarre le feature HOG + LBP + run-length da ciascun campione
- Addestrare un classificatore SVM (
C=10,gamma="scale",probability=True) - 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 è 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:
- Caricare un'immagine di testo manoscritto da
data/samples/ - Pre-elaborare (binarizzare, denoisare, raddrizzare)
- Segmentare in righe, parole e caratteri
- Calcolare e visualizzare le metriche con annotazioni sull'immagine
- (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:
- NER su testo italiano (es. testamento o dichiarazione)
- NER su testo inglese (supporto multilingue)
- Pipeline completa: immagine manoscritto → trascrizione TrOCR → estrazione entità NER
- 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
transformerscon dtype e attention adattativi - Come misurare e confrontare la qualità della trascrizione (CER) tra EasyOCR e dots.ocr
Flusso della demo:
- Check hardware — rileva GPU/RAM e seleziona automaticamente CPU fp32 o CUDA bf16
- Caricamento dots.ocr da Hugging Face (~3,5 GB bf16, ~7 GB fp32)
- Trascrizione di un campione writer_00 (immagine singola 320×140)
- Trascrizione del documento completo
testamento_writer00.png - Trascrizione di campioni reali dal dataset Lorella
- 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):
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 — 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:
# 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
# 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.