added analyse
This commit is contained in:
@@ -3,37 +3,62 @@
|
||||
|
||||
Nachdem die vorbereiteten Bilddaten an das Text\-erken\-nungs\-system gemäß \autoref{implementierung} übergeben und die Ergebnisse ermittelt wurden, werden die extrahierten Textdaten nun mit den manuell erstellten "Soll-Daten" verglichen. Anhand der Statistik kann festgestellt werden, welche Vorgehens\-weise zu der besten Qualität führt. Um die Ergebnisse zu visualisieren, erstellt der in \autoref{components_reportgenerator} beschriebene "Report\-Generator" auf Basis der Bild\-dateinamen automatisch einen Bericht mit den Vergleichs\-daten in Tabellenform. Für eine bessere Lesbarkeit wird der erstellte Bericht in verschiedene Kategorien unterteilt.
|
||||
|
||||
\subsection*{Processing-Summary}
|
||||
\subsection*{Vergleich im Detail}
|
||||
\label{report_detailed}
|
||||
|
||||
Neben der Processing-Summary beinhaltet der generierte Bericht auch einen Detailvergleich der Ergebnisdaten. In der Sektion "Processor Stats", siehe \autoref{tbl:report_detailed_processorstats}, wird die Gesamtwortfehlerrate pro Bild mit dem jeweiligen Prozessor in Verhältnis gesetzt. Auch wenn es Bilder gibt, die aufgrund ihrer Eigenschaften (niedrige Auflösung, schwierige Farbgebung, etc.) von allen Prozessoren gleichermaßen schlecht erkannt werden, fallen bei gewissen Verfahren Spezialfälle auf. So werden beispielsweise die Textdaten in den Dialog-Knöpfen des Bilds "worldview\_zoom\_steps\_001" Dank eines falsch gewählten Schwellenwerts unkenntlich gemacht. Die Texterkennung schlägt fehl.
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures/fig_AutoThresholdProcessor(Kapur)_1.tex}
|
||||
\caption{Auszug aus der "Processor Stats" Tabelle im generierten Bericht. Die Eigenschaften der Originalbilder im Vergleich zu den verarbeiteten Bildern geben Aufschluss über die Arbeitsweise und Effektivität des Prozessors.}
|
||||
\label{tbl:report_detailed_processorstats}
|
||||
\end{table}
|
||||
|
||||
Die Kategorie "Scan Results" bildet den Abschluss des Berichts. Hier werden alle Verfahrenskombinationen einzeln und mit allen verfügbaren Daten aufgeführt.
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures_modified/fig_command-processing_screentypes_controlgroup_005_1.I.tex}
|
||||
\caption{Auszug aus der "Scan Results" Tabelle im generierten Bericht. Für jede Ausgabedatei werden sämtliche Statistiken aufgelistet.}
|
||||
\label{tbl:report_detailed_scanresults_stats}
|
||||
\end{table}
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures_modified/fig_command-processing_screentypes_controlgroup_005_1.II.tex}
|
||||
\caption{Auszug aus der "Scan Results" Tabelle im generierten Bericht. Neben der numerischen Statistik erfolgt zudem ein Vergleich der tatsächlichen Inhalte mit den erkannten Wörtern. "-" steht hierbei für ein nicht erkanntes Wort.}
|
||||
\label{tbl:report_detailed_scanresults_words}
|
||||
\end{table}
|
||||
|
||||
\subsection*{Prozessoren im Überblick}
|
||||
\label{report_processingsummary}
|
||||
|
||||
Die Kategorie "Processing Summary" beinhaltet eine vereinfachte Übersicht aller Ergebnisse. Je nach Rubrik wird jeweils der Median \bzw Durchschnitt der \hyperref[metriken_cer]{Character Error Rate} und \hyperref[metriken_wer]{Word Error Rate} berechnet.
|
||||
|
||||
Auf Basis der Daten in \autoref{tbl:report_summary_wer}, \autoref{tbl:report_summary_cer} und \autoref{tbl:report_summary_time} lässt sich der Gesamterfolg der Bildvorbereitung \bzw der darauf folgenden Filterung feststellen.
|
||||
|
||||
Beispielsweise eignet sich die Dreiecks-Schwellenwertmethode, wie in \autoref{thresholding_triangle} vermutet, nicht für die Texterkennung. In der Detailübersicht zeigt sich, dass für die Bilder oft ein Schwellenwert gewählt wurde, der die Texterkennung unmöglich macht. Bei Anwendung des fixen Schwellenwertverfahrens werden mit dem richtigen Schwellenwert durchschnittlich sehr gute Ergebnisse erzielt, beim Verfahren nach Otsu oft ein geeigneter Schwellenwert gewählt.
|
||||
|
||||
Während die Fehlerquoten der Texterkennung mit Vorbereitung der Daten die Fehlerquoten von Texterkennung ohne Vorbereitung in den meisten Fällen unterbieten, ist das Ergebnis insgesamt unzufriedenstellend. Selbst bei Verwendung des fixen Thresholdingverfahrens mit einem Schwellenwert von 40 \%, werden durchschnittlich Ergebnisse mit einer Wortfehlerrate von mindestens 46 \% \bzw 1,5 falsch erkannten Zeichen pro Wort erreicht. Die relativ hohe Standardabweichung von 26 \% lässt auf eine hohe Streuung der Ergebnisdaten, also unregelmäßig gute Erfolge schließen.
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures/fig_WER_1}
|
||||
\caption{Auszug aus der Processing Summary Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Word Error Rate. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Wortfehlerrate und die Standardabweichung in "Time" und "Deviation".}
|
||||
\caption{Auszug aus der "Processing Summary" Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Word Error Rate. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Wortfehlerrate und die Standardabweichung in "Time" und "Deviation".}
|
||||
\label{tbl:report_summary_wer}
|
||||
\end{table}
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures/fig_CER_1}
|
||||
\caption{Auszug aus der Processing Summary Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Character Error Rate. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Zeichenfehlerrate und die Standardabweichung in "Time" und "Deviation".}
|
||||
\caption{Auszug aus der "Processing Summary" Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Character Error Rate. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Zeichenfehlerrate und die Standardabweichung in "Time" und "Deviation".}
|
||||
\label{tbl:report_summary_cer}
|
||||
\end{table}
|
||||
|
||||
\begin{table}[!ht]
|
||||
\centering
|
||||
\input{include/figures/fig_Time_1}
|
||||
\caption{Auszug aus der Processing Summary Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Laufzeit. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Laufzeit und die Standardabweichung in "Time" und "Deviation".}
|
||||
\caption{Auszug aus der "Processing Summary" Tabelle im generierten Bericht: Auflistung der Verfahren mit den durchschnittlich besten und schlechtesten Ergebnissen auf Basis der Laufzeit. Die jeweilige Verarbeitungsmethode ist in der Spalte "Processor" zu finden, die Laufzeit und die Standardabweichung in "Time" und "Deviation".}
|
||||
\label{tbl:report_summary_time}
|
||||
\end{table}
|
||||
|
||||
Auf Basis der Daten in \autoref{tbl:report_summary_wer}, \autoref{tbl:report_summary_cer} und \autoref{tbl:report_summary_time} lässt sich der Gesamterfolg der Bildvorbereitung \bzw der darauf folgenden Filterung feststellen.
|
||||
|
||||
|
||||
|
||||
Während die Fehlerquoten der Texterkennung mit Vorbereitung der Daten die Fehlerquoten von Texterkennung ohne Vorbereitung unterbieten, ist das Ergebnis unzufriedenstellend. Selbst bei Verwendung des fixen Thresholdingverfahrens mit einem Schwellenwert von 40 \%, werden durchschnittlich Ergebnisse mit einer Wortfehlerrate von ca. 46 \% \bzw 1,5 falsch erkannten Zeichen pro Wort erreicht. Die relativ hohe Standardabweichung von 26 \% lässt auf eine hohe Streuung der Ergebnisdaten, also unregelmäßig gute Erfolge schließen.
|
||||
|
||||
\subsection*{Detailvergleich}
|
||||
\label{report_detailed}
|
||||
\end{table}
|
||||
@@ -51,6 +51,7 @@ In der prototypischen Implementierung, geschrieben in der Programmiersprache \cs
|
||||
|
||||
Beim Entwurf des Verarbeitungssystems für die unterschiedlichen Bild- und Textverarbeitungsschritte wurde bewusst auf Flexibilität geachtet. Mithilfe von Interfaces und Builder-Methoden ist es möglich, Verarbeitungsschritte als Prozessoren (\engl{Processors}) zu definieren. So stellt beispielsweise das Normalisieren eines durch Tesseract erkannten Wortes einen Verarbeitungsschritt dar.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public interface IProcessor
|
||||
{
|
||||
@@ -68,8 +69,10 @@ Beim Entwurf des Verarbeitungssystems für die unterschiedlichen Bild- und Textv
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:processor_interface}
|
||||
\captionof{program}{Auszug aus Datei "IProcessor.cs": Schnittstelle eines Prozessors.}
|
||||
\caption{Auszug aus Datei "IProcessor.cs": Schnittstelle eines Prozessors.}
|
||||
\end{program}
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public class ToLowerProcessor
|
||||
: Processor<ScanResult, ScanResult>
|
||||
@@ -87,10 +90,12 @@ Beim Entwurf des Verarbeitungssystems für die unterschiedlichen Bild- und Textv
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:processor_implementation}
|
||||
\captionof{program}{Auszug aus Datei "ToLowerProcessor.cs": Normalisieren als einzelner Verarbeitungsschritt}
|
||||
\caption{Auszug aus Datei "ToLowerProcessor.cs": Normalisieren als einzelner Verarbeitungsschritt}
|
||||
\end{program}
|
||||
|
||||
Sollen mehrere Schritte verbunden werden, ist es möglich, bietet das Processing-Framework die Möglichkeit, eine sogenannte Verarbeitungskette aufzubauen. Hier können Delegates oder komplette Prozessoren dynamisch als einzelne Schritte aneinandergereiht werden, wobei die Typensicherheit durch das generische Typensystem von \csharp stets gewahrt wird:
|
||||
Sollen mehrere Schritte verbunden werden, bietet das Processing-Framework die Möglichkeit, eine sogenannte Verarbeitungskette aufzubauen. Hier können Delegates oder komplette Prozessoren dynamisch als einzelne Schritte aneinandergereiht werden, wobei die Typensicherheit durch das generische Typensystem von \csharp stets gewahrt wird:
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public interface IProcessorChainConfiguration<TInput, TOutput> : IProcessorChain<TInput, TOutput>
|
||||
{
|
||||
@@ -123,10 +128,12 @@ Sollen mehrere Schritte verbunden werden, ist es möglich, bietet das Processing
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:processor_chain_interface}
|
||||
\captionof{program}{Auszug aus Datei "IProcessorChainConfiguration.cs": Schnittstelle zur Konfiguration einer Verarbeitungskette}
|
||||
\caption{Auszug aus Datei "IProcessorChainConfiguration.cs": Schnittstelle zur Konfiguration einer Verarbeitungskette}
|
||||
\end{program}
|
||||
|
||||
Ist die Aufbauphase abgeschlossen, kann die Verarbeitungskette schlussendlich gestartet werden.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
var postProcessor = new ProcessorChainConfiguration<ScanResult, ScanResult>()
|
||||
.Use(new ConfidenceFilter(50))
|
||||
@@ -139,7 +146,8 @@ Ist die Aufbauphase abgeschlossen, kann die Verarbeitungskette schlussendlich ge
|
||||
postProcessor.Process(data);
|
||||
\end{CsCode}
|
||||
\label{program:processor_chain_implementation}
|
||||
\captionof{program}{Auszug aus Datei "ImageViewModel.cs": Konfiguration und Starten einer Verarbeitungskette}
|
||||
\caption{Auszug aus Datei "ImageViewModel.cs": Konfiguration und Starten einer Verarbeitungskette}
|
||||
\end{program}
|
||||
|
||||
Abhängig von den verwendeten Prozessoren können also Eingangsdaten jeglichen Typs, in diesem Fall Bildobjekte der Magick.NET Bibliothek oder Ergebnisdaten des Texterkennungsvorgangs dynamisch verarbeitet werden.
|
||||
|
||||
@@ -150,6 +158,7 @@ Für den grundlegenden Ablauf der Bildverarbeitung und der anschließenden Ergeb
|
||||
|
||||
Angefangen mit einem Ausgangsbild, welches über die Softwarebibliothek Magick.NET geladen wurde, beginnt die Bildverarbeitung zunächst mit dem Resampling. Falls der geladene Screenshot die Mindestauflösung von 300dpi unterschreitet, wird es mittels Lanczos2-Verfahren, eine von Magick.NET mitgelieferte Implementierung des Lanczos2-Algorithmus mit leichter Schärfung \mcite{imagemagick}, auf die Mindestauflösung vergrößert. Anschließend wird das Bild normalisiert, in Graustufen umgewandelt und jegliche Transparenz durch einen weißen Hintergrund ersetzt. Danach wird es mittels Schwellwertverfahren binarisiert und rund um das Bild wird ein Rahmen mit einer Dicke von 10px eingefügt. Um Texterkennungsfehler durch falsche Vorder- \bzw Hintergrundfarben auszuschließen, wird das Bild schlussendlich gemeinsam mit einer farblich invertierten Version an das Texterkennungssystem weitergegeben.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
var preprocessing = new ProcessorChainConfiguration<MagickImage, MagickImage>()
|
||||
.Use(new CloneImageProcessor())
|
||||
@@ -162,10 +171,12 @@ Angefangen mit einem Ausgangsbild, welches über die Softwarebibliothek Magick.N
|
||||
.Complete(OnPreprocessed);
|
||||
\end{CsCode}
|
||||
\label{program:program_preprocessor_definition}
|
||||
\captionof{program}{Auszug aus Datei "EvaluationProcessor.cs": Definition der Preprocessing-Kette}
|
||||
\caption{Auszug aus Datei "EvaluationProcessor.cs": Definition der Preprocessing-Kette}
|
||||
\end{program}
|
||||
|
||||
Wurde der übergebene Screenshot vom Texterkennungssystem verarbeitet, müssen nun die Ergebnisse gefiltert werden. Dazu werden zunächst die Metadaten der einzelnen Wörter betrachtet und alle Elemente mit einer Confidence unter einem Schwellenwert von 50\% verworfen. Danach werden die erkannten Texte mittels der \csharp-Funktion ToLower() normalisiert und anschließend auf Duplikate untersucht. Sind alle Duplikate verworfen, werden die Wörter schlussendlich mittels sprachabhängigen Regular Expressions -- in diesem Fall gibt es gemäß den Annahmen in \autoref{annahmen_mehrsprachigkeit} einen Sprachfilter für Englisch und Deutsch -- gefiltert.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
var postprocessing = new ProcessorChainConfiguration<ScanResult, ScanResult>()
|
||||
.Use(new ConfidenceFilter(50))
|
||||
@@ -174,7 +185,8 @@ Wurde der übergebene Screenshot vom Texterkennungssystem verarbeitet, müssen n
|
||||
.Complete(new RegexFilter(wordRegex));
|
||||
\end{CsCode}
|
||||
\label{program:program_postprocessor_definition}
|
||||
\captionof{program}{Auszug aus Datei "EvaluationProcessor.cs": Definition der Postprocessing-Kette}
|
||||
\caption{Auszug aus Datei "EvaluationProcessor.cs": Definition der Postprocessing-Kette}
|
||||
\end{program}
|
||||
|
||||
\subsubsection{Lookup}
|
||||
|
||||
@@ -182,6 +194,7 @@ Die "Lookup" Bibliothek abstrahiert das Speichern von Schlüssel-Wert-Paaren. Da
|
||||
|
||||
Unabhängig von der Ablagestruktur im Hintergrund können Lookups mittels einer gemeinsamen Schnittstelle manipuliert werden:
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public interface ILookup<TKey, TValue>
|
||||
: ILookup,
|
||||
@@ -200,7 +213,8 @@ Unabhängig von der Ablagestruktur im Hintergrund können Lookups mittels einer
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:program_lookup_interface}
|
||||
\captionof{program}{Auszug aus Datei "ILookup.cs": Definition der gemeinsamen Schnittstelle für Lookups}
|
||||
\caption{Auszug aus Datei "ILookup.cs": Definition der gemeinsamen Schnittstelle für Lookups}
|
||||
\end{program}
|
||||
|
||||
\subsubsection{OCR}
|
||||
|
||||
@@ -211,6 +225,7 @@ Die "OCR" Bibliothek enthält elementare Komponenten für die Texterkennung mitt
|
||||
|
||||
Mithilfe des ReportGenerator-Frameworks wird die automatische Berichterstellung für unterschiedlichste Ausgabeformate abstrahiert. Durch die mitgelieferten Schnittstellendefinitionen ist es möglich, eigene Ausgabeformate zu definieren und den Funktionsumfang des ReportGenerators, wie beispielsweise das Erstellen von Tabellen oder das Anlegen und Überschriften, an die jeweilige Syntax und Dokumentstruktur anzupassen.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public interface IDocumentGenerator : IStreamWriter
|
||||
{
|
||||
@@ -228,7 +243,8 @@ Mithilfe des ReportGenerator-Frameworks wird die automatische Berichterstellung
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:program_reportgenerator_interface}
|
||||
\captionof{program}{Auszug aus Datei "IDocumentGenerator.cs": Hauptschnittstelle für den ReportGenerator}
|
||||
\caption{Auszug aus Datei "IDocumentGenerator.cs": Hauptschnittstelle für den ReportGenerator}
|
||||
\end{program}
|
||||
|
||||
\subsection{Programmablauf}
|
||||
|
||||
@@ -238,6 +254,7 @@ Die prototypische Implementierung besteht neben den oben genannten Komponenten a
|
||||
|
||||
Zu Beginn der Ausführung des Kommandozeilenprogramms wird für jedes zu verarbeitende Bild abhängig von den definierten Schwellenwertverfahren eine Reihe von Prozessoren angelegt. Dazu wurde der statische Teil der Bildverarbeitungskette gemäß \autoref{processor_chain_image} innerhalb der "EvaluationProcessor" Klasse definiert. Lediglich die zu evaluierenden Prozessoren für die jeweiligen Schwellwertverfahren können außerhalb der klasse dynamisch definiert werden. Der EvaluationProcessor legt die erzeugten Ergebnisdaten, bestehend aus den gefundenen Wörtern und zugehörigen Metadaten wie die Confidence, auf Dateiebene ab. Um überprüfen zu können, welches Bild schlussendlich an das Texterkennungssystem übergeben wurde, werden auch die verarbeiteten Bilder nach der Binarisierung gespeichert.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
private static IEnumerable<EvaluationProcessor> MakeThresholdVariations()
|
||||
{
|
||||
@@ -257,7 +274,8 @@ Zu Beginn der Ausführung des Kommandozeilenprogramms wird für jedes zu verarbe
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:program_processor_definition_dynamic}
|
||||
\captionof{program}{Auszug aus Datei "Program.cs": Definition der Thresholding Prozessoren}
|
||||
\caption{Auszug aus Datei "Program.cs": Definition der Thresholding Prozessoren}
|
||||
\end{program}
|
||||
|
||||
Ist die Erstellung der Bildbearbeitungsprozessoren abgeschlossen, wird jeder einzelne Prozessor über die Systembibliothek "System.Threading.Tasks" als eigener Auftrag (\engl{Task}) gestartet. In der Kommandozeile wird anschließend der aktuelle Status jedes Tasks angezeigt. Wurden alle Tasks abgeschlossen, wird das Programm beendet.
|
||||
|
||||
@@ -267,6 +285,7 @@ Wurden die in den jeweiligen Screenshots erkannten Textdaten abgelegt, werden di
|
||||
|
||||
Als zentrale Komponente für den Vergleich spielt die Berechnung der in \autoref{metriken} erklärten Metriken eine wesentliche Rolle. Wie in Programm \ref{program:distance_levenshtein} ersichtlich, wird die Distanz zwischen zwei \csharp-Enumerables, seien es zwei Strings oder zwei Listen, über das Verfahren nach Levenshtein berechnet.
|
||||
|
||||
\begin{program}[!ht]
|
||||
\begin{CsCode}[numbers=none]
|
||||
public static double GetDistance<T>(T reference, T? hypothesis)
|
||||
where T : IEnumerable
|
||||
@@ -305,6 +324,7 @@ Als zentrale Komponente für den Vergleich spielt die Berechnung der in \autoref
|
||||
}
|
||||
\end{CsCode}
|
||||
\label{program:distance_levenshtein}
|
||||
\captionof{program}{Auszug aus Datei "Calculator.cs": Berechnung der Levenshtein-Distanz}
|
||||
\caption{Auszug aus Datei "Calculator.cs": Berechnung der Levenshtein-Distanz}
|
||||
\end{program}
|
||||
|
||||
Nach der Ermittlung der jeweiligen Distanzen auf Wort- \bzw Bildbasis werden sie mit den jeweiligen Ursprungsbildern, Prozessoren und den verwendeten Algorithmen in Bezug gesetzt. Die so aufbereiteten Ergebnisse werden anschließend an den ReportGenerator übergeben und in einen Bericht zusammengefasst.
|
||||
@@ -32,5 +32,5 @@
|
||||
- ~~Programmablauf~~
|
||||
- ~~Bulk-Scan~~
|
||||
- ~~Vergleich mit Soll-Daten~~
|
||||
- Analyse
|
||||
- Darstellung + Ausarbeitung des Reports
|
||||
- ~~Analyse~~
|
||||
- ~~Darstellung + Ausarbeitung des Reports~~
|
||||
Reference in New Issue
Block a user