Sprachmodelle

Der Leser braucht ein Tesseract-Sprachmodell - eine .traineddata-Datei -, um überhaupt etwas zu lesen.

Welche Modelle installiert sind, gilt anwendungsweit: Zehn Module, die dieselben Etiketten lesen, wollen dieselben Modelle, also liegt die Einstellung auf system/ und nicht einmal pro Modul.

Auf ctrlX OS wird ein Modell über die ctrlX-Dateischnittstelle hochgeladen.

Auf einem PC bedeutet ein Modell hochzuladen, seine Datei in das Verzeichnis zu kopieren, das system/tessdata-dir nennt.

hdvisionsystems/lumiscan-text-reader/system/
├── tessdata-dir              where you upload your own models   read-only
├── tessdata-dirs             every directory searched, in order read-only
├── languages                 the codes found across all of them read-only
├── set-tessdata-dir/         changes the upload directory
└── refresh-languages/        re-reads the directories

Zwei Verzeichnisse, der Reihe nach durchsucht

  1. Ihr Upload-Verzeichnis, tessdata-dir. Standardmäßig ist das der Ordner tessdata im Konfigurationsverzeichnis der Anwendung, neben der Konfigurationsdatei der Anwendung. Er wird beim ersten Start leer angelegt.

    Plattform Standard-tessdata-dir

    ctrlX OS

    /var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-text-reader/tessdata

    PC (Windows)

    %APP_RESOURCE_DIR%\etc\lumiscan-text-reader\tessdata; ohne APP_RESOURCE_DIR C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-text-read\etc\lumiscan-text-reader\tessdata

  2. Die in der Anwendung mitgelieferten Modelle, die schreibgeschützt sind und immer durchsucht werden.

tessdata-dirs zeigt beide, in der Reihenfolge, in der sie durchsucht werden.

Hochladen fügt Sprachen hinzu, es entfernt nie die mitgelieferten. Sie müssen unsere Dateien nirgendwohin kopieren, und Englisch funktioniert weiter, was immer Sie tun. Ein Modell, das unter demselben Namen wie ein mitgeliefertes hochgeladen wird, gewinnt; so würden Sie Englisch durch ein anderes englisches Modell ersetzen.

Was installiert ist

Englisch (eng) und osd. Zusammen etwa 34 MB, weshalb nur diese beiden mitgeliefert werden - jede zusätzliche Sprache würde die Anwendung für jeden Kunden vergrößern, und über das Hochladen erhalten Sie den Rest.

osd ist keine Sprache. Es ist das Orientierungs- und Schriftmodell, das die Layouts AUTO_OSD und SPARSE_OSD brauchen. Es erscheint in languages, weil es eine Datei im Verzeichnis ist, aber input/language auf osd zu setzen liest nichts.

Eine Sprache hinzufügen

  1. Laden Sie das Modell herunter. Das Tesseract-Projekt veröffentlicht sie unter github.com/tesseract-ocr/tessdata_fast und github.com/tesseract-ocr/tessdata_best. fast ist kleiner und schneller, best genauer; fast ist der richtige Standard für Bauteilkennzeichnungen.

  2. Laden Sie es hoch in das Verzeichnis, das system/tessdata-dir nennt: auf ctrlX OS über die ctrlX-Dateischnittstelle, auf einem PC, indem Sie die Datei dorthin kopieren.

  3. Verwenden Sie es: Setzen Sie read-text/input/language auf den Dateinamen ohne .traineddata.

upload deu.traineddata  ->  <tessdata-dir>/deu.traineddata
write  module-1/read-text/input/language = "deu"
write  module-1/read-text/execute

Es gibt keinen Code nachzuschlagen

Der Dateiname ist der Sprachcode. Tesseract verlangt, dass das Modell für die Sprache deu deu.traineddata heißt; was immer Sie hochladen, bestimmt also, was Sie eintippen. Sie müssen nie einen Code in einer Tabelle suchen, und Sie dürfen die Datei nie umbenennen.

