Posts mit dem Label OCR-Fehler werden angezeigt. Alle Posts anzeigen
Posts mit dem Label OCR-Fehler werden angezeigt. Alle Posts anzeigen

Mittwoch, 25. Dezember 2013

Was Training so ausmacht


Bin dank Clemens Neudecker auf das im Rahmen des succeed Projektes entwickelte Tool ocrevalUAtion gestoßen. Damit kann man seine OCR-Ergebnisse mit dem Original vergleichen und bekommt eine Übersicht über die typischen OCR-Fehler.

Ich habe mal eine Seite aus Bunte Bilder aus dem Sachſenlande genommen und hier sind die Werte für untrainiertes Tesseract 3.02.03 mit dem mitgelieferten "deu-frak":


CER7,74
CER-DL7,74
WER27,65
WER (bag of words)27,43
 
Dabei bedeutet CER: Character error rate, CER-DL: Character error rate nach Damerau-Levenshtein und WER: Word error rate.

Hier sind also nur knapp 92% aller Zeichen richtig und gar nur 72% aller Wörter.

Nun die im Laufe des Bunte Bilder Projektes auf den Buchtitel trainierte Variante:

CER2,83
CER-DL2,83
WER7,78
WER (bag of words)9,07

Es sind nun 97% aller Zeichen richtig und fast 91% aller Wörter! Fazit: Trainieren lohnt sich!

Dies deckt sich auch mit den Berechnung aus meinem früheren Beitrag "OCR Qualität bestimmen" bzw. aus Teil 9, wo die Worterkennungsrate 93% betrug.

Das Tool berechnet aber auch für jedes vorkommende Zeichen die Fehlerwahrscheinlichkeit, was hilft sein Augenmerk auf diese typischen Probleme zu lenken. Hier ein Beispiel des untrainierten Tesseract. Ins Auge fällt, daß dies (wie bereits beschrieben) kein langes-s erkennt. Sichtbar sind auch die Problemzeichen 'n', 'u' und 'ü':

Error rate per character and type

CharacterHex codeTotalSpuriousConfusedLostError rate
204632010,65
!210100Infinity
"220100Infinity
)2920000,00
*2a201050,00
,2c3314221,21
-2d602033,33
.2e2901313,79
131610016,67
23240000,00
53540000,00
83830000,00
93950000,00
A4160000,00
B42110109,09
D44100000,00
E4560000,00
F4690000,00
G4760000,00
H4860000,00
I494040100,00
J4a50000,00
K4b80000,00
L4c10000,00
M4d50000,00
N4e40000,00
O4f20000,00
P5030000,00
R5270000,00
S532603011,54
T5450000,00
U5540000,00
V5670000,00
W5770000,00
Z5a70000,00
a611230201,63
b62410102,44
c63660101,52
d641100000,00
e654300411,16
f664005012,50
g67710000,00
h681210403,31
i69178230012,92
j6a3400133,33
k6b210104,76
l6c912002,20
m6d64019029,69
n6e2497705,62
o6f480000,00
p70110000,00
r721480000,00
s73372005,41
t741330100,75
u75105011111,43
v76180000,00
w77310000,00
x7810000,00
y7910000,00
z7a380000,00
«ab0100Infinity
»bb0100Infinity
Äc4201050,00
ßdf70000,00
äe4130000,00
öf6110000,00
üfc2109042,86
ſ17f900900100,00
20132020100,00
20140100Infinity
201c3030100,00
201e3030100,00

Sonntag, 11. August 2013

Helferlein Postkorrektur von 'Und'

Mithilfe eines Scriptes, welches eigentlich Worttrennungen aufsammeln sollte habe ich festgestellt, daß in den schon korrigierten Texten ab und an das Wort 'und' mitten im Satz groß geschrieben war, zB.: 'Der Müller Und sein Sohn…'.

Eigentlich sollte ja, wie in meinem Beitrag "Erkennung von OCR- und Tippfehlern in Textdateien" beschrieben, die Verwendung von DPCustomMono2 solche Fehler bei der Korrektur sichtbar machen. Hat leider in diesem Beispiel nicht gut nicht funktioniert…

Da die korrigierten Texte aber Basis für ein Wörterbuch für Tesseract sind, kam es durch die gehäufte Verwendung von 'Und' zu einer sich selbstverstärkenden Schleife, die in neuen OCR-Texten immer öfter das 'Und' mit Großbuchstaben mitten in den Satz einbaut.

Dank Linux ist das Problem schnell behoben, ich habe jetzt ein Script, in welchen ich solche Kandidaten eintrage (Update: Script nun vereinfacht):

#!/bin/bash
if [ ! -e "$1" ]; then
    echo "needs a file on commandline"
    exit 1
fi
grep "[a-z]\+ Und" $1 && echo "#### found 'Und' (und) in $1"
grep "[a-z]\+U[a-z]\+" $1 && echo "#### found 'xxUxx' in $1"
grep "[a-z]\+ dein" $1 && echo "#### found 'dein' (dem) in $1"
grep "[a-z]\+ init" $1 && echo "#### found 'init' (mit) in $1"

Der Ausdruck '[a-z]\+ Und' im Grep heißt nichts anderes als 'Finde alle Stellen mit einem "Und", vor welchem ein Leerzeichen und davor mindestens ein Kleinbuchstabe steht.'

