Spaces:
Sleeping
Sleeping
File size: 33,713 Bytes
f0641dd 1af6b22 f0641dd cecde1f f0641dd | 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 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 | # Picarones — Spécifications Fonctionnelles et Techniques
> **Plateforme de comparaison et d'évaluation de moteurs OCR/HTR et de pipelines OCR+LLM pour documents patrimoniaux**
>
> Version 1.0 — Mars 2025
---
## Table des matières
1. [Vision générale et positionnement](#1-vision-générale-et-positionnement)
2. [Architecture générale](#2-architecture-générale)
3. [Module 1 — Gestion des corpus et imports](#3-module-1--gestion-des-corpus-et-imports)
4. [Module 2 — Adaptateurs moteurs OCR](#4-module-2--adaptateurs-moteurs-ocr)
5. [Module 3 — Pipelines OCR+LLM](#5-module-3--pipelines-ocrllm)
6. [Module 4 — Métriques et analyse](#6-module-4--métriques-et-analyse)
7. [Module 5 — Rapport interactif HTML](#7-module-5--rapport-interactif-html)
8. [Module 6 — Interface de lancement et CLI](#8-module-6--interface-de-lancement-et-cli)
9. [Fonctionnalités avancées](#9-fonctionnalités-avancées)
10. [Plan de développement](#10-plan-de-développement)
11. [Exigences non fonctionnelles](#11-exigences-non-fonctionnelles)
---
## 1. Vision générale et positionnement
### 1.1 Problématique
Les équipes OCR/HTR travaillant sur des fonds patrimoniaux (manuscrits, imprimés anciens, archives) disposent d'un paysage de moteurs hétérogène — moteurs locaux (Tesseract, Pero OCR, Kraken), solutions cloud (Mistral OCR, Google Vision, AWS Textract), modèles fine-tunés maison — sans outil unifié pour les comparer rigoureusement sur leurs propres corpus.
Les outils existants (ocrevalUAtion, dinglehopper) sont soit obsolètes, soit limités au CER/WER, soit non adaptés aux spécificités des documents historiques : glyphes anciens, ligatures, abréviations, graphies variables, pathologies d'image.
À cela s'ajoute une question de recherche émergente : **est-ce qu'une couche de correction par LLM améliore réellement la sortie OCR, de combien, sur quels types d'erreurs ?** Aucun outil existant ne permet de tester et mesurer cela rigoureusement.
**Picarones** comble ce vide en proposant une plateforme complète, open-source, pensée pour le milieu patrimonial, capable de comparer des moteurs OCR seuls **et** des pipelines OCR+LLM.
### 1.2 Objectifs stratégiques
- Permettre une évaluation rigoureuse, reproductible et multi-dimensionnelle des moteurs OCR/HTR sur des corpus patrimoniaux réels
- Évaluer l'apport réel des LLMs en post-correction OCR, en termes de qualité
- Produire des rapports interactifs exploitables par des profils variés : ingénieurs, chercheurs, responsables de projets de numérisation
- S'intégrer dans les workflows patrimoniaux existants (IIIF, eScriptorium, HTR-United, Gallica)
- Offrir une base extensible pour le suivi longitudinal de la qualité OCR dans le temps
### 1.3 Utilisateurs cibles
| Profil | Besoins principaux |
|---|---|
| Ingénieur OCR/ML | Pipeline programmatique, métriques fines, export JSON/CSV, CI/CD |
| Chargé de numérisation | Rapport visuel, comparaison simple A vs B, recommandation de moteur |
| Responsable de projet | Vue agrégée, graphiques, export PDF, analyse coût/bénéfice des APIs |
| Chercheur en humanités numériques | Métriques diplomatiques, corpus HTR-United, analyse des erreurs par catégorie |
| Paléographe | Diff visuel sur l'image, annotation inline des cas difficiles |
### 1.4 Proposition de valeur unique
Picarones est le seul outil combinant :
1. **Métriques adaptées aux documents historiques** (glyphes, ligatures, diacritiques, abréviations, normalisation diplomatique)
2. **Évaluation des pipelines OCR+LLM** avec mesure du delta de qualité
3. **Intégration native des standards bibliothéconomiques** (IIIF, ALTO, PAGE XML, HTR-United, eScriptorium, Gallica)
4. **Rapport interactif auto-contenu** exploitable sans compétences techniques
---
## 2. Architecture générale
### 2.1 Vue d'ensemble
```
┌──────────────────────────────────────────────────────────────────────────┐
│ PICARONES │
│ │
│ ┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────┐ │
│ │ Import / │ │ Pipeline │ │ Rapport │ │
│ │ Corpus Mgmt │──▶│ Orchestrator │──▶│ Interactif │ │
│ └─────────────────┘ └──────────────────────┘ └─────────────────┘ │
│ ▲ │ │ │
│ IIIF / Gallica ┌──────▼──────┐ HTML self-contained │
│ HTR-United │ Moteurs │ Export PDF/CSV/ALTO │
│ HuggingFace │ OCR │ │
│ eScriptorium └──────┬──────┘ │
│ Dossier local │ │
│ ┌──────▼──────┐ │
│ │ Couche │ │
│ │ LLM │ ◀── optionnelle │
│ │ (optionel) │ │
│ └─────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
```
### 2.2 Stack technique
| Couche | Technologie | Justification |
|---|---|---|
| Backend / Pipeline | Python 3.11+ | Écosystème OCR mature, jiwer, Pillow, NumPy |
| API serveur | FastAPI | Async, auto-documentation OpenAPI, léger |
| Rapport interactif | HTML + Vanilla JS + Chart.js + diff2html | Zéro dépendance runtime, fichier unique transportable |
| Configuration | YAML | Déclaration simple des moteurs et paramètres |
| Stockage résultats | JSON + SQLite optionnel | Léger, portable, requêtable |
| CLI | Click (Python) | Usage sans interface, intégration CI/CD |
### 2.3 Principes d'architecture
- **Moteur-agnostique** : chaque moteur OCR ou LLM est un adaptateur interchangeable, déclaré en YAML
- **Pipeline composable** : un "concurrent" peut être un moteur seul (`tesseract`), un pipeline (`tesseract → gpt-4o`), ou un LLM seul en mode zero-shot (`gpt-4o`)
- **Pipeline idempotent** : les sorties sont cachées par hash d'image, relance partielle possible
- **Rapport auto-contenu** : le fichier HTML final embarque toutes les données, lisible hors-ligne
- **Traçabilité complète** : versions des moteurs, paramètres, prompts LLM utilisés, dates d'exécution — tout est loggé dans les métadonnées du rapport
---
## 3. Module 1 — Gestion des corpus et imports
### 3.1 Formats de vérité terrain acceptés
| Format | Extension | Usage typique |
|---|---|---|
| Texte brut parallèle | `image.jpg` + `image.gt.txt` | Convention Tesseract, HTR-United |
| ALTO XML | `.alto.xml` | Standard bibliothèques nationales, eScriptorium export |
| PAGE XML | `.page.xml` | Transkribus, OCRopus |
| JSON HuggingFace | `dataset.json` | HuggingFace Datasets |
| eScriptorium export | `.zip` (PAGE+images) | Export natif eScriptorium |
| CSV simple | `image,texte_gt` | Exports maison, tableaux Callico |
### 3.2 Sources d'import
#### 3.2.1 Dossier local
Import d'un dossier contenant des paires image/GT. Détection automatique du format. Prévisualisation du corpus avant lancement (nombre de documents, longueur moyenne de GT, aperçu des images).
#### 3.2.2 Import IIIF — fonctionnalité clé
L'intégration IIIF est la fonctionnalité d'import la plus stratégique pour le contexte patrimonial. Elle permet d'accéder directement aux fonds numérisés de toutes les grandes bibliothèques sans téléchargement manuel.
- Import par URL de manifeste IIIF v2 et v3
- Sélection des canvas (pages) via interface de sélection visuelle
- Récupération des annotations de transcription si le manifeste les contient
- Compatibilité : Gallica (BnF), Bodleian, BL, BSB, e-codices, Europeana et tout entrepôt IIIF-compliant
- Résolution configurable des images
> **Exemple :** coller l'URL du manifeste Gallica d'un incunable, sélectionner 50 pages, lancer le benchmark. La GT est fournie séparément ou issue d'un export eScriptorium.
#### 3.2.3 Import HuggingFace Datasets
- Recherche et prévisualisation de datasets OCR/HTR
- Filtrage par langue, type de script, époque, institution
- Datasets patrimoniaux pré-référencés : IAM, RIMES, READ-BAD, Esposalles, Bozen-Baptism, datasets HTR-United
- Import partiel : sous-ensemble aléatoire ou filtré
- Cache local avec gestion des versions
#### 3.2.4 Import HTR-United
- Listing et recherche dans le catalogue HTR-United
- Import direct des corpus publiés (Bréviaires, chartes médiévales, registres paroissiaux, presse ancienne...)
- Lecture des métadonnées : langue, script, institution, époque, nombre de lignes
#### 3.2.5 Import Gallica (API BnF)
- Recherche dans Gallica par cote, titre, auteur, date
- Récupération des images via API IIIF Gallica
- Récupération de l'OCR Gallica existant comme moteur de référence ou GT partielle
#### 3.2.6 Import eScriptorium
- Connexion à une instance eScriptorium locale ou distante via API
- Import de projets, documents et transcriptions
- Export des résultats de benchmark vers eScriptorium
### 3.3 Gestion des corpus
- Corpus nommés et versionnés avec métadonnées descriptives
- Tags : type de script (gothique, humanistique, caroline, textura, cursive, imprimé ancien...), langue, siècle, institution, état de conservation
- Statistiques : distribution des longueurs de GT, histogramme des scores de qualité image, aperçu des caractères unicode présents
- Partage de corpus (format JSON exportable/importable)
- Corpus de référence fournis avec Picarones : 100 documents représentatifs multi-scripts pour benchmarks rapides
---
## 4. Module 2 — Adaptateurs moteurs OCR
### 4.1 Architecture des adaptateurs
Chaque moteur OCR est un adaptateur Python standardisé exposant une interface commune. Ajouter un nouveau moteur = créer un fichier YAML de configuration et, si nécessaire, une classe Python de ~30 lignes.
### 4.2 Moteurs OCR supportés nativement
| Moteur | Type | Priorité | Notes |
|---|---|---|---|
| Tesseract 5 | Local CLI | v1.0 | `pytesseract`, multi-langues, LSTM |
| Pero OCR | Local Python | v1.0 | Excellent sur documents historiques |
| Kraken | Local Python | v1.0 | Référence HTR manuscrits, compatible eScriptorium |
| Mistral OCR | API REST | v1.0 | Mistral OCR 3, multimodal |
| Google Vision | API REST | v1.1 | Document AI, bonne couverture unicode |
| AWS Textract | API REST | v1.1 | Détection layout avancée |
| Azure Document Intelligence | API REST | v1.1 | Anciennement Form Recognizer |
| Calamari | Local Python | v1.1 | Basé TF, modèles pré-entraînés HTR |
| OCRopus4 | Local Python | v1.2 | Historique, utile pour comparaison |
| Moteur custom | CLI/API YAML | v1.0 | Déclaration YAML, aucun code requis |
### 4.3 Configuration d'un moteur (YAML)
```yaml
# Moteur custom via CLI
name: mon_ocr_interne
type: cli
command: "mon_ocr {input_image} --output {output_file} --lang fra"
output_format: txt
version_command: "mon_ocr --version"
# Moteur via API REST
name: api_ocr_bnf
type: api
endpoint: http://localhost:8080/ocr
method: POST
image_field: file
response_path: $.result.text
```
### 4.4 Gestion de l'exécution
- Parallélisation configurable : N moteurs tournent en parallèle
- Cache des sorties par hash SHA-256 de l'image — relance partielle possible
- Timeout configurable par moteur, avec rapport d'erreur si dépassé
- Retry automatique sur erreur transitoire (rate limit, timeout réseau) avec backoff exponentiel
- Rapport d'avancement en temps réel : barre de progression par moteur, ETA
- Mode dry-run : validation de la configuration sans lancer les moteurs
---
## 5. Module 3 — Pipelines OCR+LLM
> Ce module est la fonctionnalité la plus originale de Picarones. Il permet de tester l'apport réel d'une couche de correction LLM sur une sortie OCR, et de comparer des pipelines complets entre eux.
### 5.1 Concept de "concurrent"
Dans Picarones, l'unité de comparaison est le **concurrent** — pas forcément un moteur OCR seul, mais n'importe quelle combinaison produisant du texte à partir d'une image :
| Type de concurrent | Description | Exemple |
|---|---|---|
| OCR seul | Un moteur OCR classique | `tesseract` |
| LLM zero-shot | Le LLM reçoit uniquement l'image | `gpt-4o` en mode vision |
| OCR → LLM (texte) | Le LLM reçoit la sortie OCR brute et corrige | `tesseract → mistral-large` |
| OCR → LLM (image + texte) | Le LLM reçoit image ET sortie OCR | `pero_ocr → gpt-4o` |
| OCR → LLM → LLM | Chaîne de correction en deux passes | `tesseract → llm1 → llm2` |
Ce modèle composable permet de tester toutes les configurations imaginables et de mesurer l'apport exact de chaque couche.
### 5.2 LLMs supportés
| LLM | Type | Modes supportés | Priorité |
|---|---|---|---|
| GPT-4o / GPT-4o mini | API OpenAI | texte seul, image+texte, zero-shot | v1.0 |
| Claude Sonnet / Haiku | API Anthropic | texte seul, image+texte, zero-shot | v1.0 |
| Mistral Large / Pixtral | API Mistral | texte seul, image+texte, zero-shot | v1.0 |
| Llama 3 (via Ollama) | Local | texte seul | v1.1 |
| Gemma / Phi (via Ollama) | Local | texte seul | v1.1 |
| LLM custom | API REST YAML | configurable | v1.0 |
### 5.3 Modes de correction LLM
#### Mode 1 — Post-correction texte brut
Le LLM reçoit uniquement la sortie OCR textuelle et un prompt de correction. Le plus rapide.
```
[Sortie OCR brute] ──▶ [LLM + prompt] ──▶ [Texte corrigé]
```
**Usage typique :** correction rapide sur grand volume, LLM non multimodal (Llama local), test de la valeur ajoutée d'un LLM de correction pur.
#### Mode 2 — Post-correction avec image
Le LLM reçoit l'image originale ET la sortie OCR. Permet au LLM de vérifier visuellement les passages ambigus.
```
[Image] ──────────────┐
▼
[Sortie OCR brute] ──▶ [LLM multimodal + prompt] ──▶ [Texte corrigé]
```
**Usage typique :** meilleure qualité, test de la valeur ajoutée du contexte visuel pour la correction.
#### Mode 3 — Zero-shot LLM
Le LLM reçoit uniquement l'image, sans sortie OCR préalable. Teste la capacité de transcription native du LLM.
```
[Image] ──▶ [LLM multimodal + prompt] ──▶ [Transcription]
```
**Usage typique :** évaluer si GPT-4o ou Claude peut remplacer un moteur OCR sur des documents patrimoniaux.
### 5.4 Système de prompts
Les prompts LLM sont configurables, versionnés et font partie intégrante des métadonnées du rapport.
```yaml
# Configuration d'un concurrent OCR+LLM
name: tesseract_gpt4o_correction
type: pipeline
steps:
- engine: tesseract
config:
lang: fra
psm: 6
- llm: gpt-4o
mode: text_and_image # text_only | text_and_image | zero_shot
prompt: prompts/correction_medieval_french.txt
temperature: 0.0
max_tokens: 4096
```
```
# prompts/correction_medieval_french.txt
Tu es un expert en paléographie et en transcription de documents en français médiéval.
On te fournit la sortie brute d'un moteur OCR et l'image originale du document.
Ta tâche est de corriger les erreurs de transcription en te basant sur :
- Le contexte linguistique (français médiéval, XVe siècle)
- Les confusions visuelles typiques de l'OCR (rn/m, l/1, u/n, ſ/f...)
- Les abréviations et ligatures médiévales visibles sur l'image
Retourne UNIQUEMENT le texte corrigé, sans commentaire ni explication.
Conserve fidèlement la graphie originale (ne modernise pas l'orthographe).
OCR BRUT :
{ocr_output}
```
- Bibliothèque de prompts intégrée : prompts optimisés pour manuscrits médiévaux, imprimés anciens, cursives administratives, latin, documents mixtes
- Versionning des prompts : le prompt exact utilisé est stocké dans le JSON de résultats
- Comparaison de prompts : tester différents prompts sur le même concurrent OCR+LLM
### 5.5 Questions de recherche adressées par ce module
Picarones permet de répondre empiriquement, sur vos propres corpus, à des questions qui font débat :
1. **Un LLM améliore-t-il systématiquement la sortie OCR ?** (Pas toujours — il peut halluciner)
2. **Le mode image+texte est-il meilleur que texte seul ?** (Coût plus élevé, apport variable)
3. **Un LLM zero-shot peut-il remplacer un moteur OCR sur des documents anciens ?**
4. **Sur quels types d'erreurs le LLM apporte-t-il le plus ?** (Diacritiques ? Abréviations ? Hapax ?)
5. **Y a-t-il un risque de sur-normalisation ?** Le LLM modernise-t-il à tort la graphie médiévale ?
6. **Quel est le seuil de CER OCR en dessous duquel un LLM n'apporte plus rien ?**
7. **Quel est le seuil de CER OCR en dessous duquel un LLM n'apporte plus rien ?**
---
## 6. Module 4 — Métriques et analyse
> L'objectif est de fournir la vision la plus complète possible, adaptée aux spécificités des documents patrimoniaux — bien au-delà du CER/WER brut.
### 6.1 Métriques de base
#### CER — Character Error Rate
- CER brut (distance d'édition caractère / longueur GT)
- CER avec normalisation Unicode NFC
- CER sans distinction de casse
- CER diplomatique : avec table de correspondances historiques (ſ=s, u=v, i=j...)
- CER par ligne : distribution, médiane, percentiles P90/P95
- Intervalles de confiance à 95% par bootstrap (1000 itérations)
#### WER — Word Error Rate
- WER brut et normalisé
- WER avec tokenisation historique (traits d'union, abréviations)
- Match Error Rate (MER) et Word Information Lost (WIL)
#### Métriques de précision/rappel
- Précision et rappel au niveau caractère, mot, ligne
- F1-score global et par classe de caractère
### 6.2 Métriques spécifiques aux documents patrimoniaux
#### Glyphes et caractères spéciaux
- **Matrice de confusion unicode** : quels caractères GT sont transcrits par quels caractères OCR — fingerprint de chaque moteur
- **CER par bloc Unicode** : Latin de Base / Latin Étendu A & B / Diacritiques combinants / Formes de présentation latines
- **Score ligatures** : fi, fl, ff, ffi, ffl, st, ct, œ, æ, ꝑ, ꝓ...
- **Score abréviations** : taux de restitution correcte des formes abrégées
- **Précision diacritiques** : taux de conservation des accents, cédilles, trémas
- **Précision chiffres romains et arabes** séparément
#### Analyse structurelle
- **Score d'ordre de lecture** : les blocs sont-ils dans l'ordre logique ? Critique pour documents multi-colonnes, marginalia, réclames
- **Taux de segmentation des lignes** : fusion abusive / fragmentation — indépendant du contenu
- **Conservation des sauts de paragraphe et de section**
- **Détection des transpositions de blocs**
- **Score de mise en page** (si bounding boxes disponibles) : IoU entre zones détectées et zones GT
#### Taxonomie des erreurs
Catégorisation automatique de chaque erreur :
| Classe | Description |
|---|---|
| 1 — Confusion visuelle | Caractères morphologiquement proches (rn/m, l/1, O/0, u/n...) |
| 2 — Erreur diacritique | Accent manquant, mauvais accent, cédille manquante |
| 3 — Erreur de casse | Majuscule/minuscule |
| 4 — Ligature | Non résolue ou mal résolue |
| 5 — Abréviation | Non développée ou mal développée |
| 6 — Hapax | Mot absent de tout dictionnaire moderne |
| 7 — Segmentation | Fusion ou fragmentation de tokens |
| 8 — Hors-vocabulaire | Caractère absent du modèle du moteur |
| 9 — Lacune | Zone non transcrite |
| 10 — Sur-normalisation LLM | Le LLM a modernisé à tort la graphie (spécifique pipelines LLM) |
#### Métriques sur entités et contenus critiques
- Précision sur les entités nommées (NER via spaCy multilingue) : personnes, lieux, dates
- Précision sur les séquences numériques (foliotation, pagination, montants)
- Taux de conservation de la ponctuation
### 6.3 Analyse qualité image et corrélations
#### Métriques de qualité image automatiques
- Score de netteté (variance du Laplacien)
- Niveau de bruit (écart-type sur région homogène)
- Détection du biais/rotation résiduel (transformée de Hough)
- Score de contraste (ratio Michelson encre/fond)
- Détection du show-through (transparence verso)
- Score de déformation géométrique (courbure de page)
- Détection des dégradations chimiques (taches, foxing)
#### Corrélations image ↔ performance
- Scatter plots interactifs : qualité image (X) vs CER (Y) par concurrent
- Corrélation de Pearson et Spearman, avec test de significativité
- Identification des concurrents robustes aux dégradations vs sensibles
- Segmentation du corpus en terciles qualité (bonne/moyenne/mauvaise)
### 6.4 Analyses statistiques et agrégées
#### Score de difficulté intrinsèque
Indicateur calculé indépendamment des moteurs, combinant :
- Variance du CER entre tous les concurrents (si tous ratent → document difficile)
- Métriques de qualité image
- Densité de caractères spéciaux (ligatures, abréviations, diacritiques)
- Longueur des lignes et densité du texte
**Valeur :** séparer deux questions distinctes — *est-ce que ce moteur est mauvais ?* vs *est-ce que ce document est objectivement difficile ?*
#### Tests statistiques
- Test de Wilcoxon (non-paramétrique) pour comparer deux concurrents
- Correction de Bonferroni pour comparaisons multiples (>2 concurrents)
- Intervalles de confiance à 95% par bootstrap sur toutes les métriques
- Test de Student apparié pour grands corpus
#### Analyse des séquences et clustering
- Longueur moyenne des séquences correctes entre deux erreurs
- Distribution des longueurs d'erreurs (erreurs isolées vs blocs)
- Clustering automatique des patterns d'erreurs (k-means) avec exemples représentatifs
- Export des clusters pour cibler le fine-tuning
#### Analyse inter-concurrents
- Score de consensus : vote majoritaire, souvent meilleur que n'importe quel moteur seul
- Carte d'accord : zones de consensus vs désaccord sur le corpus
- Complémentarité : quels concurrents ont des erreurs différentes (bons candidats pour ensemble) ?
- Analyse de dominance : pour quels types de documents le concurrent A bat-il systématiquement B ?
---
## 7. Module 5 — Rapport interactif HTML
Le rapport est un **fichier HTML unique auto-contenu**, lisible hors-ligne, embarquant toutes les données et visualisations. C'est la livrable principale de Picarones.
### 7.1 Structure du rapport
#### Page d'accueil — Tableau de bord exécutif
- Résumé de l'expérience : concurrents testés, corpus, date, paramètres de normalisation
- **Tableau de classement** des concurrents : CER, WER, score ligatures, score diacritiques — trié par colonne au clic
- **Graphique radar (spider chart)** : CER / WER / Précision diacritiques / Précision ligatures / Score mise en page — snapshot visuel des forces/faiblesses
- Histogrammes de distribution CER côte-à-côte
- Alertes : concurrents avec CER > seuil, tests statistiques non-significatifs
- Recommandation automatique : quel concurrent pour quel usage (manuscrits anciens, imprimés, grand volume...)
#### Vue Galerie — exploration du corpus
- Toutes les images en grille de vignettes avec badge CER par concurrent (code couleur vert→rouge)
- Filtres dynamiques : CER > X%, score qualité image, type de script, longueur GT, concurrent gagnant
- Tri multi-critères : CER, difficulté intrinsèque, longueur, date
- Vue **"Worst cases"** : top N documents les plus difficiles par concurrent, avec explication automatique
- Vue **"Consensus"** : documents où tous les concurrents s'accordent — les plus fiables
- Vue **"LLM gagne"** / **"LLM dégrade"** : documents où la couche LLM améliore vs détériore la sortie OCR
#### Vue Document — analyse détaillée
- Image originale zoomable (panneau gauche) avec superposition des zones en erreur si bounding boxes disponibles
- **Affichage N-way synchronisé** : GT + sortie de chaque concurrent en colonnes parallèles avec scroll synchronisé
- **Diff token coloré** façon GitHub : insertions (vert), suppressions (rouge), substitutions (orange)
- **Diff aligné sur l'image** : surlignage de la zone correspondante au survol d'une erreur (si bounding boxes)
- Bascule **"Diplomatique / Normalisé"** : diff exact vs diff avec normalisation configurée
- **Vue spécifique OCR+LLM** : trois colonnes — GT / Sortie OCR brute / Sortie après correction LLM — avec double diff pour voir exactement ce que le LLM a modifié
- Détail des métriques pour ce document
#### Vue Analyse — graphiques et statistiques
- Distribution complète des CER (histogramme + courbe de densité)
- Scatter plots interactifs : qualité image vs CER, colorés par type de script
- Courbes de fiabilité : pour les X% documents les plus faciles, quel CER ?
- **Heatmap de confusion de caractères** : cliquable — cliquer affiche tous les exemples
- Diagramme de Venn des erreurs (communes et exclusives entre concurrents)
- Visualisation des clusters d'erreurs avec exemples représentatifs
- Matrices de corrélation entre toutes les métriques
- Graphiques de significativité (p-values des tests de Wilcoxon)
- Analyse temporelle si métadonnées de date disponibles
#### Vue Caractères — analyse unicode
- Matrice de confusion unicode interactive, colorée par fréquence
- Tableau des caractères les plus souvent manqués par chaque concurrent
- CER par bloc unicode en diagramme à barres groupées
- Analyse des ligatures : taux de reconnaissance par ligature
- Caractères absents du vocabulaire d'un moteur
### 7.2 Fonctionnalités transversales
- Thème sombre / clair, interface responsive
- Recherche plein texte dans le corpus (GT et sorties de tous les concurrents)
- **URL stateful** : chaque vue filtrée accessible via URL — partager un cas précis avec un collègue
- **Mode présentation** : vue épurée pour contextes institutionnels
- **Annotations inline** : notes du paléographe exportées en JSON
- **Comparaison de rapports** : charger deux rapports (avant/après fine-tuning) et voir les deltas
### 7.3 Exports depuis le rapport
| Format | Contenu |
|---|---|
| CSV / Excel | Toutes les métriques par document et par concurrent |
| JSON | Données brutes complètes réutilisables |
| PDF | Rapport synthétique avec graphiques, pour non-techniciens |
| ALTO XML | Sorties OCR sélectionnées au format standard bibliothèques |
| PAGE XML | Format Transkribus / eScriptorium |
| Images annotées | Images originales avec zones d'erreur surlignées (PNG) |
| Corpus d'erreurs | Pires cas pour cibler le fine-tuning (image + GT + sortie OCR) |
| Prompts LLM | Export de tous les prompts utilisés avec leurs performances |
---
## 8. Module 6 — Interface de lancement et CLI
### 8.1 Interface web légère (FastAPI)
- Configuration du benchmark : sélection corpus, concurrents, paramètres de normalisation
- Visualisation de l'avancement en temps réel avec log streamé
- Gestion des configurations enregistrées (profils)
- Accès aux rapports générés précédemment
- Configuration des adaptateurs moteurs et LLM via formulaire
### 8.2 Interface en ligne de commande (CLI)
```bash
# Lancer un benchmark
picarones run --corpus ./mes_gt/ --engines tesseract,pero_ocr,mistral --output ./rapport/
# Avec pipeline OCR+LLM
picarones run --corpus ./gt/ --config pipelines/medieval_correction.yaml
# Import IIIF puis benchmark
picarones import iiif https://gallica.bnf.fr/ark:/12148/xxx/manifest.json --pages 1-50
picarones run --corpus iiif:xxx --engines tesseract,pero_ocr --llm gpt-4o
# Rapport seul depuis résultats existants
picarones report --results ./results.json --output ./rapport.html
# Mode CI/CD : exit code non-zero si CER > seuil
picarones run --corpus ./gt/ --engines mon_moteur --fail-if-cer-above 5.0
picarones estimate --corpus ./gt/ --config pipelines/gpt4o_correction.yaml
```
### 8.3 Intégration CI/CD
- Mode headless complet, exit code paramétrable selon les métriques
- Output JSON machine-readable pour intégration dans systèmes de monitoring
- Badge de qualité générable (SVG) affichant le CER du modèle courant
- Détection automatique des régressions (CER augmente par rapport au run précédent)
---
## 9. Fonctionnalités avancées
### 9.1 Profils de normalisation pré-configurés
| Profil | Règles principales |
|---|---|
| Français médiéval (XIIe-XVe) | u/v, i/j, ſ/s, abréviations courantes |
| Français moderne (XVIe-XVIIIe) | ſ/s, ligatures fi/fl, esperluettes |
| Latin médiéval | Abréviations, contractions, ligatures spécifiques |
| Imprimés anciens (XVe-XVIIe) | Conventions typographiques, réclames |
| Personnalisé | Configurable et exportable |
### 9.2 Analyse par type de script
Si les documents sont tagués, calcul automatique des métriques par catégorie :
- Gothique textura / rotunda / cursiva
- Minuscule caroline
- Humanistique / italique
- Imprimé romain / italique ancien
- Cursives administratives (XVIIe-XIXe)
### 9.3 Suivi longitudinal
- Base de données des benchmarks historiques (SQLite optionnel)
- Courbes d'évolution : CER dans le temps pour un modèle en développement
- Détection automatique des régressions entre deux versions
- Comparaison avant/après fine-tuning
### 9.4 Analyse de robustesse
- Génération automatique de versions dégradées des images (bruit, flou, rotation, réduction de résolution, binarisation)
- Courbes de robustesse : CER en fonction du niveau de dégradation
- Identification du seuil de dégradation critique pour chaque concurrent
### 9.5 Évaluation par sous-région
Si bounding boxes disponibles dans la GT (ALTO/PAGE XML) :
- CER par zone : corps du texte / titres courants / marginalia / initiales / notes de bas de page
- Heatmap de densité d'erreur sur l'image
### 9.6 Détection de la sur-normalisation LLM
Risque spécifique aux pipelines OCR+LLM : le LLM "corrige" à tort des graphies médiévales légitimes en les modernisant. Picarones mesure :
- Taux de modification introduites par le LLM sur des passages déjà corrects
- Score de sur-normalisation : combien de transcriptions correctes le LLM a-t-il dégradées ?
- Liste des interventions LLM non souhaitées pour affiner le prompt
---
## 10. Plan de développement
| Sprint | Durée | Livrables |
|---|---|---|
| **Sprint 1** | 1-2 sem. | Structure du projet, adaptateurs Tesseract + Pero OCR, calcul CER/WER avec `jiwer`, export JSON, CLI de base |
| **Sprint 2** | 1-2 sem. | Rapport HTML v1 : galerie, vue document avec diff coloré, tableau de classement, graphiques de base |
| **Sprint 3** | 1-2 sem. | Pipelines OCR+LLM (modes text_only et text_and_image), adaptateurs GPT-4o et Claude |
| **Sprint 4** | 1-2 sem. | Adaptateurs API OCR (Mistral OCR, Google Vision), import IIIF, normalisation unicode, CER diplomatique |
| **Sprint 5** | 1-2 sem. | Métriques avancées : matrice confusion unicode, ligatures, structure, qualité image, taxonomie des erreurs |
| **Sprint 6** | 1-2 sem. | Interface web FastAPI, import HTR-United / HuggingFace, profils de normalisation, Ollama (LLMs locaux) |
| **Sprint 7** | 1-2 sem. | Rapport HTML v2 : vue Caractères, scatter plots, heatmaps, clustering |
| **Sprint 8** | 2 sem. | Intégration eScriptorium et Gallica API, suivi longitudinal, analyse de robustesse, prompts bibliothèque |
| **Sprint 9+** | Continu | Tests utilisateurs, documentation, packaging Docker, CI/CD, publication open-source |
---
## 11. Exigences non fonctionnelles
### Performance
- Pipeline capable de traiter 1000 documents en moins de 30 minutes (moteurs locaux)
- Rapport HTML interactif fluide pour des corpus de 10 000 documents
- Calcul des métriques en moins de 1 seconde par document
### Interopérabilité
- Compatibilité Linux, macOS, Windows
- Docker fourni pour un déploiement reproductible
- API REST documentée (OpenAPI) pour intégration tierce
- Conformité IIIF, ALTO XML, PAGE XML, TEI
### Qualité et maintenabilité
- Tests unitaires pour toutes les métriques (vérification sur cas connus)
- Tests d'intégration sur corpus de référence
- Documentation de chaque métrique (définition, formule, interprétation)
- Code open-source (licence Apache 2.0)
### Sécurité et confidentialité
- Aucune donnée envoyée vers l'extérieur sans consentement explicite
- Mode entièrement hors-ligne possible (moteurs locaux + Ollama uniquement)
- Clés API dans variables d'environnement uniquement
---
*Picarones est conçu pour devenir la référence open-source de l'évaluation OCR/HTR dans le champ patrimonial — métriques adaptées aux documents historiques, pipelines OCR+LLM, intégration native des standards bibliothéconomiques, rapport interactif exportable.*
|