Die Codes haben nicht alle drei Buchstaben. Chinesisch ist chi_sim (vereinfacht) oder chi_tra (traditionell), und es gibt weitere wie srp_latn und aze_cyrl. Übernehmen Sie den Namen genau so, wie das Tesseract-Projekt ihn veröffentlicht.

Sprache Hochzuladende Datei input/language

Deutsch

deu.traineddata

deu

Französisch

fra.traineddata

fra

Chinesisch, vereinfacht

chi_sim.traineddata

chi_sim

Japanisch

jpn.traineddata

jpn

Kein Neustart, und auch kein Refresh

Ein hochgeladenes Modell ist beim allernächsten read-text nutzbar. Der Leser sucht die Datei bei jedem Durchlauf auf dem Datenträger, sodass eine neue gefunden wird, ohne dass etwas aktualisiert oder neu gestartet werden muss.

Das gilt auch für das Ersetzen eines Modells, das bereits in Gebrauch ist. Die Erkennungs-Engine wird einmal pro Modul aufgebaut und behalten, denn sie aufzubauen bedeutet, das Modell zu laden - 23 MB für Englisch -, und das bei jedem Lesen zu tun machte einen kleinen Lesevorgang dreimal langsamer als nötig. Sie wird neu aufgebaut, wann immer sich Sprache, Verzeichnis, Zeichensatz, Engine oder Layout ändern, und wann immer sich die Modelldatei selbst geändert hat: Vor jedem Lesen prüft der Leser Größe und Zeitstempel der Datei, und wenn sich eines davon geändert hat, vergleicht er den Inhalt der Datei mit dem, aus dem die Engine aufgebaut wurde. Eine Datei, die an Ort und Stelle überschrieben wird, unter demselben Namen im selben Verzeichnis, wird also beim nächsten read-text verwendet - ohne Neustart.

Die Prüfung kostet einen Dateistatus pro Lesevorgang. Ein geändertes Modell wird einmal gehasht, etwa 40 ms für 23 MB, und dann geladen wie jedes neue Modell; das Protokoll meldet The '<language>' model in '<directory>' changed on disk; loading it again. Eine Datei, die nicht geladen werden kann - etwa ein noch laufender Upload -, lässt den Lesevorgang mit -7 fehlschlagen, und der nächste Lesevorgang nach Abschluss des Uploads lädt sie.

system/languages ist das Einzige, das sich nicht von selbst aktualisiert - es ist eine Auflistung, die beim Start, durch set-tessdata-dir und durch refresh-languages aktualisiert wird:

write  system/refresh-languages/execute
read   system/languages           -> [chi_sim, deu, eng, osd]

Rufen Sie es auf, damit die Auflistung mit dem Verzeichnis übereinstimmt. Zum Lesen brauchen Sie es nicht.

Mehrere Sprachen gleichzeitig

input/language ist eine Eingabe pro Modul, sodass jedes Modul in seiner eigenen Sprache aus demselben gemeinsamen Satz von Modellen liest:

module-1/read-text/input/language = "eng"
module-2/read-text/input/language = "deu"
module-3/read-text/input/language = "chi_sim"

Jedes Modul meldet in seinem eigenen output/result.language, was es tatsächlich verwendet hat. Zwischen ihnen wird nichts geteilt außer den Modellen auf dem Datenträger.

Ein anderes Upload-Verzeichnis verwenden

set-tessdata-dir richtet das erste Suchverzeichnis woandershin. Auf ctrlX OS etwa auf einen USB-Stick, da die Anwendung die Schnittstelle removable-media hat:

write  system/set-tessdata-dir/input/tessdata-dir = "/media/usb/tessdata"

Unter Windows etwa auf einen Ordner auf einem anderen Laufwerk:

write  system/set-tessdata-dir/input/tessdata-dir = "D:\models\tessdata"

Dann, auf beiden:

