lv-rover-mlt
OCR for cropped paragraph images from Maltese PDF documents. Takes a PIL image, returns a clean joined paragraph string. Handles the full 30-letter Maltese alphabet including ċ ġ ħ ż għ ie, structural hyphens (il-kelb), and line-break rejoining.
Submitted to the DocEng 2026 Maltese OCR competition.
Results
| Metric | Value |
|---|---|
| Dev set CER, recognition-only (before post-processing) | 0.01317 |
| Dev set CER, after lead-marker normalisation | 0.01294 |
| Dev set CER, full convention-aligned pipeline | 0.00700 |
| Competition Tesseract baseline | 0.0234 |
| Total improvement | 70% below baseline |
Caveats: all CER figures are on the competition dev set (422 paragraphs); held-out real test CER is unknown at time of writing. Figures are measured with EasyOCR disabled.
The 70% improvement decomposes into two independent gains: 44% from better recognition (fine-tuned Tesseract LSTM on 68 validated fonts, soft Maltese lexicon voting, diacritic-preserving edit distance) and 26 percentage points from label-convention alignment (en-dash normalisation, apostrophe standardisation, structural hyphen preservation). Recognising both gains matters because they are additive and have different engineering implications.
Method: LV-ROVER
LV-ROVER (Lexicon-Voting ROVER) is a 5-stream Tesseract ensemble. Each stream runs a different fine-tuned LSTM checkpoint on the same image. Outputs are merged with ROVER voting augmented by a soft Maltese word-frequency lexicon and a diacritic-preserving edit distance constraint - if two candidates differ only in a Maltese canary character (ċ/c, ġ/g, ħ/h, ż/z), the lexicon score breaks the tie.
Post-processing applies six rule-based normalisation steps. The full post-processing block was validated with paired bootstrap and permutation tests. Individual deterministic rules were checked by leave-one-out dev and held-out synthetic point estimates, not by independent bootstrap confidence intervals.
No neural models. No GPU needed. Runs on CPU. Total footprint under 1 GB.
Licensing note
Released weights and code are Apache-2.0. The synthetic training text derives from korpus_malti, which is CC BY-NC-SA 4.0 (non-commercial, share-alike, gated). Whether share-alike/NC obligations propagate to fine-tuned weights is legally unsettled and flagged, not resolved.
Usage
from competition_transcriber import CompetitionTranscriber
t = CompetitionTranscriber() # downloads weights from this repo
text = t.transcribe(pil_image) # returns joined paragraph string
Canary characters
These four substitutions are the main diacritic error modes in Maltese OCR. LV-ROVER's lexicon voting and diacritic edit-distance constraint specifically target them:
| Error | Correct |
|---|---|
| c | ċ |
| g | ġ |
| h | ħ |
| z | ż |
Links
- Paper: arXiv preprint
- Code: https://github.com/adamd1985/lv-rover-mlt
- Competition: DocEng 2026 Maltese OCR
