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.
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
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 Tesseractsdeu
. Etwas besser kommtantiqua_modern
zurecht, aber immer noch nicht gut genug.
Finetuning auf eigenem, synthetischem GT (per text2image, doccreator etc.)