Try   HackMD

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):

(Auswertung auf historischen Daten: siehe GT4HistOCR-Auswerung.)

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 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, empfiehlt sich der Umweg über Subversion-Export:

​​​​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 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 (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, doccreator etc.)