write  system/set-tessdata-dir/execute
read   system/set-tessdata-dir/output/status-code   -> 1
read   system/languages                             -> [deu, eng, fra, osd]

Die mitgelieferten Modelle bleiben verfügbar, ein leeres Verzeichnis wird also akzeptiert - sinnvoll, wenn Sie kurz vor dem Hochladen darauf zeigen. Die Wahl wird gespeichert und übersteht einen Neustart.

Anders als bei jedem anderen Pfad, den diese Anwendung entgegennimmt, wird hier ein absoluter Pfad außerhalb des Konfigurationsverzeichnisses akzeptiert. Sprachmodelle sind große Dateien von Dritten, die berechtigterweise dort bleiben, wo sie sind - auf ctrlX OS außerhalb der ctrlX-Solution -, statt in das Konfigurationsverzeichnis kopiert zu werden. Die Anwendung listet und liest sie nur.

osd muss neben der Sprache liegen

Tesseract löst pro Durchlauf ein Verzeichnis auf, die Layouts AUTO_OSD und SPARSE_OSD brauchen osd.traineddata also im selben Verzeichnis wie das Sprachmodell - nicht bloß irgendwo im Suchpfad. Laden Sie deu.traineddata allein hoch, wählen Sie AUTO_OSD, und der Durchlauf wird mit genau dieser Begründung abgelehnt:

error: invalid input: layout AUTO_OSD also needs osd.traineddata beside 'deu.traineddata' in
'<tessdata-dir>'; copy it from '<shipped dir>', or choose a layout that does not detect orientation

Laden Sie entweder osd.traineddata neben Ihr Modell hoch, oder verwenden Sie ein Layout, das keine Orientierung erkennt. Der Standard, SINGLE_BLOCK, tut das nicht - das Thema kommt nur auf, wenn Sie Orientierungserkennung angefordert haben.

Wenn set-tessdata-dir ablehnt

Es validiert, bevor es irgendetwas veröffentlicht; ein abgelehnter Aufruf lässt tessdata-dir, tessdata-dirs und languages also genau so, wie sie waren - Sie sehen nie ein Verzeichnis und eine Auflistung, die sich widersprechen.

Situation status-code

input/tessdata-dir ist leer

-2 ungültige Eingabe

Der Pfad ist kein Verzeichnis

-4 Quelle nicht gefunden

Umgeschaltet, aber die Wahl konnte nicht gespeichert werden

-6 Schreiben fehlgeschlagen - die Umschaltung ist aktiv, nur das Speichern ist fehlgeschlagen

Ein leeres Verzeichnis wird nicht abgelehnt. Das war früher so, als dies der einzige Ort war, von dem Modelle gelesen wurden, und ein leeres Verzeichnis bedeutete, dass jeder Lesevorgang stillschweigend auf Englisch zurückfiel. Die mitgelieferten Modelle werden jetzt immer durchsucht.

Die falsche Sprache

read-text validiert die Sprache, bevor es läuft, und lehnt eine nicht installierte mit status-code -2 ab, unter Nennung jedes durchsuchten Verzeichnisses und dessen, was verfügbar ist:

error: invalid input: language 'fra' has no fra.traineddata in any model directory
('<tessdata-dir>', '<shipped dir>'); available: eng, osd. Upload fra.traineddata to
'<tessdata-dir>' - the file name is the language code

Verschwindet ein Modell zwischen dieser Prüfung und dem Lesen - jemand hat den USB-Stick gezogen -, meldet output/result.language, was tatsächlich verwendet wurde, und status-text sagt es ebenfalls:

ok: 4 word(s), mean score 0.91 (eng, SINGLE_BLOCK) - NOTE: language 'deu' is not installed, read with 'eng' instead

Lesen Sie output/result.language, nicht input/language, wenn Sie wissen müssen, wie ein Ergebnis zustande kam. Meist sind sie gleich. Wenn sie sich unterscheiden, sagt nur die Ausgabe die Wahrheit.