# Evaluierung OCR im Vergleich Tesseract / Calamari
Beim Wechsel von Tesseract auf Calamari (wegen GPU-Unterstützung und besserer Nachverarbeitung) hängen wir zunächst stark von einem für deutschsprachige Gegenwartsdokumente geeigneten Modell ab – Calamari liefert ja keines mit. (Das von Tesseract mitgelieferte `deu` hat zwar auch viele systematische Fehler und wurde rein synthetisch trainiert, ist aber nicht leicht zu überbieten.)
Zwar gibt es schon eine Reihe von Modellen für historische Drucke (und Handschriften):
- [Qurator](https://github.com/qurator-spk/train-calamari-gt4histocr)
- [Calamari](https://github.com/Calamari-OCR/calamari_models)
- [OCR4all](https://github.com/OCR4all/ocr4all_models/tree/master/default)
(Auswertung auf historischen Daten: siehe [GT4HistOCR-Auswerung](https://hackmd.io/@bertsky/Skd2DPyi_).)
Doch für Gegenwartssprache ist es unklar.
## Installation
ocrd_calamari 1.0.2 (Calamari 1.0.5 (TF 2.3)) ist bereits in `ocrd_all` bzw. `smarthec_backend` vorinstalliert. Es fehlen nur noch entsprechende Modelle. Diese sollte man sich in ein persistentes Verzeichnis (außerhalb des Containers) installieren.
Wir wandeln dazu die [offizielle Anleitung](https://ocr-d.de/en/models#models-and-docker) etwas ab: in unserem `smarthec_backend` sind ja bereits im Image einige Ressourcen/Modelle enthalten, die wir weiter benötigen. Wir wollen lediglich für Calamari einen Bindmount:
docker run --gpus all --rm -it --user $(id -u) -v $HOST_MODELS/ocrd-calamari-recognize:/usr/local/share/ocrd-resources/ocrd-calamari-recognize -v $HOST_DATA:/data bash
Hierbei ist `HOST_MODELS` durch den (absoluten) Pfad auf Hostseite zu ersetzen, z.B. durch `~/.local/share/ocrd-resources` (wenn man sich den Pfad mit einer nativen Installation teilen möchte).
Nun lädt man sich (egal ob auf dem Host oder im Container) die fehlenden Modelle von Github. Da Calamari-Modelle immer aus etlichen Dateien bestehen, und [sich nicht ohne weiteres direkt separat herunterladen lassen](https://github.com/Calamari-OCR/calamari_models/issues/11), empfiehlt sich der [Umweg über Subversion-Export](https://stackoverflow.com/a/18324458/14474237):
svn export https://github.com/Calamari-OCR/calamari_models/trunk/idiotikon/ ~/.local/share/ocrd-resources/ocrd-calamari-recognize/idiotikon
## Vorgehen
Nun kann man mit `ocrd-calamari-recognize -P checkpoint_dir idiotikon` prozessieren. Wie jede moderne OCR benötigt der Prozessor ein zeilensegmentiertes Bild, am besten mit Binarisierung.
Der Vergleichbarkeit halber empfiehlt es sich, dieselbe Segmentierung und Binarisierung wie für Tesseract zu nehmen – im [Runtime-Workflow](https://git.informatik.uni-leipzig.de/smarthec/smarthec_backend/-/blob/master/smarthec-sparse-tesseract-deu.mk) rechnet letzteres Segmentierung und OCR in einem Schritt, d.h. wir müssen die Filegroup der Tesseract-Ausgabe als Filegroup der Calamari-Eingabe machen (wobei der Textgehalt überschrieben wird):
ocrd-calamari-recognize -I OCR-D-OCR-TESS-deu-SEG-tesseract-sparse -O OCR-D-OCR-CALA-idiotikon-SEG-tesseract-sparse -P textequiv_level glyph -P checkpoint_dir idiotikon
Dann alignieren und vergleichen wir beide Ergebnisse:
ocrd-dinglehopper -I OCR-D-OCR-TESS-deu-SEG-tesseract-sparse,OCR-D-OCR-CALA-idiotikon-SEG-tesseract-sparse -O EVAL-TESS-deu-CALA-idiotikon
Visualisiert werden kann das am besten mit [OCRD-Browser](https://github.com/OCR-D/ocrd-website/wiki/Tools-for-Visualizing-%28intermediate%29-OCR-D-results#ocrd-browser) (indem man ein HTML-View öffnet für `EVAL-TESS-deu-CALA-idiotikon` oder für die jeweilige OCR ein PAGE-XML-View udn dann PageViewer öffnet).
> Spoiler: Das `idiotikon` enthält zwar einen ausreichend großen Zeichensatz mit allen Umlauten, scheint aber überall viel schlechter zu sein als Tesseracts `deu`. Etwas besser kommt `antiqua_modern` zurecht, aber immer noch nicht gut genug.
## Perspektive
Finetuning auf eigenem, synthetischem GT (per [text2image](https://github.com/tesseract-ocr/tesseract/blob/master/src/training/text2image.cpp), [doccreator](https://www.mdpi.com/2313-433X/3/4/62/htm) etc.)