diff --git a/.vscode/ltex.dictionary.de-AT.txt b/.vscode/ltex.dictionary.de-AT.txt index dc9661b..dea7cf5 100644 --- a/.vscode/ltex.dictionary.de-AT.txt +++ b/.vscode/ltex.dictionary.de-AT.txt @@ -40,3 +40,7 @@ Segmentierungsverfahren tessdoc tessrepo Textfilterungsschritten +Magick.NET +Processor +Delegates +Processors diff --git a/chapters/c40_durchführung/implementierung.tex b/chapters/c40_durchführung/implementierung.tex index 691b8b1..76a2a1f 100644 --- a/chapters/c40_durchführung/implementierung.tex +++ b/chapters/c40_durchführung/implementierung.tex @@ -3,20 +3,122 @@ \subsection{Vergleichsdaten} -% TODO -Erklärung und beispielhaftes Vorzeigen der Ausgangsdaten \bzw der durch den Menschen verschlagworteten Vergleichsdaten. +Als Ausgangsdaten für die Durchführung wurden von allen Dokumentationsscreenshots 25 zufällige Elemente ausgewählt. Zusätzlich wurden auch Bilder in die Stichprobe mit aufgenommen, die beispielsweise aufgrund ihrer Auflösung oder Kontrastverhältnisse schwer lesbar sind. + +% TODO Figure ein Beispielscreenshot + +% TODO Figure ein Beispielscreenshot mit schlechter Lesbarkeit + +Die textuellen Inhalte aller ausgewählten Bilder wurden anschließend manuell extrahiert und für den programmatischen Vergleich in einer Datei im selben Verzeichnis wie die Quellbilddatei festgehalten. + +% TODO Screenshot und resultierende textdaten. \subsection{Programmkomponenten} \subsubsection{Bibliotheken} -% TODO -Auflistung und kurze Erklärung der in dem Programm verwendeten Bibliotheken in Anlehnung an die in \autoref{technologien} aufgezählten Bibliotheken, nur wird hier eben das KONKRETE \csharp NuGet besprochen +In der prototypischen Implementierung, geschrieben in der Programmiersprache \csharp, wurden in Referenz an die in \autoref{technologien} vorgestellten Technologien und Werkzeuge folgende NuGet-Bibliotheken verwendet: + +\begin{itemize} + \item \textbf{Magick.NET}\\Version: 13.1.0\\Lizenz: Apache-2.0\\\url{https://www.nuget.org/packages/Magick.NET.Core} + \item \textbf{Tesseract}\\Version: 5.2.0\\Lizenz: Apache-2.0\\\url{https://www.nuget.org/packages/Tesseract} +\end{itemize} \subsubsection{Verarbeitungssystem} -% TODO -Erklärung des dynamischen Processing-Frameworks +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{CsCode}[numbers=none] + public interface IProcessor + { + IEnumerable Process(IEnumerable inputs); + } + + public interface IProcessor : IProcessor + { + IEnumerable Process(IEnumerable inputs); + + new IEnumerable Process(IEnumerable inputs) + { + return Process((IEnumerable)inputs); + } + } +\end{CsCode} +\label{program:processor_interface} +\captionof{program}{Auszug aus Datei "IProcessor.cs": Schnittstelle eines Prozessors} + +\begin{CsCode}[numbers=none] + public class ToLowerProcessor + : Processor + { + public override IEnumerable Process( + IEnumerable inputs + ) + { + foreach (var kv in inputs) + { + kv.Word.Text = kv.Word.Text.ToLower(); + yield return kv; + } + } + } +\end{CsCode} +\label{program:processor_implementation} +\captionof{program}{Auszug aus Datei "ToLowerProcessor.cs": Normalisieren als einzelner Verarbeitungsschritt} + +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: + +\begin{CsCode}[numbers=none] + public interface IProcessorChainConfiguration : IProcessorChain + { + IProcessorChainConfiguration Use( + IProcessor processor); + + IProcessorChainConfiguration Use( + Func, IEnumerable> processorFunc); + + IProcessorChainConfiguration Complete( + IProcessor processor); + + IProcessorChainConfiguration Complete( + Func, IEnumerable> processorFunc); + } + + public interface IProcessorChainConfiguration + { + IProcessorChainConfiguration Use( + IProcessor processor); + + IProcessorChainConfiguration Use( + Func, IEnumerable> processorFunc); + + IProcessorChain Complete( + IProcessor processor); + + IProcessorChain Complete( + Func, IEnumerable> processorFunc); + } +\end{CsCode} +\label{program:processor_chain_interface} +\captionof{program}{Auszug aus Datei "IProcessorChainConfiguration.cs": Schnittstelle zur Konfiguration einer Verarbeitungskette} + +Ist die Aufbauphase abgeschlossen, kann die Verarbeitungskette schlussendlich gestartet werden. + +\begin{CsCode}[numbers=none] + var postProcessor = new ProcessorChainConfiguration() + .Use(new ConfidenceFilter(50)) + .Use(new ToLowerProcessor()) + .Use(new DuplicateFilter()) + .Complete(new RegexFilter(WordRegex)); + + // ... + + postProcessor.Process(data); +\end{CsCode} +\label{program:processor_chain_implementation} +\captionof{program}{Auszug aus Datei "ImageViewModel.cs": Konfiguration und Starten einer Verarbeitungskette} + +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. \subsubsection{Verarbeitungskette} @@ -27,14 +129,17 @@ Detaillierte Erklärung der für diese BA verwendeten Verarbeitungskette bzw. de % TODO -\subsubsection{Mehrfachverarbeitung} +\subsubsection{Texterkennung} % TODO +TODO: Beschreibung der Schlüsselkomponenten für die Texterkennung \subsubsection{Vergleich mit Soll-Daten} % TODO +TODO: Beschreibung der Schlüsselkomponenten für den programmatischen Vergleich mit den Soll-Daten \subsubsection{Automatische Berichterstellung} -% TODO \ No newline at end of file +% TODO +TODO: Beschreibung der Schlüsselkomponenten für die automatische Report-Erstellung \ No newline at end of file diff --git a/chapters/c40_durchführung/index.tex b/chapters/c40_durchführung/index.tex index ccae3d5..957d27c 100644 --- a/chapters/c40_durchführung/index.tex +++ b/chapters/c40_durchführung/index.tex @@ -1,5 +1,5 @@ -\chapter{Vergleich} -\label{Vergleich} +\chapter{Durchführung} +\label{durchführung} \input{chapters/c40_durchführung/implementierung} \input{chapters/c40_durchführung/analyse} \ No newline at end of file diff --git a/gliederung.md b/gliederung.md index fb2f376..134f169 100644 --- a/gliederung.md +++ b/gliederung.md @@ -16,17 +16,17 @@ - ~~Eigenschaften Screenshots~~ - ~~Erwartungen an Ergebnisdaten~~ - ~~Sprache für Tests derweil nur Deutsch und Englisch~~ - - Vergleich (Testaufbau abstrakt!) + - ~~Vergleich (Testaufbau abstrakt!)~~ - ~~Metriken~~ - - Grundsätzliches Konzept hinter Pipeline + - ~~Grundsätzliches Konzept hinter Pipeline~~ - ~~Verwendete Algorithmen (neutral!)~~ - ~~Preprocessing~~ - ~~Postprocessing~~ - Durchführung - Implementierung - Programmkomponenten - - Bibliotheken - - Processing-Framework + - ~~Bibliotheken~~ + - ~~Processing-Framework~~ - Pipeline-Aufbau (Src-Code Exzerpt!) - Programmablauf - Bulk-Scan diff --git a/main.pdf b/main.pdf index dd1d891..1185a02 100644 Binary files a/main.pdf and b/main.pdf differ