feat(mobile): TrOCR-Re-Evaluation auf echten /training_data-Crops #416

Closed
opened 2026-05-28 06:39:39 +02:00 by pm-bot · 1 comment
Collaborator

Ziel

Die Spike-CER-Messung (0.043 case-folded, #77) lief auf synthetisch gerenderten 20-Crops mit varied fonts/sizes/rotation. Vor Production-Rollout (#82) müssen wir auf echten Einkaufszettel-Crops messen.

Datenquelle

Server-OCR sammelt Korrektur-Sessions im Volume /training_data (Container apps/ocr/), per apps/ocr/app/ocr.py:230 _save_training_session(). Jede Session hat \n- Original-Crops\n- Korrigierte Ground-Truth-Lines\n\nDamit existiert bereits ein wachsender Real-World-Datensatz.

Scope

  1. Export aller /training_data/-Sessions (read-only Pull vom prod-alt OCR-Container)
  2. Anonymisierung-Check (keine PII auf Quittungen — Adressen, Kreditkartennummern maskieren falls vorhanden)
  3. CER-Messung mit measure_cer.py (3 Varianten: TrOCR-int8 / TrOCR-fp32 / Server-Baseline)
  4. Pro Aufnahme-Bedingung (gute/schlechte Beleuchtung, gerade/schief, Druck/Handschrift) auswerten
  5. Go/No-Go: Wenn CER >0.15 auf realen Daten → Finetune-Story oder Modell-Swap (z.B. TrOCR-base-printed mit größerem Bundle)

Definition-of-Done

  • Real-World-Eval-Set extrahiert + anonymisiert
  • CER pro Variante + Aufnahme-Kategorie dokumentiert
  • Entscheidung: TrOCR-small-printed ausreichend / Finetune nötig / Modell-Swap
  • Bei Finetune-Bedarf: Folgestory mit Trainings-Pipeline

Referenzen

  • Parent-Spike: #77
  • Architecture-Reconciliation: #413, #77#issuecomment-2688
  • Blockiert: #82 (Production-Rollout sollte auf gemessene Real-World-CER warten)
## Ziel Die Spike-CER-Messung (0.043 case-folded, #77) lief auf synthetisch gerenderten 20-Crops mit varied fonts/sizes/rotation. Vor Production-Rollout (#82) müssen wir auf echten Einkaufszettel-Crops messen. ## Datenquelle Server-OCR sammelt Korrektur-Sessions im Volume `/training_data` (Container `apps/ocr/`), per `apps/ocr/app/ocr.py:230` `_save_training_session()`. Jede Session hat \n- Original-Crops\n- Korrigierte Ground-Truth-Lines\n\nDamit existiert bereits ein wachsender Real-World-Datensatz. ## Scope 1. Export aller `/training_data/`-Sessions (read-only Pull vom prod-alt OCR-Container) 2. Anonymisierung-Check (keine PII auf Quittungen — Adressen, Kreditkartennummern maskieren falls vorhanden) 3. CER-Messung mit `measure_cer.py` (3 Varianten: TrOCR-int8 / TrOCR-fp32 / Server-Baseline) 4. Pro Aufnahme-Bedingung (gute/schlechte Beleuchtung, gerade/schief, Druck/Handschrift) auswerten 5. Go/No-Go: Wenn CER >0.15 auf realen Daten → Finetune-Story oder Modell-Swap (z.B. TrOCR-base-printed mit größerem Bundle) ## Definition-of-Done - [ ] Real-World-Eval-Set extrahiert + anonymisiert - [ ] CER pro Variante + Aufnahme-Kategorie dokumentiert - [ ] Entscheidung: TrOCR-small-printed ausreichend / Finetune nötig / Modell-Swap - [ ] Bei Finetune-Bedarf: Folgestory mit Trainings-Pipeline ## Referenzen - Parent-Spike: #77 - Architecture-Reconciliation: #413, #77#issuecomment-2688 - Blockiert: #82 (Production-Rollout sollte auf gemessene Real-World-CER warten)
Author
Collaborator

Real-Data-Eval abgeschlossen

77 echte Crops aus 5 corrected sessions aus /training_data (prod-alt OCR-Container).

Metrik Synthetic (Tag-5) Real (this eval)
TrOCR-int8 mean CER 0.043 0.510
Acceptable (CER≤0.15) ~85% 9%
Exact-match n/a 7% (5/76)

EasyOCR-Baseline: CER 0.670 (TrOCR ist besser, aber beide weit unter Brauchbarkeit).

Befund: TrOCR-small-PRINTED kann keine Handschrift. Best-Performers (BLOCK, SOCKEN, KISSEN, HUT, RUCOLA) sind alles gedruckte Items; Worst-Performers sind handgeschriebene Einkaufszettel-Einträge wo das Modell plausible englische Druckschrift halluziniert (Hund → REHOL, Knoblauch → LABELEL).

Konsequenz: v0.5 pivotet auf Fuzzy-Match #415 als Hauptpfad statt On-Device-OCR-Optimierung. Closing-Cascade #77/#81/#82/#414 in den nächsten Comments.

Eval-Skript + Daten auf dev-neu: /root/ocr-spike/measure_cer_real.py + /root/ocr-spike/real-eval/.

## Real-Data-Eval abgeschlossen 77 echte Crops aus 5 corrected sessions aus `/training_data` (prod-alt OCR-Container). | Metrik | Synthetic (Tag-5) | Real (this eval) | |---|---|---| | TrOCR-int8 mean CER | 0.043 | **0.510** | | Acceptable (CER≤0.15) | ~85% | **9%** | | Exact-match | n/a | 7% (5/76) | **EasyOCR-Baseline:** CER 0.670 (TrOCR ist besser, aber beide weit unter Brauchbarkeit). **Befund:** TrOCR-small-PRINTED kann keine Handschrift. Best-Performers (`BLOCK`, `SOCKEN`, `KISSEN`, `HUT`, `RUCOLA`) sind alles gedruckte Items; Worst-Performers sind handgeschriebene Einkaufszettel-Einträge wo das Modell plausible englische Druckschrift halluziniert (`Hund → REHOL`, `Knoblauch → LABELEL`). **Konsequenz:** v0.5 pivotet auf **Fuzzy-Match #415 als Hauptpfad** statt On-Device-OCR-Optimierung. Closing-Cascade #77/#81/#82/#414 in den nächsten Comments. Eval-Skript + Daten auf dev-neu: `/root/ocr-spike/measure_cer_real.py` + `/root/ocr-spike/real-eval/`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp#416
No description provided.