diff --git a/chapters/c30_konzept/algorithmen/postprocessing.tex b/chapters/c30_konzept/algorithmen/postprocessing.tex index 962cd14..b625660 100644 --- a/chapters/c30_konzept/algorithmen/postprocessing.tex +++ b/chapters/c30_konzept/algorithmen/postprocessing.tex @@ -8,7 +8,18 @@ Da die verarbeiteten Bilddaten \bzw deren extrahierte Textdaten später durch ei Um die aus der Texterkennung gewonnenen Daten zunächst für die weitere Filterung vorzubereiten, ist es sinnvoll, die Redundanz der Daten möglichst zu reduzieren und die einzelnen Wörter zu normalisieren \bzw zu standardisieren. Beispielsweise kann durch das Umwandeln aller Textdaten in Kleinbuchstaben die Variation der Daten eingeschränkt werden, ohne jedoch für die Suche relevante Information zu verlieren. -% TODO Beispielhafter Vergleich der Daten vor bzw. nach Anwendung des Filters +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung des Filters auf einen Beispielscreenshot.} + % TODO Beispielhafter Vergleich der Daten vor bzw. nach Anwendung des Filters + \label{algorithmen_normalisierung_vergleich} +\end{figure} \subsubsection{Vermeidung von Duplikaten} \label{algorithmen_duplikate} diff --git a/chapters/c30_konzept/algorithmen/preprocessing.tex b/chapters/c30_konzept/algorithmen/preprocessing.tex index 140f698..ff5443f 100644 --- a/chapters/c30_konzept/algorithmen/preprocessing.tex +++ b/chapters/c30_konzept/algorithmen/preprocessing.tex @@ -15,24 +15,44 @@ Bei Resampling wird die Bildauflösung durch "Neuabtastung" verändert. Um die f Da Tesseract auf klare und scharfe Kontraste angewiesen ist, um Text korrekt zu identifizieren, eignen sich nicht alle von ImageMagick zur Verfügung gestellten Skalierungsmethoden für die Weiterverarbeitung. Besonders beim Hochskalieren neigen einige Filter dazu, Unschärfen und Artefakte zu erzeugen, die die Genauigkeit der Texterkennung negativ beeinflussen können. [TODO: Beispielbild für Bilineare Skalierung oder nearest-neighbor hier einfügen]. Unter den verschiedenen Resampling-Filtern, die ImageMagick bereitstellt, haben sich insbesondere die Bikubische Interpolation und das Lanczos-Verfahren als für die Texterkennung mit Tesseract geeignet erwiesen \mcite{todo}: \subsubsubsection{Bikubische Interpolation} -\label{algo:bicubic_interpolation} +\label{algorithmen_bicubic_interpolation} Die Bikubische Interpolation stellt eine Erweiterung der Kubischen Spline Interpolation dar. Für die Berechnung des Ergebniswertes eines Pixels werden bei diesem Verfahren sowohl Pixel aus der ersten, als auch aus der zweiten Nachbarschaft berücksichtigt, wodurch -- zu lasten der Laufzeitperformanz -- eine hohe Detailtreue erhalten werden kann. Mithilfe von Streuparametern kann beeinflusst werden, wie stark die Übergänge zwischen einzelnen Pixeln geglättet werden \bzw wie scharf die Kanten im berechneten Ergebnisbild sind. Abhängig von der Qualität der Ausgangsdaten können Skalierungsartefakte dadurch weitestgehend vermieden werden. % TODO Beschreibung Funktionsweise -% TODO Vergleichsbilder (Zeige eine grafik und einen text-screenshot. Hier fällt auf, dass die grafik gut aussieht, aber text eher verschwommen wird, was schlecht für tesseract ist) +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Bikubischen Interpolation auf einen Beispielscreenshot. Die Übergänge zwischen den Pixeln werden geglättet und die Texte wirken leicht verschwommen.} + % TODO Vergleichsbilder. + \label{algorithmen_bicubic_interpolation_vergleich} +\end{figure} Bei Verwendung der Bikubischen Interpolation als Resampling-Algorithmus fällt auf, dass Bilder und Grafiken durch die Glättung für das menschliche Auge ansprechender wirken. Tesseract jedoch profitiert stark von klaren Texten und hohen Kontrasten, weswegen diese Art des Resamplings keine ideale Basis für die nächsten Preprocessingschritte bildet. \subsubsubsection{Lanczos Filterung} \label{algorithmen_lanczos} -Das Lanczos-Verfahren erlaubt es, Bilder beim Resampling präzise zu rekonstruieren. Es verwendet eine Fensterfunktion, basierend auf dem nichtnormierten Sinus Cardinalis, auch bekannt als Samplingfunktion \(sinc(x)\) und erzeugt im Gegensatz zur \hyperref[algo:bicubic_interpolation]{Bikubischen Interpolation} weniger stark geglättete Ergebnisse, dafür sind diese jedoch meist schärfer. Durch die Verwendung der aufwändigen Samplingfunktion ist Resampling nach der Lanczos-Methode vergleichsweise rechenintensiv. +Das Lanczos-Verfahren erlaubt es, Bilder beim Resampling präzise zu rekonstruieren. Es verwendet eine Fensterfunktion, basierend auf dem nichtnormierten Sinus Cardinalis, auch bekannt als Samplingfunktion \(sinc(x)\) und erzeugt im Gegensatz zur \hyperref[algorithmen_bicubic_interpolation]{Bikubischen Interpolation} weniger stark geglättete Ergebnisse, dafür sind diese jedoch meist schärfer. Durch die Verwendung der aufwändigen Samplingfunktion ist Resampling nach der Lanczos-Methode vergleichsweise rechenintensiv. -% TODO Vergleichsbilder - -% TODO Figure: Details und Konturen werden gut beibehalten +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung des Lanczos Filters auf einen Beispielscreenshot. Details und Konturen bleiben verhältnismäßig gut erhalten.} + % TODO Vergleichsbilder + \label{algorithmen_lanczos_vergleich} +\end{figure} Aufgrund der höheren Bildschärfe und den dadurch deutlich klareren Texten fällt die Wahl des Skalierungsverfahrens für die weiteren Schritte auf die Lanczos-Methode. @@ -41,11 +61,11 @@ Aufgrund der höheren Bildschärfe und den dadurch deutlich klareren Texten fäl Befindet sich Text zu nah am Rand des Bildes, kommt es vor, dass dieser nicht richtig erkannt werden kann. Ebenso kann auch ein zu großer einfärbiger Rahmen am Rand des Bildes dazu führen, dass Bildsektionen fälschlicherweise als "leer" erkannt und übersprungen werden, wodurch der zu erkennende Text nicht in die Ergebnisdaten mit aufgenommen wird. -\begin{figure}[th] +\begin{figure}[ht] \centering - \fbox{\includegraphics[width=0.7\linewidth]{bsp_rahmen_groß}} - \caption[Ein Screenshot mit zu großem Rahmen]{Ein im Verhältnis zur Bildgröße zu großer einfärbiger Rahmen} - \label{fig:bsp_rahmen_großs} + \fbox{\includegraphics[width=.7\textwidth]{include/bsp_rahmen_groß.png}} + \caption{Ein im Verhältnis zur Bildgröße zu großer einfärbiger Rahmen} + \label{} \end{figure} \subsubsection{Binarisierung} @@ -62,21 +82,93 @@ Ein häufig für die Bildsegmentierung genutztes Verfahren ist die feste Schwell Obwohl das fixe Thresholding durch seine Simplizität einen relativ geringen Berechnungsaufwand benötigt und daher eine hohe Performance aufweist, sind die Ergebnisdaten abhängig von dem Schwellenwert und dem Ausgangsbild meist unzufriedenstellend. So ergibt es sich oft, dass die eigentlich bunten grafischen Elemente der Benutzeroberfläche aufgrund ihrer Helligkeit über dem Schwellenwert liegen. Dadurch werden sie, genau wie der Text, als Vordergrund wahrgenommen und die gesamte Fläche wird einfärbig. Dadurch kann jeglicher Text innerhalb dieser Fläche nicht vom Texterkennungssystem erkannt werden. -% TODO Vergleichsbilder +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung des festen Schwellenwertverfahrens auf einen Beispielscreenshot. Bei einem passenden Schwellenwert und nur geringfügig verschiedenen Farbflächen ist der Textinhalt gut vom Hintergrund abgrenzbar.} + % TODO Vergleichsbilder. + \label{thresholding_fixed_vergleich_gut} +\end{figure} + +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung des festen Schwellenwertverfahrens auf einen Beispielscreenshot. Bei einem falsch gewählten Schwellenwert oder komplexen UI-Elementstrukturen ist der Text nicht erkennbar.} + % TODO Vergleichsbilder. + \label{thresholding_fixed_vergleich_schlecht} +\end{figure} \subsubsubsection{Adaptive Schwellenwertmethode} \label{thresholding_adaptive} -Bei der adaptiven Schwellenwertmethode wird der Schwellenwert auf Basis der lokalen Eigenschaften eines Bildbereichs angepasst, der durch die sogenannte "Blockgröße" definiert wird. Innerhalb eines Blocks wird schließlich ein fixer Schwellenwert ermittelt. Dadurch können im Gegensatz zur \hyperref[thresholding_fixed]{festen Schwellenwertmethode} verschiedenfarbige Texte auf Hintergründen unterschiedlicher Helligkeit besser abgegrenzt werden und die Menge an erkanntem Text wird erhöht. +Die adaptive Schwellenwertmethode gehört zu den halbautomatischen Schwellenwertalgorithmen. Bei diesem Verfahren wird der Schwellenwert auf Basis der lokalen Eigenschaften eines Bildbereichs angepasst, der durch die sogenannte "Blockgröße" definiert wird. Innerhalb eines Blocks wird schließlich dynamisch ein fixer Schwellenwert ermittelt. Dadurch können im Gegensatz zur \hyperref[thresholding_fixed]{festen Schwellenwertmethode} verschiedenfarbige Texte auf Hintergründen unterschiedlicher Helligkeit besser abgegrenzt werden und die Menge an erkanntem Text wird erhöht. -% TODO Vergleichsbilder +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der adaptiven Schwellenwertmethode auf einen Beispielscreenshot. Die Blockgröße ist gut an den Bildinhalt angepasst und alle Details bleiben erhalten.} + % TODO Vergleichsbilder. + \label{thresholding_adaptive_vergleich_gut} +\end{figure} + +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der adaptiven Schwellenwertmethode auf einen Beispielscreenshot. Details verschwinden, wenn die Blockgröße nicht richtig an den Bildinhalt angepasst ist.} + % TODO Vergleichsbilder. + \label{thresholding_adaptive_vergleich_schlecht} +\end{figure} \subsubsubsection{Dreiecks-Schwellenwertmethode} \label{thresholding_triangle} Das Dreiecks-Schwellenwertverfahren verwendet das Histogramm eines Bildes, um einen globalen Schwellenwert zu ermitteln. Innerhalb des Histogramms wird eine Linie vom Höchstwert (\engl{Peak}) zum Minimum gezeichnet und ermittelt die Normale mit der maximalen Länge. Dieses Verfahren erzielt die besten Ergebnisse, wenn die zu extrahierenden Elemente Intensitätswerte aufweisen, die an der Basis des ermittelten Peaks liegen. Für Screenshots von UI-Elementen mit komplexer Struktur und farblich stark variierenden Komponenten ist es eher nicht geeignet. -% TODO Vergleichsbilder +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Dreiecks-Schwellenwertmethode auf einen Beispielscreenshot. Gleichen sich die Inhalte farblich, werden die Details einigermaßen gut extrahiert.} + % TODO Vergleichsbilder. + \label{thresholding_triangle_vergleich_gut} +\end{figure} + +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Dreiecks-Schwellenwertmethode auf einen Beispielscreenshot. Bereits bei mäßiger Variation der Helligkeit verschwinden die ersten Details.} + % TODO Vergleichsbilder. + \label{thresholding_triangle_vergleich_schlecht} +\end{figure} \subsubsubsection{Schwellenwertmethode nach Otsu} \label{thresholding_otsu} @@ -84,15 +176,63 @@ Das Dreiecks-Schwellenwertverfahren verwendet das Histogramm eines Bildes, um ei Bei dem Schwellenwertverfahren nach Otsu wird der globale Schwellenwert für ein Bild anhand des jeweiligen Histogramms ermittelt. Aufgrund dieser Eigenschaften funktioniert das Verfahren am besten, wenn das Histogramm des Bildes eine bimodale Verteilung aufweist, also zwei klare Spitzen hat. % TODO Beispielbild eines optimalen histogramms. Enthält ein Bild jedoch starkes Hintergrundrauschen, funktioniert die Schwellenwertermittlung nur unzuverlässig. Weist es lokale Helligkeitsunterschiede auf, wie es bei grafischen Oberflächen mit ihren unterschiedlich eingefärbten Oberflächensektionen oft der Fall ist, entstehen Dank der Bestimmung eines einzelnen globalen Wertes für das gesamte Bild ähnliche Probleme wie bei der \hyperref[thresholding_fixed]{fixen Schwellenwertmethode}. -% TODO Vergleichsbilder +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Schwellenwertmethode nach Otsu auf einen Beispielscreenshot. Wird ein passender Schwellenwert ermittelt, lässt sich der Text gut vom Hintergrund trennen.} + % TODO Vergleichsbilder. + \label{thresholding_otsu_vergleich_gut} +\end{figure} + +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Schwellenwertmethode nach Otsu auf einen Beispielscreenshot. Bei komplexen Strukturen im User-Interface gehen aufgrund des globalen Schwellenwerts Details verloren.} + % TODO Vergleichsbilder. + \label{thresholding_otsu_vergleich_schlecht} +\end{figure} \subsubsubsection{Schwellenwertmethode nach Kapur} \label{thresholding_kapur} Die Schwellenwertmethode nach Kapur, Sahoo und Wong zielt darauf ab, einen Schwellenwert zu finden, der die Entropie zwischen den Vorder- und Hintergrundregionen maximiert. -% TODO kurzer Mathematischer Exkurs +% TODO kurzer Mathematischer Exkurs?? -Dieses Schwellenwertverfahren liefert gute Ergebnisse bei Bildern mit starker Varianz der Vorder- und Hintergrundkontraste \bzw eine breite Helligkeitsverteilung aufweist. +Dieses Schwellenwertverfahren liefert gute Ergebnisse bei Bildern mit starker Varianz der Vorder- und Hintergrundkontraste \bzw einer breiten Helligkeitsverteilung. -% TODO Vergleichsbilder \ No newline at end of file +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Schwellenwertmethode nach Kapur auf einen Beispielscreenshot.} + % TODO Vergleichsbilder. + \label{thresholding_kapur_vergleich_gut} +\end{figure} + +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Anwendung der Schwellenwertmethode nach Kapur auf einen Beispielscreenshot.} + % TODO Vergleichsbilder. + \label{thresholding_kapur_vergleich_schlecht} +\end{figure} \ No newline at end of file diff --git a/chapters/c30_konzept/annahmen.tex b/chapters/c30_konzept/annahmen.tex index 4a92a14..70a6556 100644 --- a/chapters/c30_konzept/annahmen.tex +++ b/chapters/c30_konzept/annahmen.tex @@ -11,16 +11,41 @@ Um die Texterkennung mittels Tesseract und die anschließende Filterung der Erge Im Falle dieser Bachelorarbeit handelt es sich bei den zu verarbeitenden Bildern ausschließlich um digitale Bildschirmaufnahmen von grafischen Benutzeroberflächen. Es kann also angenommen werden, dass die Screenshots keine Transparenz aufweisen, die Perspektive der Aufnahme nicht verzerrt ist und der Kontrast in den meisten Fällen ausreicht, um die relevanten Inhalte zu erkennen. Weiters ist bei der Bildverarbeitung auf farbige Hintergrundflächen zu achten, mit deren Unterstützung Bildschirmelemente in modernen grafischen Oberflächen oft gruppiert oder getrennt werden. Nach Sichtung des zu verarbeitenden Bilddatensatzes fällt zudem auf, dass die manche Screenshots durch das Selektieren mit der Maus sehr eng abgeschnitten wurden. Auch das ist bei der Vorverarbeitung zu berücksichtigen. -% TODO Beispielscreenshots +\begin{figure}[ht] + \centering + \begin{minipage}{0.66\textwidth} + \includegraphics[width=\textwidth]{include/screenshots/driver_brpvi_offlineimport_004.png} + \end{minipage} + \hfill + \begin{minipage}{0.3\textwidth} + \begin{minipage}{\textwidth} + \includegraphics[width=\textwidth]{include/screenshots/historian_assistent_001.png} + \end{minipage}\hfill + \vspace{\baselineskip} + \begin{minipage}{\textwidth} + \includegraphics[width=\textwidth]{include/screenshots/driver_archdrv_variablendefinition_001.png} + \end{minipage}\hfill + \end{minipage} + \caption{Beispielhafte Auswahl typischer Dialogscreenshots.} + \label{annahmen_bild_eigenschaften_beispiel} +\end{figure} \subsubsection*{Optimieren von Daten für Tesseract} \label{annahmen_bild_optimal} Für die Verwendung von Tesseract ist es wichtig, unabhängig von der Diversität der Ausgangsdaten möglichst einheitliche Bilder zu generieren, die den Trainingsdaten des neuronalen Netzes ähnlich sehen \mcite{todo}. Während störende Elemente wie Bildrauschen aus dem Bild entfernt werden sollen, sollen Texte unabhängig von der Hinter- bzw. Vordergrundfarbe gut zu erkennen und leicht von Formen oder grafischen Symbolen abzugrenzen sein. -% TODO Textbeschreibung, welche Eigenschaften die Eingangsdaten am besten haben sollten - -% TODO Beispielbilder: So sollen die Daten optimalerweise aussehen +\begin{figure}[ht] + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{include/screenshots/command-processing_screentypes_controlgroup_005.png}} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \fbox{\includegraphics[width=\textwidth]{\detokenize{include/results/ThresholdProcessor(40\%).00.command-processing_screentypes_controlgroup_005.png}}} + \end{minipage} + \caption{Ein optimales Ergebnisbild. Jegliche farblichen Flächen wurden durch die Bildverarbeitung entfernt. Übrig bleibt klar lesbarer Text mit einem hohen Kontrast zum Hintergrund.} + \label{fig:screenshot_comparison_optimal} +\end{figure} \subsection*{Postprocessing} \label{annahmen_postprocessing} @@ -29,18 +54,31 @@ Für die Verwendung von Tesseract ist es wichtig, unabhängig von der Diversitä Bei der Texterkennung kommt es manchmal vor, dass grafische Elemente als Unicode-Symbole erkannt werden. Beispielsweise finden sich in den ungefilterten Ergebnisdaten oft Aufzählungszeichen "•" oder diverse Varianten von Bindestrichen "‒". Diese Zeichen sind gemäß Anwendungsanforderungen nicht relevant für die Schlagwortsuche und können somit entfernt \bzw ignoriert werden. -% TODO Zeigen ungefilterter Ergebnisdaten + +\begin{figure}[ht] + \begin{minipage}{0.5\textwidth} + % \includegraphics[width=\textwidth]{include/screenshots/zrs_ZAMS_filter-alarmgroup_001.png} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + % \lstinputlisting[numbers=none]{include/screenshots/zrs_ZAMS_filter-alarmgroup_001.json} + \end{minipage} + % TODO Zeigen ungefilterter Ergebnisdaten + \caption{Ungefilterte Liste von Ergebnisdaten bei Durchführung der Texterkennung in dem gezeigten Screenshot.} + \label{fig:screenshot_ergebnisdaten_ungefiltert} +\end{figure} + \subsubsection*{Mehrsprachigkeit} \label{annahmen_mehrsprachigkeit} -Eine weitere Anforderung an das Textverarbeitungssystem ist außerdem das Einlesen und Interpretieren mehrsprachiger Bilddateien. So sollen beispielsweise Bilder mit englischen, deutschen oder italienischen Inhalten zugeführt und die Ergebnisdaten richtig verarbeitet werden können. Um eine Filterung für verschiedene Zeichensätze zu ermöglichen und eine Unterstützung für Sprachen mit nicht-lateinischen Schriften zu gewährleisten, werden dynamische Sprachfilter verwendet, die individuell an die jeweilige Sprache angepasst werden können. Um die Ergebnisdaten nicht unnötig aufzubauschen, werden für die initialen Tests und die Beschreibung der generellen Vorgehensweise im Rahmen dieser Bachelorarbeit werden jedoch nur deutsche oder englische Inhalte verarbeitet. +Eine weitere Anforderung an das Textverarbeitungssystem ist außerdem das Einlesen und Interpretieren mehrsprachiger Bilddateien. So sollen beispielsweise Bilder mit englischen, deutschen oder italienischen Inhalten zugeführt und die Ergebnisdaten richtig verarbeitet werden können. Um eine Filterung für verschiedene Zeichensätze zu ermöglichen und eine Unterstützung für Sprachen mit nicht-lateinischen Schriften zu gewährleisten, werden dynamische Sprachfilter verwendet, die individuell an die jeweilige Sprache angepasst werden können. Um die Ergebnisdaten nicht unnötig zu verkomplizieren, werden für die initialen Tests und die Beschreibung der generellen Vorgehensweise im Rahmen dieser Bachelorarbeit jedoch nur deutsche oder englische Inhalte verarbeitet. % TODO Postprocessing, NLP Folien \subsubsection*{Schlagworte} \label{annahmen_schlagworte} -Für die spätere Suche von Screenshots sollen relevante Schlagworte aus den erkannten Textdaten extrahiert werden. Ein Wort eignet sich dann als Schlagwort, wenn es in relevantem Bezug zum jeweiligen Bild steht und dabei idealerweise eine wichtige Aktion oder Information widerspiegelt. Inhalte, die direkt in der grafischen Benutzeroberfläche ersichtlich sind, eignen sich demnach besonders gut als Suchworte. Damit die Menge an Schlagwörtern allerdings nicht zu unspezifisch wird, sollte es vermieden werden, allgemeine sogenannte Stoppwörter (\engl{Stop words}) ohne besondere Semantik, wie "und", "oder", in das Ergebnis mit aufzunehmen. Sie beinhalten keine spezifische Information und fördern aufgrund ihrer Häufigkeit das Auftreten von Verwechslungen. +Für die spätere Suche von Screenshots sollen relevante Schlagworte aus den erkannten Textdaten extrahiert werden. Ein Wort eignet sich dann als Schlagwort, wenn es in relevantem Bezug zum jeweiligen Bild steht und dabei idealerweise eine wichtige Aktion oder Information widerspiegelt. Inhalte, die direkt in der grafischen Benutzeroberfläche ersichtlich sind, eignen sich demnach besonders gut als Suchworte. Damit die Menge an Schlagwörtern allerdings nicht zu unspezifisch wird, sollte es vermieden werden, allgemeine sogenannte Stoppwörter (\engl{Stop words}) ohne besondere Semantik, wie "und", "oder", in das Ergebnis mit aufzunehmen. Sie beinhalten keine spezifische Information und fördern aufgrund ihrer Häufigkeit das Auftreten von Verwechslungen. % TODO this can be backed by NLP research \ No newline at end of file diff --git a/chapters/c40_durchführung/implementierung.tex b/chapters/c40_durchführung/implementierung.tex index cf98334..e34d28e 100644 --- a/chapters/c40_durchführung/implementierung.tex +++ b/chapters/c40_durchführung/implementierung.tex @@ -3,15 +3,35 @@ \subsection{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. +Als Ausgangsdaten für die Durchführung wurde eine zufällige Auswahl an Dokumentationsscreenshots getroffen. 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 +\begin{figure}[ht] + \centering + \fbox{\includegraphics[width=.7\textwidth]{include/screenshots/driver_SEL_Options_002.png}} + \caption{Ein gut für die Texterkennung geeigneter Screenshot. Die wesentlichen Inhalte weisen einen guten Kontrast zum Hintergrund auf und befinden sich in Bereichen mit gleichmäßiger Helligkeit.} + \label{} +\end{figure} -% TODO Figure ein Beispielscreenshot mit schlechter Lesbarkeit +\begin{figure}[ht] + \centering + \fbox{\includegraphics[width=.7\textwidth]{include/screenshots/editor_startpage_project-exist_001.png}} + \caption{Ein schlecht lesbarer Screenshot. Aufgrund der vielen Symbole und der bunten Flächen stellt dieses Bild eine Herausforderung für das Texterkennungssystem dar.} + \label{} +\end{figure} 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. +\begin{figure}[ht] + \begin{minipage}{0.5\textwidth} + \includegraphics[width=\textwidth]{include/screenshots/zrs_ZAMS_filter-alarmgroup_001.png} + \end{minipage} + \hspace{0.1\textwidth} + \begin{minipage}{0.4\textwidth} + \lstinputlisting[numbers=none]{include/screenshots/zrs_ZAMS_filter-alarmgroup_001.json} + \end{minipage} + \caption{Ein Screenshot und die daraus manuell extrahierten Schlagworte.} + \label{fig:screenshot_verschlagwortet} +\end{figure} \subsection{Verwendete Bibliotheken} \label{components} @@ -132,14 +152,14 @@ Angefangen mit einem Ausgangsbild, welches über die Softwarebibliothek Magick.N \begin{CsCode}[numbers=none] var preprocessing = new ProcessorChainConfiguration() - .Use(new CloneImageProcessor()) - .Use(new ResizeProcessor(FilterType.Lanczos2Sharp, PixelInterpolateMethod.Mesh)) - .Use(new NormalizeProcessor()) - .Use(_thresholdProcessor) - .Use(new AddBorderProcessor(10)) - .Use(new BinarizeProcessor()) - .Use(new NegateCloneProcessor()) - .Complete(OnPreprocessed); + .Use(new CloneImageProcessor()) + .Use(new ResizeProcessor(FilterType.Lanczos2Sharp, PixelInterpolateMethod.Mesh)) + .Use(new NormalizeProcessor()) + .Use(_thresholdProcessor) + .Use(new AddBorderProcessor(10)) + .Use(new BinarizeProcessor()) + .Use(new NegateCloneProcessor()) + .Complete(OnPreprocessed); \end{CsCode} \label{program:program_preprocessor_definition} \captionof{program}{Auszug aus Datei "EvaluationProcessor.cs": Definition der Preprocessing-Kette} @@ -148,36 +168,36 @@ Wurde der übergebene Screenshot vom Texterkennungssystem verarbeitet, müssen n \begin{CsCode}[numbers=none] var postprocessing = new ProcessorChainConfiguration() - .Use(new ConfidenceFilter(50)) - .Use(new ToLowerProcessor()) - .Use(new DuplicateFilter()) - .Complete(new RegexFilter(wordRegex)); + .Use(new ConfidenceFilter(50)) + .Use(new ToLowerProcessor()) + .Use(new DuplicateFilter()) + .Complete(new RegexFilter(wordRegex)); \end{CsCode} \label{program:program_postprocessor_definition} \captionof{program}{Auszug aus Datei "EvaluationProcessor.cs": Definition der Postprocessing-Kette} \subsubsection{Lookup} -Die "Lookup" Bibliothek abstrahiert das Speichern von Schlüssel-Wert-Paaren. Dabei kann flexibel zwischen verschiedenen Speicherimplementierungen gewechselt werden. So ist es beispielsweise möglich, die Werte in einer Listenstruktur im Arbeitsspeicher, in einer Datei oder -- mittels der EntityFramework-Bibliothek, welche von der .NET Foundation entwickelt wird -- in einer Datenbank persistent abzulegen. +Die "Lookup" Bibliothek abstrahiert das Speichern von Schlüssel-Wert-Paaren. Dabei kann flexibel zwischen verschiedenen Speicherimplementierungen gewechselt werden. So ist es beispielsweise möglich, die Werte in einer Listenstruktur im Arbeitsspeicher, in einer Datei oder -- mittels der EntityFramework-Bibliothek, welche von der .NET Foundation entwickelt wird -- in einer Datenbank persistent abzulegen. Unabhängig von der Ablagestruktur im Hintergrund können Lookups mittels einer gemeinsamen Schnittstelle manipuliert werden: \begin{CsCode}[numbers=none] -public interface ILookup + public interface ILookup : ILookup, - IDictionary>, - IDisposable -{ - ICollection Add(TKey key); + IDictionary>, + IDisposable + { + ICollection Add(TKey key); - public void Add(TKey key, TValue value); + public void Add(TKey key, TValue value); - public void AddRange(TKey key, IEnumerable values); + public void AddRange(TKey key, IEnumerable values); - public bool Remove(TKey key, TValue value); + public bool Remove(TKey key, TValue value); - public ICollection GetOrAdd(TKey key); -} + public ICollection GetOrAdd(TKey key); + } \end{CsCode} \label{program:program_lookup_interface} \captionof{program}{Auszug aus Datei "ILookup.cs": Definition der gemeinsamen Schnittstelle für Lookups} @@ -192,31 +212,27 @@ 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{CsCode}[numbers=none] -public interface IDocumentGenerator : IStreamWriter -{ - IDocumentGenerator Append(string? text = default); + public interface IDocumentGenerator : IStreamWriter + { + IDocumentGenerator Append(string? text = default); - IDocumentGenerator AppendLine(string? text = default); + IDocumentGenerator AppendLine(string? text = default); - IDocumentGenerator AppendParagraph(string? text = default); + IDocumentGenerator AppendParagraph(string? text = default); - IDocumentGenerator AppendHeading(int level, string text); + IDocumentGenerator AppendHeading(int level, string text); - IDocumentGenerator AppendTable(int columns, Action table); + IDocumentGenerator AppendTable(int columns, Action table); - string FormatImage(string path, IBounds? bounds = default); -} + string FormatImage(string path, IBounds? bounds = default); + } \end{CsCode} \label{program:program_reportgenerator_interface} \captionof{program}{Auszug aus Datei "IDocumentGenerator.cs": Hauptschnittstelle für den ReportGenerator} \subsection{Programmablauf} -Die prototypische Implementierung besteht neben den oben genannten Komponenten aus einem ausführbaren Kommandozeilenprogramm zur Texterkennung und einem Programm zum Vergleich der Ergebnisse mit den manuell verschlagworteten Soll-Daten. - -Alle relevanten Daten werden in entsprechenden Ausgabeverzeichnissen festgehalten und dadurch für den jeweiligen nächsten Schritt verfügbar gemacht. - -% TODO mermaid flow chart? +Die prototypische Implementierung besteht neben den oben genannten Komponenten aus einem ausführbaren Kommandozeilenprogramm zur Texterkennung und einem Programm zum Vergleich der Ergebnisse mit den manuell verschlagworteten Soll-Daten. Alle relevanten Daten werden in entsprechenden Ausgabeverzeichnissen festgehalten und dadurch für den jeweiligen nächsten Schritt verfügbar gemacht. \subsubsection{Texterkennung} diff --git a/images/bsp_rahmen_groß.png b/images/bsp_rahmen_groß.png deleted file mode 100644 index 20115cf..0000000 Binary files a/images/bsp_rahmen_groß.png and /dev/null differ diff --git a/images/logo.pdf b/images/logo.pdf deleted file mode 100644 index 98f4ad9..0000000 Binary files a/images/logo.pdf and /dev/null differ diff --git a/main.pdf b/main.pdf index 6769ffb..1e0cd5b 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.tex b/main.tex index c97e12d..b08cacb 100644 --- a/main.tex +++ b/main.tex @@ -6,9 +6,7 @@ \documentclass[bachelor,german,smartquotes]{hgbthesis} \RequirePackage[utf8]{inputenc} % bei Verw. von lualatex oder xelatex entfernen! - -\graphicspath{{images/}} % Verzeichnis mit Bildern und Grafiken -\logofile{logo} % Logo-Datei: images/logo.pdf (kein Logo: \logofile{}) +\logofile{include/logo.pdf} \bibliography{references} % BibLaTeX-Literaturdatei (references.bib) %%%----------------------------------------------------------------------------- @@ -16,6 +14,8 @@ \usepackage{outlines} \usepackage{booktabs} \usepackage{tabularx} +\usepackage{listings} +\usepackage{graphicx} \usepackage[parfill]{parskip} \usepackage{nameref} @@ -52,26 +52,6 @@ \newcommand{\csharp}{C\#} \newcommand{\engl}[1]{engl. "#1"} -\newcommand{\includeImgFloat}[6]{ - \begin{wrapfigure}{#1}{#2} - \includegraphics{#3} - \caption[#4]{#4\footnotemark} - \label{#6} - \end{wrapfigure} - \footnotetext{Source: \url{#5}} -} - -\newcommand{\includeImg}[6]{ - \begin{figure}[#1] - \begin{center} - \includegraphics[#2]{#3} - \caption[#4]{#4\footnotemark} - \label{#6} - \end{center} - \end{figure} - \footnotetext{Source: #5} -} - %%%----------------------------------------------------------------------------- %%%-----------------------------------------------------------------------------