Beruflich Dokumente
Kultur Dokumente
Vorgelegte von:
Mehrnaz Hashemi
Donya Moharrami Olfat
Amirhossein Sadeghi Pirzaman
Studiengang:
Master Elektrotechnik
Lehrkraft:
Sommersemester 2022
0
Inhaltverzeichnis
Einleitung ...................................................................................................................... 3
Kapitel 1: Grundlagen.................................................................................................. 4
1-1 Künstliche Intelligenz ............................................................................................... 4
1-2 Maschinelles Lernen ...................................................................................................... 4
1-2-1 Die Arten vom maschinellen Lernen ..................................................................................... 4
1-3 Deep Learning ................................................................................................................ 5
1-4 Neuronales Netzwerk (NN) ........................................................................................... 5
1-4-1 Aktivierungsfunktion ............................................................................................................. 6
1-4-2 Kernel Initializers ................................................................................................................... 6
1-4-3 Optimierungsalgorithmen ..................................................................................................... 6
1-5 Convolutional Neural Network (CNN) ........................................................................ 7
1-5-1 Convolutional Layer ............................................................................................................... 7
1-5-2 Pooling layer .......................................................................................................................... 9
1-5-3 Fully connected layer............................................................................................................. 9
1-6 MNIST-Datenbank ........................................................................................................ 9
1-7 Programmbibliotheken ............................................................................................... 10
1-7-1 TensorFlow und Keras ......................................................................................................... 10
1-7-2 OpenCV ................................................................................................................................ 11
1-8 App Entwicklung ......................................................................................................... 11
1-8-1 Native App Entwicklung ....................................................................................................... 11
1-8-2 Cross Plattform App Entwicklung ........................................................................................ 12
1-8-3 Xamarin................................................................................................................................ 12
1-8-4 React Native......................................................................................................................... 12
Kapitel 2: Entwurfsphase .......................................................................................... 13
2-1 Entwurf von Backend .................................................................................................. 13
2-2 Entwurf von Frontend ................................................................................................. 14
2-3 Kombinieren des CNN-Modells mit der App ............................................................ 14
Kapitel 3: Implementierungsphase – Backend ........................................................ 15
3-1 Modul Dataset Loader ................................................................................................. 15
3-1-1 Import der Bibliotheken ...................................................................................................... 15
3-1-2 Laden des MNIST-Datensatzes ............................................................................................ 15
3-1-3 Datenverarbeitung / Reshaping .......................................................................................... 16
3-1-4 One Hot Encoding ................................................................................................................ 16
1
3-1-5 Normalize............................................................................................................................. 16
3-2 Modul RecognitionModel ............................................................................................ 17
3-2-1 Import der Bibliotheken ...................................................................................................... 17
3-2-2 Definition des CNN-Modells ................................................................................................ 17
3-2-3 Erstellen des Modells........................................................................................................... 19
3-3 Modul Image Prediction .............................................................................................. 19
3-4 Modul Main .................................................................................................................. 19
Kapitel 4: Implementierungsphase – Frontend ....................................................... 21
4-1 Import der Bibliotheken und Module ........................................................................ 21
4-1-1 React Native-Bibliothek ....................................................................................................... 21
4-1-2 Tensorflow.js ....................................................................................................................... 22
4-1-3 Manipulation der Bilder in React Native Expo..................................................................... 22
4-1-4 Modul expo-camera ............................................................................................................ 22
4-1-5 Import des Moduls DigitRecognitionMoudle ...................................................................... 22
4-1-6 FileSystem ............................................................................................................................ 23
4-2 State und Variable ....................................................................................................... 23
4-3 Ladung des Tensorflow-Modells in state.model........................................................ 23
4-4 Camera Funktion ......................................................................................................... 24
4-5 Aufnahme und Größenänderung des Bildes ............................................................. 24
4-6 Native OpenCV-Bibliothek ......................................................................................... 24
4-6-1 Erstellen des Moduls DigitRecognationModule .................................................................. 25
4-7 Vorhersage der Ziffern ................................................................................................ 27
4-8 Kalkulation und Rechnung ......................................................................................... 28
4-9 Design der Applikation ................................................................................................ 28
Kapitel 5: Testphase ................................................................................................... 30
Zusammenfassung und Fazit ..................................................................................... 32
Referenzen ................................................................................................................... 33
2
Einleitung
Motivation:
Künstliche Intelligenz, maschinelles Lernen, tiefes Lernen und neuronale Netzwerke sind
Begriffe, die im Technologiezeitalter integriert werden und haben sich in den letzten Jahren rasant
schnell entwickelt. Künstliche Intelligenz beeinflusst das Leben und die Arbeit der Menschen.
Machine Vision versetzt die Maschinen in die Lage, die Welt so zu sehen, wie Menschen sie sehen
können. Im Laufe der Zeit wurde die Fortschritte im Bereich Computer Vision durch tiefes Lernen
entwickelt, die in erster Linie auf einem speziellen Algorithmus namens Convolutional Neural
Nets basiert sind. Die Erkennung von menschlicher Handschrift ist eine dringende Technologie,
die in verschiedenen Bereichen zum Ansatz kommt.
Der folgende Bericht dokumentiert ein maschinelles Lernens Projekt, das sich dem Thema “die
Erkennung von handgeschriebenen Zahlen und deren Verarbeitung in Echtzeit” gewidmet hat.
Zunächst ist zu erwähnen, dass hierbei es insbesondere um eine Applikation geht, die für das
Betriebssystem Android geschrieben ist. Diese App muss die in eine Reihe handgeschriebenen
Zahlen scannen, erkennen und in Echtzeit bearbeiten z.B. die Summe ausgeben.
Ablauf der Arbeit:
Der vorliegende Bericht gliedert sich in fünf Teilen:
Der erste Arbeitsschritt bestand in einer Grundlagenrecherche, um die Anforderungen für Projekt,
die es für ein maschinelles Lernens Projekt relevant sind, zu identifizieren. Der nächste Aspekt
betrifft die Entwurfsphase. in der die Frage aufwirft, wie das Ergebnis erreicht wird und was
benötigt wird. Hier teilt sich im Entwurf von Backend und Frontend, sowie die Kombination von
denen. Die Kapitel3 und 4 beleuchten die Implementierungsphase. Kapitel 3 beschäftigt sich mit
dem Backend (Logik), was in Python geschrieben ist. Hierbei wird im Bereich des maschinellen
Lernens bzw. des tiefen Lernens von der MNIST-Datenbank bis zur Vorhersage der Zahlen
mittels des Convolutional Neural Network-Modells erläutert. Kapitel 4 erläutert das Frontend
(UI), was in JavaScript geschrieben ist. Zunächst ist zu erwähnen, dass hierbei React Native, das
ein JavaScript-Framework ist, verwendet wird, um Crossplatform-App für Android zu erstellen.
React Native stellt die Möglichkeiten wie TensorFlow-Bibliothek usw. zur Verfügung, die hierbei
die Entwicklung der Crossplatform-App leichter machen. Das letzte Kapitel kümmert sich um die
Testphase, in der die App durch verschiedene Android-Geräte getestet wird.
Ein Fazit und ein kurzer Ausblick aufs CNN-Modell und App schließen die Arbeit ab.
3
Kapitel 1: Grundlagen
4
Dieses Projekt kümmert sich um ein Supervised Machine Learning Problem, da es ein
vorbereiteter Trainingsdatensatz (MNIST) verwendet wird und auch das Lernziel eine bekannte
Zahl von 0 bis 9 ist. Es ist ein Multi-label Klassifikationsproblem, da die Algorithmen diskrete
Vorhersagen treffen müssen. Maschinelles Lernen kann als eine approximative Darstellung von
Funktionen beschreiben werden. Es wird Algorithmen des Supervised Learning verwendet, um
diese Funktion zu approximieren. Deep Learning bzw. Neuronale Netze sind eine Lösung für
einen supervised-Algorithmus des maschinellen Lernens.
5
einigen Gewichten beginnen und diese dann iterativ auf bessere Werte aktualisieren. Wie kann
man die Gewichte zu Beginn des Trainings initialisieren? [1]
1-4-1 Aktivierungsfunktion
Die Aktivierungsfunktion (Activation Function) beim Entwurf eines neuronalen Netzes spielt eine
große Rolle. Nachdem dieser Funktionen in den versteckten Schichten hinzugefügt werden, kann
das Modell lernen. Es gibt drei Schichten, die ein Netz umfasst:
1- Eingabeschichten: Diese Schichten sammeln die Eingabe für den Rechenprozess. [5]
2- Versteckte Schichten: Sie sammeln die Eingaben der anderen Schichten und erzeugen
Ausgaben für die anderen Schichten. [5]
3- Ausgabeschichten: Die Ausgabeschichten können das Ergebnis voraussagen. [5]
Die Aktivierungsfunktion kann als Übertragungsfunktion bezeichnet werden und kann auch
nichtlinear sein. Eine hilfreiche Aktivierungsfunktion heißt Rectified Linear Activation Function.
ReLU ist eine nichtlineare Funktion oder eine stückweise lineare Funktion, die die Eingabe direkt
ausgibt, wenn sie positiv ist, andernfalls gibt sie Null aus. Sie ist die am häufigste verwendete
Aktivierungsfunktion in neuronalen Netzwerken, insbesondere in Convolutional Neural
Networks. [5]
1-4-3 Optimierungsalgorithmen
Loss-Funktion zeigt, wie schlecht das Modell funktioniert. Diese Funktion kann zum Trainieren
des Modells eingesetzt werden. Im Wesentlichen muss den Verlust (Loss) minimiert werden.
Optimierer sind die Algorithmen, mit denen die Gewichte und learning rate geändert werden, um
die Verluste zu verringern. Es gibt verschiedene Arten von Optimierern wie Gradient Descent,
Stochastic Gradient Descent (SGD), SGD mit momentum usw. [6]
6
1-5 Convolutional Neural Network (CNN)
Convolutional Neural Network (CNN), zu Deutsch “faltendes neuronales Netzwerk“, wird durch
die meisten neuronalen Netze verwendet. Das CNN-Netzwerk ist eine der beliebtesten Methoden
zur Objekterkennung wie zum Beispiel die Bildklassifizierung. Die Eingabe des CNN-Netzwerks
ist ein Bild. Das Netzwerk nimmt das Foto und gibt die Wahrscheinlichkeit der unterschiedlichen
Klassen aus. Wenn das Objekt im Bild vorhanden ist, ist seine Ausgabewahrscheinlichkeit hoch,
andernfalls ist die Ausgabewahrscheinlichkeit der restlichen Klassen entweder vernachlässigbar
oder niedrig. Convolutional Neural Network enthalten drei Hauptschichten, die nachfolgend kurz
erklärt werden. [1]
Abbildung 1- Faltung (Convolution) zwischen einem Eingabebild und einem Kernel [7]
1- Eingabedaten: Die Eingabedaten können ein farbiges Foto sein, das aus einer
Pixelmatrix entsteht. Diese Pixelmatrix hat drei Dimensionen (Höhe, Breite und Tiefe),
die RGB in einem Bild entsprechen. [7]
2- Filter: Der Filter oder Kernel ist tatsächlich ein Convolution Matrix, der über das
Eingangsbild übergegeben wird. Die Filtergröße ist typischerweise eine 3x3-Matrix. Der
Filter wird dann auf einen Bereich des Bildes angewendet und zwischen den
Eingabepixeln und dem Filter wird ein Skalarprodukt berechnet. Dieses Skalarprodukt
7
wird dann in ein Ausgangsarray also zweidimensionales Array eingespeist. Danach
verschiebt sich der Filter um einen Schritt und wiederholt den Vorgang, bis der Filter sich
über das gesamte Bild bewegt [01]. In der Abbildung filtert ein 3x3 convolution Matrix
ein 9x9 Eingangsmatrix. Das Ergebnis ist ein 7x7 Ausgangsmatrix. [7]
Abbildung 2 - Eingang Shape: (1, 9, 9) - Ausgang Shape: (1, 7, 7) K: (3, 3) - P: (0, 0) - S: (1, 1) [7]
3- Feature-Map: Die Ausgabe, die sich von Skalarprodukten aus der Eingabe und dem
Filter ausgibt, wird als Feature-Map, oder convolved feature bekannt. Es gibt drei
Parameter, die die Größe der Ausgabe beeinflussen. Diese müssen vor dem Beginn des
CNN-Modell-Trainings eingestellt werden und beinhalten: [1]
▫ Anzahl der Filter: sie wirkt sich auf die Tiefe der Ausgabe aus. Beispielsweise würden
drei unterschiedliche Filter drei verschiedene Feature-Maps ergeben, wodurch eine Tiefe von
drei entsteht. [1]
▫ Stride: Es ist die Anzahl der Pixel, die der Filter über die Eingabematrix bewegt. Die Filter
bewegen sich standardmäßig von links nach rechts, von oben nach unten und verschieben sie
Pixel für Pixel. Diese Verschiebung kann aber auch geändert werden. Bei einer Schrittweite
(Stride) von (1, 3) wird der Filter z. B. horizontal von 3 auf 3 und vertikal von 1 auf 1
verschoben. [1]
▫ Zero-Padding: Es wird normalerweise verwendet, wenn der Filter nicht zum
Eingangsbild passt. Dabei werden alle Pixel auf null gesetzt, die außerhalb der Eingabematrix
liegen, wodurch die Ausgabe größer oder gleich wird. [1]
Um Nichtlinearität ins Modell eingeführt zu werden, wendet ein CNN-Modell nach jeder
Faltungsoperation eine nichtlineare Transformation wie ReLU auf Feature-Map an. [1]
8
1-5-2 Pooling layer
Pooling layer führt dazu, die Anzahl der Parameter in der Eingabe zu reduzieren. Es gibt zwei
Hauptarten dafür.
1- Maximales Pooling: Wenn sich der Filter über die Eingabe bewegt, wählt er der Pixel
mit dem maximalen Wert aus. Der gewählte maximale Wert wird an das Ausgabearray
gesendet. [1]
2- Durchschnittliches Pooling: Während sich der Filter über die Eingabe bewegt,
berechnet er den Durchschnittswert, um ihn an das Ausgabearray zu senden. [1]
1-6 MNIST-Datenbank
Die MNIST-Datenbank ist eine riesige Datenbank und wird normalerweise zur Vorbereitung
verschiedener Bildverarbeitungssysteme im Bereich des maschinellen Lernens genutzt. Das
MNIST-Problem ist ein Bildklassifizierungsproblem. Das Ziel des Problems ist es, ein gegebenes
Bild einer handgeschriebenen Ziffer als eine ganze Zahl von 0 bis 9 zu klassifizieren. Es handelt
sich also um ein Bildklassifizierungsproblem mit mehreren Klassen. MNIST stellt insgesamt
70.000 handschriftlichen Zahlenbildern zur Verfügung, wobei der Trainingsdatensatz 60.000
Beispielen umfasst, um das neurale Netzwerk zu trainieren, und der Testdatensatz 10.000
Beispielen sich feststellen lässt, wie gut ein Algorithmus funktioniert. Jedes Foto hat ein Label.
9
Das Lable heißt die Ziffer, die das handgeschriebene Zeichen darstellen soll, beispielweise eine 7
oder eine 3. Das ist die Antwort, die das CNN geben soll, nachdem es die Lernphase
abgeschlossen hat. Ein Zahlenbild besteht aus (28 x 28). [8]
Im Folgenden werden die wichtigen Bibliotheken sowie die Plattformen und die Frameworks
erwähnt, die bei der Programmierung verwendet werden.
1-7 Programmbibliotheken
10
Keras- lässt ein High Level API verwenden und ist zusammen mit den ML -Frameworks wie
TensorFlow einsetzbar. Diese Schnittstelle befasst sich um eine Open-Source-Bibliothek, die in
Python geschrieben ist. Ziel dieser Bibliothek ist es, die schnelle Implementierung neuronaler
Netzwerke für Anwendungen des Deep Learnings zu ermöglichen. [10]
1-7-2 OpenCV
Open Source Computer Vision-Bibliothek oder kurz OpenCV ist unter einer Open-Source-
Softwarebibliothek zum Computer Vision und maschinelles Lernen veröffentlicht. OpenCV ist
nativ in C++ geschrieben. Es konzentriert sich hauptsächlich auf Bildverarbeitung,
Videoaufnahme und -analyse. [11]
In diesem Projekt wird die OpenCV-Bibliothek von Grund auf neu erstellen, anstatt die offiziellen
Bibliotheken von OpenCV zu verwenden.
11
1-8-2 Cross Plattform App Entwicklung
Die Cross Plattform Apps, die plattformunabhängig sind, können sowohl für Betriebssystem iOS
als auch für Android erstellt werden. Die meisten Apps sollen nicht nur auf Android, sondern auch
auf iOS verfügbar sein. Es gibt unterschiedliche Frameworks wie React Native und Xamarin zur
Verfügung. Im Vergleich zu nativen Apps sind Cross Plattform Apps ein schnellerer und
günstigerer Weg, um das Ziel der mobilen Entwicklung zu erreichen. [12]
1-8-3 Xamarin
Bei Xamarin handelt es sich um eine Open-Source-Plattform für das Erstellen moderner Apps für
iOS, Android und Windows mit .NET. Mit den Komponenten Xamarin.iOS und
Xamarin.Android ist es möglich, native Apps für iOS, Android und Windows in C# entweder mit
Xamarin Studio oder Visual Studio zu entwickeln. [12]
12
Kapitel 2: Entwurfsphase
Das folgende Kapitel geht von der Frage aus, was das Ziel des Projekts ist und wie es erreicht
wird. Das letztendliche Ziel ist es, eine Applikation für Betriebssysteme Android zu entwerfen,
die die handgeschriebene Ziffer erkennen und in Echtzeit bearbeiten kann.
Um das letztendliche Ziel zu erreichen, sollte zunächst ein Convolutional Neural Netz erstellt und
trainiert werden und Zweitens soll die App für das Betriebssystem Android anhand von einem
JavaScript-Framework sogenannte React Native entwickelt werden. Schließlich sollten das CNN-
Modell und die App kombiniert werden.
13
2-2 Entwurf von Frontend
Wie kann eine Mobile App für das Betriebssystem Android entwickelt werden? Die vorliegende
Arbeit befasst sich außerdem mit einer Cross-Plattform App für das Betriebssystem Android. Hier
betrachtet man ein Cross Plattform App, die auf React Nativ eingesetzt ist. An dieser Stelle muss
man besonders betonen, dass OpenCV auf React Nativ nicht einsetzbar ist, obwohl React Native
ein JavaScript-Framework ist. React Native kann nicht alle Bibliotheken von JavaScript
verwenden, weil einige nur für Web-Anwendungen erstellt wurden. Aus diesem Grund wird eine
native OpenCV-Bibliothek erstellt.
Command Line Interface CLI ist ein Werkzeug, die zur Kommunikation mit dem Computer im
Einsatz kommt. React-Native verfügt über zwei CLIs mit Namen Expo-CLI und React Native-
CLI. Zur Entwicklung von React Native Apps bietet Expo-CLI, die hier eingesetzt wird, viele
vorteilhafte Einstellungen an wie z.B. die Änderungen in der Echtzeit gesehen werden. [14]
Hierbei wird Node.js verwendet. Node.js ist eine Open-Source-JavaScript Environment oder
Umgebung, damit JavaScript code ohne Browser ausgeführt werden können. [15]
Das trainierte CNN-Modell kann in React Nativ aufgerufen werden, wenn es in ein JSON-File
umgewandelt wird. Das JSON-File wird von der TensorFlow-Bibliothek durchgeführt.
Da React Native ein komponentenbasiertes (component-based) JS-Framework ist, wird eine
Komponente als DigitRecognationModule definiert, die in Java geschrieben ist. Diese
Komponente wird in React Native importiert.
14
Kapitel 3: Implementierungsphase – Backend
Hierbei wird erleuchtet, wie ein Deep Learning Modell beziehungsweise ein Convolutional
Neural Network (CNN) Modell zur Erkennung der hangeschrieben Zahlen in Python unter Einsatz
von der Keras-Deep-Learning-Bibliothek, TensorFlow und OpenCV erstellt und trainiert werden
kann.
Das Backend besteht aus vier Hauptmodule, die als DatasetLoader, RecognitionModel,
ImagePrediction und Main benannt werden.
15
Im nächsten Schritt muss der Datensatz so gestaltet werden, dass das Modell ihn verstehen kann.
Das bedeutet, dass der Datensatz analysiert, vorverarbeitet und modelliert werden muss.
Die Zahlenbilder sind Graustufenbilder mit Pixelwerten im Bereich von 0 bis 255. Außerdem
haben diese Bilder eine Dimension von (28 x 28). Die Dimension der Traindaten ist (28, 28,
60000), da es 60000 Trainsmuster mit jeweils (28 x 28) Dimensionen gibt. Dementsprechend
haben die Testdaten eine Form von (28, 28, 10000), da es 10000 Testproben gibt. Es gibt auch
insgesamt zehn Ausgabeklassen, die von 0 bis 9 sind. Daher können die Zifferbilder nicht direkt
in das Modell eingespeichert werden. Um die Bilder für neuronales Netzwerk vorbreiten zu
können, müssen jedes Bild (28 x 28) der Train- und Testdaten konvertiert werden. Also das CNN-
Modell erfordert eine weitere Dimension (28, 28, 1).
Wie schon erwähnt wurde, sind die Ausgabeklassen für neuronales Netzwerk numerische Ziffern
im Bereich von (0-9). Die Algorithmen für maschinelles Lernen können nicht direkt mit
nummerischen Nummern arbeiten. Um dieses Problem zu lösen, wird eine sogenannte Methode
‚One-Hot-Encoding‘ verwendet. Dabei werden die numerische Ziffer in einem Zeilenvektor
dargestellt. Es bedeutet, dass man eine boolesche Spalte für jede Ausgabeklasse bildet. Also eine
Tabelle mit 10 Spalten, da es 10 Ziffern gibt. Für jede Stichprobe (nummerische Ziffer) kann nur
eine dieser Spalten den Wert 1 annehmen und alle andere Spalten 0 sind. Zum Beispiel zeigt diese
Hot-Encoding-Vektor [0 0 0 1 0 0 0 0 0 0] eine Bezeichnung von 3. Man kann die numerische
Ziffer als One-Hot-Codierung mit Hilfe der Methode to_categorical() darstellen. [16]
3-1-5 Normalize
Zuerst wird eine Funktion namens normalized_pixels(train, test) definiert. Wie erwähnt, sind
die Zahlenbilder Graustufenbilder mit Pixelwerten im Bereich von 0 bis 255. Die Pixelwerte
müssen vom Int8- Datentyp zum Float32-Datentyp (floating point) gewechselt werden, um in der
gesamten Lösung eine einheitliche Darstellung zu haben. Dieses Ziel kann anhand von der
16
Funktion .astype() erreicht werden. Die Pixelwerte (floating point) müssen neu skaliert werden,
um die Recheneffizienz zu verbessern und die Standards einzuhalten. Hierbei müssen die
Pixelwerte (floating point) durch 255.0 geteilt werden, um die Werte im Bereich von 0 bis 1 zu
normalisieren.
Nachfolgend wird die Netzwerkarchitektur für ein CNN-Modell zusammengefasst. Hier wird eine
Funktion für das CNN-Modell mit den Begriffen wie Sequential, Convulation2D, Max-Pooling,
usw. definiert.
Als erstens wird die Funktion define_model() erstellt.
1- Sequential: In Keras kann man einfach Schichte (layer) stapeln, um die gewünschte
Schichte eine nach der anderen zu hinzufügen. Der in diesem Projekt verwendete
Klassifikator ist e in sequentielles Modell mit einem 32-layer-CNN.
2- Convolution2D: Das ist die erste verborgene Schicht. Hier wird ein Model mit 32
Schichten und einem Filter oder Kernel (3x3) erstellt. Die Activation-Funktion ist ReLU
und als Initializer wird he_uniform verwendet. Die Klasse HeUniform ist ein
Varianzskalierungsinitialisierer. HE-Initializer ist mit der ReLU-Aktivierungsfunktion in
Verwendung. Hier gibt sich nur ein Ausgangskanal (28x28) aus. [17]
17
3- Max-Pooling2D: Als nächstes definieren wir eine Pooling-layer, die MaxPooling2D
heißt. Es ist mit einer Poolgröße von 2×2 konfiguriert.
4- Genauigkeit: Das Netzwerk nimmt eine Eingabe und gibt die Wahrscheinlichkeit der
unterschiedlichen Klassen aus.
5- One-dimensional Array:
▫ Flatten: Zum Konvertieren eines mehrdimensionalen Arrays in ein eindimensionales
Array oder zum Erstellen eines eindimensionalen Arrays kommt die Methode Flatten zum
Einsatz. [18]
▫ Dense: In Dense Layer erhält jedes Neuron Input von allen Neuronen, die in der
vorherigen Schicht liegen. [19]
In den obigen Codes kommt als nächstes eine Schichte, die die 2D-Matrixdaten in einen Vektor
umwandelt. Als nächstes kommt eine vollständig verbundene Schicht mit 100 Neuronen und die
verwendete Aktivierungsfunktion ist Relu. Schließlich hat die Ausgabeschicht 10 Neuronen für
die 10 Klassen und eine Softmax-Aktivierungsfunktion, um wahrscheinlichkeitsähnliche
Vorhersagen für jede Klasse auszugeben.
6- Compile Modell: Keras stellt eine Methode zur Verfügung, um das Modell zu kompilieren
[20]. Die wichtigsten Argumente sind die folgenden:
▫ Optimierer: hier wird SGD mit momentum verwendet. SGD mit momentum ist eine
stochastische Optimierungsmethode, die dem regulären Stochastic Gradient Descent einen
Momentum-Term hinzufügt. Hierbei ist learning rate gleich 0.01. [20]
▫ Loss-Funktion: Sie wird verwendet, um den Fehler im Lernprozess zu finden. Keras
bietet eine Loss-Funktion im Loss-Modul wie categorical_crossentropy an. [20]
▫ Metrics: Es kommt zum Einsatz, um die Leistung des Modells zu bewerten. Keras lässt
Metrics als Modul wie accuracy nutzen. [20]
18
3-2-3 Erstellen des Modells
Hier wird eine Funktion Namens create_model definiert, damit das Modell erstellt werden kann.
Hier wurde eine Funktion zum Laden der Eingabefoto definiert, in der das Foto in graustufen
umgewandelt und die Farbe invertiert wird. Die Bildgrößen werden als (28 x 28) angepasst und
sie werden in Array umgewandelt. Das Bild wird in ein einziges Sample mit 1 Kanal umgeformt
und Pixeldata wird vorbreitet.
Um das Modell zu laden und das Label vorherzusagen, wird eine andere Funktion benannt als
predict_image_with_name definiert.
In diesem Modul werden die andere drei Hauptmodule DatasetLoader, RecognitionModel und
ImagePrediction aufgerufen und durchgeführt, um MNIST-Datenbank zu laden und zu trainieren,
CNN-Modell zu erstellen und die schriftliche Ziffer zu erkennen.
19
Das Netzwerk nimmt das Foto, was vorhersagen werden soll, als die Eingabe und kann die
Ausgabe drucken. Hier soll z. B. ein Foto Namens ‘6.png’ vorhergesagt werden und die erkannte
Ziffer wird bei ‘Predicted Number is: ’ gezeigt.
Hierbei wird ein CNN-Modell erstellt und trainiert, um schriftliche Ziffer erkennen zu können.
20
Kapitel 4: Implementierungsphase – Frontend
An dieser Stelle wird Frontend implementiert, um eine App für das Betriebssystem Android zu
entwickeln. Wie in dem ersten Kapital erwähnt wurde, kommt ein JavaScript-Framework namens
React Native zur Verwendung.
Die Applikation besteht aus den nachstehenden Teilen.
Zuerst werden aus der React Native-Bibliothek die Kernkomponenten aufgerufen, um die Struktur
der Applikation zu erstellen. Diese Komponenten werden in der gesamten App verwendet und
werden je nach Bedarf wie unten importiert.
1- Stylesheet: Das Stylesheet dient dem Styling. [21]
2- TouchableOpacity: In React Native wird TouchableOpacity verwendet, um eine
Komponente klickbar oder berührbar zu machen und eine Schaltfläche (Button) konstruiert
zu werden. [22]
3- TouchableHighlight: Diese Komponente ist eine Hülle (Wrapper), die dafür sorgt, dass
Views richtig auf Berührungen reagieren. Wenn es nach unten gedrückt wird, wird die
Opazität (opacity) von View verringert, wodurch der berührte Bereich des Bildschirms
angezeigt wird. [22]
4- Text: Text definiert den Titel der Schaltfläche (Button) und das Styling wird durch Stylesheet
vorgenommen. [21]
5- View: Views reagieren auf Berührungen. [21]
6- Dimension: Es ist die Standard-API, mit der die Breite und Höhe des Bildschirms oder des
App-Fensters berechnet wird. Dimensionen können sich ändern (z. B. aufgrund von
Gerätedrehungen). Es ist wichtig, die Bildschirmdimensionen mitberücksichtigt werden,
damit der Inhalt von der App richtig angepasst werden kann. [21]
21
4-1-2 Tensorflow.js
TensorFlow.js ist eine Bibliothek für maschinelles Lernen in JavaScript. tfjs-react-native bietet
einen TensorFlow.js Plattformadapter für React Native. Die Funktion BundleResourceIO ist im
Einsatz, um das Modell vom Dateisystem wie z. B. einem lokalen Mobilgerät zu laden. [23]
Der vorliegende Code wird nicht nur zum Trainieren, sondern auch zum Einsatz des Machine-
Learning-Modells genutzt.
Expo hat ein npm-Paket, das zum Verkleinern oder zum Komprimieren von Bildern Verwendung
finden kann. Innerhalb von expo gibt es einen expoimage-manipulator, den zum Komprimieren
der Bildgröße und auch für andere Manipulationen wie spiegeln, drehen, zuschneiden usw.
benutzt werden kann. Um Bilder zu manipulieren, wird das Paket expo-image-manipulator
verwendet. Das Paket exportiert eine sogenannte manipulateAsync Komponente, die überall im
Projekt platziert werden kann. expo-image-manipulator bietet eine API zum Ändern von Bildern,
die im lokalen Dateisystem gespeichert sind, an. [22]
Modul expo-camera wird importiert, damit der Benutzer auf die Gerätekamera zugreifen kann.
Expo-Camara kann den Benutzer diese Möglichkeit geben. Die bezeichnete Camera-
Komponente wird aus dem Modul expo-Camera exportiert.
Hierbei wenn ein Foto aus der Ferne aufgenommen wird, könnte es zu einem möglichen Fehler
führen. Da die Bilder von der MNIST-Datenbank klein (28 x 28) sind, dann gibt es zusätzliche
Pixel dabei. Um diese möglichen Fehler zu beheben, dann wird einen quadratischen Bereich in
der Kamera definiert, indem das Modell ein ideales Foto als Eingabe bekommen kann. [24]
Hierbei wird das Modul DigitRecognitionMoudle aus der nativen OpenCV-Bibliothek importiert.
22
Dieses Modul wird im Abschnitt 4-6-1 genauer beschreibt.
4-1-6 FileSystem
Expo-file-system ermöglicht den Zugriff auf ein Dateisystem, das lokal auf dem Gerät gespeichert
ist.
State ist eine Komponente und wird für die Daten verwendet, die sich ändern müssen. Das
bedeutet, dass der Zustand in Zukunft aktualisiert werden kann. Es wird folgende Variablen
definiert, die in der Backendphase erstellt werden wie Model, Predictions, Capturesnumber,
Calculatednumber und Operationscommand.
Es sollte auch nicht unerwähnt bleiben, dass mit Hilfe vom React Nativ-Framework die
Komponenten als Class definiert werden können.
23
Async/wait: async kann nur vor einer Funktion hier LoadModel platziert werden. Eine Funktion
gibt immer ein Versprechen (promise) zurück. Der await-Operator darf nur innerhalb eines
Async-Blocks verwendet werden. Der await-Operator wird verwendet, um JavaScript auf ein
Promise zu warten. Dabei ist zu beachten, dass es nur den Async-Funktionsblock warten lässt und
nicht die gesamte Programmausführung.
In dem letzten Schritt wird das Modell durch die Funktion tf.loadLayersModel geladen. In dieser
Phase wird die Camera Bibliothek durch Expo-Camera importiert, um Benutzer den Zugriff auf
die Kamera zu haben. Es gibt zwei Bedingungen:
▫ Wenn Benutzer einen Zugriff hat ("granted")
▫ Wenn es keinen Zugriff gibt ("Access denied")
Es dauert, bis der Benutzer den Zugriff auf die Kamera erlaubt, deswegen wird async/await
benutzt, um parallel die anderen Aufgaben wie takepicture, render usw. ausgeführt werden.
Erstens wird beim Druck auf die Taste ein Bild mittels des Befehls takePictureAsync()
aufgenommen. Zweitens wird die Größe des Bildes unter Einsatz vom Befehl manipulateAsync
auf (1000 x 1400) geändert. ManipulateAsync lässt zwei Argumente nutzen. Das erste Argument
ist der Pfad des Bilds (photo path) und das zweite Argument ist die Breite und die Höhe.
Nachdem Größenänderung des Bildes wird die Bilddatei in die Status Variable: CapturedPhoto
eingesetzt. Um das Bild aus dem lokalen Speicher zu lesen, kommt
FileSystem.readAsStringAsync zur Verwendung. Es wird als ein String- oder Array- Objekt mit
base64-encoding type gelesen.
In diesem Schritt ist es nötig, dass das Bild vom Base64-Format in JSON-Objekt umgewandelt
wird. Unter diesen Umständen wird OpenCV aufgerufen, damit das JSON-Objekt erstellt wird.
24
Das JSON-Object enthält ein Array mit den Pixelwerten. Wie schon erwähnt wurde, ist hier die
OpenCV-Bibliothek als eine Native Bibliothek geschrieben. Dafür wird eine sogenannte
DigitRecognationModule als ein natives Modul in Java definiert.
Hierbei werden der benötigten Module wie android, com.facebook.react, org.json sowie
org.opencv, java.io und java.util importiert. Um die Länge des Berichtes zu vermeiden, wurden
die entsprechenden Codes Fotos nicht hinzugefügt. Des Weiteren die native Modul-Java-Klasse
erweitert die Klasse ReactContextBaseJavaModule. Für Android werden native Java-Module
als Klassen geschrieben, die ReactContextBaseJavaModule erweitern und die von JavaScript
benötigten Funktionen implementieren. Schließlich wird ein Modul-Class mit Namen
DigitRecognationModule definiert. [11]
3- Der Name des Moduls: Um ein Name für nativen Java-Module in Android dargestellt wird,
kommt die Methode getName() zur Verwendung. Diese Methode gibt den Namen des Moduls
als String zurück. Im folgenden Code gibt getName() DigitRecognationModule zurück. Das
heißt, auf natives Modul kann dann in JavaScript über diesen Namen zugriffen werden. [11]
25
4- Exportieren einer nativen Methode nach JavaScript: Als Nächstes wird dem nativen
Modul eine Methode namens detectDigitRect hinzugefugt. Diese Methode kann in JavaScript
aufgerufen werden. Alle nativen Modulmethoden, die von JavaScript aufgerufen werden
sollen, müssen mit @ReactMethod kommentiert werden. Native Module unterstützen ein
Argument namens Callback, das benutzt wird, um Daten von Java an JavaScript für Methoden
zu übergeben. Mit dem Befahl OpenCVLoader.initDebug() wird geprüft, ob die OpenCv-
Bibliothek verfügbar ist oder nicht. Das Format vom Originalbild wird in ein anderes Format
als Base64 in Bitmap umgewandelt. Dann wird Bitmap in Grayscale umgewandelt. Nach der
Definition des Moduls DigitRecognationModule wird das Bild in eine OpenCV-Matrix
namens Mat umgewandelt. Zum Invertieren seiner Farbe kommt den Befahl InvertColor()
zum Einsatz. Der Befahl scaleBitmap() wird zur Änderung der Bildgröße auf die
Modellgröße (28 x28) verwendet. Das Bild muss in Pixelarray normalisiert und in JSON
konvertiert werden, um an React Native gesendet zu werden. [11]
26
eine beliebige Form oder Größe (Quadrat oder ein Kreis) haben kann. Dieses Kernel hat einen
Ankerpunkt, der sein Zentrum bezeichnet und wird über das Bild gelegt, um die maximalen
Pixelwerte zu berechnen. Nach der Berechnung wird das Bild durch den Ankerpunkt in der
Mitte ersetzt. Bei diesem Verfahren werden die Bereiche der hellen Regionen immer größer,
so dass die Bildgröße zunimmt. Z. B. nimmt die Größe eines Objekts in einem weißen oder
hellen Farbton zu, während die Größe eines Objekts in einem schwarzen oder dunklen Farbton
abnimmt. [11]
Im Projektverlauf wurde darauf geachtet, wenn das Eingabefoto eine dünne Ziffer darstellt, wird
keine richtige Vorhersage getroffen. Aus diesem Grund wird die Dilatation eines Bildes mit der
Methode dilate() der Klasse imgproc durchgeführt, um das Rauschen und Unvollkommenheiten
entfernt werden zu können, damit die Ziffer sich verdicken kann und sie wird richtig vorhersagt.
In diesem Schritt wird ein Pixel mit den Koordinaten X, Y ausgewählt. Die Eingabefotos gehören
zum RGB-Farbraum. Im vorliegenden Fall liegen die Pixelwerte von R, G und B gleich. Da das
Ziel ist, ein schwarzweißes Bild zu bekommen, dann die rote Farbe werden aus den Pixeln
erhalten und ihre Werte werden zwischen 0.01 und 1 eingesetzt.
Hierbei wird mit den Java-Codes DigitRecognationModule als ein natives Modul zum Bearbeiten
des Bilds erstellt.
27
diesem Prozess kann die Ziffer vorhergesagt werden. Für den Rendering-Teil bedient sich die
Methode renderPrediction.
Nach der Vorhersage der Ziffern muss Ziffern miteinander gerechnet werden, deswegen werden
die Ziffern, die schon erkennt geworden sind, in der Calcultationsfunktion eingesetzt, um
auszurechnen. Danach wird die erkannte Ziffer in Status-Variable eingesetzt und dem Benutzer
gezeigt.
Schließlich wird die App-Umgebung programmiert. Z. B. welche Farbe verwendet werden oder
wie die Taste aussehen sollen. Im Folgenden wird die Cods gezeigt. In der Abbildung-5 wird der
Zugriff der Kamera und das Design der Applikation dargestellt.
28
▫ Nummer 1: zeigt den quadratischen Bereich. Die Ziffer, die gescannt werden soll, muss
in diesem Bereich liegen.
▫ Nummer 2: enthält Rechnenmethode (+, -, *, /)
▫ Nummer 3: zeigt das letztendliche Ergebnis.
▫ Nummer 4: zeigt die vorhersagte Ziffer.
▫ Nummer 5: zeigt, welche Rechnenmethode ausgewählt wird, da die Farbe nicht mehr
weiß, sondern hellgrau ist.
▫ Nummer 6: ist die Taste, damit man Foto scannen kann.
29
Kapitel 5: Testphase
In diesem Schritt wurde die App auf verschiedene Android- Gräte und Versionen getestet.
Nachdem die App installiert wird und der Zugriff auf die Kamera zugelassen wird, kann der
Anwender schriftliche Ziffer scannen.
30
Zuerst wird die erkannte Ziffer gezeigt. Falls der Anwender eine rechnenmethode auswählt und
die nächste Ziffer scannt, gibt die App das Ergebnis aus
In den obigen Fotos wird diese Rechnung durchgeführt:
▫ 6*7 = 42
▫ 42- 5= 37
▫ 37+1=38
Bei der Testphase ist klar geworden, dass falls die App keine richtige Ziffer erkennen kann, dann
gibt einfach eine Randomziffer aus. In dem Foto wird erwartet, dass letztendlich Ergebnis 38
wäre, da 38 – 0 = 38. Während die App keine richtige Vorhersage getroffen hätte. Also statt die
Ziffer 0 wurde einen 9 erkannt. Es gibt verschiedene Gründe für diesen Fehler wie schwache
Datenverarbeitungsleistung des Geräts, schlechtes Licht, Aufnahmequalität des Fotos durch
Anwender (zu nah, zu weit oder Zittern der Hand). Es ist auch eine begrenzte Anzahl von
Testdaten (10000) Zur Verfügung, die einen Fehler zur Folge haben kann. Die App funktioniert
in vielen Fällen einwandfrei, da die App vor allem eine hohe Genauigkeit leisten kann
31
Zusammenfassung und Fazit
In diesem Bericht wird die Methode zum Aufbau tiefer Netzwerke für Bildverarbeitungszwecke
vorgestellt. Maschinelles Sehen oder "Computer Vision" ist ein aktives und sich entwickelndes
Feld im Bereich der künstlichen Intelligenz. Dieses Feld entwickelt sich mit großer
Geschwindigkeit und durch umfangreiche Forschung, die täglich veröffentlicht wird, und bietet
die Menschen ständig neue Möglichkeiten, die zuvor mit Computern und künstlicher Intelligenz
nicht möglich waren. Convolutional Neural Networks (CNN) sind heute die treibende Kraft hinter
jedem Fortschritt in der Computer-Vision-Forschung. Man sollte nur diese Faltungsobjekte in
verschiedenen Schichten zu stapeln und eine Art Pool zu verwenden und schließlich Softmax zu
benutzen, um Computer-Vision-Technologie zu erreichen.
Während die Nutzung von Mobiltelefonen zunimmt, haben sich viele Unternehmen der App-
Entwicklung zugewandt. In diesem Artikel wird kurz erklärt, was die Entwicklung mobiler Apps
ist, was die verschiedenen Methoden der Entwicklung mobiler Apps sind und schließlich, was der
Entwicklungsprozess umfasst. Um mobile Anwendungen zu entwickeln, die den Benutzern gut
gefallen, ist es sehr wichtig, die Entwicklungsmethoden zu kennen und über ausreichende
Kenntnisse zu verfügen, um die beste Methode und das am besten geeigneten Tool für die
Erstellung der Anwendung auszuwählen.
32
Referenzen
[7] 07. [Online]. Available: Conv2d: Finally Understand What Happens in the Forward Pass | by ⭐Axel
Thevenot | Towards Data Science.
[8] T. Rashid und F. Langenau, Neuronale Netze selbst programmieren: ein verständlicher Einstieg mit
Python, Heidelberg: O'Reilly Verlag, 2017.
[16] 16. [Online]. Available: ML | One Hot Encoding to treat Categorical data parameters - GeeksforGeeks.
[18] 18. [Online]. Available: Keras Flatten | What is keras flatten? | How to use keras flatten? (educba.com).
33
34