From e1267f4f1483a46573d8becce38380e6503e6d87 Mon Sep 17 00:00:00 2001 From: donovan-dev-web Date: Wed, 9 Sep 2026 10:11:42 +0200 Subject: [PATCH] =?UTF-8?q?docs(M-12):=20planifier=20l'OCR=20interactif=20?= =?UTF-8?q?&=20fiabilisation=20=E2=80=94=20US-OCR-01..08=20(#205-#212)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/03-TECHNICAL-SPEC.md | 40 ++++++++++++ docs/04-FONCTIONAL-SPEC.md | 45 ++++++++++++++ docs/05-ARCHITECTURE.md | 20 +++++- docs/08-USER-STORIES.md | 121 +++++++++++++++++++++++++++++++++++-- docs/09-ISSUE.md | 22 ++++++- docs/11-ROADMAP.md | 41 ++++++++++++- docs/12-TESTING.md | 22 +++++++ 7 files changed, 299 insertions(+), 12 deletions(-) diff --git a/docs/03-TECHNICAL-SPEC.md b/docs/03-TECHNICAL-SPEC.md index 7a03910..e4cb4fe 100644 --- a/docs/03-TECHNICAL-SPEC.md +++ b/docs/03-TECHNICAL-SPEC.md @@ -137,6 +137,42 @@ Un **niveau de confiance** (0..1) est calculé. En cas de confiance insuffisante > **Note technique (M-05) :** le pipeline logique (parsing `ocrTextParser.ts`, confiance, rapprochement base `findByPublicationAndIssue`) est livré et **testé**, et dépend d'une interface `OcrEngine` injectée. Le moteur natif est **branché par défaut** (`MlKitOcrEngine`) via `expo-mlkit-ocr` (Google ML Kit Text Recognition, on-device, hors ligne) : `dependencies.initialize()` l'utilise, l'écran `/scan/camera` capture une photo via `expo-camera` (`takePictureAsync`) puis appelle `recognizeText(uri)`. L'import du module natif est **paresseux** pour ne pas bloquer la CI. `expo-build-properties` force le iOS `deploymentTarget` à 16.4 (exigence ML Kit). La reconnaissance a été **validée sur téléphone physique** (v0.5.0) ; hors bibliothèque native, `recognize` retourne `null` (repli `NoopOcrEngine`). +### 5.5 Flux OCR v2 interactif & fiabilisation (M-12 → v1.1.0) + +Évolution cible du pipeline (voir `04-FONCTIONAL-SPEC.md` §5.6, US-OCR-01..08) : + +``` +Photo (takePictureAsync) + → Prétraitement image (redimensionnement + contraste, éphémère) [M12-01] + → reconnaître : texte + bounding boxes (blocks/lines/elements) [M12-02] + → analyser des candidats par champ (titre, numéro/tome, année, …) + avec score de confiance (règles métier + positions spatiales) [M12-03] + → seuiller les propositions automatiques [M12-04] + → écran intermédiaire : overlay photo + zones cliquables + (conversion coordonnées image → écran) [M12-05] + → associer une zone à un champ / corriger rapidement [M12-06] + → intégrer à findByPublicationAndIssue / saisie pré-remplie [M12-07] + → fiabiliser sur jeu de couvertures réelles (mesure des erreurs) [M12-08] +``` + +**Décisions structurantes (à confirmer en implémentation, M12-02/03)** : +- **Données** : faire évoluer `OcrFrameResult` (actuellement `{ text }`) vers un + résultat avec zones `{ blocks, lines, elements }`, chacune avec sa + `boundingBox` (gap à vérifier dans `expo-mlkit-ocr` — un wrapper natif ou un + changement de module peut être nécessaire) ; +- **Prétraitement** : évaluer `expo-image-manipulator` (candidat, §9) pour le + redimensionnement/contraste ; traitement en mémoire, jamais enregistré (R14.2) ; +- **Analyse** : le classifier `ocrTextParser.ts` évolue vers un module de + **candidats** (une liste par champ) + règles de discrimination + (`192 PAGES`, `€8,50`, `2026`, `TOME 12` / `N° 125`) ; +- **Seuils** : un score de confiance ≥ seuil ⇒ proposition automatique ; scores + proches ⇒ validation utilisateur ; +- **Écran** : nouvelle route (`/scan/ocr-review`) ; conversion des coordonnées + OCR (référentiel photo, `W×H` capturé) vers l'écran (proportions, `resizeMode`) ; +- **Perf** (§8) : traitement borné hors bandeau UI, import paresseux conservé. + +> **Statut M-12 : à venir (backlog)** — issues M12-01..08 (#205-#212). + --- ## 6. Scan code-barres @@ -256,6 +292,10 @@ Priorités : ``` Plugins (`app.json`) : `["expo-mlkit-ocr", { "iosEngine": "auto" }]` et `["expo-build-properties", { "ios": { "deploymentTarget": "16.4" } }]`. +> **M-12 (à l'étude)** : `expo-image-manipulator` (prétraitement, M12-01) et — +> selon les données exposées par `expo-mlkit-ocr` — un wrapper natif pour les +> **bounding boxes** (M12-02). Non ajouté tant que les issues ne sont pas engagées. + --- ## Récapitulatif des décisions techniques diff --git a/docs/04-FONCTIONAL-SPEC.md b/docs/04-FONCTIONAL-SPEC.md index c4796b8..a9cdf5d 100644 --- a/docs/04-FONCTIONAL-SPEC.md +++ b/docs/04-FONCTIONAL-SPEC.md @@ -228,6 +228,50 @@ En cas de confiance insuffisante, les informations détectées (**publication, n Le message « confiance insuffisante » est donc toujours accompagné d'une possibilité de **valider / corriger**, en plus de réessayer. +### 5.6 Flux OCR v2 interactif & fiabilisation (M-12 → v1.1.0, US-OCR-01..08) + +Évolution des §5.1-5.5 pour rendre l'identification fiable quelle que soit la +couverture (magazines, BD, comics, textes stylisés). Workflow cible : + +``` +Photo (takePictureAsync) + │ + ▼ +Prétraitement (redimensionnement, contraste) ← US-OCR-01 + │ + ▼ +OCR local ML Kit : texte + bounding boxes ← US-OCR-02 + │ + ▼ +Analyse de candidats par champ +(titre, numéro/tome/issue, année/date, éditeur, + pages, prix…) avec score de confiance ← US-OCR-03 + │ + ├─ Confiance élevée ──► Proposition automatique + │ (ex. Titre ✓ VOGUE · Numéro ✓ 125 · Année ✓ 2026) ← US-OCR-04 + └─ Confiance faible / ambiguë ──► Sélection utilisateur + ▶ écran intermédiaire : photo + zones OCR cliquables + ▶ toucher la zone → assigner Titre / Numéro / Année ← US-OCR-05/06 + │ + ▼ +Valeurs validées → recherche (si suffisant) ← US-OCR-07 + └─ insuffisant / non trouvé → saisie manuelle pré-remplie +``` + +**Règles** : +- **prétraitement** appliqué avant la reconnaissance ; aucune image n'est enregistrée (R14.2) ; +- l'OCR fournit le texte **et** la position des zones ; l'overlay suit fidèlement la photo quel que soit l'écran (conversion des coordonnées) ; +- **règles métier** de discrimination : `192 PAGES` → pages (pas un numéro), `€8,50` → prix, `2026` → année, `TOME 12` / `N° 125` → numéro ; +- **proposition automatique** uniquement au-dessus d'un seuil de confiance ; à confiances proches, l'utilisateur valide ; +- toute proposition reste **corrigeable en 2-3 gestes** (autre zone ou saisie directe), jamais de ressaisie complète ; +- les champs non identifiés restent vides (pas de blocage) ; +- l'application **ne présente jamais** une identification comme certaine ; +- la fiabilisation est **mesurée** sur un jeu de couvertures réelles (jeu de données + taux d'erreurs, cf. `12-TESTING.md`). + +> **Statut M-12 : à venir (backlog)** — issues M12-01..08 (#205-#212), user +> stories US-OCR-01..08 (`08-USER-STORIES.md` §11). Voir aussi +> `03-TECHNICAL-SPEC.md` §5.5. + --- ## 6. Flux saisie manuelle @@ -512,6 +556,7 @@ L'application vérifie, **selon le format choisi dans la popup** : | Caméra / OCR | ✅ | | — Surcouche de scan ciblé | ✅ (v0.7.1, US-ID-08) | | — Validation / correction des infos détectées | ✅ (v0.7.1, US-ID-09) | +| — OCR v2 interactif & fiabilisation | 🚧 (v1.1.0, M-12 — §5.6, US-OCR-01..08) | | Saisie manuelle | ✅ | | Résultat Possédé / Absent | ✅ | | Gestion des doublons | ✅ | diff --git a/docs/05-ARCHITECTURE.md b/docs/05-ARCHITECTURE.md index c52fa05..c1c5bd6 100644 --- a/docs/05-ARCHITECTURE.md +++ b/docs/05-ARCHITECTURE.md @@ -116,7 +116,6 @@ src/ │ ├── types.ts # Types SQLite / rows │ └── repositories/ │ ├── magazine-repository.ts -│ ├── collection-repository.ts │ └── settings-repository.ts │ ├── identification/ @@ -124,11 +123,13 @@ src/ │ ├── scanBarcode.ts # Nettoyage / validation EAN-13, ISBN │ ├── identificationService.ts # Orchestration scan + recherche │ └── ocr/ -│ ├── ocrTypes.ts # Interface OcrEngine + OcrFrameResult +│ ├── ocrTypes.ts # Interface OcrEngine + OcrFrameResult (+ zones, M-12) │ ├── ocrTextParser.ts # Extraction publication / numéro / date │ ├── ocrTextStabilizer.ts # Vote multi-frames (2 lectures concordantes) │ ├── ocrEngine.ts # NoopOcrEngine (repli CI-safe) -│ └── mlKitOcrEngine.ts # Moteur natif Google ML Kit (par défaut) +│ ├── mlKitOcrEngine.ts # Moteur natif Google ML Kit (par défaut) +│ ├── ocrImagePreprocessor.ts # Prétraitement éphémère (M-12, M12-01) +│ └── ocrCandidateAnalyzer.ts # Candidats par champ + confiance (M-12, M12-03) │ ├── backup/ │ ├── backup-service.ts # Export / import JSON + CSV @@ -289,6 +290,19 @@ module natif est **paresseux** (dans `recognize`) : sur CI / hors Development Bu retourne `null` sans bloquer les tests. `NoopOcrEngine` reste disponible comme repli. La reconnaissance brute se valide sur téléphone physique (Development Build). +**Évolution M-12 — OCR interactif & fiabilisation (à venir, US-OCR-01..08)** : +- `OcrFrameResult` ({ text }) évolue vers un résultat avec **zones** (`blocks` / + `lines` / `elements` + `boundingBox`) — gap à confirmer dans `expo-mlkit-ocr` + (issue M12-02 #206) ; +- `ocrImagePreprocessor` (prétraitement éphémère : redimensionnement + contraste) + branché avant `recognize` (issue M12-01 #205) ; +- `ocrCandidateAnalyzer` produit des **candidats par champ** avec score de + confiance (règles métier : pages/prix/année/numéro) (issue M12-03 #207) ; +- nouvel écran `/scan/ocr-review` : overlay photo + zones cliquables + conversion + de coordonnées image→écran (issues M12-05 ../09) ; +- intégration des valeurs validées à `identificationService.searchByOcrFields` + (issue M12-07 #211). + **Qualité lecture (M10R2-09, US-UX-21)** — textes stylisés / encres faibles : - Capture **haute résolution** (`takePictureAsync({ quality: 1, skipProcessing: false })`) dans `camera.tsx` pour préserver les petites encres des titres dessinés ; diff --git a/docs/08-USER-STORIES.md b/docs/08-USER-STORIES.md index c995332..48754ab 100644 --- a/docs/08-USER-STORIES.md +++ b/docs/08-USER-STORIES.md @@ -18,7 +18,9 @@ 8. [Épique 6 — Qualité & publication](#8-épique-6--qualité--publication) 9. [Épique 7 — Paramètres](#9-épique-7--paramètres) 10. [Épique 8 — UI/UX M-10](#10-épique-8--uiux-m-10) -11. [Représentation graphique](#11-représentation-graphique) +11. [Épique 9 — OCR interactif & fiabilisation](#11-épique-9--ocr-interactif--fiabilisation) +12. [Représentation graphique](#12-représentation-graphique) +13. [Récapitulatif des user stories](#13-récapitulatif-des-user-stories) --- @@ -679,7 +681,117 @@ Chaque story est identifiée par un code (ex. `US-DB-01`) et possède : --- -## 11. Représentation graphique +## 11. Épique 9 — OCR interactif & fiabilisation (M-12) + +> Évolution du flux OCR de l'Épique 4 : l'application lit la couverture, +> **analyse des candidats** (titre, numéro/tome, année, pages, prix…) avec un +> **niveau de confiance**, **propose automatiquement** les champs fiables et +> ne fait **intervenir Marc que pour les zones ambiguës**, sélectionnées en +> touchant directement la photo. Cible : après v1.0.0 (**M-12 → v1.1.0**, +> issue #205-#212). + +### US-OCR-01 — Préparer la photo avant la lecture (prétraitement) +> En tant que **Marc**, je veux **que la photo de la couverture soit retravaillée (redimensionnement, contraste) avant la reconnaissance** afin de **maximiser les chances de lecture, même sur une couverture stylisée**. + +**Critères d'acceptation** : +- un prétraitement (redimensionnement + contraste) est appliqué avant la reconnaissance ; +- aucune image n'est enregistrée (analyse éphémère, R14.2) ; +- la lecture est plus fiable qu'à l'écran nu sur les couvertures fortement stylisées. + +**Statut (M-12)** : backlog — [M12-01 (#205)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/205). + +**Priorité** : haute. + +### US-OCR-02 — Lire le texte ET sa position (bounding boxes) +> En tant que **Marc**, je veux **que l'application connaisse non seulement le texte de la couverture mais aussi où se trouve chaque texte sur la photo** afin de **pointer précisément l'information correcte** en cas d'ambiguïté. + +**Critères d'acceptation** : +- l'OCR retourne le texte **et** la position (bounding box) de chaque zone détectée ; +- les positions sont exprimées dans un référentiel exploitable par l'écran ; +- le moteur reste abstrait (`OcrEngine`) et la CI reste verte sans module natif. + +**Statut (M-12)** : backlog — [M12-02 (#206)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/206). + +**Priorité** : haute. + +### US-OCR-03 — Comprendre ce que dit la couverture (candidats + confiance) +> En tant que **Marc**, je veux **que l'application distingue le titre, le numéro/tome/issue, l'année, voire le prix ou le nombre de pages** afin de **ne pas confondre « 125 » (numéro) avec « 192 PAGES », « €8,50 » ou « 2026 »**. + +**Critères d'acceptation** : +- pour chaque champ (titre, numéro/tome, année, éditeur…) une liste de **candidats** est produite avec un **niveau de confiance** ; +- les règles métier discriminent : `192 PAGES` ≠ numéro, `€8,50` = prix, `2026` = année, `TOME 12` / `N° 125` = numéro ; +- le module est testable sans dépendance matérielle. + +**Statut (M-12)** : backlog — [M12-03 (#207)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/207). + +**Priorité** : haute. + +### US-OCR-04 — Proposer automatiquement les champs fiables +> En tant que **Marc**, je veux **que l'application pré-remplisse les champs dont elle est sûre (ex. `Titre ✓ VOGUE`, `Numéro ✓ 125`, `Année ✓ 2026`)** afin de **valider d'un coup d'œil sans tout relire**. + +**Critères d'acceptation** : +- un seuil de confiance déclenche la proposition automatique d'un champ ; +- en cas de candidats à confiance proche, **aucune** proposition automatique (validation utilisateur requise) ; +- les propositions restent **toujours** modifiables. + +**Statut (M-12)** : backlog — [M12-04 (#208)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/208). + +**Priorité** : moyenne. + +### US-OCR-05 — Choisir la bonne zone sur la photo +> En tant que **Marc**, je veux **voir la photo avec les zones de texte détectées et toucher directement la bonne zone** afin de **dire à l'application où se trouve l'information** quand un champ est ambigu ou multiple. + +**Critères d'acceptation** : +- après la capture, un écran intermédiaire affiche la photo + les zones OCR en overlay ; +- les zones suivent fidèlement la photo quel que soit l'écran (conversion des coordonnées) ; +- chaque zone est **cliquable** ; +- aucune image n'est enregistrée. + +**Statut (M-12)** : backlog — [M12-05 (#209)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/209). + +**Priorité** : haute. + +### US-OCR-06 — Sélectionner une zone pour un champ et corriger vite +> En tant que **Marc**, je veux **associer une zone au titre, au numéro/tome ou à l'année et remplacer rapidement une proposition** afin de **corriger sans ressaisir tout le formulaire**. + +**Critères d'acceptation** : +- une zone peut être sélectionnée comme **titre**, **numéro/tome/issue** ou **année/date** ; +- une proposition automatique peut être **remplacée** par une autre zone ou une saisie directe ; +- les champs non identifiés restent vides (jamais de blocage) ; +- la correction prend au plus 2-3 gestes par champ. + +**Statut (M-12)** : backlog — [M12-06 (#210)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/210). + +**Priorité** : haute. + +### US-OCR-07 — Rechercher / ajouter avec les valeurs validées +> En tant que **Marc**, je veux **rechercher avec le titre+numéro validés ou ajouter même si une information manque** afin de **conclure en brocante sans refaire une saisie complète**. + +**Critères d'acceptation** : +- les valeurs validées déclenchent la recherche → résultat Possédé / Absent ; +- information absente → saisie manuelle **pré-remplie** avec ce qui est connu (pas de blocage) ; +- plusieurs candidats possibles → l'utilisateur choisit (jamais de choix automatique hasardeux). + +**Statut (M-12)** : backlog — [M12-07 (#211)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/211). + +**Priorité** : moyenne. + +### US-OCR-08 — Fiabiliser sur de vraies couvertures (tests terrain + règles) +> En tant que **Marc**, je veux **que l'OCR soit renforcé sur les magazines, BD, comics et couvertures stylisées, nombreux nombres ou textes inclinés** afin de **limiter les erreurs et corrections manuelles**. + +**Critères d'acceptation** : +- un **jeu de test** de couvertures réelles est constitué (magazines, BD/comics, stylisées, textes inclinés, « plusieurs nombres ») ; +- les **erreurs OCR** et les **erreurs de classification des champs** sont mesurées et consignées ; +- les règles métier (US-OCR-03) et les seuils (US-OCR-04) sont ajustés à partir des mesures ; +- la synthèse est documentée (`docs/12-TESTING.md`). + +**Statut (M-12)** : backlog — [M12-08 (#212)](https://github.com/donovan-dev-web/PicsouCollectionApp/issues/212). + +**Priorité** : moyenne. + +--- + +## 12. Représentation graphique ``` ┌─────────────────── ÉPIQUES ───────────────────┐ @@ -699,7 +811,7 @@ Chaque story est identifiée par un code (ex. `US-DB-01`) et possède : --- -## Récapitulatif des user stories +## 13. Récapitulatif des user stories | Épique | Stories | Nb | |---|---|---| @@ -714,4 +826,5 @@ Chaque story est identifiée par un code (ex. `US-DB-01`) et possède : | UI/UX M-10R (retours terrain) | US-UX-07 à 12 | 6 | | UI/UX M-10R2 (2ᵉ passe retours) | US-UX-13 à 22 | 10 | | UI/UX M-09 (tests terrain) | US-UX-23 | 1 | -| **Total** | | **61** | +| OCR interactif & fiabilisation (M-12) | US-OCR-01 à 08 | 8 | +| **Total** | | **69** | diff --git a/docs/09-ISSUE.md b/docs/09-ISSUE.md index 5a2f7a8..2291adf 100644 --- a/docs/09-ISSUE.md +++ b/docs/09-ISSUE.md @@ -212,6 +212,7 @@ Les milestones correspondent aux **phases de la roadmap** (`11-ROADMAP.md`). | `M-10R2` | 2ᵉ passe retours test physique | SafeZone drawer, permission caméra + onboarding 1er lancement, popup résultat, form valider header, paramètres sous-menus, header fiche, tri collection, OCR numéro, écran Recherche → v0.9.2 (livrée, PR #176) | | `M-09` | Tests terrain & publication | Validation réelle, retours physique → v0.9.3 (M09-01 panneau recherche #177) | | `M-11` | Review & Qualité v1.0.0 | Audit doc ↔ code, revue, refactor, tests, retrait Play Store, publication APK GitHub → v1.0.0 (#181-#190) | +| `M-12` | OCR interactif & fiabilisation (v1.1.0) | Prétraitement de la photo, OCR texte + bounding boxes, analyse de candidats par champ (titre, numéro/tome, année, pages, prix) avec confiance, propositions automatiques, sélection interactive des zones, correction rapide, intégration à la recherche, jeu de test réel → **après v1.0.0** (#205-#212) | ### Règle d'attribution - Chaque milestone a une **date de fin cible** (indicative) et une **description** ; @@ -292,6 +293,23 @@ M-10/M-10R/M-10R2 terminées, correction issues ouvertes pendant la Phase 9 |---|---|---|---| | M09-01 | Collection : panneau de recherche repliable (bouton Rechercher) | #177 | En cours (PR #178) | +**Milestone M-12 « OCR interactif & fiabilisation » (v1.1.0)** — après v1.0.0 · +milestone GitHub #17 · issues **#205 à #212** · ajoutées au project #5 (To Do, P1) + +| Issue | Titre | GitHub | Statut | +|---|---|---|---| +| M12-01 | OCR : prétraitement de la photo avant reconnaissance | #205 | À faire | +| M12-02 | OCR : récupérer texte + bounding boxes (ML Kit) | #206 | À faire | +| M12-03 | OCR : analyse de candidats par champ + score de confiance | #207 | À faire | +| M12-04 | OCR : propositions automatiques et seuil de confiance | #208 | À faire | +| M12-05 | OCR : écran interactif — overlay photo + zones cliquables | #209 | À faire | +| M12-06 | OCR : sélection d'une zone pour un champ + correction rapide | #210 | À faire | +| M12-07 | OCR : brancher les valeurs validées à la recherche / l'ajout | #211 | À faire | +| M12-08 | OCR : jeu de test réel, mesure des erreurs, ajustement des règles | #212 | À faire | + +Voir `08-USER-STORIES.md` §11 (US-OCR-01..08). Backlog : non engagé tant que +**M-11 / v1.0.0** n'est pas clôturé. + ### 6.2 Décisions de conception et causes racines (retours terrain) Les retours test physique ont produit des choix structurants conservés ici. @@ -539,7 +557,7 @@ Utiliser les **workflows natifs de GitHub Projects** pour déplacer automatiquem À l'initialisation du dépôt GitHub, configurer : - [ ] **Labels** : types, priorités, épiques, complexité (section 5) ; -- [ ] **Milestones** : M-01 à M-11 (+ `M-04R`, `M-07R`, `M-10R`, `M-10R2`) (section 6) ; +- [ ] **Milestones** : M-01 à M-12 (+ `M-04R`, `M-07R`, `M-10R`, `M-10R2`) (section 6) ; - [ ] **Project** : board Kanban "Picsou Collection" (section 10) ; - [ ] **Branch protection** sur `main` et `develop` (section 7) ; - [ ] **Templates d'issue** (bug + tâche) via `.github/ISSUE_TEMPLATE/` ; @@ -557,6 +575,6 @@ Utiliser les **workflows natifs de GitHub Projects** pour déplacer automatiquem | Outil de suivi | GitHub Projects (Kanban) | | Découpage | User story → issues → tasks | | Labels | types, priorités, épiques, complexité, statuts | -| Milestones | M-01 à M-11 (+ `M-04R`, `M-07R`, `M-10R`, `M-10R2`) (phases roadmap) | +| Milestones | M-01 à M-12 (+ `M-04R`, `M-07R`, `M-10R`, `M-10R2`) (phases roadmap) | | Versionnage | Semantic Versioning | | PR | Template + CI + revue + DoD | diff --git a/docs/11-ROADMAP.md b/docs/11-ROADMAP.md index 7c6d0e5..8163155 100644 --- a/docs/11-ROADMAP.md +++ b/docs/11-ROADMAP.md @@ -25,7 +25,10 @@ 15. [Phase 10R — Retours test physique M-10](#15-phase-10r--retours-test-physique-m-10) 16. [Phase 10R2 — 2ᵉ passe retours test physique](#16-phase-10r2--2ᵉ-passe-retours-test-physique) 17. [Phase 9 — Tests terrain & publication](#17-phase-9--tests-terrain--publication) -18. [Critères de sortie de chaque phase](#18-critères-de-sortie-de-chaque-phase) +18. [Phase 11 — Review & Qualité v1.0.0 (M-11)](#18-phase-11--review--qualité-v100-m-11) +19. [Phase 12 — OCR interactif & fiabilisation (M-12 → v1.1.0)](#19-phase-12--ocr-interactif--fiabilisation-m-12--v110) +20. [Critères de sortie de chaque phase](#critères-de-sortie-de-chaque-phase) +21. [Récapitulatif](#récapitulatif) --- @@ -58,6 +61,7 @@ Phase 10R2 ███████████████████████ Phase 10R3 ██████████████████████████████ Terminé ✓ (v0.9.3) Phase 9 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ À venir (M-09 → v1.0.0) Phase 11 ▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░ En cours (M-11 → v1.0.0) +Phase 12 ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ À venir (M-12 → v1.1.0) ``` ### 2.1 Correspondance phase ↔ milestone ↔ issues @@ -83,7 +87,8 @@ Chaque phase de la roadmap correspond à un **milestone GitHub** (`M-0x`) et à | 10R3 — Retours test v0.9.3 | `M-09 — Tests terrain & publication` | `US-UX-23` (#177), retours physiques v0.9.3 | 1 | | 9 — Tests & publication | `M-09 — Tests terrain & publication` | `US-QA-03` | 1 | | 11 — Review & Qualité | `M-11 — Review & Qualité v1.0.0` | issues M11-01..10 (#181-#190) | 10 | -| **Total** | | | **114** | +| 12 — OCR interactif | `M-12 — OCR interactif & fiabilisation (v1.1.0)` | `US-OCR-01..08` (issues M12-01..08, #205-#212) | 8 | +| **Total** | | | **122** | --- @@ -472,6 +477,35 @@ Détail : [09-ISSUE.md §6 – Milestones](09-ISSUE.md#6-milestones). --- +## 19. Phase 12 — OCR interactif & fiabilisation (M-12 → v1.1.0) + +**Objectif** : rendre le flux OCR **fiable en brocante** pour tous les supports +(magazines, BD, comics, couvertures stylisées). L'application fait le maximum +automatiquement — prétraitement de la photo, OCR texte + positions, analyse de +**candidats par champ** (titre, numéro/tome, année, pages, prix…) avec +**niveau de confiance**, **propositions automatiques** au-dessus d'un seuil — +et **n'implique Marc que pour les zones ambiguës**, qu'il sélectionne en +touchant la photo. Démarrage **après la v1.0.0** (M-11). + +| Tâche | Issue | Statut | +|---|---|---| +| Prétraitement de la photo avant reconnaissance (redimensionnement, contraste) | M12-01 (#205) | À faire | +| Récupérer texte + bounding boxes (ML Kit) | M12-02 (#206) | À faire | +| Analyse de candidats par champ + score de confiance (règles métier) | M12-03 (#207) | À faire | +| Propositions automatiques et seuil de confiance | M12-04 (#208) | À faire | +| Écran interactif : overlay photo + zones cliquables | M12-05 (#209) | À faire | +| Sélection d'une zone pour un champ + correction rapide | M12-06 (#210) | À faire | +| Brancher les valeurs validées à la recherche / l'ajout | M12-07 (#211) | À faire | +| Jeu de test réel, mesure des erreurs, ajustement des règles/seuils | M12-08 (#212) | À faire | + +**Livrables** : 8 issues M12-01..08 (#205-#212) + 8 user stories US-OCR-01..08 +(`08-USER-STORIES.md` §11). Définition fonctionnelle : `04-FONCTIONAL-SPEC.md` +§5.6 ; technique : `03-TECHNICAL-SPEC.md` §5.5. + +**Statut : À venir** — backlog ; ne démarre qu'à la fermeture du **M-11**. + +--- + ## 20. Critères de sortie de chaque phase Pour chaque phase, les critères de sortie sont : @@ -508,4 +542,5 @@ Pour chaque phase, les critères de sortie sont : | 10R3 — Retours test v0.9.3 | Recherche repliable, drawer scroll, renommage | US-UX-23 (M09-01) | 1 | | 9 — Publication | APK GitHub (release v1.0.0) | US-QA-03 | 1 | | 11 — Review & Qualité | Préparation v1.0.0 | M11-01..10 (#181-#190) | 10 | -| **Total** | | | **114** | +| 12 — OCR interactif | OCR interactif & fiabilisation (v1.1.0) | US-OCR-01..08 (M12-01..08, #205-#212) | 8 | +| **Total** | | | **122** | diff --git a/docs/12-TESTING.md b/docs/12-TESTING.md index c718bc7..be9426b 100644 --- a/docs/12-TESTING.md +++ b/docs/12-TESTING.md @@ -121,6 +121,28 @@ Couvrent le rendu et les interactions des **écrans et composants critiques**. I ### 5.3 Tests manuels (terrain) [catégorie B] Tests sur **téléphone physique** avec de vrais magazines, notamment pour caméra et OCR (difficilement automatisables). C'est le cas le plus évident de validation **du point de vue de l'utilisateur** : le résultat est-il réellement utilisable en brocante ? +### 5.4 Jeu de test OCR interactif (M-12, US-OCR-08) +Pour fiabiliser le flux OCR v2 (voir `04-FONCTIONAL-SPEC.md` §5.6), un **jeu de +test sur couvertures réelles** est constitué et documenté (issue M12-08 #212) : + +**Couverture du corpus** +- magazines classiques (ex. Disney) — texte standard, barre titre + numéro « N° » ; +- BD / comics — titres et logos **fortement stylisés** ; +- **nombreux nombres** sur la couverture (année, `192 PAGES`, `€8,50`, prix, numéro) ; +- textes **inclinés** ou fonds complexes / faible contraste. + +**Mesures produites** +- **taux d'erreurs OCR** : texte lu vs texte réel des zones ciblées ; +- **taux d'erreurs de classification des champs** : un numéro pris pour une + année, un prix pour un numéro, etc. ; +- répartition des décisions : propositions automatiques valides / corrélées / + échecs exigeant une sélection manuelle. + +**Boucle** : les erreurs alimentent les **règles métier** (`ocrCandidateAnalyzer`, +M12-03) et les **seuils de confiance** (M12-04) ; la synthèse et les chiffres +sont consignés dans ce document au fil des passes. Les cas à fort risque sont +**automatisés** (matrices de classification) pour éviter toute régression. + --- ## 6. Outillage