fix(#325): OCR-Zeilen-Merge für übersegmentierte Boxen #346

Merged
admin-mrrm merged 1 commit from fix/325-ocr-line-merge into main 2026-05-19 22:38:48 +02:00
Owner

Summary

  • Neuer Helper _merge_overlapping_bboxes in apps/ocr/app/ocr.py: clustert EasyOCR-Boxen mit vertikalem Überlapp und joint Text in X-Reihenfolge.
  • Verdrahtet in extract_text (nach dem conf > 0.1-Filter) und in debug_extract (nach _run_easyocr).
  • 6 Unit-Tests in apps/ocr/tests/test_ocr.py decken: leere Eingabe, Merge auf gleicher Zeile, getrennte Zeilen, drei Boxen mit Misch-Layout, X-Sortierung, umschließendes Rechteck.

Fixt #325.

Hintergrund

CRAFT splittet bei Lücken, Schräglage und Unterlängen aggressiv — handgeschriebene Einkaufszettel landeten dadurch im Review-Screen häufig als 2+ Items pro echter Zeile. Der Merge passiert nach dem Confidence-Filter; bestehender Test extract_text_filters_low_confidence bleibt grün, weil das Filterverhalten unverändert ist.

Default y_overlap_ratio = 0.4 (eher konservativ — falsch-Merges sind schlimmer als gar nicht gemerged). Hardcoded konstante; bei Bedarf nach realen Photos nachziehen.

Test plan

  • pytest apps/ocr/tests/test_ocr.py -v grün (Drone-CI)
  • Smoke: Foto eines handgeschriebenen Einkaufszettels → pro echter Zeile genau ein Item im Review-Screen
## Summary - Neuer Helper `_merge_overlapping_bboxes` in `apps/ocr/app/ocr.py`: clustert EasyOCR-Boxen mit vertikalem Überlapp und joint Text in X-Reihenfolge. - Verdrahtet in `extract_text` (nach dem `conf > 0.1`-Filter) und in `debug_extract` (nach `_run_easyocr`). - 6 Unit-Tests in `apps/ocr/tests/test_ocr.py` decken: leere Eingabe, Merge auf gleicher Zeile, getrennte Zeilen, drei Boxen mit Misch-Layout, X-Sortierung, umschließendes Rechteck. Fixt #325. ## Hintergrund CRAFT splittet bei Lücken, Schräglage und Unterlängen aggressiv — handgeschriebene Einkaufszettel landeten dadurch im Review-Screen häufig als 2+ Items pro echter Zeile. Der Merge passiert **nach** dem Confidence-Filter; bestehender Test `extract_text_filters_low_confidence` bleibt grün, weil das Filterverhalten unverändert ist. Default `y_overlap_ratio = 0.4` (eher konservativ — falsch-Merges sind schlimmer als gar nicht gemerged). Hardcoded konstante; bei Bedarf nach realen Photos nachziehen. ## Test plan - [ ] `pytest apps/ocr/tests/test_ocr.py -v` grün (Drone-CI) - [ ] Smoke: Foto eines handgeschriebenen Einkaufszettels → pro echter Zeile genau ein Item im Review-Screen
fix(#325): OCR-Zeilen-Merge für übersegmentierte Boxen
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
ba5ccf0ad7
CRAFT splittet handgeschriebene Zeilen oft in mehrere Bounding-Boxes
(Lücken, Schräglage, Unterlängen) → im Review-Screen erschienen
Bestandteile einer Zeile als separate Items.

_merge_overlapping_bboxes clustert Boxen mit vertikalem Überlapp
(> 40 % der kleineren Höhe), joint Text in X-Reihenfolge mit Space,
nimmt min(conf) und liefert das umschließende Rechteck zurück. Wirkt
in extract_text (nach Confidence-Filter) und debug_extract, sodass
sowohl der Review-Screen als auch das Debug-View pro Zeile genau
einen Eintrag sehen.
Sign in to join this conversation.
No reviewers
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!346
No description provided.