docs: Add OCR Kombi Pipeline to MkDocs and cross-reference from OCR Pipeline
Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 30s
CI / test-go-edu-search (push) Successful in 30s
CI / test-python-klausur (push) Failing after 2m28s
CI / test-python-agent-core (push) Successful in 17s
CI / test-nodejs-website (push) Successful in 18s
Some checks failed
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-school (push) Successful in 30s
CI / test-go-edu-search (push) Successful in 30s
CI / test-python-klausur (push) Failing after 2m28s
CI / test-python-agent-core (push) Successful in 17s
CI / test-nodejs-website (push) Successful in 18s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# OCR Pipeline - Schrittweise Seitenrekonstruktion
|
||||
|
||||
**Version:** 5.0.0
|
||||
**Version:** 5.1.0
|
||||
**Status:** Produktiv (Schritte 1–10 + Grid Editor + Regression Framework)
|
||||
**URL:** https://macmini:3002/ai/ocr-pipeline
|
||||
|
||||
@@ -149,7 +149,9 @@ klausur-service/backend/
|
||||
├── ocr_pipeline_api.py # FastAPI Router (Schritte 2-10)
|
||||
├── orientation_crop_api.py # FastAPI Router (Schritte 1 + 4)
|
||||
├── grid_editor_api.py # Grid Editor: build-grid, save-grid, grid-editor
|
||||
├── grid_editor_helpers.py # Footer-Filterung, Seitenzahl-Extraktion
|
||||
├── cv_ocr_engines.py # OCR-Engines, IPA-Korrektur, Britfone-Woerterbuch
|
||||
├── cv_syllable_detect.py # Deutsche Silbentrennung (Silben:DE Modus)
|
||||
├── cv_box_detect.py # Box-Erkennung + Zonen-Aufteilung
|
||||
├── cv_graphic_detect.py # Grafik-/Bilderkennung (Region-basiert)
|
||||
├── cv_color_detect.py # Farbtext-Erkennung (HSV-Analyse)
|
||||
@@ -1081,6 +1083,8 @@ Rekonstruktion fuer Vokabelseiten mit komplexen Layouts (Bilder, Ueberschriften,
|
||||
| Datei | Beschreibung |
|
||||
|-------|--------------|
|
||||
| `grid_editor_api.py` | `_build_grid_core()` Pipeline, alle Steps |
|
||||
| `grid_editor_helpers.py` | `_filter_footer_words()` → Seitenzahl-Extraktion, Footer-Filterung |
|
||||
| `cv_syllable_detect.py` | Deutsche Silbentrennung mit IPA-Kompatibilitaet |
|
||||
| `cv_ocr_engines.py` | IPA-Korrektur, Britfone-Woerterbuch, Garbled-IPA-Erkennung |
|
||||
| `cv_vocab_types.py` | `PageZone` (mit `image_overlays`), `ColumnGeometry` |
|
||||
| `tests/test_grid_editor_api.py` | 27 Tests |
|
||||
@@ -1106,9 +1110,15 @@ Kombi-Wortdaten
|
||||
├─ Step 4: Farb-Annotation
|
||||
│ → detect_word_colors(): HSV-Farbanalyse aller word_boxes
|
||||
│
|
||||
├─ Step 4b2: Per-Cell Artifact Filter
|
||||
│ → Einzel-Wort-Zellen mit ≤2 Zeichen und conf < 65 entfernen
|
||||
│
|
||||
├─ Step 4c: Oversized Word Box Removal
|
||||
│ → word_boxes > 3x Median entfernen (Grafik-Artefakte)
|
||||
│
|
||||
├─ Step 4d2: Connector Column Normalization
|
||||
│ → Dominante Kurzwoerter in schmalen Spalten normalisieren
|
||||
│
|
||||
├─ Step 5: Overlay-Wort-Filter
|
||||
│ → Woerter innerhalb image_overlays entfernen
|
||||
│
|
||||
@@ -1197,6 +1207,38 @@ des Headwords der vorherigen Zeile). Diese werden von PaddleOCR als garbled Text
|
||||
4. Schlaegt IPA im Britfone-Woerterbuch nach
|
||||
5. Beruecksichtigt alle Wortteile (z.B. "close sth. down" → `[klˈəʊz dˈaʊn]`)
|
||||
|
||||
### Per-Cell Artifact Filter (Step 4b2)
|
||||
|
||||
Entfernt OCR-Rauschen auf Zellebene: Zellen mit genau einer `word_box`, maximal 2 Zeichen
|
||||
und Confidence unter 65 werden als Artefakte klassifiziert und entfernt.
|
||||
|
||||
**Konstanten:**
|
||||
|
||||
| Parameter | Wert | Beschreibung |
|
||||
|-----------|------|--------------|
|
||||
| `_ARTIFACT_MAX_LEN` | 2 | Maximale Textlaenge fuer Artefakt-Verdacht |
|
||||
| `_ARTIFACT_CONF_THRESHOLD` | 65 | Confidence-Schwelle (darunter = Artefakt) |
|
||||
|
||||
**Sicherheit:** Einzelne Zeichen mit hoher Confidence (z.B. rote `!`-Marker mit conf=98)
|
||||
werden **nicht** entfernt, da ihre Confidence ueber dem Schwellwert liegt.
|
||||
|
||||
**Typische Artefakte:** `(as)` conf=55, `u)` conf=44 — OCR-Noise aus Seitenraendern
|
||||
oder Schatten.
|
||||
|
||||
### Connector Column Normalization (Step 4d2)
|
||||
|
||||
Erkennt schmale Spalten mit einem dominanten Kurzwort (z.B. "oder", "and", "bzw.")
|
||||
und normalisiert OCR-Fehler bei denen das dominante Wort mit Rauschen versehen wurde.
|
||||
|
||||
**Algorithmus:**
|
||||
|
||||
1. Pro Spalte: Zaehle Textvorkommen aller Zellen
|
||||
2. Pruefe ob ein dominantes Wort existiert (≥ 60% der Zellen, max 10 Zeichen)
|
||||
3. Fuer Zellen die mit dem dominanten Wort **beginnen** und max 2 Zeichen laenger sind:
|
||||
Normalisiere auf das dominante Wort
|
||||
|
||||
**Beispiel:** Spalte mit "oder" in 80% der Zellen → `"oderb"` wird zu `"oder"` normalisiert.
|
||||
|
||||
### Compound Word IPA Decomposition (Step 5e)
|
||||
|
||||
Zusammengesetzte Woerter wie "schoolbag" oder "blackbird" haben oft keinen eigenen
|
||||
@@ -1253,6 +1295,69 @@ Admin-UI fuer effiziente Massenpruefung von Sessions:
|
||||
|
||||
Admin-UI: [/ai/ocr-ground-truth](https://macmini:3002/ai/ocr-ground-truth)
|
||||
|
||||
### Page Number Extraction
|
||||
|
||||
Die Footer-Filterung (`_filter_footer_words` in `grid_editor_helpers.py`) erkennt
|
||||
Seitenzahlen in den untersten 5% des Bildes und gibt sie als Metadaten zurueck,
|
||||
statt sie stillschweigend zu entfernen.
|
||||
|
||||
**Algorithmus:**
|
||||
|
||||
1. Woerter in den untersten 5% des Bildes identifizieren
|
||||
2. Wenn ≤ 3 Woerter mit ≤ 10 Zeichen Gesamtlaenge: Als Seitenzahl extrahieren
|
||||
3. Rueckgabe als `PageNumber`-Objekt: `{text, y_pct, number?}`
|
||||
4. Ziffern werden separat als `number` (Integer) extrahiert
|
||||
|
||||
**Datentyp:**
|
||||
|
||||
```typescript
|
||||
interface PageNumber {
|
||||
text: string // Roh-OCR-Text (z.B. "u)233")
|
||||
y_pct: number // Vertikale Position in Prozent
|
||||
number?: number // Extrahierte Zahl (z.B. 233)
|
||||
}
|
||||
```
|
||||
|
||||
**Frontend-Anzeige:**
|
||||
|
||||
In der Summary-Leiste (GridEditor + StepGridReview) als Badge: `S. 233`.
|
||||
Zeigt bevorzugt `page_number.number` (saubere Zahl), Fallback auf `page_number.text`.
|
||||
|
||||
**Zweck:** Spaetere Zusammenfuehrung aufeinanderfolgender Seiten im Kundenfrontend.
|
||||
|
||||
### Footer-Zeilen-Erkennung (Verbesserung)
|
||||
|
||||
Die Footer-Erkennung wurde um zwei Pruefungen erweitert, um falsch-positive
|
||||
Footer-Markierungen bei Content-Zeilen zu verhindern:
|
||||
|
||||
| Pruefung | Bedingung | Grund |
|
||||
|----------|-----------|-------|
|
||||
| Komma-Check | `',' in text` → kein Footer | Content-Saetze enthalten Kommas, Seitenzahlen nicht |
|
||||
| Laengen-Check | `len(text) > 20` → kein Footer | Seitenzahlen sind kurz, Content-Zeilen lang |
|
||||
|
||||
**Vorher:** `"Uhrzeit, Vergangenheit, Zukunft"` wurde als Footer markiert.
|
||||
**Nachher:** Nur tatsaechliche Seitenzahlen (kurz, ohne Kommas) werden als Footer erkannt.
|
||||
|
||||
### Silben + IPA Kombination (Fix)
|
||||
|
||||
**Datei:** `cv_syllable_detect.py`
|
||||
|
||||
Wenn beide Modi (Silben:DE und IPA) aktiviert sind, blockierte der `_IPA_RE`-Guard
|
||||
die Silbentrennung, weil programmatisch eingefuegte IPA-Klammern (z.B. `[bɪltʃøn]`)
|
||||
IPA-Zeichen enthalten.
|
||||
|
||||
**Loesung:** Vor der IPA-Pruefung wird Bracket-Content entfernt:
|
||||
|
||||
```python
|
||||
# Bracket-Content strippen, da programmatisch eingefuegt
|
||||
text_no_brackets = re.sub(r'\[[^\]]*\]', '', text)
|
||||
if _IPA_RE.search(text_no_brackets):
|
||||
return text # Echte IPA im Fliesstext → keine Silbentrennung
|
||||
```
|
||||
|
||||
So wird `"Bild·chen [bɪltʃøn]"` korrekt silbifiziert: Die Silbenpunkte bleiben erhalten,
|
||||
und die IPA in Klammern wird nicht als Blockiergrund gewertet.
|
||||
|
||||
### `en_col_type` Erkennung
|
||||
|
||||
Die Erkennung der Englisch-Headword-Spalte nutzt **Bracket-IPA-Pattern-Count**
|
||||
@@ -1620,6 +1725,8 @@ Die Ergebnisse fliessen in Schritt 5 (Spaltenerkennung) und den Grid Editor ein.
|
||||
|
||||
| Datum | Version | Aenderung |
|
||||
|-------|---------|----------|
|
||||
| 2026-03-26 | 5.2.0 | **OCR Kombi Pipeline:** Neuer modularer Nachfolger als 11-Schritt-Architektur unter `/ai/ocr-kombi`. Eigene Dokumentation: [OCR Kombi Pipeline](OCR-Kombi-Pipeline.md). Phase 1 (Grundgeruest + DB) implementiert: DB-Migration (`document_group_id`, `page_number`), Frontend-Orchestrator, 13 Step-Komponenten, Backend-Router mit Multi-Page-Upload. |
|
||||
| 2026-03-26 | 5.1.0 | **Grid Quality & Metadata:** Per-Cell Artifact Filter (Step 4b2: ≤2 Zeichen + conf < 65), Connector Column Normalization (Step 4d2: dominante Kurzwoerter), Footer-Erkennung verbessert (Komma/Laengen-Check), Seitenzahl-Extraktion als Metadaten (`page_number` Feld im Grid-Result), Frontend-Anzeige in Summary-Leiste. Silben+IPA-Kombination gefixt (Bracket-Content vor IPA-Guard strippen). |
|
||||
| 2026-03-23 | 5.0.0 | **Phase 1 Sprint 1:** Compound-IPA-Zerlegung (`_decompose_compound`), Trailing-Garbled-Fragment-Entfernung (Multi-Wort-Headwords), Regression Framework mit DB-Persistenz + History + Shell-Script, Ground-Truth Review Workflow UI, Page-Crop Determinismus verifiziert. Admin-Seiten: `/ai/ocr-regression`, `/ai/ocr-ground-truth`. |
|
||||
| 2026-03-20 | 4.7.0 | Grid Editor: Zone Merging ueber Bilder (`image_overlays`), Heading Detection (Farbe + Hoehe), Ghost-Filter (borderless-aware), Oversized Word Box Removal, IPA Phonetic Correction (Britfone), IPA Continuation Detection, `en_col_type` via Bracket-Count. 27 Tests. |
|
||||
| 2026-03-16 | 4.6.0 | Strukturerkennung (Schritt 8): Region-basierte Grafikerkennung (`cv_graphic_detect.py`) mit Zwei-Pass-Verfahren (Farbregionen + schwarze Illustrationen), Wort-Ueberlappungs-Filter, Box/Zonen/Farb-Analyse. Schritt laeuft nach Worterkennung. |
|
||||
|
||||
Reference in New Issue
Block a user