In einer Schleife lasse ich dies über die OCR-Texte laufen:

$> for i in ../txt/img*.txt; do bash find_typical_errors.sh $i; done| less

Voila! :)

Mittwoch, 5. Juni 2013

Teil 9, Selbstversuch Ebook - Befreiung am Beispiel "Bunte Bilder aus dem Sachsenlande", Verbesserung Tesseracts Erkennungsrate

Im letzten Blogpost "OCR Qualität bestimmen" habe ich grob beschrieben, wie man beurteilen kann, wie gut die Erkennungsqualität der verschiedenen OCR-Engines ist.
Als Maß hatte ich dort die Worterkennungsrate verwendet, da diese im Vergleich zur Zeichenerkennungsrate genauer ist. Gerade bei Verfahren, die intern Wörterbücher verwenden, kann die Zeichenerkennungsrate hoch sein, der Text bleibt dennoch unleserlich.

Um die Erkennungsqualität von Tesseract 3.02 zu verbessern habe ich mir die Beschreibung der Konfigurationsoptionen unter http://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version angeschaut.

Folgende Werte hatte ich bisher in der Datei deu-frak.config stehen:

enable_new_segsearch 1
textord_space_size_is_variable 1
load_bigram_dawg 1

Die Worterkennungsrate betrug damit 86% (die Diskrepanz zum Wert 60% aus Blogpost rührt daher, daß die Wörter der benutzten Seite da noch nicht im fürs Training verwendeten Wörterbuch steckten. Dies zeigt, wie wichtig die Pflege eines korrekten Wörterbuches für die Erkennungsrate von Tesseract ist).

Im ersten Schritt habe ich nur einzelne der ff. Parameter (* zeigt Default an) verändert:

Parameter01
enable_new_search92%(*) 86%
language_model_ngram(*) 86%36%
textord_old_baselines89%(*) 86%

Die Werte textord_space_size_is_variable, load_bigram_dawg, edges_use_new_outline_complexity, permute_script_word, ngram_permuter_activated, use_new_state_cost führten zu keiner Änderung der Erkennungsrate von 86%.

Warum die Erkennungsrate bei  language_model_ngram so stark einbricht, verstehe ich noch nicht.

Im zweiten Schritt habe ich die beiden Parameter, die eine Verbesserung zeigten, kombiniert. Voila!, die Worterkennungsrate steigt auf 93%!

Wer noch Hinweise für sinnvolle Kombinationsmöglichkeiten anderer Parameter hat, immer her damit! :)

OCR Qualität bestimmen

wdiff


Mit 'wdiff' habe ich nun mal den Vergleich gemacht zwischen trainiertem Tesseract, trainiertem Ocropus, und Tesseract in Standardauslieferung mit Deutsch (deu).

Dazu habe ich eine Seite als Vergleich herangezogen, die ich schon in http://art1pirat.blogspot.de/2013/01/teil-8-selbstversuch-ebook-befreiung-am.html voll korrigiert hatte.

Der Aufruf sieht so aus: "wdiff -s $CORRECT $OCRED | tail -1"

Ergebnisse


Tesseract (trainiert)
img110_tesseract.txt: 322 Wörter  193 60% gleich  0 0% eingefügt  129 40% verändert

Tesseract (deu)
img110_tesseract.txt: 322 Wörter  62 19% gleich  0 0% eingefügt  260 81% verändert

Ocropus 0.7 (trainiert)
img110_ocropus.txt: 419 Wörter  108 26% gleich  0 0% eingefügt  311 74% verändert


Fazit


Wie man sieht, Training lohnt sich. ;)
 
Ocropus 0.7 stürzt beim Training (sh. http://art1pirat.blogspot.de/2013/05/ocropus-07-training.html) ab, ich habe den letzten funktionierenden Zwischenstand (nach 5190 Schritten) des Modells genommen, den man via ff. Aufruf bekommt:

ocropus-rtrain 'ocropus/*/*.bin.png' -F 30 -d 1 -o bbads_fraktur

Dabei sorgt die Option -F 30 dafür, daß aller 30 Schritte das Modell (bbads_fraktur) gesichert wird.

Tesseract hat noch einen vermutlich für Fraktur besser arbeitenden Trainingsmodus namens Cube. Wer dazu Infos hat, immer her damit.

Ansonsten habe ich jetzt ein Werkzeug an der Hand die Auswirkungen der verschiedenen Optionen der OCR-Engines und der Vorverarbeitungen quantitativ zu überprüfen.

Samstag, 15. Dezember 2012

Erkennung von OCR- und Tippfehlern in Textdateien

Um Fehler in den Textdateien besser zu erkennen, haben die Distributed Proofreaders, ein internationales Projekt zur verteilten Korrekturlesung gescannter Dokumente, den Zeichensatz DPCustomMono2 entwickelt, der zu verwechselnde Zeichen in besonders prägnanter Weise darstellt.

Hier ein Beispiel der Seite 6 meines Projektes »Bunte Bilder aus dem Sachsenlande«

Einen Vergleich, wie gut DPCustomMono2 Fehler sichtbar macht, kann man auf der Font-Seite der Distributed Proofreaders selber vornehmen.