[Bug] OCR-Merge: zwei separate Handschrift-Zeilen werden fälschlich zusammengefasst #350

Closed
opened 2026-05-19 23:11:30 +02:00 by admin-mrrm · 1 comment
Owner

Beobachtung

Nach dem Merge-Fix aus #325 (PR #346) zeigt der Review-Screen für einen handgeschriebenen Einkaufszettel folgendes Verhalten:

  • „300g Kirschen" (eine Zeile) und „Erdbeeren" (eigene Zeile darunter) werden in eine gemeinsame Bounding-Box zusammengefasst (Confidence 2 %, Text-Output unbrauchbar).
  • Erwartet: zwei getrennte Einträge.

Ursache

Die aktuelle Heuristik in _merge_overlapping_bboxes (apps/ocr/app/ocr.py) prüft:

y_overlap / min(h1, h2) > 0.4 → mergen

Bei deutscher Handschrift mit Unterlängen (g, p, j) und Oberlängen (E, K, l) überlappen vertikal benachbarte Zeilen oft minimal, ohne semantisch eine Zeile zu sein. Der Streifen-Überlapp reicht aus, um den Threshold zu reißen.

Vorgeschlagener Fix

Umstellung auf Center-Y-Distanz als primäre Metrik:

|center_y(box) - center_y(cluster)| < 0.5 * max(h_box, h_cluster) → mergen

Damit zählt nicht der Streifen-Überlapp, sondern ob die Mittellinien beider Boxen tatsächlich auf gleicher Höhe liegen. Robuster gegen Ober-/Unterlängen.

Akzeptanzkriterien

  • Neuer Unit-Test in apps/ocr/tests/test_ocr.py: zwei Boxen mit kleinem Y-Überlapp aber unterschiedlichen Center-Y bleiben getrennt
  • Bestehende 6 Merge-Tests aus #325 bleiben grün
  • Smoke-Test mit dem aus dem Screenshot bekannten Foto: 300g Kirschen und Erdbeeren sind zwei separate Einträge
## Beobachtung Nach dem Merge-Fix aus #325 (PR #346) zeigt der Review-Screen für einen handgeschriebenen Einkaufszettel folgendes Verhalten: - „300g Kirschen" (eine Zeile) und „Erdbeeren" (eigene Zeile darunter) werden in **eine gemeinsame Bounding-Box** zusammengefasst (Confidence 2 %, Text-Output unbrauchbar). - Erwartet: zwei getrennte Einträge. ## Ursache Die aktuelle Heuristik in `_merge_overlapping_bboxes` (apps/ocr/app/ocr.py) prüft: ``` y_overlap / min(h1, h2) > 0.4 → mergen ``` Bei deutscher Handschrift mit Unterlängen (g, p, j) und Oberlängen (E, K, l) überlappen vertikal benachbarte Zeilen oft minimal, ohne semantisch eine Zeile zu sein. Der Streifen-Überlapp reicht aus, um den Threshold zu reißen. ## Vorgeschlagener Fix Umstellung auf **Center-Y-Distanz** als primäre Metrik: ``` |center_y(box) - center_y(cluster)| < 0.5 * max(h_box, h_cluster) → mergen ``` Damit zählt nicht der Streifen-Überlapp, sondern ob die Mittellinien beider Boxen tatsächlich auf gleicher Höhe liegen. Robuster gegen Ober-/Unterlängen. ## Akzeptanzkriterien - [ ] Neuer Unit-Test in `apps/ocr/tests/test_ocr.py`: zwei Boxen mit kleinem Y-Überlapp aber unterschiedlichen Center-Y bleiben getrennt - [ ] Bestehende 6 Merge-Tests aus #325 bleiben grün - [ ] Smoke-Test mit dem aus dem Screenshot bekannten Foto: 300g Kirschen und Erdbeeren sind zwei separate Einträge
Author
Owner

Fixed in #351.

Fixed in #351.
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#350
No description provided.