maribakulj commited on
Commit
f0641dd
·
unverified ·
0 Parent(s):

Add files via upload

Browse files
Files changed (1) hide show
  1. SPECS.md +655 -0
SPECS.md ADDED
@@ -0,0 +1,655 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Picarones — Spécifications Fonctionnelles et Techniques
2
+
3
+ > **Plateforme de comparaison et d'évaluation de moteurs OCR/HTR et de pipelines OCR+LLM pour documents patrimoniaux**
4
+ >
5
+ > Version 1.0 — Mars 2025
6
+ > Bibliothèque nationale de France — Département numérique
7
+
8
+ ---
9
+
10
+ ## Table des matières
11
+
12
+ 1. [Vision générale et positionnement](#1-vision-générale-et-positionnement)
13
+ 2. [Architecture générale](#2-architecture-générale)
14
+ 3. [Module 1 — Gestion des corpus et imports](#3-module-1--gestion-des-corpus-et-imports)
15
+ 4. [Module 2 — Adaptateurs moteurs OCR](#4-module-2--adaptateurs-moteurs-ocr)
16
+ 5. [Module 3 — Pipelines OCR+LLM](#5-module-3--pipelines-ocrllm)
17
+ 6. [Module 4 — Métriques et analyse](#6-module-4--métriques-et-analyse)
18
+ 7. [Module 5 — Rapport interactif HTML](#7-module-5--rapport-interactif-html)
19
+ 8. [Module 6 — Interface de lancement et CLI](#8-module-6--interface-de-lancement-et-cli)
20
+ 9. [Fonctionnalités avancées](#9-fonctionnalités-avancées)
21
+ 10. [Plan de développement](#10-plan-de-développement)
22
+ 11. [Exigences non fonctionnelles](#11-exigences-non-fonctionnelles)
23
+
24
+ ---
25
+
26
+ ## 1. Vision générale et positionnement
27
+
28
+ ### 1.1 Problématique
29
+
30
+ 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.
31
+
32
+ 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.
33
+
34
+ À 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.
35
+
36
+ **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.
37
+
38
+ ### 1.2 Objectifs stratégiques
39
+
40
+ - Permettre une évaluation rigoureuse, reproductible et multi-dimensionnelle des moteurs OCR/HTR sur des corpus patrimoniaux réels
41
+ - Évaluer l'apport réel des LLMs en post-correction OCR, en termes de qualité
42
+ - Produire des rapports interactifs exploitables par des profils variés : ingénieurs, chercheurs, responsables de projets de numérisation
43
+ - S'intégrer dans les workflows patrimoniaux existants (IIIF, eScriptorium, HTR-United, Gallica)
44
+ - Offrir une base extensible pour le suivi longitudinal de la qualité OCR dans le temps
45
+
46
+ ### 1.3 Utilisateurs cibles
47
+
48
+ | Profil | Besoins principaux |
49
+ |---|---|
50
+ | Ingénieur OCR/ML | Pipeline programmatique, métriques fines, export JSON/CSV, CI/CD |
51
+ | Chargé de numérisation | Rapport visuel, comparaison simple A vs B, recommandation de moteur |
52
+ | Responsable de projet | Vue agrégée, graphiques, export PDF, analyse coût/bénéfice des APIs |
53
+ | Chercheur en humanités numériques | Métriques diplomatiques, corpus HTR-United, analyse des erreurs par catégorie |
54
+ | Paléographe | Diff visuel sur l'image, annotation inline des cas difficiles |
55
+
56
+ ### 1.4 Proposition de valeur unique
57
+
58
+ Picarones est le seul outil combinant :
59
+ 1. **Métriques adaptées aux documents historiques** (glyphes, ligatures, diacritiques, abréviations, normalisation diplomatique)
60
+ 2. **Évaluation des pipelines OCR+LLM** avec mesure du delta de qualité
61
+ 3. **Intégration native des standards bibliothéconomiques** (IIIF, ALTO, PAGE XML, HTR-United, eScriptorium, Gallica)
62
+ 4. **Rapport interactif auto-contenu** exploitable sans compétences techniques
63
+
64
+ ---
65
+
66
+ ## 2. Architecture générale
67
+
68
+ ### 2.1 Vue d'ensemble
69
+
70
+ ```
71
+ ┌──────────────────────────────────────────────────────────────────────────┐
72
+ │ PICARONES │
73
+ │ │
74
+ │ ┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────┐ │
75
+ │ │ Import / │ │ Pipeline │ │ Rapport │ │
76
+ │ │ Corpus Mgmt │──▶│ Orchestrator │──▶│ Interactif │ │
77
+ │ └─────────────────┘ └──────────────────────┘ └─────────────────┘ │
78
+ │ ▲ │ │ │
79
+ │ IIIF / Gallica ┌──────▼──────┐ HTML self-contained │
80
+ │ HTR-United │ Moteurs │ Export PDF/CSV/ALTO │
81
+ │ HuggingFace │ OCR │ │
82
+ │ eScriptorium └──────┬──────┘ │
83
+ │ Dossier local │ │
84
+ │ ┌──────▼──────┐ │
85
+ │ │ Couche │ │
86
+ │ │ LLM │ ◀── optionnelle │
87
+ │ │ (optionel) │ │
88
+ │ └─────────────┘ │
89
+ └──────────────────────────────────────────────────────────────────────────┘
90
+ ```
91
+
92
+ ### 2.2 Stack technique
93
+
94
+ | Couche | Technologie | Justification |
95
+ |---|---|---|
96
+ | Backend / Pipeline | Python 3.11+ | Écosystème OCR mature, jiwer, Pillow, NumPy |
97
+ | API serveur | FastAPI | Async, auto-documentation OpenAPI, léger |
98
+ | Rapport interactif | HTML + Vanilla JS + Chart.js + diff2html | Zéro dépendance runtime, fichier unique transportable |
99
+ | Configuration | YAML | Déclaration simple des moteurs et paramètres |
100
+ | Stockage résultats | JSON + SQLite optionnel | Léger, portable, requêtable |
101
+ | CLI | Click (Python) | Usage sans interface, intégration CI/CD |
102
+
103
+ ### 2.3 Principes d'architecture
104
+
105
+ - **Moteur-agnostique** : chaque moteur OCR ou LLM est un adaptateur interchangeable, déclaré en YAML
106
+ - **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`)
107
+ - **Pipeline idempotent** : les sorties sont cachées par hash d'image, relance partielle possible
108
+ - **Rapport auto-contenu** : le fichier HTML final embarque toutes les données, lisible hors-ligne
109
+ - **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
110
+
111
+ ---
112
+
113
+ ## 3. Module 1 — Gestion des corpus et imports
114
+
115
+ ### 3.1 Formats de vérité terrain acceptés
116
+
117
+ | Format | Extension | Usage typique |
118
+ |---|---|---|
119
+ | Texte brut parallèle | `image.jpg` + `image.gt.txt` | Convention Tesseract, HTR-United |
120
+ | ALTO XML | `.alto.xml` | Standard bibliothèques nationales, eScriptorium export |
121
+ | PAGE XML | `.page.xml` | Transkribus, OCRopus |
122
+ | JSON HuggingFace | `dataset.json` | HuggingFace Datasets |
123
+ | eScriptorium export | `.zip` (PAGE+images) | Export natif eScriptorium |
124
+ | CSV simple | `image,texte_gt` | Exports maison, tableaux Callico |
125
+
126
+ ### 3.2 Sources d'import
127
+
128
+ #### 3.2.1 Dossier local
129
+ 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).
130
+
131
+ #### 3.2.2 Import IIIF — fonctionnalité clé
132
+
133
+ 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.
134
+
135
+ - Import par URL de manifeste IIIF v2 et v3
136
+ - Sélection des canvas (pages) via interface de sélection visuelle
137
+ - Récupération des annotations de transcription si le manifeste les contient
138
+ - Compatibilité : Gallica (BnF), Bodleian, BL, BSB, e-codices, Europeana et tout entrepôt IIIF-compliant
139
+ - Résolution configurable des images
140
+
141
+ > **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.
142
+
143
+ #### 3.2.3 Import HuggingFace Datasets
144
+ - Recherche et prévisualisation de datasets OCR/HTR
145
+ - Filtrage par langue, type de script, époque, institution
146
+ - Datasets patrimoniaux pré-référencés : IAM, RIMES, READ-BAD, Esposalles, Bozen-Baptism, datasets HTR-United
147
+ - Import partiel : sous-ensemble aléatoire ou filtré
148
+ - Cache local avec gestion des versions
149
+
150
+ #### 3.2.4 Import HTR-United
151
+ - Listing et recherche dans le catalogue HTR-United
152
+ - Import direct des corpus publiés (Bréviaires, chartes médiévales, registres paroissiaux, presse ancienne...)
153
+ - Lecture des métadonnées : langue, script, institution, époque, nombre de lignes
154
+
155
+ #### 3.2.5 Import Gallica (API BnF)
156
+ - Recherche dans Gallica par cote, titre, auteur, date
157
+ - Récupération des images via API IIIF Gallica
158
+ - Récupération de l'OCR Gallica existant comme moteur de référence ou GT partielle
159
+
160
+ #### 3.2.6 Import eScriptorium
161
+ - Connexion à une instance eScriptorium locale ou distante via API
162
+ - Import de projets, documents et transcriptions
163
+ - Export des résultats de benchmark vers eScriptorium
164
+
165
+ ### 3.3 Gestion des corpus
166
+
167
+ - Corpus nommés et versionnés avec métadonnées descriptives
168
+ - Tags : type de script (gothique, humanistique, caroline, textura, cursive, imprimé ancien...), langue, siècle, institution, état de conservation
169
+ - Statistiques : distribution des longueurs de GT, histogramme des scores de qualité image, aperçu des caractères unicode présents
170
+ - Partage de corpus (format JSON exportable/importable)
171
+ - Corpus de référence fournis avec Picarones : 100 documents représentatifs multi-scripts pour benchmarks rapides
172
+
173
+ ---
174
+
175
+ ## 4. Module 2 — Adaptateurs moteurs OCR
176
+
177
+ ### 4.1 Architecture des adaptateurs
178
+
179
+ 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.
180
+
181
+ ### 4.2 Moteurs OCR supportés nativement
182
+
183
+ | Moteur | Type | Priorité | Notes |
184
+ |---|---|---|---|
185
+ | Tesseract 5 | Local CLI | v1.0 | `pytesseract`, multi-langues, LSTM |
186
+ | Pero OCR | Local Python | v1.0 | Excellent sur documents historiques |
187
+ | Kraken | Local Python | v1.0 | Référence HTR manuscrits, compatible eScriptorium |
188
+ | Mistral OCR | API REST | v1.0 | Mistral OCR 3, multimodal |
189
+ | Google Vision | API REST | v1.1 | Document AI, bonne couverture unicode |
190
+ | AWS Textract | API REST | v1.1 | Détection layout avancée |
191
+ | Azure Document Intelligence | API REST | v1.1 | Anciennement Form Recognizer |
192
+ | Calamari | Local Python | v1.1 | Basé TF, modèles pré-entraînés HTR |
193
+ | OCRopus4 | Local Python | v1.2 | Historique, utile pour comparaison |
194
+ | Moteur custom | CLI/API YAML | v1.0 | Déclaration YAML, aucun code requis |
195
+
196
+ ### 4.3 Configuration d'un moteur (YAML)
197
+
198
+ ```yaml
199
+ # Moteur custom via CLI
200
+ name: mon_ocr_interne
201
+ type: cli
202
+ command: "mon_ocr {input_image} --output {output_file} --lang fra"
203
+ output_format: txt
204
+ version_command: "mon_ocr --version"
205
+
206
+ # Moteur via API REST
207
+ name: api_ocr_bnf
208
+ type: api
209
+ endpoint: http://localhost:8080/ocr
210
+ method: POST
211
+ image_field: file
212
+ response_path: $.result.text
213
+ ```
214
+
215
+ ### 4.4 Gestion de l'exécution
216
+
217
+ - Parallélisation configurable : N moteurs tournent en parallèle
218
+ - Cache des sorties par hash SHA-256 de l'image — relance partielle possible
219
+ - Timeout configurable par moteur, avec rapport d'erreur si dépassé
220
+ - Retry automatique sur erreur transitoire (rate limit, timeout réseau) avec backoff exponentiel
221
+ - Rapport d'avancement en temps réel : barre de progression par moteur, ETA
222
+ - Mode dry-run : validation de la configuration sans lancer les moteurs
223
+
224
+ ---
225
+
226
+ ## 5. Module 3 — Pipelines OCR+LLM
227
+
228
+ > 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.
229
+
230
+ ### 5.1 Concept de "concurrent"
231
+
232
+ 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 :
233
+
234
+ | Type de concurrent | Description | Exemple |
235
+ |---|---|---|
236
+ | OCR seul | Un moteur OCR classique | `tesseract` |
237
+ | LLM zero-shot | Le LLM reçoit uniquement l'image | `gpt-4o` en mode vision |
238
+ | OCR → LLM (texte) | Le LLM reçoit la sortie OCR brute et corrige | `tesseract → mistral-large` |
239
+ | OCR → LLM (image + texte) | Le LLM reçoit image ET sortie OCR | `pero_ocr → gpt-4o` |
240
+ | OCR → LLM → LLM | Chaîne de correction en deux passes | `tesseract → llm1 → llm2` |
241
+
242
+ Ce modèle composable permet de tester toutes les configurations imaginables et de mesurer l'apport exact de chaque couche.
243
+
244
+ ### 5.2 LLMs supportés
245
+
246
+ | LLM | Type | Modes supportés | Priorité |
247
+ |---|---|---|---|
248
+ | GPT-4o / GPT-4o mini | API OpenAI | texte seul, image+texte, zero-shot | v1.0 |
249
+ | Claude Sonnet / Haiku | API Anthropic | texte seul, image+texte, zero-shot | v1.0 |
250
+ | Mistral Large / Pixtral | API Mistral | texte seul, image+texte, zero-shot | v1.0 |
251
+ | Llama 3 (via Ollama) | Local | texte seul | v1.1 |
252
+ | Gemma / Phi (via Ollama) | Local | texte seul | v1.1 |
253
+ | LLM custom | API REST YAML | configurable | v1.0 |
254
+
255
+ ### 5.3 Modes de correction LLM
256
+
257
+ #### Mode 1 — Post-correction texte brut
258
+ Le LLM reçoit uniquement la sortie OCR textuelle et un prompt de correction. Le plus rapide.
259
+
260
+ ```
261
+ [Sortie OCR brute] ──▶ [LLM + prompt] ──▶ [Texte corrigé]
262
+ ```
263
+
264
+ **Usage typique :** correction rapide sur grand volume, LLM non multimodal (Llama local), test de la valeur ajoutée d'un LLM de correction pur.
265
+
266
+ #### Mode 2 — Post-correction avec image
267
+ Le LLM reçoit l'image originale ET la sortie OCR. Permet au LLM de vérifier visuellement les passages ambigus.
268
+
269
+ ```
270
+ [Image] ──────────────┐
271
+
272
+ [Sortie OCR brute] ──▶ [LLM multimodal + prompt] ──▶ [Texte corrigé]
273
+ ```
274
+
275
+ **Usage typique :** meilleure qualité, test de la valeur ajoutée du contexte visuel pour la correction.
276
+
277
+ #### Mode 3 — Zero-shot LLM
278
+ Le LLM reçoit uniquement l'image, sans sortie OCR préalable. Teste la capacité de transcription native du LLM.
279
+
280
+ ```
281
+ [Image] ──▶ [LLM multimodal + prompt] ──▶ [Transcription]
282
+ ```
283
+
284
+ **Usage typique :** évaluer si GPT-4o ou Claude peut remplacer un moteur OCR sur des documents patrimoniaux.
285
+
286
+ ### 5.4 Système de prompts
287
+
288
+ Les prompts LLM sont configurables, versionnés et font partie intégrante des métadonnées du rapport.
289
+
290
+ ```yaml
291
+ # Configuration d'un concurrent OCR+LLM
292
+ name: tesseract_gpt4o_correction
293
+ type: pipeline
294
+ steps:
295
+ - engine: tesseract
296
+ config:
297
+ lang: fra
298
+ psm: 6
299
+ - llm: gpt-4o
300
+ mode: text_and_image # text_only | text_and_image | zero_shot
301
+ prompt: prompts/correction_medieval_french.txt
302
+ temperature: 0.0
303
+ max_tokens: 4096
304
+ ```
305
+
306
+ ```
307
+ # prompts/correction_medieval_french.txt
308
+ Tu es un expert en paléographie et en transcription de documents en français médiéval.
309
+ On te fournit la sortie brute d'un moteur OCR et l'image originale du document.
310
+ Ta tâche est de corriger les erreurs de transcription en te basant sur :
311
+ - Le contexte linguistique (français médiéval, XVe siècle)
312
+ - Les confusions visuelles typiques de l'OCR (rn/m, l/1, u/n, ſ/f...)
313
+ - Les abréviations et ligatures médiévales visibles sur l'image
314
+
315
+ Retourne UNIQUEMENT le texte corrigé, sans commentaire ni explication.
316
+ Conserve fidèlement la graphie originale (ne modernise pas l'orthographe).
317
+
318
+ OCR BRUT :
319
+ {ocr_output}
320
+ ```
321
+
322
+ - Bibliothèque de prompts intégrée : prompts optimisés pour manuscrits médiévaux, imprimés anciens, cursives administratives, latin, documents mixtes
323
+ - Versionning des prompts : le prompt exact utilisé est stocké dans le JSON de résultats
324
+ - Comparaison de prompts : tester différents prompts sur le même concurrent OCR+LLM
325
+
326
+ ### 5.5 Questions de recherche adressées par ce module
327
+
328
+ Picarones permet de répondre empiriquement, sur vos propres corpus, à des questions qui font débat :
329
+
330
+ 1. **Un LLM améliore-t-il systématiquement la sortie OCR ?** (Pas toujours — il peut halluciner)
331
+ 2. **Le mode image+texte est-il meilleur que texte seul ?** (Coût plus élevé, apport variable)
332
+ 3. **Un LLM zero-shot peut-il remplacer un moteur OCR sur des documents anciens ?**
333
+ 4. **Sur quels types d'erreurs le LLM apporte-t-il le plus ?** (Diacritiques ? Abréviations ? Hapax ?)
334
+ 5. **Y a-t-il un risque de sur-normalisation ?** Le LLM modernise-t-il à tort la graphie médiévale ?
335
+ 6. **Quel est le seuil de CER OCR en dessous duquel un LLM n'apporte plus rien ?**
336
+ 7. **Quel est le seuil de CER OCR en dessous duquel un LLM n'apporte plus rien ?**
337
+
338
+ ---
339
+
340
+ ## 6. Module 4 — Métriques et analyse
341
+
342
+ > 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.
343
+
344
+ ### 6.1 Métriques de base
345
+
346
+ #### CER — Character Error Rate
347
+ - CER brut (distance d'édition caractère / longueur GT)
348
+ - CER avec normalisation Unicode NFC
349
+ - CER sans distinction de casse
350
+ - CER diplomatique : avec table de correspondances historiques (ſ=s, u=v, i=j...)
351
+ - CER par ligne : distribution, médiane, percentiles P90/P95
352
+ - Intervalles de confiance à 95% par bootstrap (1000 itérations)
353
+
354
+ #### WER — Word Error Rate
355
+ - WER brut et normalisé
356
+ - WER avec tokenisation historique (traits d'union, abréviations)
357
+ - Match Error Rate (MER) et Word Information Lost (WIL)
358
+
359
+ #### Métriques de précision/rappel
360
+ - Précision et rappel au niveau caractère, mot, ligne
361
+ - F1-score global et par classe de caractère
362
+
363
+ ### 6.2 Métriques spécifiques aux documents patrimoniaux
364
+
365
+ #### Glyphes et caractères spéciaux
366
+ - **Matrice de confusion unicode** : quels caractères GT sont transcrits par quels caractères OCR — fingerprint de chaque moteur
367
+ - **CER par bloc Unicode** : Latin de Base / Latin Étendu A & B / Diacritiques combinants / Formes de présentation latines
368
+ - **Score ligatures** : fi, fl, ff, ffi, ffl, st, ct, œ, æ, ꝑ, ꝓ...
369
+ - **Score abréviations** : taux de restitution correcte des formes abrégées
370
+ - **Précision diacritiques** : taux de conservation des accents, cédilles, trémas
371
+ - **Précision chiffres romains et arabes** séparément
372
+
373
+ #### Analyse structurelle
374
+ - **Score d'ordre de lecture** : les blocs sont-ils dans l'ordre logique ? Critique pour documents multi-colonnes, marginalia, réclames
375
+ - **Taux de segmentation des lignes** : fusion abusive / fragmentation — indépendant du contenu
376
+ - **Conservation des sauts de paragraphe et de section**
377
+ - **Détection des transpositions de blocs**
378
+ - **Score de mise en page** (si bounding boxes disponibles) : IoU entre zones détectées et zones GT
379
+
380
+ #### Taxonomie des erreurs
381
+ Catégorisation automatique de chaque erreur :
382
+
383
+ | Classe | Description |
384
+ |---|---|
385
+ | 1 — Confusion visuelle | Caractères morphologiquement proches (rn/m, l/1, O/0, u/n...) |
386
+ | 2 — Erreur diacritique | Accent manquant, mauvais accent, cédille manquante |
387
+ | 3 — Erreur de casse | Majuscule/minuscule |
388
+ | 4 — Ligature | Non résolue ou mal résolue |
389
+ | 5 — Abréviation | Non développée ou mal développée |
390
+ | 6 — Hapax | Mot absent de tout dictionnaire moderne |
391
+ | 7 — Segmentation | Fusion ou fragmentation de tokens |
392
+ | 8 — Hors-vocabulaire | Caractère absent du modèle du moteur |
393
+ | 9 — Lacune | Zone non transcrite |
394
+ | 10 — Sur-normalisation LLM | Le LLM a modernisé à tort la graphie (spécifique pipelines LLM) |
395
+
396
+ #### Métriques sur entités et contenus critiques
397
+ - Précision sur les entités nommées (NER via spaCy multilingue) : personnes, lieux, dates
398
+ - Précision sur les séquences numériques (foliotation, pagination, montants)
399
+ - Taux de conservation de la ponctuation
400
+
401
+ ### 6.3 Analyse qualité image et corrélations
402
+
403
+ #### Métriques de qualité image automatiques
404
+ - Score de netteté (variance du Laplacien)
405
+ - Niveau de bruit (écart-type sur région homogène)
406
+ - Détection du biais/rotation résiduel (transformée de Hough)
407
+ - Score de contraste (ratio Michelson encre/fond)
408
+ - Détection du show-through (transparence verso)
409
+ - Score de déformation géométrique (courbure de page)
410
+ - Détection des dégradations chimiques (taches, foxing)
411
+
412
+ #### Corrélations image ↔ performance
413
+ - Scatter plots interactifs : qualité image (X) vs CER (Y) par concurrent
414
+ - Corrélation de Pearson et Spearman, avec test de significativité
415
+ - Identification des concurrents robustes aux dégradations vs sensibles
416
+ - Segmentation du corpus en terciles qualité (bonne/moyenne/mauvaise)
417
+
418
+ ### 6.4 Analyses statistiques et agrégées
419
+
420
+ #### Score de difficulté intrinsèque
421
+ Indicateur calculé indépendamment des moteurs, combinant :
422
+ - Variance du CER entre tous les concurrents (si tous ratent → document difficile)
423
+ - Métriques de qualité image
424
+ - Densité de caractères spéciaux (ligatures, abréviations, diacritiques)
425
+ - Longueur des lignes et densité du texte
426
+
427
+ **Valeur :** séparer deux questions distinctes — *est-ce que ce moteur est mauvais ?* vs *est-ce que ce document est objectivement difficile ?*
428
+
429
+ #### Tests statistiques
430
+ - Test de Wilcoxon (non-paramétrique) pour comparer deux concurrents
431
+ - Correction de Bonferroni pour comparaisons multiples (>2 concurrents)
432
+ - Intervalles de confiance à 95% par bootstrap sur toutes les métriques
433
+ - Test de Student apparié pour grands corpus
434
+
435
+ #### Analyse des séquences et clustering
436
+ - Longueur moyenne des séquences correctes entre deux erreurs
437
+ - Distribution des longueurs d'erreurs (erreurs isolées vs blocs)
438
+ - Clustering automatique des patterns d'erreurs (k-means) avec exemples représentatifs
439
+ - Export des clusters pour cibler le fine-tuning
440
+
441
+ #### Analyse inter-concurrents
442
+ - Score de consensus : vote majoritaire, souvent meilleur que n'importe quel moteur seul
443
+ - Carte d'accord : zones de consensus vs désaccord sur le corpus
444
+ - Complémentarité : quels concurrents ont des erreurs différentes (bons candidats pour ensemble) ?
445
+ - Analyse de dominance : pour quels types de documents le concurrent A bat-il systématiquement B ?
446
+
447
+ ---
448
+
449
+ ## 7. Module 5 — Rapport interactif HTML
450
+
451
+ 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.
452
+
453
+ ### 7.1 Structure du rapport
454
+
455
+ #### Page d'accueil — Tableau de bord exécutif
456
+ - Résumé de l'expérience : concurrents testés, corpus, date, paramètres de normalisation
457
+ - **Tableau de classement** des concurrents : CER, WER, score ligatures, score diacritiques — trié par colonne au clic
458
+ - **Graphique radar (spider chart)** : CER / WER / Précision diacritiques / Précision ligatures / Score mise en page — snapshot visuel des forces/faiblesses
459
+ - Histogrammes de distribution CER côte-à-côte
460
+ - Alertes : concurrents avec CER > seuil, tests statistiques non-significatifs
461
+ - Recommandation automatique : quel concurrent pour quel usage (manuscrits anciens, imprimés, grand volume...)
462
+
463
+ #### Vue Galerie — exploration du corpus
464
+ - Toutes les images en grille de vignettes avec badge CER par concurrent (code couleur vert→rouge)
465
+ - Filtres dynamiques : CER > X%, score qualité image, type de script, longueur GT, concurrent gagnant
466
+ - Tri multi-critères : CER, difficulté intrinsèque, longueur, date
467
+ - Vue **"Worst cases"** : top N documents les plus difficiles par concurrent, avec explication automatique
468
+ - Vue **"Consensus"** : documents où tous les concurrents s'accordent — les plus fiables
469
+ - Vue **"LLM gagne"** / **"LLM dégrade"** : documents où la couche LLM améliore vs détériore la sortie OCR
470
+
471
+ #### Vue Document — analyse détaillée
472
+ - Image originale zoomable (panneau gauche) avec superposition des zones en erreur si bounding boxes disponibles
473
+ - **Affichage N-way synchronisé** : GT + sortie de chaque concurrent en colonnes parallèles avec scroll synchronisé
474
+ - **Diff token coloré** façon GitHub : insertions (vert), suppressions (rouge), substitutions (orange)
475
+ - **Diff aligné sur l'image** : surlignage de la zone correspondante au survol d'une erreur (si bounding boxes)
476
+ - Bascule **"Diplomatique / Normalisé"** : diff exact vs diff avec normalisation configurée
477
+ - **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é
478
+ - Détail des métriques pour ce document
479
+
480
+ #### Vue Analyse — graphiques et statistiques
481
+ - Distribution complète des CER (histogramme + courbe de densité)
482
+ - Scatter plots interactifs : qualité image vs CER, colorés par type de script
483
+ - Courbes de fiabilité : pour les X% documents les plus faciles, quel CER ?
484
+ - **Heatmap de confusion de caractères** : cliquable — cliquer affiche tous les exemples
485
+ - Diagramme de Venn des erreurs (communes et exclusives entre concurrents)
486
+ - Visualisation des clusters d'erreurs avec exemples représentatifs
487
+ - Matrices de corrélation entre toutes les métriques
488
+ - Graphiques de significativité (p-values des tests de Wilcoxon)
489
+ - Analyse temporelle si métadonnées de date disponibles
490
+
491
+ #### Vue Caractères — analyse unicode
492
+ - Matrice de confusion unicode interactive, colorée par fréquence
493
+ - Tableau des caractères les plus souvent manqués par chaque concurrent
494
+ - CER par bloc unicode en diagramme à barres groupées
495
+ - Analyse des ligatures : taux de reconnaissance par ligature
496
+ - Caractères absents du vocabulaire d'un moteur
497
+
498
+
499
+ ### 7.2 Fonctionnalités transversales
500
+
501
+ - Thème sombre / clair, interface responsive
502
+ - Recherche plein texte dans le corpus (GT et sorties de tous les concurrents)
503
+ - **URL stateful** : chaque vue filtrée accessible via URL — partager un cas précis avec un collègue
504
+ - **Mode présentation** : vue épurée pour contextes institutionnels
505
+ - **Annotations inline** : notes du paléographe exportées en JSON
506
+ - **Comparaison de rapports** : charger deux rapports (avant/après fine-tuning) et voir les deltas
507
+
508
+ ### 7.3 Exports depuis le rapport
509
+
510
+ | Format | Contenu |
511
+ |---|---|
512
+ | CSV / Excel | Toutes les métriques par document et par concurrent |
513
+ | JSON | Données brutes complètes réutilisables |
514
+ | PDF | Rapport synthétique avec graphiques, pour non-techniciens |
515
+ | ALTO XML | Sorties OCR sélectionnées au format standard bibliothèques |
516
+ | PAGE XML | Format Transkribus / eScriptorium |
517
+ | Images annotées | Images originales avec zones d'erreur surlignées (PNG) |
518
+ | Corpus d'erreurs | Pires cas pour cibler le fine-tuning (image + GT + sortie OCR) |
519
+ | Prompts LLM | Export de tous les prompts utilisés avec leurs performances |
520
+
521
+ ---
522
+
523
+ ## 8. Module 6 — Interface de lancement et CLI
524
+
525
+ ### 8.1 Interface web légère (FastAPI)
526
+
527
+ - Configuration du benchmark : sélection corpus, concurrents, paramètres de normalisation
528
+ - Visualisation de l'avancement en temps réel avec log streamé
529
+ - Gestion des configurations enregistrées (profils)
530
+ - Accès aux rapports générés précédemment
531
+ - Configuration des adaptateurs moteurs et LLM via formulaire
532
+
533
+ ### 8.2 Interface en ligne de commande (CLI)
534
+
535
+ ```bash
536
+ # Lancer un benchmark
537
+ picarones run --corpus ./mes_gt/ --engines tesseract,pero_ocr,mistral --output ./rapport/
538
+
539
+ # Avec pipeline OCR+LLM
540
+ picarones run --corpus ./gt/ --config pipelines/medieval_correction.yaml
541
+
542
+ # Import IIIF puis benchmark
543
+ picarones import iiif https://gallica.bnf.fr/ark:/12148/xxx/manifest.json --pages 1-50
544
+ picarones run --corpus iiif:xxx --engines tesseract,pero_ocr --llm gpt-4o
545
+
546
+ # Rapport seul depuis résultats existants
547
+ picarones report --results ./results.json --output ./rapport.html
548
+
549
+ # Mode CI/CD : exit code non-zero si CER > seuil
550
+ picarones run --corpus ./gt/ --engines mon_moteur --fail-if-cer-above 5.0
551
+
552
+ picarones estimate --corpus ./gt/ --config pipelines/gpt4o_correction.yaml
553
+ ```
554
+
555
+ ### 8.3 Intégration CI/CD
556
+
557
+ - Mode headless complet, exit code paramétrable selon les métriques
558
+ - Output JSON machine-readable pour intégration dans systèmes de monitoring
559
+ - Badge de qualité générable (SVG) affichant le CER du modèle courant
560
+ - Détection automatique des régressions (CER augmente par rapport au run précédent)
561
+
562
+ ---
563
+
564
+ ## 9. Fonctionnalités avancées
565
+
566
+ ### 9.1 Profils de normalisation pré-configurés
567
+
568
+ | Profil | Règles principales |
569
+ |---|---|
570
+ | Français médiéval (XIIe-XVe) | u/v, i/j, ſ/s, abréviations courantes |
571
+ | Français moderne (XVIe-XVIIIe) | ſ/s, ligatures fi/fl, esperluettes |
572
+ | Latin médiéval | Abréviations, contractions, ligatures spécifiques |
573
+ | Imprimés anciens (XVe-XVIIe) | Conventions typographiques, réclames |
574
+ | Personnalisé | Configurable et exportable |
575
+
576
+ ### 9.2 Analyse par type de script
577
+
578
+ Si les documents sont tagués, calcul automatique des métriques par catégorie :
579
+ - Gothique textura / rotunda / cursiva
580
+ - Minuscule caroline
581
+ - Humanistique / italique
582
+ - Imprimé romain / italique ancien
583
+ - Cursives administratives (XVIIe-XIXe)
584
+
585
+ ### 9.3 Suivi longitudinal
586
+
587
+ - Base de données des benchmarks historiques (SQLite optionnel)
588
+ - Courbes d'évolution : CER dans le temps pour un modèle en développement
589
+ - Détection automatique des régressions entre deux versions
590
+ - Comparaison avant/après fine-tuning
591
+
592
+ ### 9.4 Analyse de robustesse
593
+
594
+ - Génération automatique de versions dégradées des images (bruit, flou, rotation, réduction de résolution, binarisation)
595
+ - Courbes de robustesse : CER en fonction du niveau de dégradation
596
+ - Identification du seuil de dégradation critique pour chaque concurrent
597
+
598
+ ### 9.5 Évaluation par sous-région
599
+
600
+ Si bounding boxes disponibles dans la GT (ALTO/PAGE XML) :
601
+ - CER par zone : corps du texte / titres courants / marginalia / initiales / notes de bas de page
602
+ - Heatmap de densité d'erreur sur l'image
603
+
604
+ ### 9.6 Détection de la sur-normalisation LLM
605
+
606
+ Risque spécifique aux pipelines OCR+LLM : le LLM "corrige" à tort des graphies médiévales légitimes en les modernisant. Picarones mesure :
607
+ - Taux de modification introduites par le LLM sur des passages déjà corrects
608
+ - Score de sur-normalisation : combien de transcriptions correctes le LLM a-t-il dégradées ?
609
+ - Liste des interventions LLM non souhaitées pour affiner le prompt
610
+
611
+ ---
612
+
613
+ ## 10. Plan de développement
614
+
615
+ | Sprint | Durée | Livrables |
616
+ |---|---|---|
617
+ | **Sprint 1** | 1-2 sem. | Structure du projet, adaptateurs Tesseract + Pero OCR, calcul CER/WER avec `jiwer`, export JSON, CLI de base |
618
+ | **Sprint 2** | 1-2 sem. | Rapport HTML v1 : galerie, vue document avec diff coloré, tableau de classement, graphiques de base |
619
+ | **Sprint 3** | 1-2 sem. | Pipelines OCR+LLM (modes text_only et text_and_image), adaptateurs GPT-4o et Claude |
620
+ | **Sprint 4** | 1-2 sem. | Adaptateurs API OCR (Mistral OCR, Google Vision), import IIIF, normalisation unicode, CER diplomatique |
621
+ | **Sprint 5** | 1-2 sem. | Métriques avancées : matrice confusion unicode, ligatures, structure, qualité image, taxonomie des erreurs |
622
+ | **Sprint 6** | 1-2 sem. | Interface web FastAPI, import HTR-United / HuggingFace, profils de normalisation, Ollama (LLMs locaux) |
623
+ | **Sprint 7** | 1-2 sem. | Rapport HTML v2 : vue Caractères, scatter plots, heatmaps, clustering |
624
+ | **Sprint 8** | 2 sem. | Intégration eScriptorium et Gallica API, suivi longitudinal, analyse de robustesse, prompts bibliothèque |
625
+ | **Sprint 9+** | Continu | Tests utilisateurs BnF, documentation, packaging Docker, CI/CD, publication open-source |
626
+
627
+ ---
628
+
629
+ ## 11. Exigences non fonctionnelles
630
+
631
+ ### Performance
632
+ - Pipeline capable de traiter 1000 documents en moins de 30 minutes (moteurs locaux)
633
+ - Rapport HTML interactif fluide pour des corpus de 10 000 documents
634
+ - Calcul des métriques en moins de 1 seconde par document
635
+
636
+ ### Interopérabilité
637
+ - Compatibilité Linux, macOS, Windows
638
+ - Docker fourni pour un déploiement reproductible
639
+ - API REST documentée (OpenAPI) pour intégration tierce
640
+ - Conformité IIIF, ALTO XML, PAGE XML, TEI
641
+
642
+ ### Qualité et maintenabilité
643
+ - Tests unitaires pour toutes les métriques (vérification sur cas connus)
644
+ - Tests d'intégration sur corpus de référence
645
+ - Documentation de chaque métrique (définition, formule, interprétation)
646
+ - Code open-source (licence Apache 2.0)
647
+
648
+ ### Sécurité et confidentialité
649
+ - Aucune donnée envoyée vers l'extérieur sans consentement explicite
650
+ - Mode entièrement hors-ligne possible (moteurs locaux + Ollama uniquement)
651
+ - Clés API dans variables d'environnement uniquement
652
+
653
+ ---
654
+
655
+ *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.*