Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions docs/03-TECHNICAL-SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
45 changes: 45 additions & 0 deletions docs/04-FONCTIONAL-SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 | ✅ |
Expand Down
20 changes: 17 additions & 3 deletions docs/05-ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,19 +116,20 @@ src/
│ ├── types.ts # Types SQLite / rows
│ └── repositories/
│ ├── magazine-repository.ts
│ ├── collection-repository.ts
│ └── settings-repository.ts
│
├── identification/
│ ├── barcodeStabilizer.ts # Lissage des lectures récurrentes
│ ├── 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
Expand Down Expand Up @@ -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.
<b>La reconnaissance brute se valide sur téléphone physique</b> (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 ;
Expand Down
121 changes: 117 additions & 4 deletions docs/08-USER-STORIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

---

Expand Down Expand Up @@ -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 ───────────────────┐
Expand All @@ -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 |
|---|---|---|
Expand All @@ -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** |
Loading
Loading