feat(mobile): On-Device OCR-Pipeline zusammenführen + Server-Fallback #82

Closed
opened 2026-04-26 09:11:54 +02:00 by admin-mrrm · 1 comment
Owner

Ziel

Alle On-Device-Komponenten zu einer vollständigen OCR-Pipeline zusammenführen und nahtlos in den bestehenden Flow integrieren. Server bleibt als Fallback für iOS und ältere Android-Geräte.

Abhängigkeiten

Setzt #79 (ONNX Build), #80 (Tokenizer) und #81 (Preprocessing) voraus.

Architektur

handleCameraPress(model)
  └─ canRunOnDevice()  ──yes──▶ runOnDeviceOcr(file, model)
       │                              └─ preprocessImage()
       │                              └─ splitLines()
       │                              └─ für jede Zeile:
       │                                   encoder.run(pixelValues)
       │                                   decoder.run(encoderOutput)
       │                                   tokenizer.decode(ids)
       no
       └─▶ uploadToServer(file, model)  [bisheriger Flow]

Aufgaben

OCR-Hook erweitern

  • useParseShoppingListImage – erkennt automatisch ob On-Device möglich
  • canRunOnDevice(): boolean – prüft Android + ONNX-Modell vorhanden
  • runOnDeviceOcr(file, model) – führt die lokale Pipeline aus
  • Gleiches Rückgabeformat wie Server: { items, preprocessedImage }

Modellauswahl

  • On-Device: nur Handschrift-Modelle anbieten (kein Druck-Modell bundlen)
  • Modell-Selector im UI: On-Device-Modelle mit -Symbol markieren

Fehlerbehandlung

  • On-Device-Fehler → automatischer Fallback auf Server mit Hinweis an den User
  • Modell noch nicht geladen → Download-Dialog

Performance

  • Inferenzzeit pro Zeile und gesamt loggen
  • Vergleich Server vs. On-Device im Debug-Modus anzeigen

Akzeptanzkriterien

  • Auf Pixel 8 Pro läuft OCR vollständig ohne Netzwerk
  • Auf iOS und alten Android-Geräten wird der Server genutzt
  • Erkennungsqualität ≥ Server (gemessen an 10 Test-Fotos)
  • Gesamtlaufzeit auf Pixel 8 Pro < 15 s für eine 10-zeilige Liste
## Ziel Alle On-Device-Komponenten zu einer vollständigen OCR-Pipeline zusammenführen und nahtlos in den bestehenden Flow integrieren. Server bleibt als Fallback für iOS und ältere Android-Geräte. ## Abhängigkeiten Setzt #79 (ONNX Build), #80 (Tokenizer) und #81 (Preprocessing) voraus. ## Architektur ``` handleCameraPress(model) └─ canRunOnDevice() ──yes──▶ runOnDeviceOcr(file, model) │ └─ preprocessImage() │ └─ splitLines() │ └─ für jede Zeile: │ encoder.run(pixelValues) │ decoder.run(encoderOutput) │ tokenizer.decode(ids) no └─▶ uploadToServer(file, model) [bisheriger Flow] ``` ## Aufgaben ### OCR-Hook erweitern - [ ] `useParseShoppingListImage` – erkennt automatisch ob On-Device möglich - [ ] `canRunOnDevice(): boolean` – prüft Android + ONNX-Modell vorhanden - [ ] `runOnDeviceOcr(file, model)` – führt die lokale Pipeline aus - [ ] Gleiches Rückgabeformat wie Server: `{ items, preprocessedImage }` ### Modellauswahl - [ ] On-Device: nur Handschrift-Modelle anbieten (kein Druck-Modell bundlen) - [ ] Modell-Selector im UI: On-Device-Modelle mit ⚡-Symbol markieren ### Fehlerbehandlung - [ ] On-Device-Fehler → automatischer Fallback auf Server mit Hinweis an den User - [ ] Modell noch nicht geladen → Download-Dialog ### Performance - [ ] Inferenzzeit pro Zeile und gesamt loggen - [ ] Vergleich Server vs. On-Device im Debug-Modus anzeigen ## Akzeptanzkriterien - [ ] Auf Pixel 8 Pro läuft OCR vollständig ohne Netzwerk - [ ] Auf iOS und alten Android-Geräten wird der Server genutzt - [ ] Erkennungsqualität ≥ Server (gemessen an 10 Test-Fotos) - [ ] Gesamtlaufzeit auf Pixel 8 Pro < 15 s für eine 10-zeilige Liste
Collaborator

Closed — v0.5-OCR pivotet weg von On-Device

Privacy-Klarstellung des Stakeholders: Eigener Server = trusted compute zone für nicht-sensible Daten (Einkaufszettel zählen dazu). Damit fällt der zentrale Argumentations-Treiber für On-Device-OCR weg.

Was übrig bliebe für On-Device:

  • Offline-Fähigkeit: Nice-to-have, aber nicht workflow-blockierend
  • Latency: 449 ms vs. ~2 s Server-Roundtrip — nicht das Problem
  • Kosten: 76 MB Bundle (TrOCR allein, ohne CRAFT)

→ Kosten/Nutzen rechtfertigt On-Device-Pipeline nicht.

Was stattdessen passiert: v0.5-OCR-Hauptdeliverable wird #415 Fuzzy-Match server-side. Roh-OCR-Qualität (Server CER 0.67, TrOCR 0.51 — siehe #416) wird über Sortiments-Lookup für den User nutzbar gemacht.

Spike-Investitionen nicht verloren: #77-Code (ORT-RN-Integration, KV-cache-Decode, Asset-Bundling) bleibt im Repo als Reference für ein hypothetisches künftiges On-Device-Comeback.

## Closed — v0.5-OCR pivotet weg von On-Device **Privacy-Klarstellung des Stakeholders:** Eigener Server = trusted compute zone für nicht-sensible Daten (Einkaufszettel zählen dazu). Damit fällt der zentrale Argumentations-Treiber für On-Device-OCR weg. **Was übrig bliebe für On-Device:** - Offline-Fähigkeit: Nice-to-have, aber nicht workflow-blockierend - Latency: 449 ms vs. ~2 s Server-Roundtrip — nicht das Problem - Kosten: 76 MB Bundle (TrOCR allein, ohne CRAFT) → Kosten/Nutzen rechtfertigt On-Device-Pipeline nicht. **Was stattdessen passiert:** v0.5-OCR-Hauptdeliverable wird #415 Fuzzy-Match server-side. Roh-OCR-Qualität (Server CER 0.67, TrOCR 0.51 — siehe #416) wird über Sortiments-Lookup für den User nutzbar gemacht. **Spike-Investitionen nicht verloren:** #77-Code (ORT-RN-Integration, KV-cache-Decode, Asset-Bundling) bleibt im Repo als Reference für ein hypothetisches künftiges On-Device-Comeback.
Sign in to join this conversation.
No project
No assignees
2 participants
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#82
No description provided.