feat(mobile): Bild-Vorverarbeitung und Zeilensegmentierung on-device #81

Closed
opened 2026-04-26 09:11:35 +02:00 by admin-mrrm · 2 comments
Owner

Ziel

Die Bild-Vorverarbeitung (Deskew, CLAHE, Bilateral-Filter) und Zeilensegmentierung die bisher auf dem Server in Python/OpenCV läuft, auf dem Gerät in JavaScript/nativ implementieren.

Hintergrund

TrOCR erwartet einzelne Zeilenbilder als Input. Auf dem Server übernimmt ocr.py die Segmentierung via OpenCV. On-Device muss das in React Native passieren.

Optionen

Option A: @techstark/opencv-js (empfohlen)

OpenCV.js Port für React Native – enthält alle benötigten Funktionen:

  • cv.threshold (Otsu-Binarisierung)
  • cv.dilate (Zeilensegmentierung)
  • cv.findContours
  • cv.createCLAHE
  • cv.bilateralFilter

Option B: Expo Image Manipulator + eigene Algorithmen

Nur für einfache Ops (Resize, Rotate) geeignet; Contour-Detection fehlt.

Option C: Native Modul

OpenCV Android/iOS direkt einbinden – maximale Performance, höchster Aufwand.

Aufgaben

  • @techstark/opencv-js Kompatibilität mit Expo prüfen
  • preprocessImage(uri: string): Promise<ImageData> implementieren
    • Deskew via minAreaRect
    • CLAHE auf L-Kanal
    • Bilateral-Filter
  • splitLines(imageData: ImageData): Promise<ImageData[]> implementieren
    • Otsu-Binarisierung
    • Horizontale Dilation
    • Contour-Bounding-Boxes
    • Mindestgröße-Filter
  • Ergebnis visuell mit Python-Server-Output vergleichen (gleiche Zeilen erkannt?)

Akzeptanzkriterien

  • Für ein Test-Foto werden dieselben (oder mehr) Zeilen erkannt wie auf dem Server
  • Laufzeit der Segmentierung < 500 ms auf Pixel 8 Pro
## Ziel Die Bild-Vorverarbeitung (Deskew, CLAHE, Bilateral-Filter) und Zeilensegmentierung die bisher auf dem Server in Python/OpenCV läuft, auf dem Gerät in JavaScript/nativ implementieren. ## Hintergrund TrOCR erwartet einzelne Zeilenbilder als Input. Auf dem Server übernimmt `ocr.py` die Segmentierung via OpenCV. On-Device muss das in React Native passieren. ## Optionen ### Option A: `@techstark/opencv-js` (empfohlen) OpenCV.js Port für React Native – enthält alle benötigten Funktionen: - `cv.threshold` (Otsu-Binarisierung) - `cv.dilate` (Zeilensegmentierung) - `cv.findContours` - `cv.createCLAHE` - `cv.bilateralFilter` ### Option B: Expo Image Manipulator + eigene Algorithmen Nur für einfache Ops (Resize, Rotate) geeignet; Contour-Detection fehlt. ### Option C: Native Modul OpenCV Android/iOS direkt einbinden – maximale Performance, höchster Aufwand. ## Aufgaben - [ ] `@techstark/opencv-js` Kompatibilität mit Expo prüfen - [ ] `preprocessImage(uri: string): Promise<ImageData>` implementieren - Deskew via minAreaRect - CLAHE auf L-Kanal - Bilateral-Filter - [ ] `splitLines(imageData: ImageData): Promise<ImageData[]>` implementieren - Otsu-Binarisierung - Horizontale Dilation - Contour-Bounding-Boxes - Mindestgröße-Filter - [ ] Ergebnis visuell mit Python-Server-Output vergleichen (gleiche Zeilen erkannt?) ## Akzeptanzkriterien - [ ] Für ein Test-Foto werden dieselben (oder mehr) Zeilen erkannt wie auf dem Server - [ ] Laufzeit der Segmentierung < 500 ms auf Pixel 8 Pro
Collaborator

Story-Split (per Arch-Konsultation #413 + Fact-Sheet #77):\n\n- Pre-req: Neu eröffneter Spike #414 — CRAFT-Line-Detection on-device (ONNX-Export + RN-Integration, analog #77).\n- Dieses Issue (#81): Bleibt offen, blockiert by #414. Scope nach #414-Done: TrOCR-Eingabe-Crops aus CRAFT-Bounding-Boxes erzeugen + Preprocessing-Pipeline (Deskew, Resize, Normalize) auf Mobile bauen.\n\nServer-OCR (apps/ocr/app/ocr.py) hat CRAFT bereits — Mobile braucht das Äquivalent für den Offline-Pfad.

Story-Split (per Arch-Konsultation #413 + Fact-Sheet #77):\n\n- **Pre-req:** Neu eröffneter Spike #414 — CRAFT-Line-Detection on-device (ONNX-Export + RN-Integration, analog #77).\n- **Dieses Issue (#81):** Bleibt offen, blockiert by #414. Scope nach #414-Done: TrOCR-Eingabe-Crops aus CRAFT-Bounding-Boxes erzeugen + Preprocessing-Pipeline (Deskew, Resize, Normalize) auf Mobile bauen.\n\nServer-OCR (`apps/ocr/app/ocr.py`) hat CRAFT bereits — Mobile braucht das Äquivalent für den Offline-Pfad.
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#81
No description provided.