bachelorarbeit magic mushroom app - ntb.ch · der ntb hochladen, damit die neuronalen netze zu...

110
BACHELORARBEIT MAGIC MUSHROOM APP Mit Deep Learning essbare Pilze erkennen Autoren: Riccardo Jung Dominik Wagner [email protected] [email protected] Referenten: Prof. Dr. Christoph Würsch Prof. Dr. Klaus Frick [email protected] [email protected]

Upload: vanxuyen

Post on 02-Jun-2019

219 views

Category:

Documents


0 download

TRANSCRIPT

BACHELORARBEIT MAGIC MUSHROOM APP Mit Deep Learning essbare Pilze erkennen

Autoren:

Riccardo Jung Dominik Wagner

[email protected] [email protected]

Referenten:

Prof. Dr. Christoph Würsch Prof. Dr. Klaus Frick

[email protected] [email protected]

I / II Abstract

06.08.2018 Riccardo Jung, Dominik Wagner I

I Abstract DE

Die Klassifizierung verschiedener Pilzarten ist für Laien extrem schwierig. Die bis anhin zur Verfügung stehenden

Hilfsmittel, wie zum Beispiel Pilzbücher, sind für Laien als Entscheidungshilfen nur bedingt geeignet. Viele

Merkmale sind nur von Experten sicher zu bestimmen. Das Ziel dieser Bachelorarbeit ist die Entwicklung und die

Machbarkeitsabklärung einer App, mit der auch Laien Pilze klassifizieren können. Die Nutzer1 der App sollen

dafür lediglich ein oder mehrere Bilder des gefundenen Pilzes machen und Angaben über die Grösse des Pilzes

zur Verfügung stellen. Die Klassifizierung erfolgt durch ein tiefes neuronales Faltungsnetz (CNN).

Als Erstes wurde eine Datenbank mit ca. 35’000 Bildern von 15 Pilzarten erstellt. Diese Daten dienen sowohl als

Trainings als auch als Validierungsdaten. Über eine Gitter-Suche (grid search) wurde die optimale Architektur des

CNN bestimmt. Erreicht wird auf den Testdaten der Lamellenpilze eine Trefferquote von 85.2 % und bei den

Röhrlingen eine von 75.0 %. Die App steht als Webapplikation unter magic.ntb.ch für alle Anwender offen zur

Verfügung, mit dem Ziel, die App durch Inputs aus der Community zu verbessern.

II Abstract EN

The classification of different types of mushrooms is extremely difficult for non-professionals. The available tools,

such as mushroom books, are only conditionally suitable as decision aids for non-professionals. Experts can only

determine many features reliably. The aim of this bachelor thesis is to develop and check the feasibility of an

application that allows non-professionals to classify mushrooms. The users of the application shall only take one

or more photos of the mushroom and enter the size of the mushroom. The application will then classify the

mushroom by using a proven deep neural network.

First, a database with approximately 35’000 images of 15 different mushrooms was created. This data is used as

both training and validation data. A grid search was used to determine the optimal architecture of the CNN. A hit

rate of 85.2 % is achieved on the test data of the lamellar mushrooms and 75.0 % for the boletuses. The app is

available to all users as a web application at magic.ntb.ch with the aim of improving the app through inputs from

the community.

1 In der folgenden Arbeit wird aus Gründen der besseren Lesbarkeit ausschliesslich die männliche Form verwendet. Sie bezieht sich auf Personen beiderlei Geschlechts.

III Zusammenfassung

06.08.2018 Riccardo Jung, Dominik Wagner II

III Zusammenfassung

Das Ziel dieser Bachelorarbeit bestand in der Entwicklung einer Applikation, mit welcher Pilze anhand von Bildern

klassifiziert werden können. Mit dieser Entwicklung soll die Machbarkeit einer solchen App geklärt werden. Die

Klassifizierung war mithilfe von neuronalen Netzen durchzuführen. Zudem sollte eine grafische Benutzer-

oberfläche programmiert werden, die einfach und intuitiv zu bedienen ist.

Um solche neuronalen Netze trainieren zu können, mussten sowohl hardware- als auch softwaretechnische

Vorkehrungen getroffen werden. Zu Beginn wurde eine Workstation der NTB mit einer NVIDIA GTX 1080 Ti

Grafikkarte ausgerüstet und alle benötigten Programme und Bibliotheken installiert. Zudem erhielten wir einen

Zugriff auf eine NVIDIA Tesla V100 Grafikkarte der Hochschule für Technik Rapperswil (HSR), um die neuronalen

Netze zu trainieren. Einen Überblick der verwendeten Software und einen Vergleich der verschiedenen

Grafikkarten sind in den Kapiteln 2 und 3 dokumentiert.

Die Basis für das Training der neuronalen Netze waren die Trainingsbilder. Es wurden tausende Bilder von

verschiedenen Pilzen aus dem Internet heruntergeladen und standardisiert. Das bedeutet, dass in jedem Bild

mithilfe eines bereits trainierten neuronalen Netzes die Pilze lokalisiert wurden. Anschliessend wurden diese

Bilder zentriert, zugeschnitten und auf eine einheitliche Grösse von 256x256 Pixel gebracht. Damit die Anzahl an

Bildern möglichst gross ist, wurden anschliessend alle Bilder vervielfacht. Dies gelang durch das Spiegeln, Drehen

und durch die Anpassung des Gammawertes jedes einzelnen Bildes. Die gesamte Anzahl an Bildern stieg damit

auf ca. 35’000 Stück. Alle durchgeführten Arbeiten bis zur fertigen Pilzdatenbank sind im Kapitel 4 dieser Arbeit

dokumentiert.

Nachdem die Trainingsdaten vorbereitet waren, konnten erste Versuche mit tiefen neuronalen Faltungs-

netzwerken (CNNs) gestartet werden. Da keine Vorkenntnisse vorhanden waren, mussten wir uns zuerst in die

Theorie der neuronalen Netze einarbeiten. Eine Zusammenfassung der Theorie und die ersten Testergebnisse

sind dem Kapitel 5 zu entnehmen. Nach den ersten Versuchen mit fünf Pilzarten wurde das Training auf 15

Pilzarten ausgeweitet. Da die Ergebnisse nicht zufriedenstellend waren, wurden die 15 Pilzarten in Röhrlinge und

Lamellenpilze unterteilt. Zusätzlich wurden dem neuronalen Netz neben den Bildern auch Informationen über

die Grösse des Pilzes zur Verfügung gestellt.

Als die grundlegenden Funktionen der Software programmiert waren, wurde die optimale Architektur und die

optimalen Hyperparameter des CNN mit einer Gittersuche bestimmt. Damit die Ergebnisse bestmöglich

verglichen werden konnten, wurden bei jedem Test Logdateien erstellt, die anschliessend ausgewertet werden

konnten. Alle Testreihen und die dazugehörigen Resultate sind ebenfalls im Kapitel 5 dokumentiert.

Zum Schluss wurde eine Webapplikation entwickelt, welche sowohl von einem Computer, als auch von einem

Mobilgerät aus verwendet werden kann. Dazu ist weder eine Installation, noch ein bestimmtes Betriebssystem

vorausgesetzt. Der Benutzer hat damit die Möglichkeit, direkt ein oder mehrere Bilder mit seinem Mobilgerät

aufzunehmen oder Bilder aus seinem Verzeichnis auszuwählen, um diese anschliessend klassifizieren zu lassen.

Die Webapplikation zeigt daraufhin das Resultat inklusive eines Beispielbildes und einigen allgemeinen

Informationen zum klassifizierten Pilz. Zudem können die Benutzer auch eigene Bilder von Pilzen auf einen Server

der NTB hochladen, damit die neuronalen Netze zu einem späteren Zeitpunkt erweitert werden können. Alle

Funktionen und das Design der Webapplikation sind im Kapitel 6 ausführlich beschrieben und visualisiert.

Inhaltsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner

Inhaltsverzeichnis

I Abstract DE ............................................................................................................................................................. I

II Abstract EN ............................................................................................................................................................ I

III Zusammenfassung .............................................................................................................................................. II

1 Motivation und Ziel ......................................................................................................................................... 1

1.1 Ziel ........................................................................................................................................................... 1

1.2 Vision ....................................................................................................................................................... 1

2 Software .......................................................................................................................................................... 2

2.1 Anaconda ................................................................................................................................................ 2

2.2 PyCharm .................................................................................................................................................. 2

2.3 OpenCV ................................................................................................................................................... 2

2.4 TensorFlow .............................................................................................................................................. 3

2.5 TensorBoard ............................................................................................................................................ 3

3 Hardware......................................................................................................................................................... 4

3.1 NVIDIA GeForce GTX 645 ........................................................................................................................ 4

3.2 NVIDIA GeForce GTX 1080 Ti ................................................................................................................... 4

3.3 NVIDIA Tesla V100 ................................................................................................................................... 4

3.4 Vergleich der Grafikkarten ...................................................................................................................... 5

4 Bildvorverarbeitung ........................................................................................................................................ 6

4.1 Rückblick Fachmodul ............................................................................................................................... 6

4.2 Kreuzkorrelation komplett ...................................................................................................................... 7

4.3 Kreuzkorrelation zeilenweise .................................................................................................................. 8

4.4 Vorverarbeitete Bilder............................................................................................................................. 9

5 Neuronales Netz ............................................................................................................................................ 12

5.1 Theorie Convolutional Neural Network (CNNs) ..................................................................................... 12

5.1.1 Convolutional Neural Networks Einführung .................................................................................. 12

5.1.2 Biologische Inspiration .................................................................................................................. 12

5.1.3 Convolutional Neural Network Architektur und Schichten ........................................................... 13

5.1.4 Optimizer ....................................................................................................................................... 17

5.1.5 Overfitting vermeiden ................................................................................................................... 17

5.2 Erstes Netzwerk..................................................................................................................................... 18

5.2.1 Resultate erster Tests .................................................................................................................... 19

5.3 Training mit 15 Pilzarten ....................................................................................................................... 20

5.3.1 Ergebnis ......................................................................................................................................... 20

5.3.2 Diskussion ...................................................................................................................................... 21

5.3.3 Fazit ............................................................................................................................................... 21

Inhaltsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner

5.4 Training mit zusätzlichen Features ........................................................................................................ 22

5.4.1 Ergebnis ......................................................................................................................................... 22

5.4.2 Diskussion ...................................................................................................................................... 23

5.4.3 Fazit ............................................................................................................................................... 23

5.5 Einleitung Testreihen ............................................................................................................................ 24

5.6 Lamellenpilze Testreihe 1 ...................................................................................................................... 26

5.6.1 Konfiguration ................................................................................................................................. 26

5.6.2 Ergebnis ......................................................................................................................................... 26

5.6.3 Diskussion ...................................................................................................................................... 28

5.6.4 Fazit ............................................................................................................................................... 28

5.7 Lamellenpilz Testreihe 2 ........................................................................................................................ 29

5.7.1 Konfiguration ................................................................................................................................. 29

5.7.2 Ergebnis ......................................................................................................................................... 29

5.7.3 Diskussion ...................................................................................................................................... 30

5.7.4 Fazit ............................................................................................................................................... 32

5.8 Lamellenpilze Testreihe 3 ...................................................................................................................... 33

5.8.1 Konfiguration ................................................................................................................................. 33

5.8.2 Ergebnis ......................................................................................................................................... 33

5.8.3 Diskussion ...................................................................................................................................... 34

5.8.4 Fazit ............................................................................................................................................... 35

5.9 Fazit Testreihen Lamellenpilze .............................................................................................................. 36

5.10 Röhrlinge Testreihe 1 ............................................................................................................................ 38

5.10.1 Konfiguration ................................................................................................................................. 38

5.10.2 Ergebnis ......................................................................................................................................... 38

5.10.3 Diskussion ...................................................................................................................................... 39

5.10.4 Fazit ............................................................................................................................................... 40

5.11 Röhrlinge Testreihe 2 ............................................................................................................................ 41

5.11.1 Konfiguration ................................................................................................................................. 41

5.11.2 Ergebnis ......................................................................................................................................... 41

5.11.3 Diskussion ...................................................................................................................................... 42

5.11.4 Fazit ............................................................................................................................................... 43

5.12 Röhrlinge Testreihe 3 ............................................................................................................................ 44

5.12.1 Konfiguration ................................................................................................................................. 44

5.12.2 Ergebnis ......................................................................................................................................... 44

5.12.3 Diskussion ...................................................................................................................................... 45

5.12.4 Fazit ............................................................................................................................................... 46

5.13 Fazit Testreihen Röhrlinge ..................................................................................................................... 47

Inhaltsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner

6 Webapplikation ............................................................................................................................................. 49

6.1 Pilz klassifizieren .................................................................................................................................... 50

6.2 Pilz Upload ............................................................................................................................................. 52

6.2.1 Sicherheit ...................................................................................................................................... 53

6.3 About ..................................................................................................................................................... 53

7 Schlussfolgerung ........................................................................................................................................... 54

8 Ausblick ......................................................................................................................................................... 55

9 Danksagung ................................................................................................................................................... 56

10 Eigenständigkeitserklärung ........................................................................................................................... 57

11 Abbildungsverzeichnis ................................................................................................................................... 58

12 Tabellenverzeichnis ....................................................................................................................................... 62

13 Literaturangaben ........................................................................................................................................... 63

14 Anhang .......................................................................................................................................................... 67

14.1 Anleitung: Einrichten der Workstation ................................................................................................. 67

14.2 Anleitung: Erweiterung der Applikation ................................................................................................ 68

14.2.1 Anleitung Bildvorverarbeitung ...................................................................................................... 68

14.2.2 Anleitung Training neuronales Netz .............................................................................................. 69

14.2.3 Anleitung Anpassung Webapplikation .......................................................................................... 71

14.3 Python Skripts ....................................................................................................................................... 72

14.3.1 Vorverarbeitung (Mushroom_Finder.py) ...................................................................................... 72

14.3.2 Training neuronales Netz (Mushroom_Classifier.py) .................................................................... 76

14.3.3 Datensatz vorbereiten (dataset.py) .............................................................................................. 80

14.3.4 Schichten für neuronales Netz (layer.py) ...................................................................................... 82

14.3.5 Logdateien (log.py) ........................................................................................................................ 83

14.3.6 Zusätzliche Features (MushroomFeatures_JSON.py).................................................................... 84

14.4 JSON File (MushroomFeatures.json) ..................................................................................................... 85

14.5 Testergebnisse Grid-Tests ..................................................................................................................... 87

1 Motivation und Ziel 1.1 Ziel

06.08.2018 Riccardo Jung, Dominik Wagner 1

1 Motivation und Ziel

Essbare von nicht essbaren Pilzen zu unterscheiden ist eine äusserst komplexe Disziplin, welche meist nur durch

fachliche geschulte Experten der Pilzkontrollstellen beherrscht wird. Für einen Laien ist die Bestimmung der Pilze

mittels Pilzbestimmungsbücher extrem schwierig. Hinzu kommt die Restunsicherheit, da viele Pilze einen

sogenannten Doppelgänger besitzen, welcher ungeniessbar oder gar giftig ist. Es fehlt schlicht die langjährige

Erfahrung in dieser Disziplin.

Genau dieses Problem stellt die Motivation dieser Arbeit dar. Die mangelnde Erfahrung eines Laien in der

Pilzbestimmung soll mit möglichst einfachen Mitteln abgedeckt werden, damit die Restunsicherheit möglichst

gering ist. Die jahrelange Erfahrung der Pilzexperten soll mittels künstlicher Intelligenz nachgebildet werden.

Dazu wird ein neuronales Netz mit tausenden Pilzbildern trainiert.

Doch wie kommt nun ein Laie an diese Informationen? Im Zeitalter der Digitalisierung trägt beinahe jeder ein

Smartphone mit sich herum. Daher ist es naheliegend, dass bei der Pilzbestimmung genau dieses Mittel genutzt

wird. Für den Benutzer soll es anhand von einem Bild und einfach erkennbaren Merkmalen möglich sein, den

gefundenen Pilz zu bestimmen. Damit könnte die Restunsicherheit wesentlich minimiert werden.

1.1 Ziel

Ziel dieser Bachelorarbeit ist die Entwicklung und das Trainieren eines convolutional neural networks (CNN) zur

Bestimmung von heimischen Pilzen (Schweiz, Österreich und Deutschland). Dabei sollen je zwei Bilder plus einige

wenige einfach bestimmbare Merkmale als Inputvektor für das convolutional neural network dienen. Die

Bachelorarbeit beinhaltet folgende Aufgaben:

Einarbeiten in die Theorie der neuronalen Netzwerke (Fachmodul)

Erste Schritte mit Python, ScikitLearn und TensorFlow (Fachmodul)

Bereitstellen einer Bilddatenbank für das Training der neuronalen Netze

Trainieren des convolutional neural network mit TensorFlow

Bestimmung der Klassifikationsfehlerraten

Erstellen einer Webapplikation [1]

1.2 Vision

Für Pilzsuchende soll eine einfach bedienbare Webapplikation entwickelt werden, mit der eine Pilzbestimmung

möglichst einfach durchgeführt werden kann. Diese App könnte zu einem grossen Erfolg werden.

Damit die Applikation wachsen und die Klassifizierung der Pilze immer genauer werden kann, wird die Mithilfe

der Community ein richtungsweisender Faktor sein. Aus diesem Grund soll die Applikation einfach erweiterbar

sein. So soll es möglich sein, immer mehr Pilzarten dem neuronalen Netz hinzuzufügen und damit den Benutzern

eine breitere Produktpalette zur Verfügung zu stellen. Mit der Hilfe der Benutzer könnte die Applikation gar einen

weltweiten Erfolg feiern, da dies die erste Applikation auf dem Markt ist, welche Pilze mittels Fotoaufnahmen

klassifizieren kann.

2 Software 2.1 Anaconda

06.08.2018 Riccardo Jung, Dominik Wagner 2

2 Software

Auf den folgenden beiden Seiten werden alle nötigen Tools und Bibliotheken kurz erklärt. Alle von uns

verwendeten Tools sind kostenlos und können jederzeit im Internet heruntergeladen werden.

2.1 Anaconda

Die Anaconda Distribution ist eine Open Source Software für die

Programmiersprachen Python und R. Sie beinhaltet unter anderem die

Entwicklungsumgebung Spyder, den Kommandozeileninterpreter IPython und

weitere Tools für die Programmierung mit Python. [2]

Abbildung 1 Logo Anaconda [3]

Für die Programmierung mit Python wurde Spyder verwendet, welches in der Anaconda Distribution enthalten

ist. Weitere Bibliotheken wie OpenCV und CUDA konnten einfach über die Kommandozeile installiert werden.

Da die Arbeit mit Anaconda und Spyder während der Bachelorarbeit allerdings dauernd zu unerklärlichen

Problemen führte, wurde als Alternative PyCharm verwendet.

2.2 PyCharm

PyCharm ist eine integrierte Entwicklungsumgebung (IDE) für die Programmiersprache

Python, die von JetBrains entwickelt wurde. Mithilfe von PyCharm konnten

Softwarebibliotheken wie zum Beispiel OpenCV oder TensorFlow leicht importiert und

verwendet werden. PyCharm bietet zudem nützliche Funktionen wie zum Beispiel eine

intelligente Code-Vervollständigung, Code-Inspektionen oder umfassende Naviga-

tionsfunktionen. [4]

Abbildung 2 Logo PyCharm [5]

2.3 OpenCV

OpenCV, oder auch Open Source Computer Vision Library, ist wie der Name schon

vorwegnimmt, eine Open Source Computer Vision und Machine Learning Bibliothek.

OpenCV kann sowohl für kommerzielle, wie auch für nicht kommerzielle Anwendungen

verwendet werden, da sie als sogenannte BSD – Lizenz kopiert, verändert und verbreitet

werden darf. Einzig die Urheberrechte (Copyright) müssen deklariert werden.

Abbildung 3 Logo OpenCV [6]

Die Bibliothek beinhaltet mehr als 2500 optimierte Algorithmen, welche im Feld der Computer Vision und

Machine Learning Verwendung finden. Darunter sind beispielsweise Algorithmen für die Objekterkennung,

Klassifizierung von Personen in Videos, aber auch klassische Bildverarbeitungsalgorithmen, wie zum Beispiel das

Entfernen von roten Augen in Bildern.

OpenCV unterstützt sowohl Windows, Linux, wie auch Mac OS und hat Interfaces für die Programmiersprachen

C++, C, Java, Python und MATLAB. [7]

2 Software 2.4 TensorFlow

06.08.2018 Riccardo Jung, Dominik Wagner 3

2.4 TensorFlow

TensorFlow ist eine Open Source Softwarebibliothek, die ursprünglich von

Forschern und Ingenieuren des Brain-Teams in der KI-Organisation von Google

entwickelt wurde. Die Softwarebibliothek bietet eine Vielzahl von

Möglichkeiten für maschinelles Lernen. [8]

Abbildung 4 Logo Tensorflow [9]

Durch die flexible Architektur können Berechnungen einfach auf verschiedenen Plattformen implementiert

werden. Unsere Berechnungen wurden mithilfe einer Grafikkarte, oder auch GPU (Graphics Processing Unit)

genannt, durchgeführt.

2.5 TensorBoard

Um die neuronalen Netze, welche mittels TensorFlow erzeugt

wurden, zu visualisieren, gibt es ein Visualisierungstool namens

TensorBoard. Mithilfe dieses Tools können verschiedene

neuronale Netze einfach verglichen und gezielt optimiert

werden. In der Abbildung 5 sieht man beispielsweise die

Ergebnisse zweier verschiedenen neuronalen Netze. Zudem

kann auch die Architektur des neuronalen Netzes einfach

dargestellt werden. Diese werden im weiteren Verlauf des

Dokuments aufgezeigt. [10]

Abbildung 5 TensorBoard – Dargestellt ist ein Beispiel

für die Visualisierung der validation accuracy und des

validation loss von zwei neuronalen Netzen in

TensorBoard.

3 Hardware 3.1 NVIDIA GeForce GTX 645

06.08.2018 Riccardo Jung, Dominik Wagner 4

3 Hardware

Für die Entwicklung von neuronalen Netzen wird eine grosse Rechenleistung beansprucht. Damit diese Leistung

erbracht werden kann, wird meist auf Grafikprozessoren (GPU) gerechnet. Der grosse Vorteil der GPU ist die

grosse Anzahl an verbauten Kernen, welche parallele Berechnungen erlauben.

Mit der Hilfe des CUDA-Treibers konnten die bereits verbauten Grafikprozessoren der NTB-Rechner verwendet

werden. Dadurch wird der Vorteil genutzt, dass Programmteile, wie bei uns die Berechnung des neuronalen

Netzes, durch die signifikant schnellere GPU abgearbeitet werden, anstatt wie herkömmlich mit dem normalen

Prozessor (CPU). Zur Übersicht wird die verwendete Hardware kurz vorgestellt und verglichen.

3.1 NVIDIA GeForce GTX 645

In den bereitgestellten Rechnern der NTB waren Grafikprozessoren der Marke NVIDIA vom Typ NVIDIA GeForce

GTX 645 verbaut, welche CUDA unterstützen. Daher konnten diese für erste Tests verwendet werden.

Da diese Grafikkarte jedoch schon seit dem Jahre 2013 auf dem

Markt ist, kann sie bezüglich Leistung nicht mehr mit den neueren

Grafikkarten konkurrenzieren. Deswegen wurde für die weitere

Berechnung der neuronalen Netze eine neue Grafikkarte

angeschafft. Auch diese möchte kurz vorgestellt werden. [11]

Abbildung 6 NVIDIA GeForce GTX 645 [12]

3.2 NVIDIA GeForce GTX 1080 Ti

Die GeForce GTX 1080 Ti aus dem Hause NVIDIA ist das

momentane Flaggschiff (Stand April 2018) unter den NVIDIA-

Gaming-Grafikkarten. Verbaut in ein Asus Gehäuse bietet diese

Grafikkarte ein extrem leistungsstarkes Paket, welches ein

schnelleres Training der neuronalen Netze garantiert. [13]

Diese Grafikkarte wurde in die bereits bestehende Workstation

des Institutes ICE (Institut für Computational Engineering)

eingebaut.

Abbildung 7 NVIDIA GeForce GTX 1080 Ti [14]

3.3 NVIDIA Tesla V100

Eine noch stärkere Grafikkarte steht uns am GPU Cluster der

Partnerhochschule HSR (Hochschule für Technik Rapperswil) zur

Verfügung. Die NVIDIA Tesla V100 ist der bislang fortschrittlichste

KI-Grafikprozessor auf dem Markt und speziell für die Entwicklung

von neuronalen Netzen ausgelegt. [15]

Ein kurzer Vergleich der drei verwendeten Grafikkarten soll

Aufschluss über die Leistungsunterschiede geben.

Abbildung 8 NVIDIA Tesla V100 [16]

3 Hardware 3.4 Vergleich der Grafikkarten

06.08.2018 Riccardo Jung, Dominik Wagner 5

3.4 Vergleich der Grafikkarten

Zur Veranschaulichung der Unterschiede werden in Tabelle 1 die signifikantesten Punkte aufgelistet.

NVIDIA GeForce GTX 645 NVIDIA GeForce GTX 1080 Ti NVIDIA Tesla V100

Prozessortaktung 823 MHz 1569 MHz 1455 MHz

Speicherkapazität 1 GB 11 GB 16 GB

CUDA

Recheneinheiten

576 3584 5120

Leistungsaufnahme 130 W 250 W 300 W

Tabelle 1 Vergleich Grafikkarten [15, 17, 18]

Wie in der Tabelle 1 ersichtlich, ist die GeForce GTX 1080 Ti um einiges besser bestückt als die GeForce GTX 645.

Dies macht sich in der Rechenleistung klar bemerkbar. Laut Datenblatt ist die neue GTX 1080 Ti rund zwölfmal

schneller als die etwas ältere Grafikkarte vom Typ GeForce GTX 645.

Mit der NVIDIA Tesla V100 haben wir die momentan beste Grafikkarte für das Trainieren von neuronalen Netzen

aus dem Hause NVIDIA zur Verfügung. Mit 5120 CUDA Recheneinheiten ist sie nochmals rund 50 % stärker

bestückt als die High-End-Gaming-Grafikkarte. [15]

Damit man einen guten Überblick über die Performance der drei Grafikkarten bekommt, werden diese über

einen Benchmark-Test verglichen. Als Test wurde ein neuronales Netz auf allen GPU’s trainiert und die benötigte

Rechenzeit verglichen. Dieser Vorgang wurde dreimal wiederholt, damit sich kurzfristige Seiteneffekte nicht auf

das Testresultat auswirken.

Im Benchmark-Test wurde dasselbe Python Skript wie für den Grid-Test verwendet, jedoch wurde nur ein Netz

mit 128x128 Pixel grossen Bildern und vier convolutional layer über 100 Epochen trainiert. Der grosse

Unterschied zu den Grid-Tests ist, dass nur mit einer Batchgrösse von 32 Bildern pro Batch gearbeitet werden

konnte, da die Ressourcen in der NVIDIA GeForce GTX 645 mit einem Speicher von 1GB sehr begrenzt sind. In

Tabelle 2 sind die Resultate des Benchmark-Tests ersichtlich.

NVIDIA GeForce GTX 645 NVIDIA GeForce GTX 1080 Ti NVIDIA Tesla V100

Benötigte Rechenzeit

Test 1

2h 40 min 25 s 16 min 56 s 16 min 18 s

Benötigte Rechenzeit

Test 2

2h 40 min 1 s 16 min 54 s 16 min 19 s

Benötigte Rechenzeit

Test 3

2h 40 min 15 s 16 min 55 s 16 min16 s

Durchschnittliche

Rechenzeit

2h 40min 14 s 16 min 55 s 16 min 18 s

Tabelle 2 Benchmark-Test

Anhand des Tests wird die enorme Performance der neuen Grafikkarten ersichtlich. Diese konnten wir uns beim

Berechnen der neuronalen Netze zu Nutze machen, da diese Berechnungen extrem zeitintensiv sind. Der kleine

Unterschied der NVIDIA GeForce GTX 1080 Ti und der NVIDIA Tesla V100 ist auf die kleine Batchgrösse

zurückzuführen. Dadurch kann nicht die volle Performance der NVIDIA Tesla V100 ausgenutzt werden.

4 Bildvorverarbeitung 4.1 Rückblick Fachmodul

06.08.2018 Riccardo Jung, Dominik Wagner 6

4 Bildvorverarbeitung

4.1 Rückblick Fachmodul

Um die neuronalen Netze trainieren zu können, müssen möglichst viele

Trainingsdaten zur Verfügung gestellt werden. Dafür wurde als Vorbereitung

für die Bachelorarbeit im Fachmodul bereits ein neuronales Netz trainiert,

welches einen Pilz innerhalb eines Bildes lokalisiert. Mit dieser Information

konnte das Bild anschliessend zugeschnitten werden, damit zum Beispiel Laub,

wie in der Abbildung 9 zu sehen, das Training des neuronalen Netzes nicht

unnötig erschwert oder sogar unmöglich macht.

Abbildung 9 Pilz lokalisieren – Das blaue

Rechteck um den Pilz herum zeigt, wo

der Pilz lokalisiert wurde.[19]

Danach wurden die Pilze innerhalb des Ausschnitts zentriert. Dies erfolgte durch das Aufsummieren der

Grauwerte in der unteren Hälfte des Bildes. Das Ziel dabei war, die Position des Stiels zu bestimmen. Dafür wurde

das Maximum innerhalb des Diagramms, welches in der Abbildung 10 auf der rechten Seite ersichtlich ist, gesucht

und so das neue Zentrum des Bildes definiert.

Abbildung 10 Pilz zentrieren – Die blaue Linie zeigt, wo das Zentrum des Pilzes durch das Aufsummieren aller Grauwerte in der unteren

Hälfte des Bildes bestimmt wurde. [20]

Da allerdings nicht alle Pilze ausreichend im Bild zentriert waren, konnte es vorkommen, dass einige Pilze am

Rand abgeschnitten wurden, sobald sie gedreht wurden. Darum wurde im Rahmen der Bachelorarbeit versucht,

eine Zentrierung mittels Kreuzkorrelation durchzuführen, welche im Kapitel 4.2 und 4.3 dokumentiert ist.

Die zugeschnittenen Bilder wurden anschliessend vervielfacht, um den Datensatz künstlich zu vergrössern. Dafür

wurde das Originalbild gespiegelt, gedreht und der Gamma Wert angepasst. Zudem wurden die Bilder auf eine

einheitliche Grösse von 256x256 Pixel zugeschnitten. Mithilfe dieser Massnahmen konnten aus einem Bild 12

Trainingsbilder erzeugt werden. In der Abbildung 11 ist ein Beispiel mit einem Sommersteinpilz ersichtlich.

Abbildung 11 Bilder vervielfachen – Dargestellt sind alle Varianten der Vervielfachung der Pilzbilder. [21]

4 Bildvorverarbeitung 4.2 Kreuzkorrelation komplett

06.08.2018 Riccardo Jung, Dominik Wagner 7

4.2 Kreuzkorrelation komplett

Wie bereits erwähnt, war die Zentrierung der Pilze innerhalb des Bildes bis anhin nicht immer optimal. Deshalb

wurde mittels Kreuzkorrelation versucht, die Pilze besser zu zentrieren. Dafür wurde der lokalisierte Pilz grob

zugeschnitten und an der Y-Achse gespiegelt. Dieses Bild wurde dann Pixel für Pixel entlang der X-Achse über das

Originalbild gelegt und die maximale Übereinstimmung bestimmt.

In der Abbildung 12 kann das Referenzbild über ca. 200 Pixel entlang der X-Achse geschoben werden. Als

Referenzpunkt wurde der linke Rand des Bildes verwendet, welcher dann für die Diagramme auf der rechten

Seite der Abbildungen verwendet wurde. Anhand dieses Punktes wurde der neue Ausschnitt berechnet und hier

mittels einem weissen Rahmen visualisiert. In der Abbildung 12 war die Korrelation am höchsten, als der linke

Rand des Referenzbildes ca. bei Pixel 45 auf der X-Achse war. Ein weiteres Beispiel ist in der Abbildung 13

dargestellt.

Abbildung 12 Kreuzkorrelation komplett – Der weisse Rahmen innerhalb des Bildes zeigt, wo die Korrelation zum Referenzbild am

höchsten war. Die Grafik rechts zeigt die Korrelation entlang der X-Achse. [22]

Abbildung 13 Kreuzkorrelation komplett – Der weisse Rahmen innerhalb des Bildes zeigt, wo die Korrelation zum Referenzbild am

höchsten war. Die Grafik rechts zeigt die Korrelation entlang der X-Achse. [23]

Wie in der Abbildung 12 und Abbildung 13 ersichtlich, war kein eindeutiges Maximum auszumachen. Die

Differenz zwischen dem Minimum und dem Maximum war extem gering. In der Abbildung 13 betrug diese

gerade einmal 2.5 %, was kein eindeutiges Ergebnis darstellt. Aus diesem Grund wurde in einem weiteren Test

versucht, die Korrelation zeilenweise zu berechnen.

4 Bildvorverarbeitung 4.3 Kreuzkorrelation zeilenweise

06.08.2018 Riccardo Jung, Dominik Wagner 8

4.3 Kreuzkorrelation zeilenweise

Als zweite Variante wurde versucht, jede einzelne Zeile des gespiegelten Bildes über das Originalbild zu schieben,

um die Korrelation zeilenweise zu berechnen. Das Ziel dabei war, Zeilen, welche keine nützlichen Informationen

enthalten, zu eliminieren.

In der Abbildung 14 ist sehr schön ersichtlich, welche Zeilen nützliche Informationen über das Zentrum des Pilzes

enthalten. Der Bereich bis Zeile 80 weist kein eindeutiges Maximum auf, da der Hintergrund des Bildes relativ

homogen ist. Der Bereich ab Zeile 80 zeigt ein eindeutiges Maximum der Korrelation, wodurch die Position des

Pilzes genau bestimmt werden kann. Leider konnten solch gute Ergebnisse nur bei wenigen Bildern erzielt

werden. Häufig sah das Ergebnis wie in Abbildung 15 aus. Über alle Zeilen hinweg konnte kein eindeutiges

Maximum bestimmt werden, welches Informationen über den Standort des Pilzes innerhalb des Bildes lieferte.

Abbildung 14 Kreuzkorrelation zeilenweise – Das Diagramm zeigt die Korrelation des Referenzbildes (rechts) mit dem kompletten Bild

(links) jeder einzelnen Zeile. [24]

Abbildung 15 Kreuzkorrelation zeilenweise – Das Diagramm zeigt die Korrelation des Referenzbildes (rechts) mit dem kompletten Bild

(links) jeder einzelnen Zeile. [22]

4 Bildvorverarbeitung 4.4 Vorverarbeitete Bilder

06.08.2018 Riccardo Jung, Dominik Wagner 9

4.4 Vorverarbeitete Bilder

Da weder die Kreuzkorrelation über das komplette Bild, noch die zeilenweise Kreuzkorrelation homogen gute

Ergebnisse erzielten, wurde diese in der endgültigen Bildvorverarbeitung weggelassen. Die Zentrierung der Bilder

erfolgt mittels Grauwertbestimmung, wie sie bereits im Fachmodul erarbeitet wurde.

Zur besseren Übersicht der Bildvorverarbeitung werden alle Schritte nochmals kurz aufgezeigt:

1. Bilder von Google downloaden (mittels Google Image Downloader, Verwendung von

wissenschaftlichem Namen ergibt bessere Resultate)

2. Aussortieren von schlechten Bildern (von Hand)

3. Neu Nummerieren der Bilder mittels Batch-Datei

4. Lokalisierung des Pilzes mittels Haar-Features

5. Grobes Zuschneiden der Bilder

6. Zentrierung mittels Grauwertbestimmung

7. Definitives Zuschneiden der Bilder

8. Standardisieren auf 256x256 Pixel

9. Vervielfachen

Dabei ist anzumerken, dass die Schritte 4 bis 9 alle automatisch mit einem Python Skript durchgeführt wurden,

welches im Anhang im Kapitel 14.3.1 zu finden ist.

Insgesamt wurden 15 Pilzarten mit diesen Tools für das neuronale Netz vorbereitet. Das Resultat der

Bildvorverarbeitung ist jedoch nicht bei jedem Pilz gleich ausgefallen. Beispielsweise konnten für den Butterpilz

nur 1500 Bilder generiert werden. Für andere Pilzarten, wie der Sommer-Steinpilz, wurden über 3800 Bilder

generiert. Das sind mehr als doppelt so viele Bilder, wie beim schlechtesten Ergebnis. Der Übersicht halber

werden nun alle bearbeiteten Pilzarten mit zwei Beispielbildern aufgezeigt.

Pilzart Wissenschaft-

licher Name

Anzahl

Bilder

Familie Beispielbilder

Sommer-Steinpilz Boletus

aestivalis

3864 Röhrling

Abbildung 16 Sommer-Steinpilz [25, 26]

Kiefern-Steinpilz Boletus

pinophilus

3048 Röhrling

Abbildung 17 Kiefern-Steinpilz [27, 28]

Gemeiner-Steinpilz Boletus edulis 2352 Röhrling

Abbildung 18 Gemeiner-Steinpilz [29, 30]

4 Bildvorverarbeitung 4.4 Vorverarbeitete Bilder

06.08.2018 Riccardo Jung, Dominik Wagner 10

Pilzart Wissenschaft-

licher Name

Anzahl

Bilder

Familie Beispielbilder

Schwarzhütiger-

Steinpilz

Boletus aereus 3612 Röhrling

Abbildung 19 Schwarzhütiger-Steinpilz [31, 32]

Fliegenpilz Amanita

muscaria

2075 Lamellenpilz

Abbildung 20 Fliegenpilz [33, 34]

Butterpilz Suillus luteus 1500 Röhrling

Abbildung 21 Butterpilz [35, 36]

Gold-Röhrling Suillus grevillei 2353 Röhrling

Abbildung 22 Gold-Röhrling [37, 38]

Sand-Röhrling Suillus

variegatus

1944 Röhrling

Abbildung 23 Sand-Röhrling [39, 40]

Ziegenlippe Xerocomus

subtomentosus

2041 Röhrling

Abbildung 24 Ziegenlippe [41, 42]

4 Bildvorverarbeitung 4.4 Vorverarbeitete Bilder

06.08.2018 Riccardo Jung, Dominik Wagner 11

Pilzart Wissenschaft-

licher Name

Anzahl

Bilder

Familie Beispielbilder

Gelber-

Knollenblätterpilz

Amanita citrina 3012 Lamellenpilz

Abbildung 25 Gelber-Knollenblätterpilz [43, 44]

Grauer-Wulstling Amanita

excelsa

2544 Lamellenpilz

Abbildung 26 Grauer-Wulstling [45, 46]

Grüner-

Knollenblätterpilz

Amanita

phalloides

2544 Lamellenpilz

Abbildung 27 Grüner-Knollenblätterpilz [47, 48]

Pantherpilz Amanita

pantherina

2232 Lamellenpilz

Abbildung 28 Pantherpilz [49, 50]

Perlpilz Amanita

rubescens

2496 Lamellenpilz

Abbildung 29 Perpilz [51, 52]

Pfifferling Cantharellus

cibarius

1632 Lamellenpilz

Abbildung 30 Pfifferling [53, 54]

Tabelle 3 Übersicht vorverarbeitete Bilder

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 12

5 Neuronales Netz

5.1 Theorie Convolutional Neural Network (CNNs)

In diesem Kapitel wird eine kurze Zusammenfassung über die Theorie der convolutional neural networks, oder

auch abgekürzt CNNs, verfasst. Dabei wird auf die in der Arbeit verwendeten Schichten, sowie dem Optimierer

(optimizer) eingegangen.

Aufgrund der etwas sperrigen Übersetzung der englischen Begriffe in die deutsche Sprache, werden in diesem,

wie auch in den folgenden Kapiteln, für alle mit CNNs zusammenhängende Themen, die englischen Begriffe

benutzt.

5.1.1 Convolutional Neural Networks Einführung

Convolutional neural networks haben ihren Ursprung in der Erforschung des visuellen Kortexes des menschlichen

Gehirns und werden schon seit den 1980er Jahren für die Bilderkennung verwendet. Dank der zunehmenden

Rechenleistung der Computer, sowie der grossen Menge an zur Verfügung stehenden Trainingsdaten, haben sich

die CNNs in den letzten Jahren stark entwickelt. Durch diese Mittel konnten die convolutional neural networks in

visuellen Aufgaben gar übermenschliche Leistungen erbringen. So werden diese Netze für verschiedene

Aufgaben, wie die Gesichtserkennung, die Erkennung von Strassenschildern oder gar für selbstfahrende Autos

eingesetzt. Doch die CNNs beschränken sich nicht nur auf visuelle Wahrnehmungen. Des Weiteren werden sie

für die Sprach-, Text- und Liederkennung eingesetzt. Wir wollen uns aber auf die Bearbeitung von visuellen

Wahrnehmungen in convolutional neural networks beschränken.

Bis vor ein paar Jahren waren solche Aufgaben wie die Erkennung eines Welpen auf einem Bild oder die

Texterkennung für Computer eine fast unlösbare Aufgabe. Daher stellt sich die Frage, weshalb solche Aufgaben

für den Menschen mühelos zu bewältigen sind und für Maschinen nicht? Diese Frage ist nicht ganz einfach zu

beantworten. Denn zum Zeitpunkt, wenn die Informationen unser Gehirn erreichen, sind diese bereits mit

hochrangigen Merkmalen geschmückt. Für den Menschen ist es beinahe unmöglich zu erklären, wie zum Beispiel

das Bild des Welpen erkannt wird. Dabei wird klar, dass die Wahrnehmung überhaupt nicht trivial ist. Damit das

Konzept hinter der Wahrnehmung und somit auch den convolutional neural networks genauer verstanden wird,

muss im nächsten Abschnitt genauer angesehen werden, wie diese sensorischen Module funktionieren.

[55, S. 355–357, 56, S. 129]

5.1.2 Biologische Inspiration

Die Idee des convolutional neural networks hat einen biologischen Hintergrund. In einer Serie von Experimenten

haben die Wissenschaftler David H. Humber und Torsten Wiesel den visuellen Kortex von Katzen genauer

analysiert. Dabei ist Ihnen aufgefallen, dass das Sehfeld in viele verschiedene lokale rezeptive Felder unterteilt

ist. Überlappend wiederspiegelt dieses rezeptive Feld von verschiedenen Neuronen das gesamte Sehfeld. Zudem

wurde ersichtlich, dass diese Felder für verschieden komplexe Muster ausgebildet sind. Die Architektur der

unterschiedlichen Felder teilt sich auf grosse Felder auf, welche für die weniger komplexen Strukturen

verantwortlich sind, und kleinere rezeptive Felder, welche für komplexere Strukturen im Sehfeld zuständig sind.

Diese Felder werden dann über einzelne Verbindungen verbunden.

Genau diese Studie hat das im Jahre 1980 eingeführte Neocognitron inspiriert, welches sich über die Jahre

allmählich zu dem entwickelte, was wir unter dem Namen convolutional neural network kennen. Ein Meilenstein

für die CNNs wurde im Jahre 1998 mit der Erfindung der LeNet-5 Architektur gesetzt, mit welcher

handgeschriebene Nummern erkannt werden konnten. Dabei wurden Schichten wie fully connected layer,

pooling layer, aber auch convolutional layer verwendet. Diese werden in den nächsten Abschnitten genauer

erklärt. [55, S. 356, 56, S. 126]

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 13

5.1.3 Convolutional Neural Network Architektur und Schichten

Convolutional neural networks sind typischerweise aus vielen Schichten aufgebaut. Wie die Abbildung 31 zeigt,

kann die Architektur generell in 3 verschiedene Stufen aufgeteilt werden, wobei die Struktur innerhalb der Stufen

stark variieren kann. Über diese drei Stufen hinweg werden die Eingangsdaten in ein gegebenes Set von Klassen

transformiert. [56, S. 128–129]

Abbildung 31 Generelle Struktur eines CNNs – Die Abbildung zeigt die grundsätzliche Struktur eines CNN mit dem input layer, den

feature-extraction layers und den classification layers. [56, S. 128]

5.1.3.1 Input Layer

Die erste Stufe bildet der input layer. Hier werden die Bilddaten in das Netz eingegeben. Parameter der

Eingangsdaten bilden die Länge, Breite, sowie die Anzahl der Kanäle. Mit der Anzahl an Kanälen sind die

Farbkanäle gemeint. Bei einem Farbbild sind dies drei, für jeden Wert von R (Rot), G (Grün) und B (Blau) einen

Wert pro Pixel. [56, S. 130]

5.1.3.2 Convolutional Layer

Ein Teil der zweiten Stufe (feature-extraction layers) bilden die convolutional layer. Diese Schicht ist auch die

wichtigste in einem convolutional neural network. Sie bildet den Kern der CNNs.

Wichtig für das Verständnis dieses layers ist,

dass nicht jeder Pixel des Eingangsbildes mit

einem Neuron des convolutional layers der

ersten Schicht verbunden ist. Das Gleiche gilt

auch für den zweiten convolutional layer. Es

sind nur die Neuronen verbunden, welche

sich innerhalb des Rechteckes der

darunterliegenden Schicht befinden. Sehr

schön dargestellt ist dieser Vorgang in der

Abbildung 32.

Abbildung 32 Convolutional layer mit rechteckigen rezeptiven Feldern – Die

Abbildung zeigt, wie die Neuronen zwischen den einzelnen layers verbunden

sind. [55, S. 358]

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 14

Durch diese Architektur, welche auch in realistischen Bildern üblich ist, wird es möglich, dass sich jede Schicht

auf spezielle Features im Bild konzentrieren kann. Dies ist auch der Grund, weshalb CNNs oft für die

Bilderkennung eingesetzt werden. [55, S. 357–358]

Zum Verständnis der Faltung muss ein kurzer Exkurs in die Mathematik gemacht werden. Die Faltung oder

englisch convolution wird in den convolutional neural networks auch als Merkmalsdetektor betitelt. In der

Abbildung 33 wird gezeigt, wie der Kernel, oder auch Filter genannt, über die Eingangsdaten geschoben wird. Für

jede Position wird der Kernel mit den Eingangsdaten multipliziert. Anschliessend werden alle Resultate der

Multiplikation addiert und das Resultat wird in die Ausgabe (feature map oder hier convoluted feature)

geschrieben. Dieser Vorgang wird Faltung genannt. [56, S. 131–132]

Abbildung 33 Beispiel Faltungsoperation - In der Abbildung wird gezeigt, wie der Kernel, oder auch Filter genannt, über die Eingangsdaten

geschoben wird und daraus die feature map berechnet wird. [56, S. 131]

Wird dieser Vorgang nun mit demselben Filter über das ganze Bild angewendet, so entstehen die sogenannten

feature maps. Der Aufbau der Filter wird während dem Training automatisch an die Eingabedaten angepasst,

sodass diese möglichst gut klassifiziert werden können.

Bis anhin wurde der Einfachheit halber der

convolutional layer als zweidimensionaler layer

betrachtet. In Wirklichkeit besteht dieser jedoch

aus mehreren feature maps gleicher Grösse,

welche als dreidimensionales Gebilde darzu-

stellen sind. Ersichtlich ist dieses Gebilde in der

Abbildung 34. Die verschiedenen feature maps

teilen sich innerhalb eines convolutional layers

sowohl die Gewichtungen, wie auch die

Bias - Werte. Einziger Unterschied bilden die

Filter, welche unterschiedliche Parameter auf-

weisen können. Mithilfe dieser verschiedenen

Filter ist es für den convolutional layer möglich,

mehrere Merkmale im Eingangsbild zu erken-

nen.[55, S. 360–361]

Abbildung 34 Convolutional layer mit verschiedenen feature maps – Die

Abbildung zeigt zwei convolutional layer mit mehreren feature maps und ein Bild

mit drei Kanälen (RGB). [55, S. 361]

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 15

Weitere Parameter eines convolutional layers sind der stride, sowie das padding. Diese Parameter werden

anhand der nächsten Abbildungen erklärt.

In der Abbildung 35 ist ein Bild mit dem Parameter padding same zu sehen. Dieser legt fest, wie die Ränder eines

Bildes bearbeitet werden, wenn der Filter über den Rand hinauskommt. Mögliche Varianten, welche in

Tensorflow zur Verfügung stehen sind padding same oder padding valid. Bei padding same wird das Bild am

Randbereich mit Nullen ergänzt, sodass das Bild im Output dieselbe Grösse hat und alle Pixel berücksichtigt

werden. Bei padding valid wird dies nicht gemacht, was zur Folge hat, dass die äussersten Pixel nicht bearbeitet

werden können, weil der Filter nicht vollständig im Bild platziert werden kann.

Abbildung 35 Erklärung Parameter padding – Die Abbildung visualisiert den Parameter padding, der festlegt, wie die Ränder eines Bildes

bearbeitet werden. Der Parameter fw definiert die Filterweite und der Parameter fh die Filterhöhe. Der hier verwendete Filter hat

dementsprechend die Grösse 3x3 Pixel. Die Ränder des Bildes werden mit Nullen aufgefüllt (zero padding). [55, S. 358]

Der zweite Parameter, welcher beim convolutional layer definiert werden muss, ist die Schrittweite oder englisch

stride. Dieser legt fest, wie weit der Filter nach einem Schritt weitergeschoben wird, bevor das rezeptive Feld

erneut ausgewertet wird. Dieser Parameter hat auch einen grossen Einfluss auf die Anzahl Parameter des

neuronalen Netzes. Denn zum Beispiel mit einem stride von 2 wird das Bild um diesen Faktor in der nächsten

Schicht verkleinert. Sehr gut ersichtlich ist dies in der Abbildung 36, wobei das obere Rechteck den Output, und

somit den Input der nächsten Schicht darstellt. Dieser Parameter wird jedoch meist auf 1 gesetzt und die

Reduzierung des Bildes wird mit dem pooling layer durchgeführt. Dieser wird im nächsten Abschnitt genauer

erklärt. [55, S. 358–359]

Abbildung 36 Erklärung Parameter stride – Dieser Parameter dient zur Dimensionsreduktion. Zu sehen ist ein Bild mit der Schrittweite 2,

welche zur Folge hat, dass das Ausgangsbild (oberes Rechteck) um den Faktor 2 kleiner ist. Die Randstellen sind wiederum mit Nullen

gefüllt, damit das Ausgangsbild alle Pixel des Eingangsbildes berücksichtigen kann. [55, S. 359]

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 16

5.1.3.3 Pooling Layer

Ein weiterer Bestandteil der zweiten Stufe bilden die pooling layer. Diese sind im Gegensatz zu den convolutional

layer sehr einfach zu verstehen und man findet sie üblicherweise nach jedem dieser Schichten. Die Reduzierung

des Eingangsbildes ist die Aufgabe dieses layers. Die Reduzierung der Bildgrösse zieht viele positive Eigenschaften

mit sich. Damit wird auch die Anzahl der Parameter reduziert. Dies hat einen grossen Einfluss auf den

Rechenaufwand und den Speicherbedarf, welche dadurch ebenfalls reduziert werden. Zudem ergibt sich durch

die Reduktion des Bildes eine Standortinvarianz.

Für die Reduktion der Bildgrösse werden keine Gewichtungen benötigt. Mit der Hilfe einer Aggregierungs-

funktion wie max (Maximum) oder mean (Mittelwert) werden nur einzelne Gewichtungen in die nächste Schicht

übernommen. Am Beispiel der Abbildung 37 kann man die Funktion des pooling layers sehr gut darstellen. Die

Abbildung zeigt den am meisten verwendeten pooling layer, nämlich den max pooling layer. Als

Aggregationsfunktion wird die Maximalfunktion verwendet. Ein weiterer Parameter bildet der sogenannte

pooling kernel. Dieser hat in unserem Beispiel der Abbildung 37 eine Grösse von 2x2 Pixel. Die Schrittweite oder

englisch stride wurde in diesem Beispiel mit 2 Pixel pro Schritt gewählt. Der letzte Parameter, welcher definiert

werden muss, ist das padding. Dieser bestimmt, wie die Randstellen des Bildes behandelt werden. Hier wurde

padding valid gewählt, wodurch der Rand einfach abgeschnitten wird.

Abbildung 37 Max pooling layer (2x2 pooling kernel, stride 2) – Die Abbildung zeigt, wie die Bildgrösse dank des pooling layers verringert

werden kann. Links im Bild ersichtlich ist die Auswahl der Aggregierungsfunktion, welche hier den Wert 5 übernimmt, da eine

Maximalfunktion gewählt wurde. Weil padding valid für die Randbehandlung gewählt wurde, wird dieser abgeschnitten.

Mit dieser Konfiguration des pooling layers wird das Bild um den Faktor 2 verkleinert. Dabei ist anzumerken, dass

nur der maximale Wert des Kernels übernommen wird, alle anderen Gewichtungen fallen weg. So fallen in

diesem Beispiel insgesamt 75 % aller Gewichtungen weg, was enorme Einsparungen im Rechenaufwand zur Folge

hat. [55, S. 365–367]

5.1.3.4 Fully Connected Layer

Die dritte Stufe bildet der Classification layer. Dieser wird durch sogenannte fully connected layer abgebildet.

Wie es der Name schon verrät, sind diese Schichten vollständig mit den Neuronen der davorliegenden Schicht

verbunden. In einem neuronalen Netz können mehrere dieser Schichten nacheinander folgen. Die allerletzte

Schicht bildet dabei das Netz auf die Ausgänge der Vorhersage ab. Meist wird dies mit einem speziellen fully

connected layer realisiert, dem sogenannten softmax layer. Dieser berechnet für jede Klasse die

Wahrscheinlichkeit und gibt diese aus. [56, S. 140–141]

5 Neuronales Netz 5.1 Theorie Convolutional Neural Network (CNNs)

06.08.2018 Riccardo Jung, Dominik Wagner 17

5.1.4 Optimizer

Das Training eines neuronalen Netzes kann je nach Grösse des Netzwerkes sehr lange dauern. Die Wahl des

richtigen Optimierers kann die Zeit bis gute Ergebnisse erzielt werden um ein Vielfaches verringern. Die Wahl des

Optimierers fiel in unserem Fall auf den Adam optimizer, welcher untenstehend genauer erläutert wird.

5.1.4.1 Adam Optimizer

Der Adam optimizer ist ein Optimierungsalgorithmus, welcher anstelle des klassischen stochastischen

Gradientenabstiegsverfahrens verwendet werden kann, um die optimalen Gewichte des neuronalen Netzes zu

bestimmen. Adam steht für adaptive moment estimation und kombiniert die Ideen von Momentum optimization

und RMSProp. Wie bei der Momentum optimization werden alle bereits berechneten Gradienten miteinbezogen,

um schneller ein Minium zu erreichen, falls die Gradienten mehrmals in die gleiche Richtung zeigen. Als Beispiel

kann man sich einen Ball vorstellen, der von einem Hügel herunterrollt. Dieser wird kontinuierlich schneller, bis

ein Minimum erreicht ist. Wenn der Ball allerdings nach jedem Meter gestoppt und erneut losgelassen wird,

dauert es viel länger, bis der Ball das Minimum erreicht. Wenn man also weiss, dass der Ball bereits vorhin mit

einer gewissen Geschwindigkeit in diese Richtung unterwegs war, kann man ihn nach jedem Stopp mit einer

Anfangsgeschwindigkeit loslassen, damit er schneller das Minium erreicht. Anders als bei Momentum

optimization werden bei RMSProp nicht alle berechneten Gradienten miteinbezogen. Es werden nur einzelne

Gradienten mit einem exponentiellen Verfall miteinberechnet.

Da der Adam optimizer ein adaptiver Lernratenalgorithmus ist, ist die Wahl der Lernrate nicht so wichtig. Oft

kann eine standartmässige Lernrate von 0.001 verwendet werden, wodurch die Verwendung sogar einfacher

wird, als mit dem Gradientenabstiegsverfahren. [55, S. 295–301]

5.1.5 Overfitt ing vermeiden

Neuronale Netze haben normalerweise zehntausende von Parametern, manchmal sogar bis zu mehreren

Millionen. Mit dieser riesigen Anzahl von Parametern hat das Netzwerk viel Freiheit sich an viele verschiedene

komplexe Datensätze anzupassen. Diese Flexibilität hat allerdings auch den Nachteil, dass das neuronale Netz

anfällig auf das Übertraining der Lerndaten ist. Das bedeutet, dass das neuronale Netz die Klassifikation auf den

Lerndaten gut bewältigt, die Verallgemeinerung auf unbekannten Daten fällt dem neuronalen Netz allerdings

schwer.

Da auch wir während dieser Arbeit mit dem Thema Übertraining konfrontiert wurden, sind nachfolgend zwei

mögliche Lösungsvarianten dokumentiert. [55, S. 305]

5.1.5.1 Early Stopping

Eine gute Variante, um das Übertraining zu verhindern, ist das verfrühte Beenden des Trainings, sobald die

accuracy der Validierungsdaten anfängt zu sinken. Dies kann erreicht werden, indem das neuronale Netz in

regelmässigen Abständen mittels Validierungsdaten getestet wird und das Modell gespeichert wird, falls sich die

Ergebnisse verbessert haben. Nach jedem Speichern des Modells werden die Schritte gezählt, bis ein neues

besseres Modell trainiert wurde. Falls nach einer gewissen Anzahl Schritte kein besseres Modell gefunden wurde,

kann das bereits gespeicherte beste Modell wiederhergestellt werden. [55, S. 305]

5.1.5.2 Data Augmentation

Eine weitere Variante, um das Übertraining zu verhindern, ist die Vergrösserung des Datensatzes. Dies wird

erreicht, indem aus den aktuellen Trainingsdaten neue Trainingsdaten erzeugt werden. So kann die Anzahl an

Daten künstlich vergrössert werden. Die Vergrösserung des Datensatzes kann beispielsweise durch das Ändern

des Kontrasts, Spiegelung oder Drehen eines Bildes erreicht werden. Wir haben bei der Klassifizierung der Pilze

ebenfalls alle Daten vervielfacht. Eine ausführliche Dokumentation über die Art und Weise der Vervielfachung

wurde bereits im Kapitel 4.1 dokumentiert. [55, S. 311]

5 Neuronales Netz 5.2 Erstes Netzwerk

06.08.2018 Riccardo Jung, Dominik Wagner 18

5.2 Erstes Netzwerk

Für erste Tests mit fünf verschiedenen Pilzarten wurde ein neuronales Netz, basierend auf einem Tutorial [57],

entwickelt. Den Code dafür konnte auf GitHub [58] entnommen werden. Mit nur kleinen Anpassungen konnten

so erste Tests durchgeführt werden.

Die Architektur des ersten Netzes wurde bewusst klein gewählt, damit diese bei Bedarf stetig ausgebaut werden

kann. Als Basis wurden drei convolutional layer, ein flattened layer, sowie ein fully connected layer eingebaut.

Zur besseren Übersicht wird die Architektur, wie sie dem Tutorial entnommen werden konnte, aufgezeigt. Diese

ist in Abbildung 38 ersichtlich.

Abbildung 38 Architektur Neuronales Netzwerk – In dieser Abbildung ist ein neuronales Netz mit drei convolutional layer, einem

flattened layer und einem fully connected layer dargestellt, welches als Basis für die ersten Tests diente. [59]

Zur besseren Veranschaulichung des Netzes wurde der Programmcode durch Inputs in das Tensorboard

erweitert. Beispielsweise wird die Treffsicherheit (validation accuracy und validation loss), bei den

Validierungsdaten, zyklisch aufgezeichnet. Den benötigten Code dafür kann in wenigen Zeilen geschrieben

werden.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.summary.scalar("Validation_accuracy", accuracy)

Des Weiteren wurde der Code mit einer sogenannten Confusion Matrix erweitert, damit die

Validierungsergebnisse besser visualisiert werden konnten. Ein kurzer Exkurs zur Confusion Matrix:

Die Confusion Matrix, welche teilweise auch als Error Matrix bezeichnet wird, repräsentiert die Performance

eines Algorithmus. Dabei werden in den Spalten die vorhergesagten Labels und in den Zeilen die wirklichen Labels

aufgezeigt. Damit kann genauer evaluiert werden, bei welchen Labels die Fehler entstanden sind und welche

Labels gut erkannt werden. [60]

Am Beispiel in Abbildung 39 ist gut ersichtlich, dass

das neuronale Netz Probleme mit dem ersten Label

(Sommersteinpilz) hat. Diese werden in fünf Fällen

falsch vorhergesagt. Nur die Diagonale wieder-

spiegelt eine richtige Vorhersage. Auch die Basis

dieses Codes stammt aus dem Internet [61] und

wurde auf unsere Bedürfnisse angepasst. Auf der

nächsten Seite ist der Code für die Confusion Matrix

zu finden.

Abbildung 39 Confusion Matrix - Die Confusion Matrix, welche teilweise

auch als Error Matrix bezeichnet wird, repräsentiert die Performance

eines Algorithmus.

5 Neuronales Netz 5.2 Erstes Netzwerk

06.08.2018 Riccardo Jung, Dominik Wagner 19

# Create Folder for ConfusionMatrix

if not os.path.exists("./log/ConfusionMatrix"): os.makedirs("./log/ConfusionMatrix")

# Confusion matrix

y_pred_show = session.run(y_pred, feed_dict=feed_dict_validate)

y_pred_show_1 = np.argmax(y_pred_show, axis=1)

y_val_1 = np.argmax(y_valid_batch, axis=1)

conf_matrix = confusion_matrix(y_val_1, y_pred_show_1)

plt.imshow(conf_matrix, interpolation='nearest', cmap=plt.cm.Blues)

plt.title('Confusion matrix Epoche: ' + str(epoch))

plt.colorbar(boundaries=np.linspace(0, int(batch_size/6), int(batch_size/12)+1)) tick_marks = np.arange(len(classes))

plt.xticks(tick_marks, classes, rotation=90, fontsize=7) plt.yticks(tick_marks, classes, fontsize=7)

thresh = conf_matrix.max() / 2. for u, j in itertools.product(range(conf_matrix.shape[0]), range(conf_matrix.shape[1])):

plt.text(j, u, format(conf_matrix[u, j], 'd'),horizontalalignment="center",

verticalalignment="center", fontsize=7,

color="white" if conf_matrix[u, j] > thresh else "black") plt.ylabel("True label")

plt.xlabel("Predicted label")

plt.tight_layout()

if not os.path.exists("./log/ConfusionMatrix/" + hparam): os.makedirs("./log/ConfusionMatrix/" + hparam)

plt.savefig("./log/ConfusionMatrix/" + hparam + "/" + str(epoch+1)) plt.close()

plt.clf()

Mit der Hilfe des angepassten Python Skripts konnten nun die ersten Tests durchgeführt und ausgewertet

werden. Diese wurden anfänglich mit nur fünf Pilzarten durchgeführt, bevor die Architektur des Netzes stetig

erweitert und die Anzahl der Pilze erhöht wurde.

Der gesamte Code kann dem Anhang im Kapitel 14.3 Python Skripts, sowie Kapitel 14.4 JSON File entnommen

werden. Es werden zwischendurch kurze Codestücke aufgezeigt, welche der Erklärung dienen sollen.

Des Weiteren wurden in dieser Phase etliche Tests auf der Keras Plattform gemacht. Dies ist eine einfache API

(application programming interface) für das Trainieren neuronaler Netze, welche auf TensorFlow aufgebaut ist.

Damit können neuronale Netze sehr elegant und mit wenigen Codezeilen entworfen werden. Da jedoch nicht die

exakt gleiche Architektur, welche mit Tensorflow aufgebaut wurde, nachgebaut werden konnte und dadurch die

Resultate schlechter ausfielen, wurde auf eine weitere Entwicklung mit der Hilfe dieses Tools verzichtet.

5.2.1 Resultate erster Tests

Die ersten Tests wurden allesamt auf den internen Grafikkarten (NVIDIA GeForce GTX 645) durchgeführt,

weshalb die Batchgrösse auf 32 Bilder pro Batch limitiert war. Bei diesen Tests wurde der Fehler gemacht, dass

die Validierungs- und Trainingsdaten nicht sauber getrennt wurden. Daher kannte das neuronale Netz die Bilder

bereits und konnte diese sehr gut klassifizieren. Dieser Fehler wurde erst bei den Tests mit 15 Pilzarten erkannt

und ist auch in diesem Kapitel genauer dokumentiert.

Bei diesen Tests fiel auf, dass sich das neuronale Netz mit kleineren Filtergrössen besser verhielt als mit

grösseren. Zudem wurde beobachtet, dass das Netz sehr schnell konvergiert, danach jedoch meist nur noch

schlechtere Ergebnisse lieferte. Aufgrund des vorhandenen Fehlers wird auf die nähere Betrachtung dieser Tests

verzichtet.

5 Neuronales Netz 5.3 Training mit 15 Pilzarten

06.08.2018 Riccardo Jung, Dominik Wagner 20

5.3 Training mit 15 Pilzarten

Nachdem eine Datenbank mit den bereits vorgestellten 15 Pilzarten erstellt wurde, konnten die ersten Tests mit

allen Pilzen durchgeführt werden. Es zeigte sich allerdings schnell, dass das Training eines neuronalen Netzes für

die Klassifizierung von 15 Pilzarten eine grosse Herausforderung darstellt. Im nächsten Abschnitt wird das

Ergebnis der ersten Tests mit 15 Pilzen genauer unter die Lupe genommen.

5.3.1 Ergebnis

Erste Tests haben eine validation accuracy von über 90 % ergeben. Einige Tests später wurde allerdings bemerkt,

dass die Test- und Validierungsdaten auf demselben Datensatz beruhten. Das Problem bei gleichen Daten ist,

dass das Netz mit denselben Daten trainiert und validiert wurde. Dadurch hat das neuronale Netz die Bilder

bereits eintrainiert und kann diese in einem späteren Validierungszyklus viel einfacher klassifizieren. Als

Lösungsansatz für dieses Problem wurde die Trennung der Daten ausgewählt. Dazu wurde bereits beim Einlesen

der Daten 20 % des Datensatzes für einen separaten Validierungsdatensatz reserviert und ausgeschlossen. Der

Effekt dieses Fehlers war enorm gross, denn die validation accuracy verschlechterte sich nach dem Auftrennen

der Daten auf ca. 50 %. In der Abbildung 40 und Abbildung 41 ist jeweils das beste Ergebnis, welches nach dem

Trennen der Datensätze erreicht wurde, dargestellt.

Abbildung 40 Graph accuracy mit 15 Pilzarten – In dieser Abbildung ist die accuracy, welche nach dem Trennen der Datensätze mit 15

Pilzarten erreicht wurde, dargestellt. Eine validation accuracy von 50 % wird schon nach wenigen Epochen erreicht, danach stagniert das

Wachstum.

Abbildung 41 Graph loss mit 15 Pilzarten Pilzarten – In dieser Abbildung ist der loss, welcher nach dem Trennen der Datensätze mit 15

Pilzarten erreicht wurde, dargestellt. Der validation loss steigt bereits früh nach dem Start des Trainings wieder an, was ein klares Zeichen

für ein Übertraining ist.

5 Neuronales Netz 5.3 Training mit 15 Pilzarten

06.08.2018 Riccardo Jung, Dominik Wagner 21

5.3.2 Diskussion

5.3.2.1 Graph

Eine validation accuracy von 50 % wird schon nach wenigen Epochen erreicht, danach stagniert das Wachstum.

Ab Epoche 30 lernt das neuronale Netz nur noch auf den Trainingsdaten, was mit einem stetigen Anstieg der

training accuracy zu beobachten ist. Gleichzeitig zum Wachstum der training accuracy steigt der loss an. Dies ist

ein klares Zeichen für ein Übertraining der Daten.

5.3.2.2 Confusion Matrix

Anhand der Confusion Matrix in

Abbildung 42 sieht man, dass sich die

Pilze grundsätzlich gut klassifizieren

lassen. Jedoch gibt es keine Klasse, bei

welchen keine Fehlerklassifizierungen

aufgetreten sind. Auffällig sind einzelne

Sektoren wie jener der vier Steinpilz-

arten. Spannend zu sehen ist, dass dies

auch bei den Lamellenpilzen derselben

Familie der Fall ist. Namentlich sind dies

der Graue-Wulstling, Pantherpilz, Perl-

pilz und die Knollenblätterpilze, welche

alle zur Familie Amanita gehören.

Genau wie beim Menschen tritt auch

beim neuronalen Netz die grösste

Fehlklassifizierung bei solch ähnlichen

Pilzen auf.

Abbildung 42 Confusion Matrix 15 Pilzarten – Anhand der Confusion Matrix sieht

man, dass es bei jeder Pilzart zu Fehlklassifizierungen kam. Auffällig sind zwei

Sektoren, bei welchen die Fehlklassifizierungen auf die gleiche Familien-

zugehörigkeit zurückzuführen sind.

5.3.3 Fazit

Die Klassifizierung der 15 Pilze funktioniert nur sehr bedingt mit diesem neuronalen Netz. Mit einer validation

accuracy von gerade einmal knapp über 50 % ist die Wahrscheinlichkeit für eine sichere Klassifizierung sehr

gering. Deswegen wurden weitere Lösungsvarianten ausprobiert, damit die Klassifizierung genauer wird. Diese

Varianten wurden auf den nächsten Seiten dokumentiert und erläutert.

5 Neuronales Netz 5.4 Training mit zusätzlichen Features

06.08.2018 Riccardo Jung, Dominik Wagner 22

5.4 Training mit zusätzl ichen Features

Nachdem die ersten Tests nicht zufriedenstellend

waren, wurde versucht, dem neuronalen Netz weitere

Informationen zur Verfügung zu stellen, welche zu einer

besseren Klassifizierung führen. Dazu wurden neben

dem Bild als Input auch Informationen über die Grösse

des Pilzes miteinbezogen.

Für das Training bedeutet das, dass jedem Pilz eine

Stiellänge und ein Hutdurchmesser zugeordnet wird.

Dazu wurde für jede Pilzart eine durchschnittliche

Länge des Stiels und des Hutdurchmessers inklusive

einer Standardabweichung bestimmt. Diese Informa-

tionen wurden in einem JSON File hinterlegt, damit sie

sowohl für das Training, als auch für die Webapplikation

verwendet werden können, welche später ausführlich

beschrieben wird. Anhand der durchschnittlichen

Grösse und der Standardabweichung wurden über eine

Normalverteilung jedem Pilz eine Stiellänge und ein

Hutdurchmesser zugeordnet. Diese Informationen

wurde anschliessend dem fully connected layer

angehängt. Ein Beispiel eines neuronalen Netzes mit

diesen Zusatzinformationen ist in der Abbildung 43

dargestellt.

Abbildung 43 Neuronales Netz mit zusätzlichen Features – Die Abbildung

zeigt, wie die zusätzlichen Informationen dem neuronalen Netz zur

Verfügung gestellt werden.

5.4.1 Ergebnis

In der Abbildung 44 und Abbildung 45 sind die validation accuracy und der validation loss von zwei neuronalen

Netzen abgebildet, welche sich nur durch die zusätzlichen Features unterscheiden. Beide Netze wurden mit den

Daten der Lamellenpilze trainiert.

Abbildung 44 Graph accuracy mit zusätzlichen Features – In der Abbildung ist sehr gut zu erkennen, dass der Verlauf der jeweiligen

Graphen beinahe identisch ist. Der wesentliche Unterschied liegt darin, dass die accuracy um ca. 10 % höher ist, wenn das neuronale Netz

mit den zusätzlichen Features trainiert wurde.

5 Neuronales Netz 5.4 Training mit zusätzlichen Features

06.08.2018 Riccardo Jung, Dominik Wagner 23

Abbildung 45 Graph loss mit zusätzlichen Features – Die Abbildung zeigt den positiven Effekt der zusätzlichen Features. Dank diesen

zusätzlichen Informationen konnte der loss gesenkt werden.

5.4.2 Diskussion

In der Abbildung 44 ist sehr gut zu erkennen, dass der Verlauf der jeweiligen Graphen beinahe identisch ist, mit

der Ausnahme, dass die accuracy um ca. 10 Prozent höher ist. Dieser Unterschied ist auf die zusätzlichen

Informationen, welche dem neuronalen Netz hinzugefügt wurden, zurückzuführen.

Betrachtet man Abbildung 45, so wird ein zusätzlich positiver Effekt der Informationen ersichtlich. Mit den

zusätzlichen Features wird nicht nur die validation accuracy verbessert, sondern auch der loss um einiges

verringert, was zur Folge hat, dass die Fehlertoleranz des Netzes geringer ist.

Es soll aber auch angemerkt werden, dass sowohl die training accuracy, wie auch der training loss immer noch

viel besser als die Ergebnisse der Validierungsdaten ausfallen.

5.4.3 Fazit

Der Test hat gezeigt, dass die validation accuracy um zirka 10 % verbessert werden konnte. Das Problem des

Übertrainings konnte allerdings noch nicht verringert werden.

Das Ergebnis war allerdings nach wie vor nicht zufriedenstellend, weshalb die Pilze in Röhrlinge und Lamellenpilze

unterteilt wurden. Dies hat aber zur Folge, dass der Benutzer der Applikation anschliessend auch selber

entscheiden muss, ob es sich um einen Röhrling oder einen Lamellenpilz handelt. Dies kann unter Umständen

auch zu Fehlklassifizierungen führen. Da die Unterschiede dieser Features jedoch relativ einfach mit dem

menschlichen Auge zu erkennen sind, werden die Fehlklassifizierungen durch dieses Feature relativ gering

ausfallen.

Zur kurzen Erklärung dieses Features werden diese in der Abbildung 46 und Abbildung 47 dargestellt. Es muss

lediglich die Unterseite des Pilzes betrachtet werden, um zu erkennen, ob es sich um einen Röhrling oder einen

Lamellenpilz handelt.

Abbildung 46 Beispiel Lamellenpilz [62]

Abbildung 47 Beispiel Röhrling [63]

5 Neuronales Netz 5.5 Einleitung Testreihen

06.08.2018 Riccardo Jung, Dominik Wagner 24

5.5 Einleitung Testreihen

Nachdem die ersten Tests mit verschiedenen Konfigurationen und Features durchgeführt wurden, entschieden

wir uns, mit ähnlichen Architekturen weiterzuarbeiten. Die Trennung der zwei Pilzfamilien (Lamellenpilze und

Röhrlinge) führte in ersten kleineren Tests zu vielversprechenden Ergebnissen. Deswegen wurde diese Idee

weiterverfolgt.

Mit sogenannten Grid-Tests wurde in den folgenden Tests die bestmögliche Architektur für das jeweilige

neuronale Netz gesucht. In den Grid-Tests werden viele verschiedene Parameter verändert und dafür jeweilige

Netze trainiert. Der grosse Vorteil dieser Tests ist, dass man sie durch einen Befehl starten kann und automatisch

viele verschiedene Tests gestartet werden. Zur besseren Veranschaulichung wird ein Codeausschnitt dargestellt

und erklärt.

def main(): for img_size in [64,128,256]: # Load Dataset

data = dataset.read_train_sets(train_path, img_size, classes,

validation_size=validation_size) print("Complete reading input data. Will Now print a snippet of it") print("Number of files in Training-set:\t\t{}".format(len(data.train.labels))) print("Number of files in Validation-set:\t{}".format(len(data.valid.labels)))

num_epochs = 100

if img_size == 64: batch_size = 256 number_of_iteration = int(num_epochs*len(data.train.labels)/batch_size)

elif img_size == 128: batch_size = 128 number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

elif img_size == 256: batch_size = 64 number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

for learning_rate in [1E-3, 1E-4]: global i i = 0

for num_filter in [32]: for fc1_layer_size in [64,128]: for num_convlayer in [2, 3, 4]: if num_convlayer == 2: for filter in [[10, 10], [8, 8], [6, 6], [4, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

if num_convlayer == 3: for filter in [[10, 8, 6], [8, 8, 6], [8, 6, 4], [6, 6, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

if num_convlayer == 4: for filter in [[10, 8, 6, 6], [8, 8, 6, 4], [8, 6, 6, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

Oben ersichtlich ist die main-Methode des Python Skriptes. Der Grid-Test wurde mittels mehreren for-Schleifen

voll ausprogrammiert. In den jeweiligen Schleifen können die Parameter des Tests angegeben werden.

Beispielsweise wird in img_size über drei verschiedenen Bildgrössen von 64x64, 128x128 und 256x256 Pixeln

iteriert. Jede Bildgrösse durchläuft dann alle anderen Parameter, welche wiederum in den verschiedenen

for-Schleifen definiert sind. So durchläuft beispielsweise dieser Test das Training von 132 verschiedenen Netzen,

welche anschliessend ausgewertet werden können.

5 Neuronales Netz 5.5 Einleitung Testreihen

06.08.2018 Riccardo Jung, Dominik Wagner 25

Zur Darstellung der Resultate wurde wiederum die Confusion Matrix, sowie das TensorBoard verwendet. Da

diese beiden Tools bereits in den vorherigen Tests ausführlich erklärt wurden, verzichten wir auf eine weitere

Erklärung. Zusätzlich zu den bereits programmierten Ausgaben wurde noch eine Ausgabe in ein Textdokument

realisiert. Dazu wurde ein separates Python Skript (log.py) erstellt, welches im Testskript importiert wurde. Im

Textdokument werden zuerst alle Hyperparameter des Tests niedergeschrieben, danach folgt die Ausgabe des

Trainings. Am Schluss wird dann das beste Ergebnis vermerkt, damit die Auswertung erleichtert wird. Eine

gekürzte Version der Ausgabe in das Textdokument wird unten dargestellt.

Classes: ['004_Fliegenpilz', '009_Gelber-Knollenblaetterpilz', '010_Grauer-Wulstling', '011_Gruener-Knollenblaetterpilz', '012_Pantherpilz', '013_Perlpilz', '014_Pfifferling']

Image size: 64x64 Pixel

Batch size: 256

Learning rate: 0.001

Optimizer: AdamOptimizer

Number of convolutional layers: 2

Filter size: [3, 3]

Number of filters: 32

Fully connected layer size: 64

------------------------------------------------------------------

Start Training:

Training Epoch 0 --- Training Accuracy: 10.9%, Validation Accuracy: 13.3%, Validation Loss: 2.364

Training Epoch 1 --- Training Accuracy: 54.7%, Validation Accuracy: 46.9%, Validation Loss: 1.347

Training Epoch 100 --- Training Accuracy: 100.0%, Validation Accuracy: 63.7%, Validation Loss: 2.982

Training Epoch 101 --- Training Accuracy: 100.0%, Validation Accuracy: 73.4%, Validation Loss: 2.199

Training done! Highest val acc: 0.7734375 val loss: 0.7956599

Zu guter Letzt wurde auch das Modell abgespeichert, damit dies für eine spätere Prognose verwendet werden

kann. Auch dieses wird automatisch durch das Programm abgespeichert. Damit nur das beste Modell

abgespeichert wird, vergichen wir die validation accuracy mit den vorherigen Epochen und speicherten jeweils

nur das beste Ergebnis ab. Dies kann mit nur wenigen Codezeilen realisiert werden.

Der gesamte Code für die Realisierung des Grid-Tests kann dem Anhang im Kapitel 14.3.2 entnommen werden.

5 Neuronales Netz 5.6 Lamellenpilze Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 26

5.6 Lamellenpilze Testreihe 1

Auf den folgenden Seiten werden die Grid-Tests mit mehreren Testreihen der Lamellenpilze genau erläutert.

Dabei wird jeweils auf die Konfiguration, die Ergebnisse und eine daraus folgende Diskussion eingegangen. Mit

einem kurzen Fazit wird die Testreihe anschliessend abgeschlossen.

5.6.1 Konfiguration

Für den ersten Test wurden folgende Parameter getestet und verglichen:

Pilze: Fliegenpilz, Gelber-Knollenblätterpilz, Grüner-Knollenblätterpilz, Grauer-

Wulstling, Pantherpilz, Perlpilz, Pfifferling

Bildgrösse: 64x64 Pixel, 128x128 Pixel

Farbkanäle: 3

Batchgrösse: 256 (64x64 Pixel), 128 (128x128 Pixel)

Anzahl convolutional layer: 2, 3, 4

Filtergrösse: [10, 10], [8, 8], [6, 6], [4, 4]

[10 ,8, 6], [8, 8, 6], [8, 6, 4], [6, 6, 4]

[10, 8, 6, 6], [8, 8, 6, 4], [8, 6, 6, 4], [8, 6, 4, 4]

Anzahl Filter: 32

Grösse fully connected layer: 32, 64, 128

Lernrate: 0.0001

Anzahl Epochen: 100

5.6.2 Ergebnis

Mithilfe dieser Parameter wurden 72 verschiedene neuronale Netze trainiert und verglichen. Das Ergebnis der

fünf besten neuronalen Netze wird in Tabelle 4 in gekürzter Form dargestellt. Alle Testresultate sind dem Anhang

im Kapitel 14.5 Testergebnisse Grid-Tests zu entnehmen.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer size

Validation

accuracy

Validation loss

128x128 3 [6,6,4] 64 80.5 % 1.394

128x128 3 [8,6,4] 128 79.7 % 0.816

64x64 3 [6,6,4] 128 78.1 % 1.016

128x128 4 [8,6,4,4] 64 78.1 % 1.112

128x128 2 [4,4] 128 78.1 % 1.395

Tabelle 4 Ergebnis der fünf besten neuronalen Netze der 1. Testreihe (Lamellenpilze)

5 Neuronales Netz 5.6 Lamellenpilze Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 27

In der Abbildung 48 und Abbildung 49 ist das neuronale Netze dargestellt, welches die höchste validation

accuracy mit rund 80 % erreicht hat. Sehr auffällig sind die Sprünge in der validation accuracy, welche in den

Tests aller Lamellenpilze vorkommen. In weiteren Tests auf Bildern der Röhrlinge, welche im Kapitel 5.10 bis 5.12

dokumentiert sind, wurde ein solcher Effekt nicht mehr verzeichnet. Zurückzuführen ist dies auf die Batchgrösse,

welche bei den Tests der Lamellenpilze durch die Grafikkarte NVIDIA GeForce GTX 1080 Ti auf 128 Bilder pro

Batch, aufgrund des Speicherbedarfs, begrenzt ist. Bei den Tests mit den Bildern der Röhrlinge und einer

Batchgrösse von 256 Bilder pro Batch ist dieses Sprungverhalten nicht mehr festzustellen. Diese Tests wurden

auf der noch stärkeren Grafikkarte NVIDA Tesla V100 mit einem grösseren Speicher von 16GB durchgeführt,

weshalb die Batchgrösse auf 256 Bilder pro Batch erhöht werden konnte.

Abbildung 48 Graph accuracy Lamellenpilze Testreihe 1 – In der Abbildung ist das neuronale Netze dargestellt, welches die höchste

validation accuracy mit rund 80 % erreicht hat.

Abbildung 49 Graph loss Lamellenpilze Testreihe 1 – Die Abbildung zeigt, dass das Problem des Übertrainings immer noch besteht, da der

loss ab der 20. Epoche stetig ansteigt.

5 Neuronales Netz 5.6 Lamellenpilze Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 28

5.6.3 Diskussion

5.6.3.1 Graph

Abgesehen von den Sprüngen, welche sehr markant sind, ist ein viel besseres Ergebnis als mit allen 15 Pilzarten

zu verzeichnen. Das Problem des Übertrainings besteht jedoch immer noch, denn der loss erhöht sich nach 20

Epochen stetig.

5.6.3.2 Tabelle

Aus der Auswertung aller Tests in der Excel-Tabelle wird ersichtlich, dass sich hauptsächlich zwei Parameter auf

das Resultat auswirken. Dies sind die Filtergrösse und die Bildeingangsgrösse.

Bei den Bildergrössen ist zu vermerken, dass die neuronalen Netze mit Bildern der Grösse 128x128 Pixel

tendenziell bessere Resultate liefern. Vier der fünf besten Resultate wurden auf dieser Bildeingangsgrösse erzielt.

Ein ebenfalls wichtiger Faktor zeigte sich in den Filtergrössen. Hier wurden stets bessere Resultate mit kleineren

Filtergrössen erzielt.

5.6.3.3 Confusion Matrix

Anhand der Confusion Matrix der Abbildung 50 sieht

man sehr gut, dass der Fliegenpilz und der Pfifferling

kaum falsch klassifiziert werden. Bei den anderen

Pilzen kommt es häufiger zu Fehlklassifizierungen, was

daran liegt, dass sich die Pilze sehr ähneln. Insgesamt

werden bei diesem Validierungsbatch 103 von 128

Pilzen richtig klassifiziert, was zu einer Trefferquote

von rund 80 % führt.

Abbildung 50 Confusion Matrix 1. Testreihe Lamellenpilze – Die

Confusion Matrix zeigt deutlich, dass die Fliegenpilze und Pfifferlinge

kaum falsch klassifiziert werden. Insgesamt werden 103 von 128 Pilzen

richtig klassifiziert, was zu einer Trefferquote von rund 80 % führt.

5.6.4 Fazit

Anhand der Resultate wird ersichtlich, dass die fünf besten Ergebnisse mit den kleineren Filtern erzielt werden,

weshalb in einem zweiten Test der Fokus auf kleinere Filter gelegt und dieser Parameter noch ausgiebiger

getestet wird. Das Problem des ständig ansteigenden loss wird im nächsten Test ebenfalls unter die Lupe

genommen. Dies wird mit einem Test mit verschiedenen Lernraten realisiert.

5 Neuronales Netz 5.7 Lamellenpilz Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 29

5.7 Lamellenpilz Testreihe 2

5.7.1 Konfiguration

Für den zweiten Test wurden folgende Parameter getestet und verglichen:

Pilze: Fliegenpilz, Gelber-Knollenblätterpilz, Grüner-Knollenblätterpilz, Grauer-

Wulstling, Pantherpilz, Perlpilz, Pfifferling

Bildgrösse: 64x64 Pixel, 128x128 Pixel

Farbkanäle: 3

Batchgrösse: 256 (64x64 Pixel), 128 (128x128 Pixel)

Anzahl convolutional layer: 2, 3, 4, 5

Filtergrösse: [6, 6], [6, 4], [4, 4], [3, 3]

[6, 6, 4], [6, 4, 4], [4, 4, 4], [3, 3, 3]

[6, 6, 6, 4], [6, 6, 4, 4], [4, 4, 4, 4], [3, 3, 3, 3]

[6, 6, 6, 6, 4], [6, 6, 4, 4, 4], [4, 4, 4, 4, 4], [3, 3, 3, 3, 3]

Anzahl Filter: 32

Grösse fully connected layer: 64, 128, 256

Lernrate: 0.0001, 0.001

Anzahl Epochen: 100

5.7.2 Ergebnis

In unserer zweiten Testreihe zur Klassifizierung der Lamellenpilze wurden mithilfe der obenstehenden Parameter

192 verschiedene neuronale Netze trainiert und verglichen. Das Ziel lag darin, kleinere Filtergrössen

untereinander zu vergleichen und eine definitive Bildgrösse für die weiteren Tests festzulegen. Wiederum

werden die fünf besten Resultate in Tabelle 5 dargestellt. Die restlichen Testresultate sind dem Anhang im Kapitel

14.5 Testergebnisse Grid-Tests zu entnehmen.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer size

Validation

accuracy

Validation loss

128x128 5 [4,4,4,4,4] 128 85.2 % 1.528

128x128 4 [3,3,3,3] 256 84.4 % 0.640

128x128 5 [6,6,4,4,4] 256 84.4 % 1.203

128x128 5 [6,6,4,4,4] 128 83.6 % 1.052

64x64 4 [3,3,3,3] 256 83.2 % 1.356

Tabelle 5 Ergebnis der fünf besten neuronalen Netze der 2. Testreihe (Lamellenpilze)

5 Neuronales Netz 5.7 Lamellenpilz Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 30

In der Abbildung 51, sowie in der Abbildung 52 ist das neuronalen Netze dargestellt, welches die höchste

validation accuracy erreicht hat.

Abbildung 51 Graph accuracy Lamellenpilze Testreihe 2 – Gut ersichtlich ist, dass das neuronale Netz extrem schnell lernt. Bereits nach

wenigen Epochen wird eine validation accuracy von über 50 % erreicht. Nach 12 Epochen werden sogar schon über 75 % erreicht.

Abbildung 52 Graph loss Lamellenpilze Testreihe 2 – Auch in dieser Abbildung wird ersichtlich, dass das neuronale Netz ab Epoche 30 mit

dem Übertraining zu kämpfen hat.

5.7.3 Diskussion

5.7.3.1 Graph

Gut ersichtlich ist, dass das neuronale Netz extrem schnell lernt. Bereits nach wenigen Epochen wird eine

validation accuracy von über 50 % erreicht. Nach 12 Epochen werden gar über 75 % erreicht, was als ein gutes

Resultat interpretiert werden kann. Danach stagniert die validation accuracy und der loss pendelt sich ein, bevor

dieser nach oben geht. Das beste Resultat wird dann knapp vor 60 Epochen erreicht. In diesem Teil befindet sich

das Netz jedoch schon leicht in einem Übertraining, was am höheren loss zu erkennen ist.

5 Neuronales Netz 5.7 Lamellenpilz Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 31

5.7.3.2 Tabelle

Hier wird ganz klar gezeigt, dass sich etwas kleinere Filter besser zur Erkennung von Pilzen eignen. Insgesamt

erreichen 24 Netze den vorherigen Bestwert von 80.4 % in der validation accuracy. Das allerbeste Netz erreicht

sogar 85.2 %, was mit beinahe 5 % Steigerung eine klare Verbesserung darstellt.

Ein weiterer Parameter, welcher grosse Unterschiede in der Performance der neuronalen Netze darstellt, ist die

Anzahl der convolutional layer. Am unteren Ende der Tabelle angesiedelt sind die Netze mit zwei und drei

convolutional layer. Die besseren Netze sind meist mit vier oder fünf convolutional layer ausgestattet. Nur

einzelne Ausreisser mit drei convolutional layer sind in der oberen Tabellenhälfte angesiedelt.

Ein ähnlicher Effekt wird wiederum in der Bildgrösse entdeckt. Die Netze mit den grösseren Bildern (128x128

Pixel) als Input verzeichnen generell bessere Resultate als solche mit einem Input von Bildern mit 64x64 Pixel.

5.7.3.3 Confusion Matrix

Die Confusion Matrix, welche in der Abbildung 53

ersichtlich ist, zeigt erneut relativ klar, wo das

neuronale Netz Probleme bei der Klassifizierung hat.

Die Unterscheidung zwischen den beiden Knollen-

blätterpilzen fällt dem neuronalen Netz schwer und

führt immer wieder zu Fehlklassifizierungen. Das

gleiche Problem zeichnet sich beim Pantherpilz und

dem grauen Wulstling ab. Pilze wie der Fliegenpilz

oder der Pfifferling, die sich auch für das menschliche

Auge klar von den anderen Pilzen unterscheiden

lassen, werden kaum falsch klassifiziert.

Abbildung 53 Confusion Matrix 2. Testreihe Lamellenpilze – Die

Confusion Matrix zeigt, dass das neuronale Netz Schwierigkeiten hat, die

beiden Knollenblätterpilze zu unterscheiden.

5.7.3.4 Vergleich Lernraten

In der Abbildung 54 und Abbildung 55, welche auf der nächsten Seite ersichtlich sind, wurden die accuracy und

der loss der Trainings- und Validierungs-Daten von zwei neuronalen Netzen abgebildet, die sich nur durch

unterschiedliche Lernraten unterscheiden. Es ist sehr gut zu erkennen, dass das neuronale Netz mit der höheren

Lernrate sehr viel schneller bei den gegebenen Trainingsdaten lernt. Die validation accuracy pendelt sich bereits

nach kurzer Zeit zwischen 65 % und 80 % ein. Man sieht allerdings auch, dass der validation loss bereits nach 10

Epochen wieder anfängt zu steigen, was auf ein Übertraining hindeutet. Zudem wird der loss bedeutend grösser,

wenn die Lernrate grösser gewählt wird.

5 Neuronales Netz 5.7 Lamellenpilz Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 32

Abbildung 54 Graph accuracy Vergleich Lernraten – Anhand dieser Abbildung ist sehr gut zu erkennen, dass das neuronale Netz mit der

höheren Lernrate sehr viel schneller bei den gegebenen Trainingsdaten lernt.

Abbildung 55 Graph loss Vergleich Lernraten – Die Abbildung zeigt, dass der loss bedeutend grösser wird, wenn die Lernrate grösser

gewählt wird.

5.7.4 Fazit

Das Resultat der zweiten Testreihe hat erneut gezeigt, dass mit den grösseren 128x128 Pixel grossen Bildern

allgemein die besseren Ergebnisse erzielt werden können, weshalb keine weiteren Tests mit 64x64 Pixel grossen

Bildern durchgeführt werden. Zudem ist ersichtlich, dass die Pilze besser klassifiziert werden, wenn das

neuronale Netz mindestens vier convolutional layer besitzt. Bezüglich der Filtergrössen wird weiter mit kleinen

Grössen gearbeitet, da diese zu klar besseren Resultaten geführt haben.

Da keine Verbesserung durch eine Erhöhung der Lernrate erzielt werden konnte, werden in einer dritten

Testreihe Versuche mit einer kleineren Lernrate durchgeführt.

5 Neuronales Netz 5.8 Lamellenpilze Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 33

5.8 Lamellenpilze Testreihe 3

5.8.1 Konfiguration

Für die dritte Testreihe wurden folgende Parameter getestet und verglichen:

Pilze: Fliegenpilz, Gelber-Knollenblätterpilz, Grüner-Knollenblätterpilz, Grauer-

Wulstling, Pantherpilz, Perlpilz, Pfifferling

Bildgrösse: 128x128 Pixel

Farbkanäle: 3

Batchgrösse: 128

Anzahl convolutional layer: 4, 5

Filtergrösse: [6, 6, 6, 4], [6, 6, 4, 4], [4, 4, 4, 4], [4, 4, 3, 3], [3, 3, 3, 3]

[6, 6, 6, 6, 4], [6, 6, 4, 4, 4], [4, 4, 4, 4, 4], [4, 4, 3, 3, 3], [3, 3, 3, 3, 3]

Anzahl Filter: 32

Grösse fully connected layer: 64, 128, 256

Lernrate: 0.00001

Anzahl Epochen: 300

5.8.2 Ergebnis

Ziel dieses Tests war die Reduktion des Übertrainings durch eine kleinere Lernrate. Diese Reduktion zog auch

eine Erhöhung der Epochen mit sich, wodurch die Trainingszeit des neuronalen Netzes bedeutend länger wurde.

Die fünf besten Resultate des Tests werden in Tabelle 6 aufgezeigt. Alle Daten und die restlichen Tests können

dem Anhang im Kapitel 14.5 Testergebnisse Grid-Tests entnommen werden.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer size

Validation

accuracy

Validation loss

128x128 4 [4, 4, 3, 3] 256 84.4 % 0.800

128x128 4 [4, 4, 3, 3] 64 83.6 % 0.703

128x128 5 [3, 3, 3, 3, 3] 256 82.8 % 0.792

128x128 5 [6, 6, 4, 4, 4] 64 82.8 % 0.620

128x128 4 [6, 6, 4, 4] 256 82.0 % 0.815

Tabelle 6 Ergebnis der fünf besten neuronalen Netze der 3. Testreihe (Lamellenpilze)

5 Neuronales Netz 5.8 Lamellenpilze Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 34

Das beste Resultat der dritten Testreihe ist in der Abbildung 56 und Abbildung 57 dargestellt. Durch die

Verkleinerung der Lernrate konnte das Netz viel langsamer trainiert werden. Die Anzahl der Epochen musste auf

300 erhöht werden, damit das Netz eine training accuracy von über 90 % erreichen konnte.

Abbildung 56 Graph accuracy Lamellenpilze Testreihe 3 – Ca. bis zur 150. Epoche kann die validaiton accuracy mit der training accuracy

mithalten, danach steigt nur noch die training accuracy an.

Abbildung 57 Graph loss Lamellenpilze Testreihe 3 – Sehr gut ersichtlich wird in dieser Abbildung , dass sich der validation loss erst nach

150 Epochen erhöht und damit der Effekt des Übertrainings wesentlich verringert werden konnte.

5.8.3 Diskussion

5.8.3.1 Graph

Sehr gut ersichtlich wird in der Abbildung 57, dass sich der validaiton loss erst nach 150 Epochen erhöht und

damit der Effekt des Übertrainings wesentlich verringert werden konnte. Dies ist auch in Abbildung 56 zu

beobachten. Bis ca. 150 Epochen kann die validation accuracy mit der training accuracy mithalten, danach erhöht

sich die training accuracy und die validation accuracy stagniert.

5 Neuronales Netz 5.8 Lamellenpilze Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 35

5.8.3.2 Tabelle

Mit einem Resultat von 84.4 % ist das Ergebnis nur leicht schlechter wie jenes der 2. Testreihe. Auffällig ist, dass

der validaiton loss in allen Tests sehr niedrig ausfällt. Dies liegt an der niedrigeren Lernrate, welche das

Übertraining verringert. Auch wieder gut ersichtlich wird, dass die kleineren Filter generell bessere Resultate

liefern wie grössere Filter.

Kein eindeutiges Resultat können die Parameter fully connected layers size und number of convolutional layer

liefern. Daher kann kein eindeutiges Fazit über die optimale Grösse des neuronalen Netzes gezogen werden.

5.8.3.3 Confusion Matrix

In der Abbildung 58 ist erneut die Confusion Matrix

der Validierungsdaten abgebildet. In dieser Epoche

wird die höchste validation accuracy von 84.4 %

erreicht. Die Fliegenpilze und die Pfifferlinge werden

wie erwartet nahezu fehlerfrei klassifiziert. Bei den

restlichen Pilzen sind die Fehlklassifizierungen

relativ homogen verteilt.

Abbildung 58 Confusion Matrix 3. Testreihe Lamellenpilze – In dieser

Abbildung ist ausser bei den Fliegenpilzen und den Pfifferlingen eine

relativ homogene Verteilung an Fehlklassifizierungen zu beobachten.

5.8.4 Fazit

Durch die Verringerung der Lernrate wird im Verglich zur 2. Testreihe kein besseres Ergebnis erzielt. Die kleinere

Lernrate vermeidet aber das Übertraining, was sich in einem generell tieferen loss auswirkt.

Ein wesentlicher Aspekt des Trainings des neuronalen Netzes bildet jedoch auch die benötigte Trainingszeit.

Diese wird durch die Verringerung der Lernrate und der damit verbundenen Erhöhung der Anzahl Epochen

enorm in die Länge gezogen.

5 Neuronales Netz 5.9 Fazit Testreihen Lamellenpilze

06.08.2018 Riccardo Jung, Dominik Wagner 36

5.9 Fazit Testreihen Lamellenpilze

Zur besseren Übersicht über alle Testreihen werden die besten zehn Resultate in der Tabelle 7 aufgeführt.

Testreihe Image size

[Pixel]

Lernrate Filter size Fully

connected

layer size

Validation

accuracy

Validation

loss

2 128x128 0.001 [4,4,4,4,4] 128 85.2 % 1.528

2 128x128 0.0001 [3,3,3,3] 256 84.4 % 0.640

3 128x128 0.00001 [4, 4, 3, 3] 256 84.4 % 0.800

2 128x128 0.001 [6,6,4,4,4] 256 84.4 % 1.203

3 128x128 0.00001 [4, 4, 3, 3] 64 83.6 % 0.703

2 128x128 0.001 [6,6,4,4,4] 128 83.6 % 1.052

2 64x64 0.001 [3,3,3,3] 256 83.2 % 1.356

3 128x128 0.00001 [3, 3, 3, 3, 3] 256 82.8 % 0.792

3 128x128 0.00001 [6, 6, 4, 4, 4] 64 82.8 % 0.620

2 128x128 0.001 [3,3,3,3,3] 64 82.8 % 1.037

Tabelle 7 Übersicht der zehn besten neuronalen Netze aller Testreihen (Lamellenpilze)

Die besten Resultate werden allesamt in der 2. und 3. Testreihe erzielt.

Ein eindeutiger Parameter, welcher bei allen Tests zu ähnlichen Resultaten führte, ist die Bildgrösse. Hier werden

mit einer Bildgrösse von 128x128 Pixel meist die besten Ergebnisse erzielt, nur einzelne Ausreisser, wie dies beim

siebtbesten Netz der Fall ist, sind zu verzeichnen. Ebenso ein eindeutiges Ergebnis bringt die Filtergrösse hervor.

In Architekturen mit kleineren Filtergrössen werden generell bessere Resultate erzielt.

In der 3. Testreihe wurde sehr gut ersichtlich, dass sich die kleinere Lernrate positiv auf das Übertraining auswirkt.

Dieser Effekt ist sehr gut in den Abbildungen des validation loss zu beobachten. Dieser befindet sich durch eine

kleinere Lernrate viel länger im Abwärtstrend, als dies bei grösseren Lernraten von 0.0001 der Fall ist. Da dieser

Test jedoch leicht schlechtere Resultate zur Folge hatte, werden Lernraten von 0.001 oder 0.0001 in unserem

Fall leicht bevorzugt.

Alle anderen Parameter müssen durch etliche Tests ausprobiert werden, damit man das beste Netz für die

Pilzsuche bestimmen kann. Daher ist eine eindeutige beste Architektur nicht generell zu erwähnen, sondern

muss stets auf die Inputdaten angepasst und durch Tests validiert werden. In unserem Fall mit den

Lamellenpilzen entscheiden wir uns für das neuronale Netz an 2. Stelle.

Doch wieso wird nun nicht das etwas bessere Netz für die Vorhersage der Pilze verwendet? Dies lässt sich durch

einen kurzen Blick auf die Tabelle 7 begründen. Der validation loss beim neuronalen Netz an zweiter Stelle ist

wesentlich niedriger, was auf eine exaktere Vorhersage hindeutet. Aus diesem Grund wird für die

Webapplikation das zweitbeste neuronale Netz verwendet.

5 Neuronales Netz 5.9 Fazit Testreihen Lamellenpilze

06.08.2018 Riccardo Jung, Dominik Wagner 37

In der Abbildung 59 ist die von uns ausgewählte Architektur mit vier convolutional layer dargestellt. Mit dieser

Architektur gibt es 555’751 verschiedene Parameter, die optimiert werden mussten, um eine möglichst gute

Klassifizierung zu erhalten. Die Anzahl an Parameter ist im Vergleich zu den Anzahl Trainingsbilder um den Faktor

15 grösser, was definitiv nicht optimal ist. Da dieses neuronale Netz allerdings bessere Ergebnisse erzielte als

andere neuronale Netze mit weniger Parameter und wir keine Möglichkeit hatten, die Anzahl an Trainingsdaten

zu erhöhen, wurde trotzdem dieses Netz für die Webapplikation verwendet.

Abbildung 59 Architektur neuronales Netz Lamellenpilze – Die Abbildung zeigt sehr schön die Architektur des besten neuronalen Netzes,

welches aus vier convolutional layer und insgesamt zwei fully connected layer besteht.

5 Neuronales Netz 5.10 Röhrlinge Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 38

5.10 Röhrlinge Testreihe 1

Auf den nachfolgenden Seiten werden die Tests mit den Röhrlingen dokumentiert. Diese wurden parallel zu den

Tests mit den Lamellenpilzen auf der Grafikkarte des Clusters der HSR durchgeführt, weshalb sich einige

Erkenntnisse wiederholen werden. Diese werden aber der Vollständigkeit halber trotzdem dokumentiert.

5.10.1 Konfiguration

Für den ersten Test wurden folgende Parameter getestet und verglichen:

Pilze: Sommer-Steinpilz, Kiefern-Steinpilz, Gemeiner-Steinpilz, Schwarzhütiger-

Steinpilz, Butterpilz, Gold-Röhrling, Sand-Röhrling, Ziegenlippe

Bildgrösse: 64x64 Pixel, 128x128 Pixel, 256x256 Pixel

Farbkanäle: 3

Batchgrösse: 256

Anzahl convolutional layer: 2, 3, 4

Filtergrösse: [10, 10], [8, 8], [6, 6], [4, 4]

[10 ,8, 6], [8, 8, 6], [8, 6, 4], [6, 6, 4]

[10, 8, 6, 6], [8, 8, 6, 4], [8, 6, 6, 4], [8, 6, 4, 4]

Anzahl Filter: 32

Grösse fully connected layer: 32, 64, 128

Lernrate: 0.0001

Anzahl Epochen: 100

5.10.2 Ergebnis

Mithilfe dieser Parameter wurden 108 verschiedene neuronale Netze trainiert und verglichen. Bei diesem Test

wurden alle neuronalen Netze auf dem GPU Cluster der Hochschule in Rapperswil trainiert. Dank des grösseren

Speichers der Grafikkarte war es möglich, alle Tests mit einer Batchgrösse von 256 durchzuführen. Wie bei den

Tests mit den Lamellenpilzen werden auch hier die fünf besten Ergebnisse in Tabelle 8 dargestellt. Alle

Testresultate sind dem Anhang im Kapitel 14.5 Testergebnisse Grid-Tests zu entnehmen.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer Size

Validation

accuracy

Validation loss

64x64 2 [4,4] 32 62.9 % 1.093

64x64 3 [8,6,4] 64 61.3 % 1.541

64x64 4 [8,6,4,4] 128 61.3 % 1.105

64x64 3 [6,6,4] 128 60.9 % 2.168

64x64 4 [8,6,4,4] 64 60.2 % 1.685

Tabelle 8 Ergebnis der fünf besten neuronalen Netze der 1. Testreihe (Röhrlinge)

5 Neuronales Netz 5.10 Röhrlinge Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 39

Die Plots des besten Netzes dieser Testreihe sind in der Abbildung 60 und Abbildung 61 ersichtlich. Hier ist der

Effekt der grösseren Batchgrösse gut zu erkennen, denn die Sprünge, welche in allen Tests der Lamellenpilze zu

beobachten waren, sind nicht mehr vorhanden.

Abbildung 60 Graph accuracy Röhrlinge Testreihe 1 – Die Abbildung zeigt ein ähnliches Verhalten wie bei den Lamellenpilzen. Bereits nach

40 Epochen wird die maximale validation accuracy erreicht.

Abbildung 61 Graph loss Röhrlinge Testreihe 1 – Auch bei diesem neuronalen Netz steigt der validation loss während des Trainings wieder

an, was auf ein Übertraining hindeutet.

5.10.3 Diskussion

5.10.3.1 Graph

Ähnlich wie bei den Lamellenpilzen ist auch das Verhalten der Röhrlinge. Schon nach wenigen Epochen erreicht

die validation accuracy 50 % und die Steigung nimmt ab. Bereits nach 40 Epochen wird der Höhepunkt erreicht

und der loss wird langsam wieder höher. Auch hier besteht das Problem des Übertrainings auf den

Trainingsdaten.

5 Neuronales Netz 5.10 Röhrlinge Testreihe 1

06.08.2018 Riccardo Jung, Dominik Wagner 40

5.10.3.2 Tabelle

Mit 62.9 % fallen die Resultate einiges schlechter aus als jene der ersten Testreihe mit den Lamellenpilzen. Dies

liegt daran, dass sehr viele Pilze Ähnlichkeiten untereinander aufweisen. Genauere Resultate zu diesem Problem

werden im nächsten Abschnitt genauer betrachtet.

Grosse Filter haben auch bei diesen Pilzen zu keinem guten Ergebnis geführt. Es sind eher kleine Filtergrössen,

welche gute Resultate hervorbrachten.

Ein erstaunliches Resultat ergibt sich bei der Bildgrösse. Hier wird entgegen den Erwartungen ein besseres

Resultat mit den Bildern mit 64x64 Pixel erzielt, anstatt mit 128x128 Pixel, wie es bei den Lamellenpilzen der Fall

war.

5.10.3.3 Confusion Matrix

Die Confusion Matrix, welche in Abbildung 62

abgebildet ist, zeigt auch bei diesem Test sehr gut die

Probleme bei der Klassifizierung auf. Da sich die vier

Steinpilzarten sehr ähnlich sind, kommt es häufig zu

Fehlklassifizierungen. Viele Fehlklassifizierungen sind

auch beim Gold-Röhrling zu verzeichnen.

Abbildung 62 Confusion Matrix 1. Testreihe Röhrlinge – Die Confusion

Matrix zeigt deutlich, dass die Klassifizierung der vier Steinpilzarten

Schwierigkeiten bereitet.

5.10.4 Fazit

Die erste Testreihe zeigt, dass die Klassifizierung der Röhrlinge allgemein schlechter funktioniert als die der

Lamellenpilze. Der Hauptgrund liegt vor allem darin, dass sich die vier verschiedenen Steinpilze zum Teil sehr

ähnlich sind, und dadurch auch häufiger falsch klassifiziert werden. Da auch bei dieser Testreihe die Ergebnisse

mit den kleineren Filtern etwas besser sind, wird eine zweite Testreihe mit kleineren Filtern durchgeführt.

Überraschend ist allerdings, dass die 64x64 Pixel grossen Bilder am besten klassifiziert werden, weshalb in der

zweiten Testreihe nur noch mit den 64x64 und 128x128x Pixel grossen Bilder trainiert wird. Des Weiteren wird

in der nächsten Testreihe mit der Anzahl der Filter ein weiterer Parameter getestet.

Durch die Erhöhung der Batchgrösse auf 256 Bilder gibt es keine extremen Sprünge mehr zwischen den einzelnen

Epochen, wie es bei den Lamellenpilzen zu beobachten war.

5 Neuronales Netz 5.11 Röhrlinge Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 41

5.11 Röhrlinge Testreihe 2

5.11.1 Konfiguration

Für den zweiten Test der Röhrlinge wurden folgende Parameter getestet und verglichen:

Pilze: Sommer-Steinpilz, Kiefern-Steinpilz, Gemeiner-Steinpilz, Schwarzhütiger-

Steinpilz, Butterpilz, Gold-Röhrling, Sand-Röhrling, Ziegenlippe

Bildgrösse: 64x64 Pixel, 128x128 Pixel

Farbkanäle: 3

Batchgrösse: 256

Anzahl convolutional layer: 4, 5

Filtergrösse: [6, 6, 6, 4], [6, 6, 4, 4], [4, 4, 4, 4], [3, 3, 3, 3]

[6, 6, 6, 6, 4], [6, 6, 4, 4, 4], [4, 4, 4, 4, 4], [3, 3, 3, 3, 3]

Anzahl Filter: 32, 64

Grösse fully connected layer: 64, 128, 256

Lernrate: 0.001, 0.0001

Anzahl Epochen: 100

5.11.2 Ergebnis

Bei dieser Testreihe wurden insgesamt 192 Tests durchgeführt. Die besten fünf Resultate der Testreihe werden

in gekürzter Form in Tabelle 9 dargestellt. Die ganze Tabelle mit allen Informationen, sowie allen Tests, ist dem

Anhang im Kapitel 14.5 Testergebnisse Grid-Tests zu entnehmen.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer size

Validation

accuracy

Validation loss

64x64 5 [3, 3, 3, 3, 3] 128 69.5 % 0.971

64x64 5 [3, 3, 3, 3, 3] 256 66.4 % 0.994

128x128 5 [3, 3, 3, 3, 3] 128 66.4 % 0.976

64x64 5 [3, 3, 3, 3, 3] 256 66.0 % 1.049

64x64 4 [3, 3, 3, 3 ] 256 66.0 % 1.006

Tabelle 9 Ergebnis der fünf besten neuronalen Netze der 2. Testreihe (Röhrlinge)

Da der Graph des besten neuronalen Netzes ähnlich wie jener der letzten Testreihe ausfiel, wird auf der nächsten

Seite in der Abbildung 63 und Abbildung 64 ausnahmsweise nicht das beste Ergebnis visualisiert, sondern ein

etwas schlechteres neuronales Netz, um die Unterschiede aufzuzeigen.

5 Neuronales Netz 5.11 Röhrlinge Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 42

Abbildung 63 Graph accuracy Röhrlinge Testreihe 2 – Diese Abbildung zeigt die accuracy eines schlechten Resultats.

Abbildung 64 Graph loss Röhrlinge Testreihe 2 – Diese Abbildung zeigt den grossen Unterschied zu den guten Ergebnissen. Der validation

loss steigt bei diesem neuronalen Netz viel stärker an, als bei besseren neuronalen Netzen.

5.11.3 Diskussion

5.11.3.1 Graph

Wie schon auf der vorherigen Seite erwähnt, handelt es sich bei dieser Betrachtung des Graphen um ein

schlechtes Resultat.

In der Abbildung 63 sind keine grossen Unterschiede zu einem Graph mit besseren Resultaten zu sehen. Einzig

die maximal erreichte accuracy ist tiefer. Der grosse Unterschied von guten zu schlechten Resultaten ist in der

Abbildung 64 im loss zu finden. Bei der ersten Betrachtung werden kaum Unterschiede entdeckt, wenn man

allerdings genauer hinsieht, erkennt man, dass sich der Wertebereich beim schlechten Ergebnis in einem

grösseren Rahmen bewegt. Bei guten Resultaten variiert dieser im Bereich von 20 bis 100 Epochen um ca. 0.2.

Beim schlechten Netz variiert dieser im gleichen Bereich um mehr als 1, was somit auch zum schlechten Resultat

führt.

5 Neuronales Netz 5.11 Röhrlinge Testreihe 2

06.08.2018 Riccardo Jung, Dominik Wagner 43

5.11.3.2 Tabelle

Durch die Veränderung der Parameter können um knapp 7 % bessere Resultate als in der ersten Testreihe

erreicht werden. Der grösste Einfluss auf das Ergebnis hat die Anzahl der convolutional layer. Bei der letzten

Testreihe wurden nur bis vier convolutional layer getestet. Durch das Hinzufügen eines weiteren layer können

nun in dieser Testreihe signifikant bessere Resultate erzielt werden. Unter den zehn besten Architekturen aus

diesem Test sind deren sieben mit fünf convolutional layer ausgestattet. Die kleinen Filtergrössen verzeichnen

auch hier bessere Resultate als die grossen Filter mit einer Grösse von sechs Pixeln.

In diesem Test werden bessere Resultate mit Bildern der Grösse 64x64 Pixel erreicht. Es sind nur einzelne gute

Resultate mit Bildern der Grösse von 128x128 Pixel in der obersten Tabellenhälfte zu finden.

Ein weiterer Parameter, welcher in diesem Test genauer unter die Lupe genommen wurde, war die Anzahl der

Filter, welche ein convolutional layer besitzt. Es wurden sowohl 32, wie auch 64 Filter getestet. Aus den

Resultaten wird ersichtlich, dass 32 Filter generell bessere Resultate hervorbringen als 64 Filter. Einzelne gute

Resultate mit 64 Filtern pro convolutional layer sind in der oberen Tabellenhälfte zu sehen, jedoch häufen sich

diese eher in der unteren Hälfte.

5.11.3.3 Confusion Matrix

In der Confusion Matrix des besten Netzes aus dieser

Testreihe, welche in Abbildung 65 zu sehen ist, kann

man wiederum die Probleme der Klassifizierung

aufzeigen. Diese sind vorwiegend bei den vier

verschiedenen Steinpilzen zu beobachten. Doch auch

bei den anderen Pilzen wie dem Sandröhrling oder

der Ziegenlippe sind einige Fehlklassifizierungen zu

verzeichnen.

Abbildung 65 Confusion Matrix 2. Testreihe Röhrlinge – Die Probleme bei

der Klassifizierung der Steinpilzarten sind auch bei dieser Confusion

Matrix eindeutig zu erkennen.

5.11.4 Fazit

Diese Testreihe hat bereits einige bessere Resultate als die letzte Testreihe hervorgebracht. Der wohl grösste

Einfluss hat dabei die Anzahl convolutional layer. Andere Parameter, welche in diesem Test verändert wurden,

wie die Anzahl der Filter, werden aufgrund von schlechteren Ergebnissen nicht mehr verfolgt. Da die Lernrate

einen sehr grossen Einfluss bei den Lamellenpilzen hatte, wird auch dieser Parameter in den nächsten Tests

untersucht. Dazu wird die Lernrate auf 10-5 eingestellt, und die Anzahl Epochen auf 300 erhöht, damit man in der

training accuracy nahe an die 100 % und somit in den Bereich des Übertrainings kommt.

5 Neuronales Netz 5.12 Röhrlinge Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 44

5.12 Röhrlinge Testreihe 3

5.12.1 Konfiguration

Für die dritte Testreihe der Röhrlinge wurden folgende Parameter getestet und verglichen:

Pilze: Sommer-Steinpilz, Kiefern-Steinpilz, Gemeiner-Steinpilz, Schwarzhütiger-

Steinpilz, Butterpilz, Gold-Röhrling, Sand-Röhrling, Ziegenlippe

Bildgrösse: 64x64 Pixel, 128x128 Pixel, 256x256 Pixel

Farbkanäle: 3

Batchgrösse: 128

Anzahl convolutional layer: 4, 5

Filtergrösse: [6, 6, 6, 4], [6, 6, 4, 4], [4, 4, 4, 4], [4, 4, 3, 3], [3, 3, 3, 3]

[6, 6, 6, 6, 4], [6, 6, 4, 4, 4], [4, 4, 4, 4, 4], [4, 4, 3, 3, 3], [3, 3, 3, 3, 3]

Anzahl Filter: 32, 64

Grösse fully connected layer: 64, 128, 256

Lernrate: 0.00001

Anzahl Epochen: 300

5.12.2 Ergebnis

Zu guter Letzt wurden nochmals Tests mit 90 verschiedenen neuronalen Netzen gestartet. Dabei wurde entgegen

den Erkenntnissen der vorherigen Tests nochmals die Bildgrösse auf 256x256 als Input getestet. Nach zwei Tests

wurden die Tests mit so grossen Bildern jedoch vom Programm beendet, da der Speicherbedarf für ein Netz

dieser Grösse (mit der Verwendung von vier oder fünf convolutional layer) derjenigen der Grafikkarte

überschritten hatte. Deswegen konnten keine weiteren Tests mit der Bildgrösse 256x256 Pixel durchgeführt

werden. In der Excel-Tabelle sind alle Tests aufgeführt, welche mit der gegebenen Hardware durchgeführt

werden konnten. Insgesamt sind dies 60 verschiedene Architekturen. Die besten fünf Ergebnisse können der

Tabelle 10 entnommen werden. Die restlichen Resultate können dem Anhang im Kapitel 14.5 Testergebnisse

Grid-Tests entnommen werden.

Image size

[Pixel]

Number of

convolutional

layer

Filter size Fully connected

layer size

Validation

accuracy

Validation loss

128x128 5 [4, 4, 3, 3, 3 ] 256 75.0 % 0.862

128x128 5 [3, 3, 3, 3, 3 ] 128 75.0 % 0.879

64x64 5 [4, 4, 3, 3, 3 ] 256 73.4 % 0.908

128x128 5 [4, 4, 3, 3, 3 ] 128 73.4 % 0.838

64x64 4 [4, 4, 3, 3] 256 72.7 % 0.912

Tabelle 10 Ergebnis der fünf besten neuronalen Netze der 3. Testreihe (Röhrlinge)

5 Neuronales Netz 5.12 Röhrlinge Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 45

Die Abbildung 66 und Abbildung 67 zeigen wieder die accuracy sowie den loss, welche beim besten neuronalen

Netz erreicht wurde. Aufgrund der Tests mit den grösseren Bildern wurden in diesem Test alle Netze mit der

Batchgrösse von 128 Bilder pro Batch trainiert. Dies wiederspiegelt sich im Graph, da in den Validierungs-

ergebnissen wieder grosse Sprünge zu beobachten sind.

Abbildung 66 Graph accuracy Röhrlinge Testreihe 3 – In dieser Abbildung fallen die starken Sprünge zwischen den einzelnen Epochen auf,

die auf die kleinere Batchgrösse zurückzuführen sind.

Abbildung 67 Graph loss Röhrlinge Testreihe 3 – Der in dieser Abbildung dargestellte validation loss steigt erst gegen Ende des Trainings

ein wenig an, was darauf hindeutet, dass das neuronale Netz kaum übertrainiert.

5.12.3 Diskussion

5.12.3.1 Graph

Wie schon erwähnt sind die Sprünge wegen der kleinen Batchgrösse wieder zu beobachten. Abgesehen von

diesen ist im loss der Abbildung 67 eine sehr schöne Lernkurve zu sehen. Bis ca. zur Epoche 100 kann dieser gar

mit dem training loss mithalten. Danach stagniert dieser und gegen den Schluss erhöht sich dieser gar leicht. Ein

ähnliches Ergebnis ist in der Abbildung 66 der accuracy zu beobachten. Die besten Gewichtungen findet das Netz

erst nach 230 Epochen, was bedeutet, dass sich das Netz bis zu diesem Zeitpunkt noch in keinem Übertraining

befindet. In den letzten 10 Epochen kann dann von Übertraining der Daten gesprochen werden, da die training

accuracy einen Anstieg verzeichnet und die validation accuracy immer auf demselben Level bleibt.

5 Neuronales Netz 5.12 Röhrlinge Testreihe 3

06.08.2018 Riccardo Jung, Dominik Wagner 46

5.12.3.2 Tabelle

Mit einem besten Ergebnis von 75 % können durch diese Veränderungen in der Testreihe 3 eine Steigerung von

5 % gegenüber der Testreihe 2 erreicht werden. In der Tabelle 10 zu sehen ist, dass die Bildgrösse des Netzinputs

für 64x64 und 128x128 Pixel gute Resultate hervorbringt. Die besten zwei Resultate werden jedoch mit

128x128 Pixel grossen Bildern erreicht.

In dieser Testreihe sind unter den besten fünf neuronalen Netzen deren vier Netze mit fünf convolutional layer.

Die Filtergrössen sind immer noch in eher kleineren Filtern der Grösse drei oder vier Pixel zu finden.

Bei der Grösse des fully connected layer zeichnet sich wiederum ein nicht so klares Ergebnis ab. Unter den zehn

besten Resultaten ist eine relativ homogene Verteilung aller getesteten Grössen zu vermerken. Aufgrund dessen

kann hier keine eindeutige Grösse für die Architektur festgestellt werden.

5.12.3.3 Confusion Matrix

In der Confusion Matrix der Abbildung 68 zeichnet sich

wieder ein klares Resultat ab. Auch hier werden die

Probleme der Klassifizierung sehr schön aufgezeigt. Die

meisten Fehlklassifizierungen sind bei den Steinpilzen

zu vermerken. Alleine bei diesen vier Arten sind 23

Fehlklassifizierungen zu verschreiben, was eine

Einbusse in der validation accuracy von knapp 18 %

ausmacht. Ansonsten sind nicht viele Fehler in den

Klassifizierungen festzustellen.

Abbildung 68 Confusion Matrix 3. Testreihe Röhrlinge – Die Confusion

Matrix zeigt, dass alleine bei den Steinpilzarten 23 Fehlklassifizierungen

auftreten, was eine Einbusse von knapp 18 % in der validation accuracy

bedeutet. Ansonsten sind nicht viele Fehlklassifizierungen zu vermerken.

5.12.4 Fazit

Durch diese Testreihe kann erneut eine gute Verbesserung in der validation accuracy erreicht werden. Mit 75 %

ist eine Steigerung von 25 % gegenüber der ersten Testreihe zu verzeichnen. Sieht man von den

Fehlklassifizierungen der Steinpilze ab, so wird eine validation accuracy von 93 % bei den Röhrlingen erreicht,

was ein sehr gutes Resultat darstellt.

An den Tests der dritten Testreihe ist jedoch auch anzumerken, dass diese Testreihe extrem viel Zeit in Anspruch

genommen hat, da auf allen Netzen mit 300 Epochen gar 3mal so lange trainiert wurde wie in den vorherigen

Testreihen.

5 Neuronales Netz 5.13 Fazit Testreihen Röhrlinge

06.08.2018 Riccardo Jung, Dominik Wagner 47

5.13 Fazit Testreihen Röhrlinge

In Tabelle 11 werden die zehn besten Resultate aller Tests der Röhrlinge aufgelistet:

Testreihe Image size

[Pixel]

Lernrate Filter size Fully

connected

layer size

Validation

accuracy

Validation

loss

3 128x128 0.00001 [3, 3, 3, 3, 3 ] 128 75.0 % 0.879

3 128x128 0.00001 [4, 4, 3, 3, 3 ] 256 75.0 % 0.862

3 64x64 0.00001 [4, 4, 3, 3, 3 ] 256 73.4 % 0.908

3 128x128 0.00001 [4, 4, 3, 3, 3 ] 128 73.4 % 0.838

3 64x64 0.00001 [4, 4, 3, 3] 256 72.7 % 0.912

3 128x128 0.00001 [3, 3, 3, 3 ] 64 72.7 % 0.859

3 64x64 0.00001 [4, 4, 3, 3, 3 ] 64 72.7 % 0.835

3 64x64 0.00001 [3, 3, 3, 3 ] 64 71.9 % 0.860

3 64x64 0.00001 [3, 3, 3, 3, 3 ] 256 71.9 % 0.912

3 128x128 0.00001 [3, 3, 3, 3 ] 256 71.1 % 0.960

Tabelle 11 Übersicht der zehn besten neuronalen Netze aller Testreihen (Röhrlinge)

Auffällig ist, dass alle Resultate der Top Ten in der 3. Testreihe erreicht wurden. Dies lässt daraus folgen, dass die

Lernrate bei diesen Daten den grössten Einfluss auf das Resultat hatte.

Sehr spannend ist auch, dass viele gute Resultate mit einer Bildgrösse von 64x64 Pixel erreicht wurden. Anders

als bei den Lamellenpilzen scheinen sich diese Bilder auch mit kleineren Eingangsdaten klassifizieren zu lassen.

Trotzdem wurden die allerbesten Ergebnisse mit der Bildgrösse von 128x128 Pixel erreicht.

Wie es schon bei den Lamellenpilzen zu beobachten war, ist der Parameter fully ocnnected layer size nicht

eindeutig zu bestimmen. Auch bei den Röhrlingen muss dieser Parameter durch etliche Tests herausgefunden

werden.

Eine sehr schöne Darstellung lieferte die Confusion Matrix, durch welche die Probleme des neuronalen Netzes

sehr gut erkennbar gemacht wurden. Diese lagen vorwiegend bei den Steinpilzen. Da wir für das Training vier

verschiedene Steinpilzarten gewählt haben, wurde das Training der Röhrlinge extrem erschwert. Wenn man

diese Fehlklassifizierungen weglässt, so kann man wie in der 3. Testreihe bereits erwähnt, eine validation

accuracy von 93 % erreichen. Damit ist dieses Resultat als sehr gut einzuschätzen.

Ähnlich wie beim Fazit der Lamellenpilze wird auch hier das in der Tabelle an zweiter Stelle liegende Netz als das

beste eingestuft, da der validation loss ein wenig geringer ist.

Ein kurzer Vergleich mit der Testreihe der Lamellenpilze zeigt, dass trotz des gleichen Problems, Pilze zu

erkennen, ganz andere Architekturen für die Klassifizierung verwendet werden. Aufgrund dessen müssen bei

einer allfälligen Erweiterung der Daten wiederum Grid-Tests durchgeführt werden, damit die beste auf diese

Daten angepasste Architektur gefunden werden kann.

5 Neuronales Netz 5.13 Fazit Testreihen Röhrlinge

06.08.2018 Riccardo Jung, Dominik Wagner 48

In der Abbildung 69 ist die von uns ausgewählte Architektur mit fünf convolutional layer dargestellt. Mit dieser

Architektur gibt es 179’994 verschiedene Parameter, die optimiert werden mussten, um eine möglichst gute

Klassifizierung zu erhalten. Die Anzahl an Parameter ist im Vergleich zu der ausgewählten Architektur bei den

Lamellenpilzen um einiges geringer, da dank dem zusätzlichen Layer die Bildgrösse erneut halbiert wird, und so

die Anzahl Parameter im fully connected layer viel geringer ist.

Abbildung 69 Architektur neuronales Netz Röhrlinge – Die Abbildung zeigt sehr schön die Architektur des neuronalen Netzes, welches aus

fünf convolutional layer und insgesamt zwei fully connected layer besteht.

6 Webapplikation

06.08.2018 Riccardo Jung, Dominik Wagner 49

6 Webapplikation

Aus der Sicht der Benutzer ist die Benutzeroberfläche der wichtigste Teil der Magic Mushroom App. Es wurde

entschieden, dass die App als Webapplikation entwickelt wird, damit die Anwendung mit relativ geringem

Aufwand sowohl am Computer, als auch auf Mobilgeräten funktioniert. Die Webanwendung ist auf Deutsch als

auch auf Englisch verfügbar, damit möglichst viele potenzielle Benutzer die Magic Mushroom App verwenden

können. Der gesamte Quellcode der Webapplikation ist auf dem beigelegten USB-Stick im Verzeichnis

«Software/Web» zu finden. Die App ist unter magic.ntb.ch abrufbar.

Die Webapplikation lässt sich in zwei grundlegende Bereiche unterteilen. Zum einen können Pilze klassifiziert

werden, und zum anderen ist es auch möglich, Bilder von Pilzen auf einen Server der NTB hochzuladen, damit

die neuronalen Netze zu einem späteren Zeitpunkt mit mehr Pilzarten trainiert werden können.

Beim Zugriff auf die Webanwendung, welcher in der Abbildung 70 dargestellt ist, muss der Benutzer zuerst

bestätigen, dass er zur Kenntnis genommen hat, dass die Magic Mushroom App ein Forschungsprojekt ist und

keinen Pilzexperten ersetzen kann.

Abbildung 70 Startseite Webapplikation – Diese Abbildung zeigt die Startseite der Webapplikation, bei welcher der Benutzer

bestätigen muss, dass er alle Informationen gelesen und zur Kenntnis genommen hat.

6 Webapplikation 6.1 Pilz klassifizieren

06.08.2018 Riccardo Jung, Dominik Wagner 50

6.1 Pilz klassifiz ieren

Der Benutzer hat die Möglichkeit, mit bis zu drei Bildern einen Pilz zu klassifizieren. Er ist dabei selber

verantwortlich, dass alle Bilder vom selben Pilz stammen. Auf den Mobilgeräten hat der Benutzer zusätzlich die

Möglichkeit, direkt ein Bild mit seiner Kamera aufzunehmen. Nachdem der Benutzer ein Bild ausgewählt hat,

kann er das Bild nachträglich zuschneiden, damit der Pilz zentriert ist.

Damit die Pilze klassifiziert werden

können, muss der Benutzer neben den

Bildern auch noch weitere Informati-

onen bereitstellen. Er muss die Ent-

scheidung treffen, ob es sich um einen

Röhrling oder um einen Lamellenpilz

handelt. Falls sich der Benutzer nicht

im Klaren ist, worin die Unterschiede

liegen, kann er sich über den «Info»

Button Beispiele ansehen, die Ihn bei

seiner Entscheidung unterstützen.

Anschliessend muss der Benutzer nur

noch den ungefähren Hutdurchmesser

und die Stiellänge des Pilzes angeben,

welche er bequem über die beiden

Slider einstellen kann.

In der Abbildung 71 ist ein Beispiel

abgebildet, bei dem der Benutzer alle

Schritte durchgeführt hat und bereit

ist, seinen Pilz klassifizieren zu lassen.

In diesem Fall handelt es sich um einen

Gelben-Knollenblätterpilz, der klassifi-

ziert werden soll.

Abbildung 71 Home Webapplikation – Die Abbildung zeigt ein Beispiel, bei der ein

Benutzer alle nötigen Schritte für die Klassifizierung eines Pilzes durchgeführt hat.

Sobald der Benutzer auf den Button «Pilz bestimmen!» drückt, wird ein Formular mittels PHP an den Server

gesendet. Dieses enthält alle Informationen, die der Benutzer vorhin angegeben hat. Auf dem Server der NTB

wird anschliessend ein Python Skript ausgeführt, das die gespeicherten Modelle der neuronalen Netze lädt und

die Bilder mit den zusätzlichen Informationen den neuronalen Netzen zur Verfügung stellt. Ein Aufruf des Python

Skripts anhand des Beispiels in Abbildung 71 sähe dann folgendermassen aus:

Python predict_web.py ”Session_ID” Lamellen 10 6 img1_”Session_ID”.jpg

6 Webapplikation 6.1 Pilz klassifizieren

06.08.2018 Riccardo Jung, Dominik Wagner 51

Das neuronale Netz gibt nach der Klassifizierung die Wahrscheinlichkeiten für alle trainierten Pilzarten aus. Für

die Darstellung auf der Webapplikation wird anschliessend die höchste Wahrscheinlichkeit zusammen mit dem

Pilznamen und weiteren allgemeinen Informationen zurückgegeben. Diese Informationen werden aus dem JSON

File geholt, welches bereits für das Training der neuronalen Netze eingesetzt wurde und im Anhang im Kapitel

14.4 zu finden ist. In der Abbildung 72 ist das Resultat der Klassifizierung der letzten Seite (Abbildung 71) zu

sehen. Es wird ein Beispielbild des klassifizierten Pilzes angezeigt, damit der Benutzer der Applikation selbst auch

beurteilen kann, ob der von ihm klassifizierte Pilz in etwa gleich aussieht. Zudem werden Informationen über die

durchschnittliche Grösse und die Essbarkeit angezeigt. Über den Button «Zeige Details / Verstecke Details» kann

zusätzlich angezeigt werden, wie gross die Wahrscheinlichkeiten der anderen Pilzarten sind.

Mithilfe des «Zurück» Button gelangt der Benutzer wieder auf die ursprüngliche Seite, um weitere Pilze

klassifizieren zu lassen. In der Abbildung 72 ist das Resultat einer Klassifizierung inklusive der Detailansicht

ersichtlich.

Abbildung 72 Resultat Webapplikation – In dieser Abbildung ist das Resultat einer Klassifizierung inklusive der

Detailansicht dargestellt.

6 Webapplikation 6.2 Pilz Upload

06.08.2018 Riccardo Jung, Dominik Wagner 52

6.2 Pilz Upload

Das Ziel dieser Funktion ist es, die Datenbank der Pilze fortlaufend zu erweitern und damit auch die

Pilzklassifizierung zu verbessern, weil es wie bereits erwähnt nicht einfach ist, an genügend Daten für das Training

eines neuronalen Netzes zu gelangen.

In der Abbildung 73 ist die Visualisierung der Upload-Seite dargestellt. Der Benutzer hat die Möglichkeit, bis zu

10 MB grosse Bilder hochzuladen und für das Training von weiteren neuronalen Netzen zur Verfügung zu stellen.

Insgesamt können maximal 200 MB an Daten pro Upload hochgeladen werden und die maximale Anzahl an

Bildern ist auf 100 Stück begrenzt. Falls der Benutzer mehr Dateien ausgewählt hat oder die Dateien zu gross

sind, wird er mithilfe eines Popup Fensters dazu aufgefordert, seine Auswahl anzupassen.

Um Bilder hochzuladen, wählt der Benutzer ein Bild aus seinem Verzeichnis aus, falls er vom Computer auf die

Applikation zugreift, oder er nimmt direkt ein Bild mithilfe der Kamera seines Mobilgerätes auf. Anschliessend

gibt er an, um was für eine Pilzart es sich handelt. Sobald der Benutzer das CAPTCHA korrekt ausgefüllt hat und

auf den «Upload» Button drückt, werden die Bilder auf dem Server der NTB abgelegt. In der Abbildung 73 werden

beispielsweise fünf Bilder eines Fliegenpilzes hochgeladen.

Abbildung 73 Upload Webapplikation – Die Abbildung zeigt ein Beispiel der Uploadfunktion, bei der ein Benutzer fünf Bilder eines

Fliegenpilzes hochladen will.

6 Webapplikation 6.3 About

06.08.2018 Riccardo Jung, Dominik Wagner 53

6.2.1 Sicherheit

Die auf der letzten Seite gezeigte Funktion sieht auf den ersten Blick sehr einfach aus. Im Hintergrund müssen

allerdings einige Massnahmen getroffen werden, damit die Upload Funktion nicht missbraucht werden kann.

Folgende Funktionen wurden dafür implementiert:

- Die maximale Dateigrösse ist auf 10 MB festgelegt, was für normale Bilder völlig ausreichend ist.

- Die Gesamtgrösse aller Dateien darf maximal 200 MB betragen.

- Die maximale Anzahl Bilder pro Upload ist auf 100 Stück beschränkt.

- Bevor die Bilder hochgeladen werden können, muss der Benutzer ein CAPTCHA ausfüllen, damit ein

potenzieller Angreifer nicht ein Skript programmieren kann, welches den Server ununterbrochen mit

Bildern zumüllt.

- Die Bildgrösse wird überprüft. Falls keine Bildgrösse vorhanden ist, handelt es sich dementsprechend

nicht um ein Bild und wird nicht hochgeladen.

- Der MIME-Type (Multipurpose Internet Mail Extension) wird überprüft. Es werden nur Daten hoch-

geladen, die vom Typ «Image» sind.

- Jedem hochgeladenen Bild wird ein zufälliger Name zugewiesen, damit die Dateien nicht mehr anhand

des Dateinamens identifiziert werden können, sobald sie hochgeladen wurden. [64]

6.3 About

Die letzte Seite der Webapplikation, welche in der Abbildung 74 zu sehen ist, ist die About Seite. Hier wird in

einigen wenigen Sätzen der Sinn und Zweck der Magic Mushroom App erläutert und alle Pilzarten aufgelistet,

mit denen das neuronale Netz aktuell trainiert wurde. Zudem werden die Benutzer erneut darauf aufmerksam

gemacht, dass die Magic Mushroom App ein Forschungsprojekt ist und keinen Pilzexperten ersetzen kann.

Abbildung 74 About Webapplikation – Die Abbildung der About Seite zeigt dem Benutzer alle Pilzarten, die momentan

mithilfe des neuronalen Netzes klassifiziert werden können.

7 Schlussfolgerung

06.08.2018 Riccardo Jung, Dominik Wagner 54

7 Schlussfolgerung

Diese Arbeit hat grundsätzlich gezeigt, dass die Pilzerkennung mittels neuronalen Netzen möglich ist. Mit einer

validation accuracy von 75 % mit den Bildern der Röhrlinge und 85.2 % mit den Lamellenpilzen kann man das

Ergebnis als gut einstufen. Bei der Bearbeitung der Arbeit sind uns folgende Stichworte aufgefallen:

Vorverarbeitung und Zentrierung der Bilder, Wahl der Architektur, Trennung der Daten und zusätzliche Features.

Auf diese Punkte möchten wir in der Schlussfolgerung kurz eingehen.

Die Daten, in unserem Fall die Pilzbilder, gehören zu einem der wichtigsten Punkte bei der Arbeit mit neuronalen

Netzen. Dadurch, dass wir die Bilder ausschliesslich von Google herunterladen konnten, waren wir in diesem Fall

eingeschränkt. Durch eine saubere Vorverarbeitung der Bilder konnte dann der Datensatz generiert werden.

Dabei ist anzumerken, dass die Vorverarbeitung auch ein wesentlicher Punkt für einen guten Datensatz darstellt.

Durch eine korrekte Zentrierung kann die Qualität des Datensatzes enorm gesteigert werden. In diesem Punkt

gibt es sicherlich noch Verbesserungspotenzial auf unserem Datensatz. Als Fazit dieser Punkte muss nochmals

klargemacht werden, dass der Datensatz, und somit die Pilzbilder, der Grundstein für eine gute Klassifizierung

darstellen und somit als der wichtigste Punkt angesehen werden muss.

Die Architektur bildet einen weiteren wichtigen Punkt des neuronalen Netzes. Von einer Grundarchitektur

ausgehend, kann diese mit einem Grid-Test sehr gut ausgebaut und getestet werden. Einziger Nachteil dieser

Tests ist, dass sehr viele neuronale Netze getestet werden, was sehr zeitintensiv ist. Mit einer neueren

Hochleistungsgrafikkarte, wie die NVIDIA GeForce GTX 1080 Ti, welche wir zur Verfügung hatten, sind solche

Tests jedoch in einer geraumen Zeit machbar.

Durch die Visualisierung der Ergebnisse mit der Confusion Matrix konnte die Struktur der Daten genauer

analysiert werden. Dabei ist die Ähnlichkeit der Pilze innerhalb der gleichen Familie aufgefallen. Durch die

Trennung in zwei verschiedene neuronale Netze konnte eine Verbesserung in der validation accuracy von knapp

15 % erreicht werden. Daraus lässt sich schliessen, dass ähnliche Daten wenn möglich aufgeteilt werden sollten,

sodass die Klassifizierung im neuronalen Netz vereinfacht wird.

Der letzte Punkt, welcher noch angesprochen werden möchte, ist jener der zusätzlichen Features. Durch die

Einbindung des Hutdurchmessers, sowie der Stiellänge vor dem fully connected layer wurde eine Steigerung von

rund 10 % in der validation accuracy erreicht. Eine solche Steigerung zeigt, dass diese Features einen grossen

Einfluss auf das Resultat des neuronalen Netzes nehmen. Einziger Nachteil dieser Features, sowie der Trennung

in zwei verschiedene Netze ist, dass sie eine Entscheidung der Benutzer erzwingt. Dadurch können

Fehlinformationen bei der Vorhersage eingebracht werden, was zu einer Fehlklassifizierung führen kann. Da es

sich jedoch um einfach zu erkennende Merkmale handelt, ist diese Fehlerquelle als gering einzustufen.

8 Ausblick

06.08.2018 Riccardo Jung, Dominik Wagner 55

8 Ausblick

Der Grundstein für die Magic Mushroom App ist gesetzt. Nun wird grosse Hoffnung auf die Community gelegt.

Mit der Hilfe dieser kann die App wachsen und stetig erweitert werden. Sobald genügend Bilder einer weiteren

Pilzart vorhanden sind, kann erneut ein neuronales Netz trainiert werden, das anschliessend der Community zur

Verfügung gestellt wird. Damit profitiert nicht nur die NTB, sondern auch die Community. Je schneller die

Pilzdatenbank gefüllt wird, desto schneller kann auch das neuronale Netz entwickelt werden.

Jedoch ist das neuronale Netz auch noch nicht perfekt. Dieses könnte mit mehreren zusätzlichen Features

erweitert werden. Ein einfach zu erkennendes Feature wäre beispielsweise der Ring, welcher zum Beispiel bei

einem Fliegenpilz vorhanden ist. Dadurch könnten die Pilze noch genauer abstrahiert werden und die

Klassifizierung würde wahrscheinlich etwas genauer werden. Auch dieser Grundstein ist im Programm gelegt,

sodass solche Features mit nur kleinen Anpassungen hinzugefügt werden können.

Ein Schritt, welcher auch in Zukunft sehr zeitintensiv sein wird, ist die Auswahl der geeigneten Architektur des

neuronalen Netzes. Diese muss wiederum durch Grid-Tests bestimmt werden. Mit dem Python Skript im Anhang

des Kapitels 14.3.2 können diese Tests jedoch relativ schnell gestartet werden. Die Auswertung kann dann ganz

einfach mit den automatisch erstellten Textdokumenten geschehen.

Der genaue Ablauf zur Erweiterung des neuronalen Netzes mit allen Anpassungen samt Webanwendung kann

dem Dokument «Anleitung_ErweiterungApplikation.docx», welches auch im Anhang im Kapitel 14.2 zu finden

ist, entnommen werden. Des Weiteren befindet sich im Kapitel 14.1 eine Anleitung zur Inbetriebnahme der

vorhandenen Workstations der NTB. Auch diese könnten in näherer Zukunft mit der Grafikkarte NVIDIA GeForce

GTX 1080 Ti ausgestattet werden, damit auf diesen Rechnern neuronale Netze trainiert werden könnten.

Mit diesen Werkzeugen und Programmen sollte man nun fähig sein, die Magic Mushroom App zu erweitern. Mit

stetigen Aktualisierungen und Erweiterungen könnte die App zu einem gänzlichen Erfolg werden. So sind wir

überzeugt, dass diese App bei Pilzsuchenden zukünftig zum Equipment dazugehören wird und nicht nur

schweizweit einen Erfolg feiern kann, sondern auch weltweit zum Einsatz kommen wird.

9 Danksagung

06.08.2018 Riccardo Jung, Dominik Wagner 56

9 Danksagung

Einen besonderen Dank geht an die Referenten Prof. Dr. Christoph Würsch und Prof. Dr. Klaus Frick. Durch Sie

wurde die Bachelorarbeit Magic Mushroom App erst ins Leben gerufen und tatkräftig unterstützt. Bei Fragen

jeglicher Art konnten wir uns stets auf Ihr Wissen abstützen und waren immer willkommen.

Bedanken möchten wir uns ebenfalls beim gesamten Team der Informatik-Dienste der NTB, welche uns tatkräftig

beim Einrichten des Servers unterstützten.

Ein weiterer Dank geht an die Partnerhochschule der NTB, die Hochschule für Technik Rapperswil (HSR), welche

unsere Arbeit durch die Bereitstellung des Clusters unterstützten. Dadurch war es uns möglich, viele Tests mit

neuronalen Netzen durchzuführen und die nötigen Schlüsse daraus zu ziehen.

10 Eigenständigkeitserklärung

06.08.2018 Riccardo Jung, Dominik Wagner 57

10 Eigenständigkeitserklärung

Hiermit versichern wir, dass wir die vorliegende Arbeit selbstständig verfasst und keine anderen als die

angegebenen Quellen und Hilfsmittel benutzt haben, dass alle Stellen der Arbeit, die wörtlich oder sinngemäß

aus anderen Quellen übernommen wurden, als solche kenntlich gemacht und dass die Arbeit in gleicher oder

ähnlicher Form noch keiner Prüfungsbehörde vorgelegt wurde.

St.Gallen, den 06.08.2018.

Riccardo Jung Dominik Wagner

11 Abbildungsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner 58

11 Abbildungsverzeichnis

Abbildung 1 Logo Anaconda [3] .............................................................................................................................. 2

Abbildung 2 Logo PyCharm [5] ................................................................................................................................ 2

Abbildung 3 Logo OpenCV [6] ................................................................................................................................. 2

Abbildung 4 Logo Tensorflow [9] ............................................................................................................................ 3

Abbildung 5 TensorBoard – Dargestellt ist ein Beispiel für die Visualisierung der validation accuracy und des

validation loss von zwei neuronalen Netzen in TensorBoard. ................................................................................ 3

Abbildung 6 NVIDIA GeForce GTX 645 [12] ............................................................................................................. 4

Abbildung 7 NVIDIA GeForce GTX 1080 Ti [14] ....................................................................................................... 4

Abbildung 8 NVIDIA Tesla V100 [16] ....................................................................................................................... 4

Abbildung 9 Pilz lokalisieren – Das blaue Rechteck um den Pilz herum zeigt, wo der Pilz lokalisiert wurde.[19] .. 6

Abbildung 10 Pilz zentrieren – Die blaue Linie zeigt, wo das Zentrum des Pilzes durch das Aufsummieren aller

Grauwerte in der unteren Hälfte des Bildes bestimmt wurde. [20] ....................................................................... 6

Abbildung 11 Bilder vervielfachen – Dargestellt sind alle Varianten der Vervielfachung der Pilzbilder. [21] ........ 6

Abbildung 12 Kreuzkorrelation komplett – Der weisse Rahmen innerhalb des Bildes zeigt, wo die Korrelation

zum Referenzbild am höchsten war. Die Grafik rechts zeigt die Korrelation entlang der X-Achse. [22] ................ 7

Abbildung 13 Kreuzkorrelation komplett – Der weisse Rahmen innerhalb des Bildes zeigt, wo die Korrelation

zum Referenzbild am höchsten war. Die Grafik rechts zeigt die Korrelation entlang der X-Achse. [23] ................ 7

Abbildung 14 Kreuzkorrelation zeilenweise – Das Diagramm zeigt die Korrelation des Referenzbildes (rechts)

mit dem kompletten Bild (links) jeder einzelnen Zeile. [24] ................................................................................... 8

Abbildung 15 Kreuzkorrelation zeilenweise – Das Diagramm zeigt die Korrelation des Referenzbildes (rechts)

mit dem kompletten Bild (links) jeder einzelnen Zeile. [22] ................................................................................... 8

Abbildung 16 Sommer-Steinpilz [25, 26] ................................................................................................................ 9

Abbildung 17 Kiefern-Steinpilz [27, 28]................................................................................................................... 9

Abbildung 18 Gemeiner-Steinpilz [29, 30] .............................................................................................................. 9

Abbildung 19 Schwarzhütiger-Steinpilz [31, 32] ................................................................................................... 10

Abbildung 20 Fliegenpilz [33, 34] .......................................................................................................................... 10

Abbildung 21 Butterpilz [35, 36] ........................................................................................................................... 10

Abbildung 22 Gold-Röhrling [37, 38] ..................................................................................................................... 10

Abbildung 23 Sand-Röhrling [39, 40] .................................................................................................................... 10

Abbildung 24 Ziegenlippe [41, 42] ........................................................................................................................ 10

Abbildung 25 Gelber-Knollenblätterpilz [43, 44] .................................................................................................. 11

Abbildung 26 Grauer-Wulstling [45, 46] ............................................................................................................... 11

Abbildung 27 Grüner-Knollenblätterpilz [47, 48] .................................................................................................. 11

Abbildung 28 Pantherpilz [49, 50] ......................................................................................................................... 11

Abbildung 29 Perpilz [51, 52] ................................................................................................................................ 11

Abbildung 30 Pfifferling [53, 54] ........................................................................................................................... 11

Abbildung 31 Generelle Struktur eines CNNs – Die Abbildung zeigt die grundsätzliche Struktur eines CNN mit

dem input layer, den feature-extraction layers und den classification layers. [56, S. 128] .................................. 13

11 Abbildungsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner 59

Abbildung 32 Convolutional layer mit rechteckigen rezeptiven Feldern – Die Abbildung zeigt, wie die Neuronen

zwischen den einzelnen layers verbunden sind. [55, S. 358] ................................................................................ 13

Abbildung 33 Beispiel Faltungsoperation - In der Abbildung wird gezeigt, wie der Kernel, oder auch Filter

genannt, über die Eingangsdaten geschoben wird und daraus die feature map berechnet wird. [56, S. 131] .... 14

Abbildung 34 Convolutional layer mit verschiedenen feature maps – Die Abbildung zeigt zwei convolutional

layer mit mehreren feature maps und ein Bild mit drei Kanälen (RGB). [55, S. 361] ........................................... 14

Abbildung 35 Erklärung Parameter padding – Die Abbildung visualisiert den Parameter padding, der festlegt,

wie die Ränder eines Bildes bearbeitet werden. Der Parameter fw definiert die Filterweite und der Parameter fh

die Filterhöhe. Der hier verwendete Filter hat dementsprechend die Grösse 3x3 Pixel. Die Ränder des Bildes

werden mit Nullen aufgefüllt (zero padding). [55, S. 358] .................................................................................... 15

Abbildung 36 Erklärung Parameter stride – Dieser Parameter dient zur Dimensionsreduktion. Zu sehen ist ein

Bild mit der Schrittweite 2, welche zur Folge hat, dass das Ausgangsbild (oberes Rechteck) um den Faktor 2

kleiner ist. Die Randstellen sind wiederum mit Nullen gefüllt, damit das Ausgangsbild alle Pixel des

Eingangsbildes berücksichtigen kann. [55, S. 359] ................................................................................................ 15

Abbildung 37 Max pooling layer (2x2 pooling kernel, stride 2) – Die Abbildung zeigt, wie die Bildgrösse dank des

pooling layers verringert werden kann. Links im Bild ersichtlich ist die Auswahl der Aggregierungsfunktion,

welche hier den Wert 5 übernimmt, da eine Maximalfunktion gewählt wurde. Weil padding valid für die

Randbehandlung gewählt wurde, wird dieser abgeschnitten. ............................................................................. 16

Abbildung 38 Architektur Neuronales Netzwerk – In dieser Abbildung ist ein neuronales Netz mit drei

convolutional layer, einem flattened layer und einem fully connected layer dargestellt, welches als Basis für die

ersten Tests diente. [59] ....................................................................................................................................... 18

Abbildung 39 Confusion Matrix - Die Confusion Matrix, welche teilweise auch als Error Matrix bezeichnet wird,

repräsentiert die Performance eines Algorithmus................................................................................................ 18

Abbildung 40 Graph accuracy mit 15 Pilzarten – In dieser Abbildung ist die accuracy, welche nach dem Trennen

der Datensätze mit 15 Pilzarten erreicht wurde, dargestellt. Eine validation accuracy von 50 % wird schon nach

wenigen Epochen erreicht, danach stagniert das Wachstum. .............................................................................. 20

Abbildung 41 Graph loss mit 15 Pilzarten Pilzarten – In dieser Abbildung ist der loss, welcher nach dem Trennen

der Datensätze mit 15 Pilzarten erreicht wurde, dargestellt. Der validation loss steigt bereits früh nach dem

Start des Trainings wieder an, was ein klares Zeichen für ein Übertraining ist. ................................................... 20

Abbildung 42 Confusion Matrix 15 Pilzarten – Anhand der Confusion Matrix sieht man, dass es bei jeder Pilzart

zu Fehlklassifizierungen kam. Auffällig sind zwei Sektoren, bei welchen die Fehlklassifizierungen auf die gleiche

Familienzugehörigkeit zurückzuführen sind. ........................................................................................................ 21

Abbildung 43 Neuronales Netz mit zusätzlichen Features – Die Abbildung zeigt, wie die zusätzlichen

Informationen dem neuronalen Netz zur Verfügung gestellt werden. ................................................................. 22

Abbildung 44 Graph accuracy mit zusätzlichen Features – In der Abbildung ist sehr gut zu erkennen, dass der

Verlauf der jeweiligen Graphen beinahe identisch ist. Der wesentliche Unterschied liegt darin, dass die accuracy

um ca. 10 % höher ist, wenn das neuronale Netz mit den zusätzlichen Features trainiert wurde. ...................... 22

Abbildung 45 Graph loss mit zusätzlichen Features – Die Abbildung zeigt den positiven Effekt der zusätzlichen

Features. Dank diesen zusätzlichen Informationen konnte der loss gesenkt werden. ......................................... 23

Abbildung 46 Beispiel Lamellenpilz [62] ............................................................................................................... 23

Abbildung 47 Beispiel Röhrling [63] ...................................................................................................................... 23

Abbildung 48 Graph accuracy Lamellenpilze Testreihe 1 – In der Abbildung ist das neuronale Netze dargestellt,

welches die höchste validation accuracy mit rund 80 % erreicht hat. ................................................................. 27

11 Abbildungsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner 60

Abbildung 49 Graph loss Lamellenpilze Testreihe 1 – Die Abbildung zeigt, dass das Problem des Übertrainings

immer noch besteht, da der loss ab der 20. Epoche stetig ansteigt. .................................................................... 27

Abbildung 50 Confusion Matrix 1. Testreihe Lamellenpilze – Die Confusion Matrix zeigt deutlich, dass die

Fliegenpilze und Pfifferlinge kaum falsch klassifiziert werden. Insgesamt werden 103 von 128 Pilzen richtig

klassifiziert, was zu einer Trefferquote von rund 80 % führt. ............................................................................... 28

Abbildung 51 Graph accuracy Lamellenpilze Testreihe 2 – Gut ersichtlich ist, dass das neuronale Netz extrem

schnell lernt. Bereits nach wenigen Epochen wird eine validation accuracy von über 50 % erreicht. Nach 12

Epochen werden sogar schon über 75 % erreicht. ............................................................................................... 30

Abbildung 52 Graph loss Lamellenpilze Testreihe 2 – Auch in dieser Abbildung wird ersichtlich, dass das

neuronale Netz ab Epoche 30 mit dem Übertraining zu kämpfen hat. ................................................................ 30

Abbildung 53 Confusion Matrix 2. Testreihe Lamellenpilze – Die Confusion Matrix zeigt, dass das neuronale

Netz Schwierigkeiten hat, die beiden Knollenblätterpilze zu unterscheiden. ...................................................... 31

Abbildung 54 Graph accuracy Vergleich Lernraten – Anhand dieser Abbildung ist sehr gut zu erkennen, dass das

neuronale Netz mit der höheren Lernrate sehr viel schneller bei den gegebenen Trainingsdaten lernt. ............ 32

Abbildung 55 Graph loss Vergleich Lernraten – Die Abbildung zeigt, dass der loss bedeutend grösser wird, wenn

die Lernrate grösser gewählt wird. ....................................................................................................................... 32

Abbildung 56 Graph accuracy Lamellenpilze Testreihe 3 – Ca. bis zur 150. Epoche kann die validaiton accuracy

mit der training accuracy mithalten, danach steigt nur noch die training accuracy an. ...................................... 34

Abbildung 57 Graph loss Lamellenpilze Testreihe 3 – Sehr gut ersichtlich wird in dieser Abbildung , dass sich der

validation loss erst nach 150 Epochen erhöht und damit der Effekt des Übertrainings wesentlich verringert

werden konnte. ..................................................................................................................................................... 34

Abbildung 58 Confusion Matrix 3. Testreihe Lamellenpilze – In dieser Abbildung ist ausser bei den Fliegenpilzen

und den Pfifferlingen eine relativ homogene Verteilung an Fehlklassifizierungen zu beobachten. ..................... 35

Abbildung 59 Architektur neuronales Netz Lamellenpilze – Die Abbildung zeigt sehr schön die Architektur des

besten neuronalen Netzes, welches aus vier convolutional layer und insgesamt zwei fully connected layer

besteht. ................................................................................................................................................................. 37

Abbildung 60 Graph accuracy Röhrlinge Testreihe 1 – Die Abbildung zeigt ein ähnliches Verhalten wie bei den

Lamellenpilzen. Bereits nach 40 Epochen wird die maximale validation accuracy erreicht................................. 39

Abbildung 61 Graph loss Röhrlinge Testreihe 1 – Auch bei diesem neuronalen Netz steigt der validation loss

während des Trainings wieder an, was auf ein Übertraining hindeutet. .............................................................. 39

Abbildung 62 Confusion Matrix 1. Testreihe Röhrlinge – Die Confusion Matrix zeigt deutlich, dass die

Klassifizierung der vier Steinpilzarten Schwierigkeiten bereitet. .......................................................................... 40

Abbildung 63 Graph accuracy Röhrlinge Testreihe 2 – Diese Abbildung zeigt die accuracy eines schlechten

Resultats. ............................................................................................................................................................... 42

Abbildung 64 Graph loss Röhrlinge Testreihe 2 – Diese Abbildung zeigt den grossen Unterschied zu den guten

Ergebnissen. Der validation loss steigt bei diesem neuronalen Netz viel stärker an, als bei besseren neuronalen

Netzen. .................................................................................................................................................................. 42

Abbildung 65 Confusion Matrix 2. Testreihe Röhrlinge – Die Probleme bei der Klassifizierung der Steinpilzarten

sind auch bei dieser Confusion Matrix eindeutig zu erkennen. ............................................................................ 43

Abbildung 66 Graph accuracy Röhrlinge Testreihe 3 – In dieser Abbildung fallen die starken Sprünge zwischen

den einzelnen Epochen auf, die auf die kleinere Batchgrösse zurückzuführen sind. ........................................... 45

Abbildung 67 Graph loss Röhrlinge Testreihe 3 – Der in dieser Abbildung dargestellte validation loss steigt erst

gegen Ende des Trainings ein wenig an, was darauf hindeutet, dass das neuronale Netz kaum übertrainiert. .. 45

11 Abbildungsverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner 61

Abbildung 68 Confusion Matrix 3. Testreihe Röhrlinge – Die Confusion Matrix zeigt, dass alleine bei den

Steinpilzarten 23 Fehlklassifizierungen auftreten, was eine Einbusse von knapp 18 % in der validation accuracy

bedeutet. Ansonsten sind nicht viele Fehlklassifizierungen zu vermerken. ......................................................... 46

Abbildung 69 Architektur neuronales Netz Röhrlinge – Die Abbildung zeigt sehr schön die Architektur des

neuronalen Netzes, welches aus fünf convolutional layer und insgesamt zwei fully connected layer besteht. ... 48

Abbildung 70 Startseite Webapplikation – Diese Abbildung zeigt die Startseite der Webapplikation, bei welcher

der Benutzer bestätigen muss, dass er alle Informationen gelesen und zur Kenntnis genommen hat. .............. 49

Abbildung 71 Home Webapplikation – Die Abbildung zeigt ein Beispiel, bei der ein Benutzer alle nötigen

Schritte für die Klassifizierung eines Pilzes durchgeführt hat. .............................................................................. 50

Abbildung 72 Resultat Webapplikation – In dieser Abbildung ist das Resultat einer Klassifizierung inklusive der

Detailansicht dargestellt. ...................................................................................................................................... 51

Abbildung 73 Upload Webapplikation – Die Abbildung zeigt ein Beispiel der Uploadfunktion, bei der ein

Benutzer fünf Bilder eines Fliegenpilzes hochladen will. ...................................................................................... 52

Abbildung 74 About Webapplikation – Die Abbildung der About Seite zeigt dem Benutzer alle Pilzarten, die

momentan mithilfe des neuronalen Netzes klassifiziert werden können. .......................................................... 53

12 Tabellenverzeichnis

06.08.2018 Riccardo Jung, Dominik Wagner 62

12 Tabellenverzeichnis

Tabelle 1 Vergleich Grafikkarten [15, 17, 18] .......................................................................................................... 5

Tabelle 2 Benchmark-Test ....................................................................................................................................... 5

Tabelle 3 Übersicht vorverarbeitete Bilder ........................................................................................................... 11

Tabelle 4 Ergebnis der fünf besten neuronalen Netze der 1. Testreihe (Lamellenpilze) ...................................... 26

Tabelle 5 Ergebnis der fünf besten neuronalen Netze der 2. Testreihe (Lamellenpilze) ...................................... 29

Tabelle 6 Ergebnis der fünf besten neuronalen Netze der 3. Testreihe (Lamellenpilze) ...................................... 33

Tabelle 7 Übersicht der zehn besten neuronalen Netze aller Testreihen (Lamellenpilze) ................................... 36

Tabelle 8 Ergebnis der fünf besten neuronalen Netze der 1. Testreihe (Röhrlinge) ............................................. 38

Tabelle 9 Ergebnis der fünf besten neuronalen Netze der 2. Testreihe (Röhrlinge) ............................................. 41

Tabelle 10 Ergebnis der fünf besten neuronalen Netze der 3. Testreihe (Röhrlinge) ........................................... 44

Tabelle 11 Übersicht der zehn besten neuronalen Netze aller Testreihen (Röhrlinge) ........................................ 47

13 Literaturangaben

06.08.2018 Riccardo Jung, Dominik Wagner 63

13 Literaturangaben

[1] Würsch Christoph: Ausschreibung Bachelorarbeit, 2018.

https://intranet.ntb.ch/studium/bachelor/bachelorarbeiten/bachelorarbeiten-2018/liste-nach-

student/?DA=1032&r=p, abgerufen am: 09.01.2018

[2] Anaconda Inc.: Conda — Conda documentation, 2018. https://conda.io/docs/, abgerufen am: 10.01.2018

[3] Logo Anaconda, 2015. http://www.gurobi.com/images/logo-anaconda.png, abgerufen am: 10.01.2018

[4] JetBrains s.r.o.: PyCharm. https://www.jetbrains.com/pycharm/features/, abgerufen am: 21.06.2018

[5] JetBrains s.r.o.: Logo PyCharm, 2015.

https://d3nmt5vlzunoa1.cloudfront.net/pycharm/files/2015/12/PyCharm_400x400_Twitter_logo_white.

png, abgerufen am: 21.06.2018

[6] OpenCV team: Logo OpenCV, 2018. https://opencv.org/, abgerufen am: 26.04.2018

[7] OpenCV team: OpenCV library, 2018. https://opencv.org/about.html, abgerufen am: 10.01.2018

[8] TensorFlow: TensorFlow, 2018. https://www.tensorflow.org/, abgerufen am: 26.04.2018

[9] LeanBI: Logo TensorFlow. http://leanbi.ch/blog/tensorflow/, abgerufen am: 26.04.2018

[10] TensorFlow: TensorBoard: Visualizing Learning , 2018.

https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard, abgerufen am:

26.04.2018

[11] Techpowerup: NVIDIA GeForce GTX 645 OEM. https://www.techpowerup.com/gpudb/2359/geforce-gtx-

645-oem, abgerufen am: 18.07.2018

[12] NVIDIA: NVIDIA GTX 645, 2013. http://www.nvidia.de/content/product-detail-pages/geforce-gtx-645-

oem/geforce-gtx-660-645-front.png, abgerufen am: 26.04.2018

[13] NVIDIA: NVIDIA GeForce GTX 1080Ti Graphics Card, 2018.

https://www.nvidia.co.uk/geforce/products/10series/geforce-gtx-1080-ti/, abgerufen am: 18.07.2018

[14] Digitec Galaxus AG: NVIDIA GTX 1080 Ti, 2017.

https://static.digitecgalaxus.ch/Files/7/4/9/6/1/5/5/4502.jpg?fit=inside%7C802:639&output-

format=progressive-jpeg, abgerufen am: 26.04.2018

[15] NVIDIA Corporation: NVIDIA Tesla V100. https://www.nvidia.de/data-center/tesla-v100/, abgerufen am:

21.06.2018

[16] NVIDIA: NVIDIA Tesla V100, 2018. https://www.nvidia.de/content/dam/en-zz/Solutions/Data-

Center/tesla-v100/[email protected], abgerufen am: 21.06.2018

[17] NVIDIA Corporation: GeForce GTX 645. https://www.geforce.com/hardware/desktop-gpus/geforce-gtx-

645-oem/specifications, abgerufen am: 26.04.2018

[18] Digitec Galaxus AG: ASUS GeForce GTX 1080 Ti STRIX O11G-GAMING.

https://www.digitec.ch/de/s1/product/asus-geforce-gtx-1080-ti-strix-o11g-gaming-11gb-high-end-

grafikkarte-6188992, abgerufen am: 26.04.2018

[19] Pilze Birsfelden: Sommer-Steinpilz 1, 2012. http://www.pilze-

birsfelden.ch/typo3temp/pics/ef3089b2d8.jpg, abgerufen am: 10.01.2018

[20] Alamy Ltd: Sommer-Steinpilz 2. http://c8.alamy.com/compde/dak5ab/sommer-bolete-sommer-cep-

boletus-reticulatus-boletus-aestivalis-zwei-fruchtkorper-deutschland-mecklenburg-vorpommern-

dak5ab.jpg, abgerufen am: 10.01.2018

[21] Salvatore Saitta: Sommer-Steinpilz 3, 2016.

http://www.salvatoresaitta.it/pages/fungi/boletus_aestivalis.htm, abgerufen am: 26.04.2018

13 Literaturangaben

06.08.2018 Riccardo Jung, Dominik Wagner 64

[22] Marjan Kustera: Sommer-Steinpilz 4.

https://www.flickr.com/photos/59698578@N06/9741966226/in/photostream/, abgerufen am:

26.04.2018

[23] t4.ftcdn.net: Sommer-Steinpilz 5, 2016.

https://t4.ftcdn.net/jpg/00/69/04/53/240_F_69045303_K8wNAVui0Ql8ghejwrweX1YJodD1xg38.jpg,

abgerufen am: 26.04.2018

[24] Northamptonshirewildlife: Sommer-Steinpilz 6, 2007.

http://www.northamptonshirewildlife.co.uk/Images/boletus_edulis.jpg, abgerufen am: 17.07.2018

[25] Wikipedia: Archenzo: Sommer-Steinpilz 7, 2013.

https://upload.wikimedia.org/wikipedia/commons/8/83/2006-10-

07_Boletus_aestivalis_cropped.jpg?uselang=de, abgerufen am: 18.07.2018

[26] Wikipedia: Xth-Floor: Sommer-Steinpilz 8, 2013.

https://upload.wikimedia.org/wikipedia/commons/e/e4/Vrbensk%C3%A9_rybn%C3%ADky_-

_Boletus_aestivalis_02.jpg, abgerufen am: 18.07.2018

[27] Flickr: Charles de Mille-Isles: Kiefern-Steinpilz 1.

https://www.flickr.com/photos/demartigny/6139036791/, abgerufen am: 18.07.2018

[28] Wikipedia: Paffka: Kiefern-Steinpilz 2, 2013.

https://upload.wikimedia.org/wikipedia/commons/6/66/Boletus_pinophilus3.JPG, abgerufen am:

18.07.2018

[29] Pxhere: Gemeiner-Steinpilz 1, 2017.

https://c.pxhere.com/photos/af/36/grzyb_ceps_porcini_boletus_edulis-1079733.jpg!d, abgerufen am:

18.07.2018

[30] Wikipedia: Jörg Hempel: Gemeiner-Steinpilz 2, 2018.

https://commons.wikimedia.org/wiki/File:Boletus_edulis_LC0371.jpg, abgerufen am: 18.07.2018

[31] Flickr: GLJIVARSKO DRUSTVO NIS: Schwarzhütiger-Steinpilz 1. https://www.flickr.com/photos/fungi-

nis/9109097740, abgerufen am: 18.07.2018

[32] Wikipedia: Roberto Petruzzo: Schwarzhütiger-Steinpilz 2, 2018.

https://commons.wikimedia.org/wiki/File:Boletus_aereus_IT.JPG, abgerufen am: 18.07.2018

[33] Pixabay: snd63: Fliegenpilz 1. https://pixabay.com/en/amanita-amanita-muscaria-mushroom-2902116/,

abgerufen am: 18.07.2018

[34] Flickr: Bernard Spragg: Fliegenpilz 2. https://www.flickr.com/photos/volvob12b/32830552834, abgerufen

am: 18.07.2018

[35] Wikipedia: Pumber: Butterpilz 1, 2018.

https://commons.wikimedia.org/wiki/File:Barnagy%C5%B1r%C5%B1s.jpg, abgerufen am: 18.07.2018

[36] Wikipedia: Σ64: Butterpilz 2, 2018. https://commons.wikimedia.org/wiki/File:Suillus_luteus_01.jpg,

abgerufen am: 18.07.2018

[37] Wikipedia: Szabi237: Gold-Röhrling 1. https://fr.wikipedia.org/wiki/Fichier:Suillus_grevillei2.JPG,

abgerufen am: 18.07.2018

[38] Pixabay: adege: Gold-Röhrling 2. https://pixabay.com/en/mushroom-suillus-grevillei-yellow-2759709/,

abgerufen am: 18.07.2018

[39] Wikipedia: Andrey Gaverdovsky: Sand-Röhrling 1, 2018.

https://commons.wikimedia.org/wiki/File:Suillus_variegatus_(21685100733).jpg, abgerufen am:

18.07.2018

13 Literaturangaben

06.08.2018 Riccardo Jung, Dominik Wagner 65

[40] Wikipedia: Tocekas: Sand-Röhrling 2. https://lt.wikipedia.org/wiki/Vaizdas:Suillus_variegatus_1.jpg,

abgerufen am: 18.07.2018

[41] Wikipedia : Daniel Ullrich: Ziegenlippe 1. https://de.wikipedia.org/wiki/Datei:Boletus_subtomentosus.jpg,

abgerufen am: 18.07.2018

[42] Wikipedia: Dendrofil: Ziegenlippe 2, 2018.

https://commons.wikimedia.org/wiki/File:Xerocomus_subtomentosus_Podkomorsk%C3%A9_lesy.jpg,

abgerufen am: 18.07.2018

[43] Wikipedia: Jim Champion: Gelber-Knollenblätterpilz 1, 2018.

https://commons.wikimedia.org/wiki/File:Amanita_citrina_fungus_in_Bignell_Wood,_New_Forest_-

_geograph.org.uk_-_260930.jpg, abgerufen am: 18.07.2018

[44] Wikipedia: Jean-Marc Pascolo: Gelber-Knollenblätterpilz 2, 2018.

https://commons.wikimedia.org/wiki/File:Amanita_citrina_%C3%A0_Carling.jpg, abgerufen am:

18.07.2018

[45] Wikipedia: Björn S.: Grauer-Wulstling 1, 2018.

https://commons.wikimedia.org/wiki/File:Botanical_Garden_Gothenburg_and_Angg%C3%A5rdsbergen_

13.08.2017_Grey_Spotted_Amanita_-_Amanita_excelsa_(37330338051).jpg, abgerufen am: 18.07.2018

[46] Wikipedia: Björn S.: Grauer-Wulstling 2, 2018.

https://commons.wikimedia.org/wiki/File:Eichhof_06.08.2017_Grey_Spotted_Amanita_-

_Amanita_excelsa_(37339552175).jpg, abgerufen am: 18.07.2018

[47] Wikipedia: George Chernilevsky: Grüner-Knollenblätterpilz 1, 2018.

https://commons.wikimedia.org/wiki/File:Amanita_phalloides_2011_G2.jpg, abgerufen am: 18.07.2018

[48] Flickr: GLJIVARSKO DRUSTVO NIS: Grüner-Knollenblätterpilz 2. https://www.flickr.com/photos/fungi-

nis/5830935134, abgerufen am: 18.07.2018

[49] Wikipedia: ccfarmer: Pantherpilz 1. https://de.wikipedia.org/wiki/Datei:2008-

10_Amanita_pantherina_cropped.jpg, abgerufen am: 18.07.2018

[50] Wikipedia: Quartl: Pantherpilz 2, 2018.

https://commons.wikimedia.org/wiki/File:Amanita_pantherina_qtl2.jpg, abgerufen am: 18.07.2018

[51] Wikipedia: Archenzo: Perlpilz 1, 2018. https://commons.wikimedia.org/wiki/File:Amanita_rubescens.JPG,

abgerufen am: 18.07.2018

[52] Wikipedia: Andreas Kunze: Perlpilz 2. https://de.wikipedia.org/wiki/Datei:2011-07-

30_Amanita_rubescens_1.jpg, abgerufen am: 18.07.2018

[53] Wikipedia: Henk Monster: Pfifferling 1, 2018.

https://commons.wikimedia.org/wiki/File:Cantharellus_cibarius_(GB%3D_Chanterelle,_D%3D_Pfifferling,

_Reherling,_Eierschwamm,_NL%3D_Hanenkam)_at_Wofheze_at_30_July_2015_-_panoramio.jpg,

abgerufen am: 18.07.2018

[54] Wikipedia: H. Krisp: Pfifferling 2, 2018.

https://commons.wikimedia.org/wiki/File:Pfifferling_Cantharellus_cibarius.jpg, abgerufen am:

18.07.2018

[55] Géron, A.: Hands-on machine learning with Scikit-Learn and TensorFlow. Concepts, tools, and techniques

to build intelligent systems / Aurélien Géron. Beijing: O'Reilly 2017

[56] Patterson, J. u. Gibson, A.: Deep learning. A practitioner's approach / Josh Patterson and Adam Gibson.

Beijing: O'Reilly 2017

[57] cv-tricks.com: Tensorflow Tutorial. http://cv-tricks.com/tensorflow-tutorial/training-convolutional-

neural-network-for-image-classification/, abgerufen am: 26.04.2018

13 Literaturangaben

06.08.2018 Riccardo Jung, Dominik Wagner 66

[58] cv-tricks.com: Github: Tensorflow Tutorial. https://github.com/sankit1/cv-tricks.com, abgerufen am:

26.04.2018

[59] cv-tricks.com: Architektur Beispielprojekt. http://cv-tricks.com/wp-

content/uploads/2017/02/Tensorflow-tutorial-2-1.jpg, abgerufen am: 26.04.2018

[60] Data School: Confusion Matrix. https://www.dataschool.io/simple-guide-to-confusion-matrix-

terminology/, abgerufen am: 20.07.2018

[61] Scikit-learn developers: Confusion matrix, 2018. http://scikit-

learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html, abgerufen am:

16.07.2018

[62] Thomas Regnery: Feature_Lamellenpilz, 2013. http://pilztom.de/ees-001.png, abgerufen am: 27.06.2018

[63] Thomas Regnery: Feature_Röhrling, 2010. http://pilztom.de/ees-002.png, abgerufen am: 27.06.2018

[64] Stack Overflow: PHP,Full Secure Image Upload Script.

https://stackoverflow.com/questions/38509334/full-secure-image-upload-script, abgerufen am:

16.07.2018

14 Anhang 14.1 Anleitung: Einrichten der Workstation

06.08.2018 Riccardo Jung, Dominik Wagner 67

14 Anhang

14.1 Anleitung: Einrichten der Workstation

Für das Training der neuronalen Netze hatten wir eine alte Workstation der NTB zur Verfügung. Eine solche

Workstation war notwendig, um die NVIDIA GeForce GTX 1080 Ti Grafikkarte einbauen zu können. Damit die

neuronalen Netze mithilfe der Grafikkarte trainiert werden können, müssen folgende Dinge erledigt werden:

1) Installation von Python 3.6:

https://www.python.org/downloads/release/python-360/

2) Installation von PyCharm Community:

https://www.jetbrains.com/pycharm/download/#section=windows

3) Installation von CUDA 9.1:

https://developer.nvidia.com/cuda-91-download-archive

Hinweis: Überprüfen Sie, ob die Umgebungsvariablen für CUDA angelegt wurden.

4) Download der cudnn 7.1 Dateien (NVIDIA Account erforderlich):

https://developer.nvidia.com/rdp/cudnn-archive

5) Verschieben der cudnn 7.1 Dateien nach:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1

6) Projekt erstellen in PyCharm:

File -> New Project…

7) Auswahl des Python Interpreters in PyCharm:

File -> Settings -> Project: «Workspace»

8) Falls TensorFlow auf einem Rechner installiert werden soll, der eine alte CPU ohne AVX Instruktionen

besitzt, wie es bei der Workstation der NTB der Fall war, muss folgende Wheel Datei mittels «pip install»

direkt im Projekt installiert werden:

https://github.com/fo40225/tensorflow-windows-

wheel/tree/master/1.8.0/py36/GPU/cuda91cudnn71sse2

Falls TensorFlow auf einem Rechner installiert werden soll, der eine CPU mit AVX Instruktionen besitzt,

kann TensorFlow direkt in PyCharm installiert werden:

File -> Settings -> Project: «Workspace» -> Install -> «tensorflow-gpu»

9) Test mittels Import von TensorFlow über die Konsole in PyCharm:

«import tensorflow as tf»

Wenn keine Fehlermeldung nach dem Import von TensorFlow erscheint, ist die Workstation bereit für das

Training von neuronalen Netzen mithilfe der Grafikkarte.

14 Anhang 14.2 Anleitung: Erweiterung der Applikation

06.08.2018 Riccardo Jung, Dominik Wagner 68

14.2 Anleitung: Erweiterung der Applikation

Damit die Webapplikation zu einem späteren Zeitpunkt auch von Drittpersonen relativ einfach erweitert werden

kann, sind auf den nächsten Seiten alle Schritte dokumentiert, die für eine Erweiterung notwendig sind. Dazu

zählen die Bildvorverarbeitung, das Training des neuronalen Netzes und die Anpassung der Webapplikation.

Alle Skripts, Bilder und die Dateien der Webapplikation sind dem Anhang angehängt und zudem auf einem USB-

Stick gespeichert, welcher zur ausgedruckten Dokumentation mitgegeben wird.

14.2.1 Anleitung Bildvorverarbeitung

Sobald einige hundert Bilder eines Pilzes vorhanden sind, kann das neuronale Netz um eine weitere Pilzart

erweitert werden. Dafür werden alle Bilder standardisiert und vervielfacht. Folgende Schritte sind dafür

durchzuführen:

1) Bilder von Auge vorsortieren.

2) Die Bilder mithilfe der Batch Datei «Dateien_Nummerieren.bat», welche im Verzeichnis

«Software/Bildvorverarbeitung» zu finden sind, nummerieren:

Dazu muss die Batchdatei in den Ordner mit den Bildern verschoben werden und der Name des Pilzes

angepasst werden.

set ZAEHLER=0

mkdir end

:start

if not exist *.jpg goto end

set /a ZAEHLER=ZAEHLER+1

ren *.jpg pfifferling_%ZAEHLER%.jpg

move pfifferling_%ZAEHLER%.jpg end

goto start

:end

exit

3) Python Skript «Mushroom_Classifier.py» im Verzeichnis «Software/Python» öffnen und folgende

Parameter anpassen:

numberOfPictures = 462

link_CascadeClassifier = str("./cascade_files/myhaar_48x48.xml")

imageOutputSize = 256, 256

fileType = str(".jpg")

link_InputImage = str("./images/mushrooms/Pfifferling/end/pfifferling_")

link_OutputImage = str("./images/ergebnis/Pfifferling/")

14 Anhang 14.2 Anleitung: Erweiterung der Applikation

06.08.2018 Riccardo Jung, Dominik Wagner 69

4) Python Skript «Mushroom_Classifier.py» ausführen

5) Bilder von Auge nachsortieren, falls die Pilze schlecht zentriert oder andere Dinge lokalisiert wurden.

6) Bilder mithilfe der Batch Datei «Dateien_Nummerieren.bat» erneut, wie bei Punkt 2 aufgezeigt,

nummerieren.

7) Nachdem alle Punkte abgearbeitet wurden, kann der Ordner mit den zentrierten und vervielfachten

Bildern in den Ordner der Pilzdatenbank verschoben werden.

14.2.2 Anleitung Training neuronales Netz

Hinweis: Das Training der neuronalen Netze kann nur auf einem Rechner durchgeführt werden, auf dem die

TensorFlow und OpenCV Bibliothek installiert sind. Eine Anleitung dazu ist im Kapitel 14.1 zu finden.

Für das Training der neuronalen Netze sind folgende Schritte notwendig:

1) JSON File «MushroomFeatures.json» im Verzeichnis «Software/Python» öffnen und einen neue Pilzart

folgendermassen definieren:

"014_Pfifferling" : [ {

"Name": "Cantharellus cibarius / Pfifferling",

"Stiellaenge": 4,

"Stiellaenge_Standardabweichung": 1,

"Hutdurchmesser": 8,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "Yes/Ja"}

]

Wichtig ist dabei, dass wie in diesem Beispiel der Name «014_Pfifferling» auch im Python Skript

«Mushroom_Classifier.py» unter «classes» verwendet wird.

2) Python Skript «Mushroom_Classifier.py» im Verzeichnis «Software/Python» öffnen

3) Parameter anpassen: (Der folgende Codeausschnitt zeigt die Klassennamen für das Training der

Lamellenpilze)

# Paths

train_path = 'D:/BA_MagicMushroom/Test/Datenbank/training_data'

# Prepare input data

classes = ['004_Fliegenpilz', '009_Gelber-Knollenblaetterpilz', '010_Grauer-Wulstling',

'011_Gruener-Knollenblaetterpilz', '012_Pantherpilz', '013_Perlpilz',

'014_Pfifferling']

#classes = ['000_Sommer-Steinpilz', '001_Kiefern-Steinpilz', '002_Gemeiner-Steinpilz',

'003_Schwarzhuetiger-Steinpilz', '005_Butterpilz', '006_Gold-Roehrling',

'007_Sandroehrling', '008_Ziegenlippe']

14 Anhang 14.2 Anleitung: Erweiterung der Applikation

06.08.2018 Riccardo Jung, Dominik Wagner 70

4) Gewünschte Architektur des neuronalen Netzes im Python Skript «Mushroom_Classifier.py» definieren:

def main(): for img_size in [64,128,256]: # Load Dataset

data = dataset.read_train_sets(train_path, img_size, classes,

validation_size=validation_size) print("Complete reading input data. Will Now print a snippet of it") print("Number of files in Training-set:\t\t{}".format(len(data.train.labels))) print("Number of files in Validation-set:\t{}".format(len(data.valid.labels)))

num_epochs = 100

if img_size == 64: batch_size = 256 number_of_iteration = int(num_epochs*len(data.train.labels)/batch_size)

elif img_size == 128: batch_size = 128 number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

elif img_size == 256: batch_size = 64 number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

for learning_rate in [1E-3, 1E-4]: global i i = 0

for num_filter in [32]: for fc1_layer_size in [64,128]: for num_convlayer in [2, 3, 4]: if num_convlayer == 2: for filter in [[10, 10], [8, 8], [6, 6], [4, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

if num_convlayer == 3: for filter in [[10, 8, 6], [8, 8, 6], [8, 6, 4], [6, 6, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

if num_convlayer == 4: for filter in [[10, 8, 6, 6], [8, 8, 6, 4], [8, 6, 6, 4]]: train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter,

num_filter, fc1_layer_size)

Im Beispiel oben wird eine ganze Testreihe mit verschiedenen Parametern trainiert, damit anschliessend

das neuronale Netz verwendet werden kann, das die besten Ergebnisse erzielt hat.

5) Python Skript «Mushroom_Classifier.py» ausführen.

6) Während des Trainings der neuronalen Netze wird ein Unterordner «log» erzeugt, in dem sich alle

Modelle, die Confusion Matrix, Dateien für das TensorBoard und weitere Logdateien befinden.

7) Wenn ein Modell zufriedenstellende Ergebnisse erzielt hat, kann es anschliessend für die

Webapplikation verwendet werden.

14 Anhang 14.2 Anleitung: Erweiterung der Applikation

06.08.2018 Riccardo Jung, Dominik Wagner 71

14.2.3 Anleitung Anpassung Webapplikation

Nachdem bereits die JSON File «MushroomFeatures.json» angepasst und ein neuronales Netz trainiert wurde,

muss nur noch die Webapplikation angepasst werden. Dazu sind folgende Anpassungen notwendig:

1) Im Verzeichnis «Software/Web/Image» muss ein Beispielbild von jeder zu klassifizierenden Pilzart

abgelegt sein. Falls mehr Pilze als bis anhin klassifiziert werden, muss ein solches Beispielbild abgelegt

werden, welches anschliessend in der Webapplikation dargestellt wird.

2) Wenn eine weitere Pilzart klassifiziert werden kann, muss dies in den beiden HTML Dateien

«about-de.html» und «about-en.html» eingetragen werden, damit die Benutzer der Webapplikation

wissen, welche Pilze klassifiziert werden können. Beide Dateien sind im Verzeichnis «Web» zu finden.

3) Falls ein anderes neuronales Netz für die Klassifizierung der Pilze verwendet werden soll, muss das

Modell im passenden Verzeichnis «Software/Web/Python/…» abgelegt werden.

4) Das Python Skript «predict_web.py» im Verzeichnis «Software/Web/Python» muss ebenfalls angepasst

werden. Falls weitere Pilzarten trainiert wurden, müssen diese unter «classes_roehrling» oder

«classes_lamellen» eingetragen werden. Zudem müssen die Pfade für die Modelle der neuronalen

Netze angepasst werden, welche im Schritt 3 abgelegt wurden.

classes_roehrling = ['000_Sommer-Steinpilz', '001_Kiefern-Steinpilz', '002_Gemeiner-

Steinpilz', '003_Schwarzhuetiger-Steinpilz', '005_Butterpilz',

'006_Gold-Roehrling', '007_Sandroehrling', '008_Ziegenlippe']

classes_lamellen = ['004_Fliegenpilz', '009_Gelber-Knollenblaetterpilz', '010_Grauer-

Wulstling', '011_Gruener-Knollenblaetterpilz', '012_Pantherpilz',

'013_Perlpilz', '014_Pfifferling']

# Model

model_roehrling = './Python/Model_Roehrling/img=128,batch=128,lr_1E-05,conv=5,fs=[4, 4,

3, 3, 3],nf=32,fc=256_model.meta'

model_lamellen = './Python/Model_Lamellen/img=128,batch=128,lr_1E-04,conv=4,fs=[3, 3, 3,

3],nf=32,fc=256_model.meta'

14 Anhang 14.3.1 Vorverarbeitung (Mushroom_Finder.py)

06.08.2018 Riccardo Jung, Dominik Wagner 72

14.3 Python Skripts

14.3.1 Vorverarbeitung (Mushroom_Finder.py)

USB-Stick: « Software/Bildvorverarbeitung /Mushroom_Finder.py »

### Bachelorarbeit Magic Mushroom App

### Pilze lokalisieren, zentrieren, standardisieren

### Riccardo Jung / Dominik Wagner

### 08.07.2018

# Import

import cv2

import numpy as np

# Parameter

numberOfPictures = 462

link_CascadeClassifier = str("./cascade_files/myhaar_48x48.xml")

imageOutputSize = 256, 256

fileType = str(".jpg")

# link_InputImage = str("./images/mushrooms/Sommer-Steinpilz/end/sommer_steinpilz_")

# link_InputImage = str("./images/mushrooms/Kiefern-Steinpilz/end/kiefern_steinpilz_")

# link_InputImage = str("./images/mushrooms/Gemeiner-Steinpilz/end/gemeiner_steinpilz_")

# link_InputImage = str("./images/mushrooms/Schwarzhuetiger-

Steinpilz/end/schwarzhuetiger_steinpilz_")

# link_InputImage = str("./images/mushrooms/Fliegenpilz/end/fliegenpilz_")

# link_InputImage = str("./images/mushrooms/Sandroehrling/end/sandroehrling_")

# link_InputImage = str("./images/mushrooms/Butterpilz/end/butterpilz_")

# link_InputImage = str("./images/mushrooms/Gold-Roehrling/end/gold-roehrling_")

# link_InputImage = str("./images/mushrooms/Ziegenlippe/end/ziegenlippe_")

# link_InputImage = str("./images/mushrooms/Gelber-Knollenblaetterpilz/end/gelber-

knollenblaetterpilz_")

# link_InputImage = str("./images/mushrooms/Grauer-Wulstling/end/grauer-wulstling_")

# link_InputImage = str("./images/mushrooms/Gruener-Knollenblaetterpilz/end/gruener-

knollenblaetterpilz_")

# link_InputImage = str("./images/mushrooms/Pantherpilz/end/pantherpilz_")

# link_InputImage = str("./images/mushrooms/Perlpilz/end/perlpilz_")

link_InputImage = str("./images/mushrooms/Pfifferling/end/pfifferling_")

# link_OutputImage = str("./images/ergebnis/Sommer-Steinpilz_final/")

# link_OutputImage = str("./images/ergebnis/Kiefern-Steinpilz_final/")

# link_OutputImage = str("./images/ergebnis/Gemeiner-Steinpilz/")

# link_OutputImage = str("./images/ergebnis/Schwarzhuetiger-Steinpilz/")

# link_OutputImage = str("./images/ergebnis/Fliegenpilz/")

# link_OutputImage = str("./images/ergebnis/Sandroehrling/")

# link_OutputImage = str("./images/ergebnis/Butterpilz/")

# link_OutputImage = str("./images/ergebnis/Gold-Roehrling/")

# link_OutputImage = str("./images/ergebnis/Ziegenlippe/")

# link_OutputImage = str("./images/ergebnis/Gelber-Knollenblaetterpilz/")

# link_OutputImage = str("./images/ergebnis/Grauer-Wulstling/")

# link_OutputImage = str("./images/ergebnis/Gruener-Knollenblaetterpilz/")

# link_OutputImage = str("./images/ergebnis/Pantherpilz/")

# link_OutputImage = str("./images/ergebnis/Perlpilz/")

link_OutputImage = str("./images/ergebnis/Pfifferling/")

# Import Cascade Classifier

mushroom_cascade = cv2.CascadeClassifier(link_CascadeClassifier)

if mushroom_cascade.empty():

raise IOError('Unable to load the mushroom cascade classifier xml file')

mushroomCount = 0

def resizeImg(img, OutputSize):

print("Resize image!")

return cv2.resize(img, OutputSize)

14 Anhang 14.3.1 Vorverarbeitung (Mushroom_Finder.py)

06.08.2018 Riccardo Jung, Dominik Wagner 73

def cropImg(img, x, y, height, width):

print("Crop image!")

return img[y: y + height, x: x + width]

def saveImg(img, link, name, type):

print("Save image!")

cv2.imwrite(link + str(name) + type, img)

def flipImg(img):

print("Flip image!")

return cv2.flip(img, 1)

def rotateImg(img, x, y, height, width, angle):

print("Rotate image!")

rot_mat_right = cv2.getRotationMatrix2D((x + width / 2, y + height / 2), angle, 1.0)

return cv2.warpAffine(img, rot_mat_right, img.shape[1::-1], flags=cv2.INTER_LINEAR)

def changeGamma(img, gamma):

print("Change gamma image!")

table = np.array([((i / 255.0) ** gamma) * 255

for i in np.arange(0, 256)]).astype("uint8")

return cv2.LUT(img, table)

for i_images in range(1, numberOfPictures):

# Import image

img = cv2.imread(link_InputImage + str(i_images) + fileType)

img_width = img.shape[1]

img_height = img.shape[0]

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Find mushroom

mushroom = mushroom_cascade.detectMultiScale(img_gray, 1.03, 50,

minSize=(int(img_width / 3),

int(img_height / 3)))

for (x, y, w, h) in mushroom:

# Calculate Window

xWindow = int(x - (w * 0.15)) # Start coordinate X

yWindow = int(y - (h * 0.25)) # Start coordinate Y

xWidth = int(w + 2 * (x - xWindow)) # Window width X

yHeight = int(w + (y - yWindow)) # Window height Y

if xWindow < 0:

xWindow = 0

xWidth = w + 2 * x

if yWindow < 0:

yWindow = 0

yHeight = h + y

if (xWidth + xWindow) > img_width:

xcalc = (img_width - w - x)

xWindow = x - xcalc

xWidth = img_width - xWindow

if (yHeight + yWindow) > img_height:

yWindow = y - (img_height - y - h)

yHeight = img_height - yWindow

# Cut Image first time (rough)

crop_img = cropImg(img, xWindow, yWindow, yHeight, xWidth)

# Resize Image first time

crop_img = resizeImg(crop_img, imageOutputSize)

# Find center X coordinate

array_greyMeansX = np.zeros((32, 1))

array_numberOfPixels = np.zeros((32, 1))

14 Anhang 14.3.1 Vorverarbeitung (Mushroom_Finder.py)

06.08.2018 Riccardo Jung, Dominik Wagner 74

for i_mask in range(0, 32):

# Create a mask

mask = np.zeros(crop_img.shape[:2], np.uint8)

mask[int(crop_img.shape[0] / 2):int(crop_img.shape[0]), int(i_mask *

(crop_img.shape[1] / 32)):

int(crop_img.shape[1] / 32 +

i_mask * crop_img.shape[1] / 32)] = 255

masked_img = cv2.bitwise_and(crop_img, crop_img, mask=mask)

# Calculate histogram with mask

hist_mask = cv2.calcHist([crop_img], [0], mask, [256], [0, 256])

for i_greyscale in range(0, 255):

array_greyMeansX[i_mask] = (

array_greyMeansX[i_mask] + hist_mask[i_greyscale] * i_greyscale)

array_numberOfPixels[i_mask] = (

array_numberOfPixels[i_mask] + hist_mask[i_greyscale])

brightestPosition = 8

for i_meanBrightness in range(8, 24):

if (array_greyMeansX[i_meanBrightness] >=

array_greyMeansX[brightestPosition]):

brightestPosition = i_meanBrightness

# Find brightest Area

greyscaleBrightestArea = array_greyMeansX[brightestPosition]

brightestAreaRange = greyscaleBrightestArea * 0.7

array_range = np.zeros((16, 1))

numberOfBrightAreas = 0

for y in range(8, 24):

if (array_greyMeansX[y] >= brightestAreaRange):

array_range[numberOfBrightAreas] = y

numberOfBrightAreas = numberOfBrightAreas + 1

highestAreaInRange = 0

for i_areaInRange in range(0, 15):

if (array_range[i_areaInRange] > 0):

highestAreaInRange = i_areaInRange

# Define Center X coordinate

centerMushroomX = (array_range[0] + array_range[highestAreaInRange]) / 2

# Calculate Window

distanceToCenter = int((crop_img.shape[1] / 2) - (crop_img.shape[1] / 32 *

centerMushroomX))

xWindow = xWindow - distanceToCenter

if xWindow < 0:

xWindow = 0

xWidth = w + 2 * x

if (xWidth + xWindow) > img_width:

xcalc = (img_width - w - x)

xWindow = x - xcalc

xWidth = img_width - xWindow

# Cut image second time

crop_img = cropImg(img, xWindow, yWindow, yHeight, xWidth)

# Resize Image second time

final_img = resizeImg(crop_img, imageOutputSize)

################################################################

# Save Images

################################################################

# Save Image 1

saveImg(final_img, link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 2, flipped

saveImg(flipImg(final_img), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

14 Anhang 14.3.1 Vorverarbeitung (Mushroom_Finder.py)

06.08.2018 Riccardo Jung, Dominik Wagner 75

# Save Image 3, rotated right

saveImg(resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, -

15), xWindow, yWindow, yHeight,

xWidth), imageOutputSize), link_OutputImage,

mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 4, rotated left

saveImg(resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, 15),

xWindow, yWindow, yHeight,

xWidth), imageOutputSize), link_OutputImage,

mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 5, change Gamma

saveImg(changeGamma(final_img, 0.5), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 6, change Gamma and flipped

saveImg(flipImg(changeGamma(final_img, 0.5)), link_OutputImage, mushroomCount,

fileType)

mushroomCount = mushroomCount + 1

# Save Image 7, rotated right and change Gamma

saveImg(changeGamma(resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight,

xWidth, -15),

xWindow, yWindow, yHeight, xWidth),

imageOutputSize), 0.5),

link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 8, rotated left and change Gamma

saveImg(changeGamma(

resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, 15),

xWindow, yWindow, yHeight, xWidth),

imageOutputSize), 0.5), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 9, rotated right and flipped

saveImg(flipImg(resizeImg(

cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, -15), xWindow,

yWindow, yHeight, xWidth),

imageOutputSize)), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 10, rotated left and flipped

saveImg(flipImg(

resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, 15),

xWindow, yWindow, yHeight, xWidth),

imageOutputSize)), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 11, rotated right and flipped and change Gamma

saveImg(changeGamma(flipImg(resizeImg(

cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, -15), xWindow,

yWindow, yHeight, xWidth),

imageOutputSize)), 0.5), link_OutputImage, mushroomCount, fileType)

mushroomCount = mushroomCount + 1

# Save Image 12, rotated left and flipped and change Gamma

saveImg(changeGamma(flipImg(

resizeImg(cropImg(rotateImg(img, xWindow, yWindow, yHeight, xWidth, 15),

xWindow, yWindow, yHeight, xWidth),

imageOutputSize)), 0.5), link_OutputImage, mushroomCount,

fileType)

mushroomCount = mushroomCount + 1

i_images = i_images + 1

14 Anhang 14.3.2 Training neuronales Netz (Mushroom_Classifier.py)

06.08.2018 Riccardo Jung, Dominik Wagner 76

14.3.2 Training neuronales Netz (Mushroom_Classifier.py)

USB-Stick: « Software/Python/Mushroom_Classifier.py »

# -*- coding: utf-8 -*-

### Bachelorarbeit Magic Mushroom App

### V4

### Riccardo Jung / Dominik Wagner

### 08.07.2018

# Imports

import dataset

import layer

import log

import tensorflow as tf

import os

from sklearn.metrics import confusion_matrix

import numpy as np

import matplotlib.pyplot as plt

import itertools

# Adding Seed so that random initialization is consistent

from numpy.random import seed

seed(1)

tf.set_random_seed(2)

# Disable Warnings

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '4'

# Parameter

validation_size = 0.2

num_channels = 3 # channels RGB = 3

# Paths

train_path = 'D:/BA_MagicMushroom/Test/Datenbank/training_data'

# Prepare input data

classes = ['004_Fliegenpilz',

'009_Gelber-Knollenblaetterpilz', '010_Grauer-Wulstling', '011_Gruener-

Knollenblaetterpilz',

'012_Pantherpilz', '013_Perlpilz', '014_Pfifferling']

num_classes = len(classes)

def train(data, img_size, batch_size, learning_rate, number_of_iteration, num_convlayer,

filter, num_filter, fc1_layer_size):

# Construct a hyperparameter string for each one (example: "lr_1E-

3,fc=2,conv=2,fs=3")

global hparam

hparam = make_hparam_string(img_size, batch_size, learning_rate, num_convlayer,

fc1_layer_size, filter, num_filter)

print("Start training: " + hparam)

# Create log file for each test

global logfile

logfile = log.openLogFile(hparam)

log.createLogHeader(logfile, classes, img_size, batch_size, learning_rate,

"AdamOptimizer", num_convlayer, filter, num_filter, fc1_layer_size)

model_path = str('./log/model/' + hparam)

if not os.path.exists(model_path):

os.makedirs(model_path)

tf.reset_default_graph()

global session

session = tf.Session()

# Setup placeholders, and reshape the data

x = tf.placeholder(tf.float32, shape=[None, img_size, img_size, num_channels],

name='x')

x_features = tf.placeholder(tf.float32, shape=[None, 2], name='x_features')

global y

y = tf.placeholder(tf.float32, shape=[None, num_classes], name='labels')

14 Anhang 14.3.2 Training neuronales Netz (Mushroom_Classifier.py)

06.08.2018 Riccardo Jung, Dominik Wagner 77

# Create network

conv = []

conv.append(layer.create_conv_layer(x, num_channels, filter[0], num_filter,

"conv0"))

for num in range(1, num_convlayer):

conv.append(layer.create_conv_layer(conv[num-1], num_filter, filter[num],

num_filter, "conv"+ str(num)))

flattened = layer.create_flatten_layer(conv[num_convlayer-1])

merged = tf.concat([flattened, x_features], -1)

fc1 = layer.create_fc_layer(merged, merged.get_shape()[1:4].num_elements(),

fc1_layer_size, True, "fc1")

logits = layer.create_fc_layer(fc1, fc1_layer_size, num_classes, False, "fc2")

# Calculate prediction and visualize

with tf.name_scope("xent"):

global xent

xent = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,

labels=y), name="xent") # Cost

tf.summary.scalar("Loss", xent)

with tf.name_scope("train"):

train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)

global y_pred

y_pred = tf.nn.softmax(logits, name='y_pred')

with tf.name_scope("accuracy"):

correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))

global accuracy

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.summary.scalar("Accuracy", accuracy)

saver = tf.train.Saver(max_to_keep=2)

# session.run(tf.global_variables_initializer())

## for tensorboard

global writer_val

global writer_train

global write_op

writer_val = tf.summary.FileWriter("./log/tensorboard/plot_val_" + hparam)

writer_train = tf.summary.FileWriter("./log/tensorboard/plot_train_" + hparam)

# writer_train.add_graph(session.graph)

write_op = tf.summary.merge_all()

session.run(tf.global_variables_initializer())

total_iterations = 0

val_acc_old = 0;

val_loss_old = 1000;

for i in range(total_iterations, total_iterations + number_of_iteration):

global y_valid_batch

x_batch, x_features_batch, y_batch, _, cls_batch =

data.train.next_batch(batch_size)

x_valid_batch, x_valid_features_batch, y_valid_batch, _, valid_cls_batch =

data.valid.next_batch(batch_size)

feed_dict_tr = {x: x_batch, x_features: x_features_batch, y: y_batch}

feed_dict_val = {x: x_valid_batch, x_features: x_valid_features_batch, y:

y_valid_batch}

# Visualize in Console

if i % int(data.train.num_examples / batch_size) == 0:

epoch = int(i / int(data.train.num_examples / batch_size))

show_progress(epoch, feed_dict_tr, feed_dict_val, batch_size)

14 Anhang 14.3.2 Training neuronales Netz (Mushroom_Classifier.py)

06.08.2018 Riccardo Jung, Dominik Wagner 78

###################### Save model ##################################

if (val_acc > val_acc_old):

saver.save(session, os.path.join(model_path,

hparam + "_model"))

val_loss_old = val_loss

val_acc_old = val_acc

session.run(train_step, feed_dict=feed_dict_tr)

total_iterations += number_of_iteration

# Close log file

log.writeInFile(logfile, "Training done!")

log.writeInFile(logfile, " Highest val acc: " + str(val_acc_old))

log.writeInFile(logfile, " val loss: " + str(val_loss_old))

log.closeLogFile(logfile)

def make_hparam_string(img_size, batch_size, learning_rate, number_conv, number_fc,

filter_size, num_filter):

img_param = "img=%i" % img_size

batch_param = "batch=%i" % batch_size

conv_param = "conv=%i" % number_conv

fc_param = "fc=%i" % number_fc

filter_param = "fs=%s" % filter_size

num_filter_param = "nf=%s" % num_filter

return "%s,%s,lr_%.0E,%s,%s,%s,%s" % (img_param, batch_param, learning_rate,

conv_param, filter_param, num_filter_param, fc_param)

def main():

for img_size in [128]:

# Load Datasets

data = dataset.read_train_sets(train_path, img_size, classes,

validation_size=validation_size)

print("Complete reading input data. Will Now print a snippet of it")

print("Number of files in Training-set:\t\t{}".format(len(data.train.labels)))

print("Number of files in Validation-set:\t{}".format(len(data.valid.labels)))

num_epochs = 300

if img_size == 64:

batch_size = 256

number_of_iteration = int(num_epochs*len(data.train.labels)/batch_size)

elif img_size == 128:

batch_size = 128

number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

elif img_size == 256:

batch_size = 64

number_of_iteration = int(num_epochs * len(data.train.labels) / batch_size)

for learning_rate in [1E-5]:

global i

i = 0

for num_filter in [32]:

for fc1_layer_size in [64, 128, 256]:

for num_convlayer in [4, 5]:

if num_convlayer == 4:

for filter in [[6, 6, 6, 4], [6, 6, 4, 4], [4, 4, 4, 4], [4,

4, 3, 3], [3, 3, 3, 3]]:

train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter, num_filter, fc1_layer_size)

if num_convlayer == 5:

for filter in [[6, 6, 6, 6, 4], [6, 6, 4, 4, 4], [4, 4, 4,

4, 4], [4, 4, 3, 3, 3], [3, 3, 3, 3, 3]]:

train(data, img_size, batch_size, learning_rate,

number_of_iteration, num_convlayer, filter, num_filter, fc1_layer_size)

def show_progress(epoch, feed_dict_train, feed_dict_validate, batch_size):

14 Anhang 14.3.2 Training neuronales Netz (Mushroom_Classifier.py)

06.08.2018 Riccardo Jung, Dominik Wagner 79

#### Tensorboard

[acc, summary] = session.run([accuracy, write_op], feed_dict=feed_dict_train)

writer_train.add_summary(summary, epoch)

[loss, summary] = session.run([xent, write_op], feed_dict=feed_dict_train)

writer_train.add_summary(summary, epoch)

global val_acc

[val_acc, summary] = session.run([accuracy, write_op], feed_dict=feed_dict_validate)

writer_val.add_summary(summary, epoch)

global val_loss

[val_loss, summary] = session.run([xent, write_op], feed_dict=feed_dict_validate)

writer_val.add_summary(summary, epoch)

# create Folder for ConfusionMatrix

if not os.path.exists("./log/ConfusionMatrix"):

os.makedirs("./log/ConfusionMatrix")

# Confusion matrix

y_pred_show = session.run(y_pred, feed_dict=feed_dict_validate)

y_pred_show_1 = np.argmax(y_pred_show, axis=1)

y_val_1 = np.argmax(y_valid_batch, axis=1)

conf_matrix = confusion_matrix(y_val_1, y_pred_show_1)

plt.imshow(conf_matrix, interpolation='nearest', cmap=plt.cm.Blues)

plt.title('Confusion matrix Epoche: ' + str(epoch))

plt.colorbar(boundaries=np.linspace(0, int(batch_size/6), int(batch_size/12)+1))

tick_marks = np.arange(len(classes))

plt.xticks(tick_marks, classes, rotation=90, fontsize=7)

plt.yticks(tick_marks, classes, fontsize=7)

thresh = conf_matrix.max() / 2.

for u, j in itertools.product(range(conf_matrix.shape[0]),

range(conf_matrix.shape[1])):

plt.text(j, u, format(conf_matrix[u, j], 'd'),

horizontalalignment="center", verticalalignment="center", fontsize=7,

color="white" if conf_matrix[u, j] > thresh else "black")

plt.ylabel("True label")

plt.xlabel("Predicted label")

plt.tight_layout()

if not os.path.exists("./log/ConfusionMatrix/" + hparam):

os.makedirs("./log/ConfusionMatrix/" + hparam)

plt.savefig("./log/ConfusionMatrix/" + hparam + "/" + str(epoch+1))

plt.close()

plt.clf()

# Visualize in Console

msg = "Training Epoch {0} --- Training Accuracy: {1:>6.1%}, Validation Accuracy:

{2:>6.1%}, Validation Loss: {3:.3f} \n"

print(msg.format(epoch, acc, val_acc, val_loss))

# Visualize in log file

log.writeInFile(logfile, msg.format(epoch, acc, val_acc, val_loss))

main()

14 Anhang 14.3.3 Datensatz vorbereiten (dataset.py)

06.08.2018 Riccardo Jung, Dominik Wagner 80

14.3.3 Datensatz vorbereiten (dataset.py)

USB-Stick: « Software/Python/dataset.py »

### Bachelorarbeit Magic Mushroom App

### Load Dataset

### Riccardo Jung / Dominik Wagner

# Import

import cv2

import os

import glob

from sklearn.utils import shuffle

import numpy as np

import MushroomFeatures_JSON

def load_train(train_path, image_size, classes, validation_size):

train_images = []

train_features = []

train_labels = []

train_img_names = []

train_cls = []

valid_images = []

valid_features = []

valid_labels = []

valid_img_names = []

valid_cls = []

print('Going to read training images')

for fields in classes:

index = classes.index(fields)

print('Now going to read {} files (Index: {})'.format(fields, index))

path = os.path.join(train_path, fields, '*g')

files = glob.glob(path)

for fl in files:

files_index = files.index(fl)

numberoffiles = len(files)

image = cv2.imread(fl)

image = cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR)

image = image.astype(np.float32)

image = np.multiply(image, 1.0 / 255.0)

randomStemLength = MushroomFeatures_JSON.getRandomStemLength(fields)

randomHatDiameter = MushroomFeatures_JSON.getRandomHatDiameter(fields)

features = [randomStemLength, randomHatDiameter]

if(files_index < int(numberoffiles*(1-validation_size))):

train_images.append(image)

label = np.zeros(len(classes))

label[index] = 1.0

train_labels.append(label)

flbase = os.path.basename(fl)

train_img_names.append(flbase)

train_cls.append(fields)

train_features.append(features)

else:

valid_images.append(image)

label = np.zeros(len(classes))

label[index] = 1.0

valid_labels.append(label)

flbase = os.path.basename(fl)

valid_img_names.append(flbase)

valid_cls.append(fields)

valid_features.append(features)

14 Anhang 14.3.3 Datensatz vorbereiten (dataset.py)

06.08.2018 Riccardo Jung, Dominik Wagner 81

train_images = np.array(train_images)

train_features = np.array(train_features)

train_labels = np.array(train_labels)

train_img_names = np.array(train_img_names)

train_cls = np.array(train_cls)

valid_images = np.array(valid_images)

valid_features = np.array(valid_features)

valid_labels = np.array(valid_labels)

valid_img_names = np.array(valid_img_names)

valid_cls = np.array(valid_cls)

return train_images, train_features, train_labels, train_img_names, train_cls,

valid_images, valid_features, valid_labels, valid_img_names, valid_cls

class DataSet(object):

def __init__(self, images, features, labels, img_names, cls):

self._num_examples = images.shape[0]

self._images = images

self._features = features

self._labels = labels

self._img_names = img_names

self._cls = cls

self._epochs_done = 0

self._index_in_epoch = 0

@property

def images(self):

return self._images

@property

def features(self):

return self._features

@property

def labels(self):

return self._labels

@property

def img_names(self):

return self._img_names

@property

def cls(self):

return self._cls

@property

def num_examples(self):

return self._num_examples

@property

def epochs_done(self):

return self._epochs_done

def next_batch(self, batch_size):

"""Return the next `batch_size` examples from this data set."""

start = self._index_in_epoch

self._index_in_epoch += batch_size

if self._index_in_epoch > self._num_examples:

# After each epoch we update this

self._epochs_done += 1

start = 0

self._index_in_epoch = batch_size

assert batch_size <= self._num_examples

end = self._index_in_epoch

return self._images[start:end], self._features[start:end], self._labels[start:end],

self._img_names[start:end], self._cls[start:end]

14 Anhang 14.3.4 Schichten für neuronales Netz (layer.py)

06.08.2018 Riccardo Jung, Dominik Wagner 82

def read_train_sets(train_path, image_size, classes, validation_size):

class DataSets(object):

pass

data_sets = DataSets()

train_images, train_features, train_labels, train_img_names, train_cls, valid_images,

valid_features, valid_labels, valid_img_names, valid_cls = load_train(train_path,

image_size, classes, validation_size)

train_images, train_features, train_labels, train_img_names, train_cls =

shuffle(train_images, train_features, train_labels, train_img_names, train_cls)

valid_images, valid_features, valid_labels, valid_img_names, valid_cls =

shuffle(valid_images, valid_features, valid_labels, valid_img_names, valid_cls)

data_sets.train = DataSet(train_images, train_features, train_labels, train_img_names,

train_cls)

data_sets.valid = DataSet(valid_images, valid_features, valid_labels, valid_img_names,

valid_cls)

return data_sets

14.3.4 Schichten für neuronales Netz (layer.py)

USB-Stick: « Software/Python/layer.py »

### Bachelorarbeit Magic Mushroom App

### Create layer

### Riccardo Jung / Dominik Wagner

### 08.07.2018

# Import

import tensorflow as tf

# Convutional layer

def create_conv_layer(input, size_in, filter_size, size_out, name="conv"):

with tf.name_scope(name):

w = tf.Variable(tf.truncated_normal([filter_size, filter_size, size_in,

size_out], stddev=0.1), name="W")

b = tf.Variable(tf.constant(0.05, shape=[size_out]), name="B")

conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")

act = tf.nn.relu(conv + b)

# tf.summary.histogram("weights", w)

# tf.summary.histogram("biases", b)

# tf.summary.histogram("activations", act)

return tf.layers.batch_normalization(tf.nn.max_pool(act, ksize=[1, 2, 2, 1],

strides=[1, 2, 2, 1], padding="SAME"))

# Flatten layer --> needed for fully connected layer

def create_flatten_layer(layer):

# Shape of the layer: [batch_size img_size img_size num_channels]

layer_shape = layer.get_shape()

# Number of features: img_height * img_width* num_channels

num_features = layer_shape[1:4].num_elements()

layer = tf.reshape(layer, [-1, num_features])

return layer

# Full connected layer

def create_fc_layer(input, size_in, size_out, use_relu=True, name="fc"): # Fully

connected Layer

with tf.name_scope(name):

w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name="W")

b = tf.Variable(tf.constant(0.05, shape=[size_out]), name="B")

act = tf.matmul(input, w) + b

if use_relu:

act = tf.nn.relu(act)

# tf.summary.histogram("weights", w)

# tf.summary.histogram("biases", b)

# tf.summary.histogram("activations", act)

return act

14 Anhang 14.3.5 Logdateien (log.py)

06.08.2018 Riccardo Jung, Dominik Wagner 83

14.3.5 Logdateien (log.py)

USB-Stick: « Software/Python/log.py »

### Bachelorarbeit Magic Mushroom App

### Create Log File

### Riccardo Jung / Dominik Wagner

### 08.07.2018

# Import

import os

def openLogFile(name):

if not os.path.exists("./log/txt"):

os.makedirs("./log/txt")

logfile = open("log/txt/" + name + ".txt", "w")

return logfile

def closeLogFile(logfile):

logfile.close()

def writeInFile(logfile, text):

logfile.write(text)

def createLogHeader(logfile, classes, img_size, batch_size, learning_rate, optimizer,

num_convlayer, filter, num_filter, fc1_layer_size):

msg_classes = "Classes: {0} \n"

msg_img_size = "Image size: {0}x{0} Pixel \n"

msg_batch_size = "Batch size: {0} \n"

msg_learning_rate = "Learning rate: {0} \n"

msg_optimizer = "Optimizer: {0} \n"

msg_num_convlayer = "Number of convolutional layers: {0} \n"

msg_filter = "Filter size: {0} \n"

msg_num_filter = "Number of filters: {0} \n"

mgs_fc1_layersize = "Fully connected layer size: {0} \n \n"

logfile.write(msg_classes.format(classes))

logfile.write(msg_img_size.format(img_size))

logfile.write(msg_batch_size.format(batch_size))

logfile.write(msg_learning_rate.format(learning_rate))

logfile.write(msg_optimizer.format(optimizer))

logfile.write(msg_num_convlayer.format(num_convlayer))

logfile.write(msg_filter.format(filter))

logfile.write(msg_num_filter.format(num_filter))

logfile.write(mgs_fc1_layersize.format(fc1_layer_size))

logfile.write("------------------------------------------------------------------

\n")

logfile.write("Start Training: \n")

14 Anhang 14.3.6 Zusätzliche Features (MushroomFeatures_JSON.py)

06.08.2018 Riccardo Jung, Dominik Wagner 84

14.3.6 Zusätzliche Features (MushroomFeatures_JSON.py)

USB-Stick: « Software/Python/MushroomFeatures_JSON.py »

### Bachelorarbeit Magic Mushroom App

### Get mushroom features from JSON file

### Riccardo Jung / Dominik Wagner

### 08.07.2018

# Import

import json

import numpy as np

from pprint import pprint

with open('MushroomFeatures.json') as data_file:

data = json.load(data_file)

def getStemLength(mushroom):

return data[mushroom][0]["Stiellaenge"]

def getStemStandardDeviation(mushroom):

return data[mushroom][0]["Stiellaenge_Standardabweichung"]

def getHatDiameter(mushroom):

return data[mushroom][0]["Hutdurchmesser"]

def getHatStandardDeviation(mushroom):

return data[mushroom][0]["Hutdurchmesser_Standardabweichung"]

def getRandomStemLength(mushroom):

stemLength = getStemLength(mushroom)

randomStemLength = np.random.normal(stemLength, getStemStandardDeviation(mushroom))

if(randomStemLength < stemLength/10 or randomStemLength > stemLength*2):

return getRandomStemLength(mushroom)

else:

return randomStemLength

def getRandomHatDiameter(mushroom):

hatDiameter = getHatDiameter(mushroom)

randomhatDiameter = np.random.normal(hatDiameter, getHatStandardDeviation(mushroom))

if (randomhatDiameter < hatDiameter / 10 or randomhatDiameter > hatDiameter * 2):

return getRandomHatDiameter(mushroom)

else:

return randomhatDiameter

14 Anhang 14.3.6 Zusätzliche Features (MushroomFeatures_JSON.py)

06.08.2018 Riccardo Jung, Dominik Wagner 85

14.4 JSON File (MushroomFeatures.json)

USB-Stick: « Software/Python/MushroomFeatures.json »

{

"000_Sommer-Steinpilz" : [ {

"Name": " Boletus aestivalis / Sommer-Steinpilz",

"Stiellaenge": 12,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 13,

"Hutdurchmesser_Standardabweichung": 4,

"Essbar": "Yes/Ja"}

],

"001_Kiefern-Steinpilz" : [ {

"Name": "Boletus pinophilus / Kiefern-Steinpilz",

"Stiellaenge": 8,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 17,

"Hutdurchmesser_Standardabweichung": 4,

"Essbar": "Yes/Ja"}

],

"002_Gemeiner-Steinpilz" : [ {

"Name": "Boletus edulis / Gemeiner-Steinpilz",

"Stiellaenge": 12,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 16,

"Hutdurchmesser_Standardabweichung": 4,

"Essbar": "Yes/Ja"}

],

"003_Schwarzhuetiger-Steinpilz" : [ {

"Name": "Boletus aereus / Schwarzhütiger-Steinpilz",

"Stiellaenge": 10,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 13,

"Hutdurchmesser_Standardabweichung": 4,

"Essbar": "Yes/Ja"}

],

"004_Fliegenpilz" : [ {

"Name": "Amanita muscaria / Fliegenpilz",

"Stiellaenge": 10,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 13,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "No, attention toxic!/Nein, Achtung giftig!"}

],

"005_Butterpilz" : [ {

"Name": "Suillus luteus / Butterpilz",

"Stiellaenge": 6,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 8,

"Hutdurchmesser_Standardabweichung": 2,

"Essbar": "Yes/Ja"}

],

"006_Gold-Roehrling" : [ {

"Name": "Suillus grevillei / Gold-Röhrling",

"Stiellaenge": 7,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 10,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "Yes/Ja"}

],

"007_Sandroehrling" : [ {

"Name": "Suillus variegatus / Sand-Röhrling",

"Stiellaenge": 6,

"Stiellaenge_Standardabweichung": 1,

"Hutdurchmesser": 8,

"Hutdurchmesser_Standardabweichung": 2,

"Essbar": "Yes/Ja"}

],

14 Anhang 14.3.6 Zusätzliche Features (MushroomFeatures_JSON.py)

06.08.2018 Riccardo Jung, Dominik Wagner 86

"008_Ziegenlippe" : [ {

"Name": "Xerocomus subtomentosus / Ziegenlippe",

"Stiellaenge": 6,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 7,

"Hutdurchmesser_Standardabweichung": 2,

"Essbar": "Yes/Ja"}

],

"009_Gelber-Knollenblaetterpilz" : [ {

"Name": "Amanita citrina / Gelber-Knollenblätterpilz",

"Stiellaenge": 10,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 6,

"Hutdurchmesser_Standardabweichung": 2,

"Essbar": "No, attention toxic!/Nein, Achtung giftig!"}

],

"010_Grauer-Wulstling" : [ {

"Name": "Amanita excelsa / Grauer-Wulstling",

"Stiellaenge": 10,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 9,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "Limited edible, raw: toxic, cooked: edible/Bedingt, roh: giftig,

gekocht: essbar"}

],

"011_Gruener-Knollenblaetterpilz" : [ {

"Name": "Amanita phalloides / Grüner-Knollenblätterpilz",

"Stiellaenge": 11,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 10,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "No, attention toxic!/Nein, Achtung giftig!"}

],

"012_Pantherpilz" : [ {

"Name": "Amanita pantherina / Pantherpilz",

"Stiellaenge": 9,

"Stiellaenge_Standardabweichung": 2,

"Hutdurchmesser": 7,

"Hutdurchmesser_Standardabweichung": 2,

"Essbar": "No, attention toxic!/Nein, Achtung giftig!"}

],

"013_Perlpilz" : [ {

"Name": "Amanita rubescens / Perlpilz",

"Stiellaenge": 12,

"Stiellaenge_Standardabweichung": 3,

"Hutdurchmesser": 10,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "Limited edible, raw: toxic, cooked: edible/Bedingt, roh: giftig,

gekocht: essbar"}

],

"014_Pfifferling" : [ {

"Name": "Cantharellus cibarius / Pfifferling",

"Stiellaenge": 4,

"Stiellaenge_Standardabweichung": 1,

"Hutdurchmesser": 8,

"Hutdurchmesser_Standardabweichung": 3,

"Essbar": "Yes/Ja"}

]

}

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 87

14.5 Testergebnisse Grid-Tests

Lamellenpilze Testreihe 1

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

13.06.2018 56 Lamellen(7) 128 128 3 3 [6,6,4] 32 64 0.0001 100 80.5 % 1.394

13.06.2018 67 Lamellen(7) 128 128 3 3 [8,6,4] 32 128 0.0001 100 79.7 % 0.816

13.06.2018 32 Lamellen(7) 256 64 3 3 [6,6,4] 32 128 0.0001 100 78.1 % 1.016

13.06.2018 60 Lamellen(7) 128 128 3 4 [8,6,4,4] 32 64 0.0001 100 78.1 % 1.112

13.06.2018 64 Lamellen(7) 128 128 3 2 [4,4] 32 128 0.0001 100 78.1 % 1.395

13.06.2018 71 Lamellen(7) 128 128 3 4 [8,6,6,4] 32 128 0.0001 100 78.1 % 1.679

13.06.2018 8 Lamellen(7) 256 64 3 3 [6,6,4] 32 32 0.0001 100 77.7 % 0.772

13.06.2018 28 Lamellen(7) 256 64 3 2 [4,4] 32 128 0.0001 100 77.0 % 0.833

13.06.2018 12 Lamellen(7) 256 64 3 4 [8,6,4,4] 32 32 0.0001 100 76.7 % 0.952

13.06.2018 16 Lamellen(7) 256 64 3 2 [4,4] 32 64 0.0001 100 76.6 % 0.794

13.06.2018 48 Lamellen(7) 128 128 3 4 [8,6,4,4] 32 32 0.0001 100 76.6 % 1.239

13.06.2018 63 Lamellen(7) 128 128 3 2 [6,6] 32 128 0.0001 100 76.6 % 1.300

13.06.2018 69 Lamellen(7) 128 128 3 4 [10,8,6,6] 32 128 0.0001 100 76.6 % 1.655

13.06.2018 4 Lamellen(7) 256 64 3 2 [4,4] 32 32 0.0001 100 76.2 % 0.814

13.06.2018 43 Lamellen(7) 128 128 3 3 [8,6,4] 32 32 0.0001 100 75.8 % 1.887

13.06.2018 52 Lamellen(7) 128 128 3 2 [4,4] 32 64 0.0001 100 75.8 % 0.968

13.06.2018 53 Lamellen(7) 128 128 3 3 [10,8,6] 32 64 0.0001 100 75.8 % 2.062

13.06.2018 58 Lamellen(7) 128 128 3 4 [8,8,6,4] 32 64 0.0001 100 75.8 % 0.933

13.06.2018 59 Lamellen(7) 128 128 3 4 [8,6,6,4] 32 64 0.0001 100 75.8 % 0.936

13.06.2018 68 Lamellen(7) 128 128 3 3 [6,6,4] 32 128 0.0001 100 75.8 % 2.134

13.06.2018 72 Lamellen(7) 128 128 3 4 [8,6,4,4] 32 128 0.0001 100 75.8 % 1.259

13.06.2018 34 Lamellen(7) 256 64 3 4 [8,8,6,4] 32 128 0.0001 100 75.4 % 1.097

13.06.2018 46 Lamellen(7) 128 128 3 4 [8,8,6,4] 32 32 0.0001 100 75.0 % 1.278

13.06.2018 54 Lamellen(7) 128 128 3 3 [8,8,6] 32 64 0.0001 100 75.0 % 1.400

13.06.2018 55 Lamellen(7) 128 128 3 3 [8,6,4] 32 64 0.0001 100 75.0 % 1.325

13.06.2018 6 Lamellen(7) 256 64 3 3 [8,8,6] 32 32 0.0001 100 74.6 % 1.406

13.06.2018 20 Lamellen(7) 256 64 3 3 [6,6,4] 32 64 0.0001 100 74.2 % 0.859

13.06.2018 23 Lamellen(7) 256 64 3 4 [8,6,6,4] 32 64 0.0001 100 74.2 % 1.074

13.06.2018 44 Lamellen(7) 128 128 3 3 [6,6,4] 32 32 0.0001 100 74.2 % 1.829

13.06.2018 47 Lamellen(7) 128 128 3 4 [8,6,6,4] 32 32 0.0001 100 74.2 % 0.874

13.06.2018 57 Lamellen(7) 128 128 3 4 [10,8,6,6] 32 64 0.0001 100 74.2 % 1.661

13.06.2018 66 Lamellen(7) 128 128 3 3 [8,8,6] 32 128 0.0001 100 74.2 % 1.542

13.06.2018 70 Lamellen(7) 128 128 3 4 [8,8,6,4] 32 128 0.0001 100 74.2 % 1.288

13.06.2018 11 Lamellen(7) 256 64 3 4 [8,6,6,4] 32 32 0.0001 100 73.8 % 1.039

13.06.2018 18 Lamellen(7) 256 64 3 3 [8,8,6] 32 64 0.0001 100 73.8 % 1.178

13.06.2018 19 Lamellen(7) 256 64 3 3 [8,6,4] 32 64 0.0001 100 73.8 % 1.052

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 88

13.06.2018 31 Lamellen(7) 256 64 3 3 [8,6,4] 32 128 0.0001 100 73.8 % 0.887

13.06.2018 33 Lamellen(7) 256 64 3 4 [10,8,6,6] 32 128 0.0001 100 73.8 % 1.448

13.06.2018 65 Lamellen(7) 128 128 3 3 [10,8,6] 32 128 0.0001 100 73.4 % 1.228

13.06.2018 7 Lamellen(7) 256 64 3 3 [8,6,4] 32 32 0.0001 100 73.0 % 0.855

13.06.2018 15 Lamellen(7) 256 64 3 2 [6,6] 32 64 0.0001 100 72.7 % 0.877

13.06.2018 50 Lamellen(7) 128 128 3 2 [8,8] 32 64 0.0001 100 72.7 % 1.933

13.06.2018 10 Lamellen(7) 256 64 3 4 [8,8,6,4] 32 32 0.0001 100 72.3 % 0.984

13.06.2018 35 Lamellen(7) 256 64 3 4 [8,6,6,4] 32 128 0.0001 100 72.3 % 1.119

13.06.2018 5 Lamellen(7) 256 64 3 3 [10,8,6] 32 32 0.0001 100 71.9 % 1.303

13.06.2018 26 Lamellen(7) 256 64 3 2 [8,8] 32 128 0.0001 100 71.9 % 1.366

13.06.2018 37 Lamellen(7) 128 128 3 2 [10,10] 32 32 0.0001 100 71.9 % 2.045

13.06.2018 45 Lamellen(7) 128 128 3 4 [10,8,6,6] 32 32 0.0001 100 71.9 % 1.257

13.06.2018 36 Lamellen(7) 256 64 3 4 [8,6,4,4] 32 128 0.0001 100 71.5 % 1.010

13.06.2018 27 Lamellen(7) 256 64 3 2 [6,6] 32 128 0.0001 100 71.1 % 1.413

13.06.2018 39 Lamellen(7) 128 128 3 2 [6,6] 32 32 0.0001 100 71.1 % 0.853

13.06.2018 41 Lamellen(7) 128 128 3 3 [10,8,6] 32 32 0.0001 100 71.1 % 2.053

13.06.2018 42 Lamellen(7) 128 128 3 3 [8,8,6] 32 32 0.0001 100 71.1 % 1.752

13.06.2018 51 Lamellen(7) 128 128 3 2 [6,6] 32 64 0.0001 100 71.1 % 1.493

13.06.2018 61 Lamellen(7) 128 128 3 2 [10,10] 32 128 0.0001 100 71.1 % 2.804

13.06.2018 62 Lamellen(7) 128 128 3 2 [8,8] 32 128 0.0001 100 71.1 % 1.910

13.06.2018 3 Lamellen(7) 256 64 3 2 [6,6] 32 32 0.0001 100 70.7 % 1.295

13.06.2018 2 Lamellen(7) 256 64 3 2 [8,8] 32 32 0.0001 100 70.3 % 1.328

13.06.2018 17 Lamellen(7) 256 64 3 3 [10,8,6] 32 64 0.0001 100 70.3 % 1.245

13.06.2018 29 Lamellen(7) 256 64 3 3 [10,8,6] 32 128 0.0001 100 70.3 % 1.384

13.06.2018 1 Lamellen(7) 256 64 3 2 [10,10] 32 32 0.0001 100 69.9 % 1.264

13.06.2018 24 Lamellen(7) 256 64 3 4 [8,6,4,4] 32 64 0.0001 100 69.5 % 1.157

13.06.2018 49 Lamellen(7) 128 128 3 2 [10,10] 32 64 0.0001 100 69.5 % 2.655

13.06.2018 9 Lamellen(7) 256 64 3 4 [10,8,6,6] 32 32 0.0001 100 68.8 % 1.293

13.06.2018 21 Lamellen(7) 256 64 3 4 [10,8,6,6] 32 64 0.0001 100 68.8 % 1.227

13.06.2018 38 Lamellen(7) 128 128 3 2 [8,8] 32 32 0.0001 100 68.8 % 1.431

13.06.2018 40 Lamellen(7) 128 128 3 2 [4,4] 32 32 0.0001 100 68.8 % 1.126

13.06.2018 30 Lamellen(7) 256 64 3 3 [8,8,6] 32 128 0.0001 100 68.4 % 1.440

13.06.2018 13 Lamellen(7) 256 64 3 2 [10,10] 32 64 0.0001 100 68.0 % 1.644

13.06.2018 14 Lamellen(7) 256 64 3 2 [8,8] 32 64 0.0001 100 68.0 % 1.724

13.06.2018 22 Lamellen(7) 256 64 3 4 [8,8,6,4] 32 64 0.0001 100 68.0 % 1.221

13.06.2018 25 Lamellen(7) 256 64 3 2 [10,10] 32 128 0.0001 100 64.1 % 1.929

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 89

Lamellenpilze Testreihe 2

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

15.06.2018 175 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 128 0.001 100 85.2 % 1.528

15.06.2018 140 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 256 0.0001 100 84.4 % 0.640

15.06.2018 190 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 256 0.001 100 84.4 % 1.203

15.06.2018 174 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 128 0.001 100 83.6 % 1.052

15.06.2018 92 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 256 0.001 100 83.2 % 1.356

15.06.2018 160 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 64 0.001 100 82.8 % 1.037

15.06.2018 168 Lamellen(7) 128 128 3 3 [3,3,3] 32 128 0.001 100 82.8 % 1.422

15.06.2018 192 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 256 0.001 100 82.8 % 1.386

15.06.2018 60 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 64 0.001 100 82.0 % 0.661

15.06.2018 112 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 64 0.0001 100 82.0 % 0.691

15.06.2018 123 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 128 0.0001 100 82.0 % 0.870

15.06.2018 155 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 64 0.001 100 82.0 % 0.948

15.06.2018 156 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 64 0.001 100 82.0 % 1.831

15.06.2018 172 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 128 0.001 100 82.0 % 1.833

15.06.2018 71 Lamellen(7) 256 64 3 3 [4,4,4] 32 128 0.001 100 81.3 % 0.712

15.06.2018 111 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 64 0.0001 100 81.3 % 0.810

15.06.2018 128 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 128 0.0001 100 81.3 % 0.658

15.06.2018 144 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 256 0.0001 100 81.3 % 0.792

15.06.2018 72 Lamellen(7) 256 64 3 3 [3,3,3] 32 128 0.001 100 80.9 % 1.714

15.06.2018 8 Lamellen(7) 256 64 3 3 [3,3,3] 32 64 0.0001 100 80.5 % 0.662

15.06.2018 135 Lamellen(7) 128 128 3 3 [4,4,4] 32 256 0.0001 100 80.5 % 1.451

15.06.2018 176 Lamellen(7) 128 128 3 5 [3,3,3,3,3] 32 128 0.001 100 80.5 % 1.620

15.06.2018 183 Lamellen(7) 128 128 3 3 [4,4,4] 32 256 0.001 100 80.5 % 1.628

15.06.2018 188 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 256 0.001 100 80.5 % 1.646

15.06.2018 137 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 256 0.0001 100 80.4 % 1.318

15.06.2018 24 Lamellen(7) 256 64 3 3 [3,3,3] 32 128 0.0001 100 79.7 % 0.761

15.06.2018 104 Lamellen(7) 128 128 3 3 [3,3,3] 32 64 0.0001 100 79.7 % 1.334

15.06.2018 108 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 64 0.0001 100 79.7 % 0.761

15.06.2018 122 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 128 0.0001 100 79.7 % 1.267

15.06.2018 124 Lamellen(7) 128 128 3 4 [3,3,3,3] 32 128 0.0001 100 79.7 % 0.639

15.06.2018 139 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 256 0.0001 100 79.7 % 0.658

15.06.2018 165 Lamellen(7) 128 128 3 3 [6,6,4] 32 128 0.001 100 79.7 % 1.753

15.06.2018 191 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 256 0.001 100 79.7 % 1.730

15.06.2018 12 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 64 0.0001 100 79.3 % 0.688

15.06.2018 11 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 64 0.0001 100 78.9 % 0.775

15.06.2018 16 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 64 0.0001 100 78.9 % 0.693

15.06.2018 31 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 128 0.0001 100 78.9 % 0.711

15.06.2018 44 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 256 0.0001 100 78.9 % 0.670

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 90

15.06.2018 88 Lamellen(7) 256 64 3 3 [3,3,3] 32 256 0.001 100 78.9 % 1.582

15.06.2018 90 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 256 0.001 100 78.9 % 1.844

15.06.2018 109 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 64 0.0001 100 78.9 % 1.171

15.06.2018 126 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 128 0.0001 100 78.9 % 0.942

15.06.2018 127 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 128 0.0001 100 78.9 % 0.642

15.06.2018 136 Lamellen(7) 128 128 3 3 [3,3,3] 32 256 0.0001 100 78.9 % 1.231

15.06.2018 138 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 256 0.0001 100 78.9 % 1.278

15.06.2018 143 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 256 0.0001 100 78.9 % 1.237

15.06.2018 148 Lamellen(7) 128 128 3 2 [3,3] 32 64 0.001 100 78.9 % 0.873

15.06.2018 151 Lamellen(7) 128 128 3 3 [4,4,4] 32 64 0.001 100 78.9 % 2.563

15.06.2018 153 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 64 0.001 100 78.9 % 1.960

15.06.2018 157 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 64 0.001 100 78.9 % 1.043

15.06.2018 169 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 128 0.001 100 78.9 % 1.782

15.06.2018 171 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 128 0.001 100 78.9 % 2.183

15.06.2018 181 Lamellen(7) 128 128 3 3 [6,6,4] 32 256 0.001 100 78.9 % 1.566

15.06.2018 182 Lamellen(7) 128 128 3 3 [6,4,4] 32 256 0.001 100 78.9 % 1.879

15.06.2018 184 Lamellen(7) 128 128 3 3 [3,3,3] 32 256 0.001 100 78.9 % 1.465

15.06.2018 185 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 256 0.001 100 78.9 % 1.510

15.06.2018 187 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 256 0.001 100 78.9 % 1.112

15.06.2018 14 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 64 0.0001 100 78.5 % 0.854

15.06.2018 64 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 64 0.001 100 78.5 % 0.715

15.06.2018 35 Lamellen(7) 256 64 3 2 [4,4] 32 256 0.0001 100 78.1 % 0.938

15.06.2018 37 Lamellen(7) 256 64 3 3 [6,6,4] 32 256 0.0001 100 78.1 % 0.886

15.06.2018 46 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 256 0.0001 100 78.1 % 0.881

15.06.2018 96 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 256 0.001 100 78.1 % 1.574

15.06.2018 105 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 64 0.0001 100 78.1 % 1.700

15.06.2018 115 Lamellen(7) 128 128 3 2 [4,4] 32 128 0.0001 100 78.1 % 0.725

15.06.2018 119 Lamellen(7) 128 128 3 3 [4,4,4] 32 128 0.0001 100 78.1 % 1.982

15.06.2018 120 Lamellen(7) 128 128 3 3 [3,3,3] 32 128 0.0001 100 78.1 % 1.026

15.06.2018 132 Lamellen(7) 128 128 3 2 [3,3] 32 256 0.0001 100 78.1 % 1.170

15.06.2018 164 Lamellen(7) 128 128 3 2 [3,3] 32 128 0.001 100 78.1 % 0.721

15.06.2018 167 Lamellen(7) 128 128 3 3 [4,4,4] 32 128 0.001 100 78.1 % 1.393

15.06.2018 170 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 128 0.001 100 78.1 % 0.772

15.06.2018 189 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 256 0.001 100 78.1 % 1.678

15.06.2018 38 Lamellen(7) 256 64 3 3 [6,4,4] 32 256 0.0001 100 77.7 % 0.788

15.06.2018 53 Lamellen(7) 256 64 3 3 [6,6,4] 32 64 0.001 100 77.7 % 1.996

15.06.2018 62 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 64 0.001 100 77.7 % 1.724

15.06.2018 94 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 256 0.001 100 77.7 % 1.848

15.06.2018 6 Lamellen(7) 256 64 3 3 [6,4,4] 32 64 0.0001 100 77.3 % 1.107

15.06.2018 17 Lamellen(7) 256 64 3 2 [6,6] 32 128 0.0001 100 77.3 % 1.157

15.06.2018 27 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 128 0.0001 100 77.3 % 0.730

15.06.2018 39 Lamellen(7) 256 64 3 3 [4,4,4] 32 256 0.0001 100 77.3 % 0.797

15.06.2018 40 Lamellen(7) 256 64 3 3 [3,3,3] 32 256 0.0001 100 77.3 % 0.738

15.06.2018 52 Lamellen(7) 256 64 3 2 [3,3] 32 64 0.001 100 77.3 % 0.796

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 91

15.06.2018 70 Lamellen(7) 256 64 3 3 [6,4,4] 32 128 0.001 100 77.3 % 1.316

15.06.2018 87 Lamellen(7) 256 64 3 3 [4,4,4] 32 256 0.001 100 77.3 % 1.621

15.06.2018 103 Lamellen(7) 128 128 3 3 [4,4,4] 32 64 0.0001 100 77.3 % 1.332

15.06.2018 107 Lamellen(7) 128 128 3 4 [4,4,4,4] 32 64 0.0001 100 77.3 % 0.737

15.06.2018 142 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 256 0.0001 100 77.3 % 0.811

15.06.2018 158 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 64 0.001 100 77.3 % 2.470

15.06.2018 159 Lamellen(7) 128 128 3 5 [4,4,4,4,4] 32 64 0.001 100 77.3 % 2.268

15.06.2018 186 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 256 0.001 100 77.3 % 1.370

15.06.2018 4 Lamellen(7) 256 64 3 2 [3,3] 32 64 0.0001 100 77.0 % 0.786

15.06.2018 7 Lamellen(7) 256 64 3 3 [4,4,4] 32 64 0.0001 100 77.0 % 0.813

15.06.2018 15 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 64 0.0001 100 77.0 % 0.758

15.06.2018 28 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 128 0.0001 100 77.0 % 0.725

15.06.2018 42 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 256 0.0001 100 77.0 % 0.815

15.06.2018 43 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 256 0.0001 100 77.0 % 0.732

15.06.2018 54 Lamellen(7) 256 64 3 3 [6,4,4] 32 64 0.001 100 77.0 % 1.865

15.06.2018 56 Lamellen(7) 256 64 3 3 [3,3,3] 32 64 0.001 100 77.0 % 0.724

15.06.2018 69 Lamellen(7) 256 64 3 3 [6,6,4] 32 128 0.001 100 77.0 % 1.613

15.06.2018 80 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 128 0.001 100 77.0 % 1.926

15.06.2018 147 Lamellen(7) 128 128 3 2 [4,4] 32 64 0.001 100 76.7 % 0.726

15.06.2018 21 Lamellen(7) 256 64 3 3 [6,6,4] 32 128 0.0001 100 76.6 % 0.832

15.06.2018 22 Lamellen(7) 256 64 3 3 [6,4,4] 32 128 0.0001 100 76.6 % 1.243

15.06.2018 26 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 128 0.0001 100 76.6 % 0.817

15.06.2018 30 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 128 0.0001 100 76.6 % 0.930

15.06.2018 47 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 256 0.0001 100 76.6 % 0.826

15.06.2018 85 Lamellen(7) 256 64 3 3 [6,6,4] 32 256 0.001 100 76.6 % 1.367

15.06.2018 86 Lamellen(7) 256 64 3 3 [6,4,4] 32 256 0.001 100 76.6 % 1.408

15.06.2018 101 Lamellen(7) 128 128 3 3 [6,6,4] 32 64 0.0001 100 76.6 % 0.900

15.06.2018 102 Lamellen(7) 128 128 3 3 [6,4,4] 32 64 0.0001 100 76.6 % 1.557

15.06.2018 106 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 64 0.0001 100 76.6 % 0.790

15.06.2018 110 Lamellen(7) 128 128 3 5 [6,6,4,4,4] 32 64 0.0001 100 76.6 % 0.752

15.06.2018 154 Lamellen(7) 128 128 3 4 [6,6,4,4] 32 64 0.001 100 76.6 % 2.322

15.06.2018 10 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 64 0.0001 100 76.2 % 0.843

15.06.2018 48 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 256 0.0001 100 76.2 % 0.696

15.06.2018 51 Lamellen(7) 256 64 3 2 [4,4] 32 64 0.001 100 76.2 % 1.232

15.06.2018 59 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 64 0.001 100 76.2 % 1.990

15.06.2018 68 Lamellen(7) 256 64 3 2 [3,3] 32 128 0.001 100 76.2 % 0.779

15.06.2018 73 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 128 0.001 100 76.2 % 2.173

15.06.2018 76 Lamellen(7) 256 64 3 4 [3,3,3,3] 32 128 0.001 100 76.2 % 0.705

15.06.2018 79 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 128 0.001 100 76.2 % 1.460

15.06.2018 74 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 128 0.001 100 75.8 % 0.906

15.06.2018 77 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 128 0.001 100 75.8 % 0.826

15.06.2018 91 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 256 0.001 100 75.8 % 0.693

15.06.2018 95 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 256 0.001 100 75.8 % 0.834

15.06.2018 133 Lamellen(7) 128 128 3 3 [6,6,4] 32 256 0.0001 100 75.8 % 1.692

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 92

15.06.2018 150 Lamellen(7) 128 128 3 3 [6,4,4] 32 64 0.001 100 75.8 % 2.046

15.06.2018 166 Lamellen(7) 128 128 3 3 [6,4,4] 32 128 0.001 100 75.8 % 1.590

15.06.2018 173 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 128 0.001 100 75.8 % 1.534

15.06.2018 5 Lamellen(7) 256 64 3 3 [6,6,4] 32 64 0.0001 100 75.4 % 0.972

15.06.2018 20 Lamellen(7) 256 64 3 2 [3,3] 32 128 0.0001 100 75.4 % 0.770

15.06.2018 41 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 256 0.0001 100 75.4 % 0.795

15.06.2018 63 Lamellen(7) 256 64 3 5 [4,4,4,4,4] 32 64 0.001 100 75.4 % 1.666

15.06.2018 2 Lamellen(7) 256 64 3 2 [6,4] 32 64 0.0001 100 75.0 % 1.217

15.06.2018 23 Lamellen(7) 256 64 3 3 [4,4,4] 32 128 0.0001 100 75.0 % 0.839

15.06.2018 25 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 128 0.0001 100 75.0 % 0.953

15.06.2018 55 Lamellen(7) 256 64 3 3 [4,4,4] 32 64 0.001 100 75.0 % 0.767

15.06.2018 58 Lamellen(7) 256 64 3 4 [6,6,4,4] 32 64 0.001 100 75.0 % 1.344

15.06.2018 75 Lamellen(7) 256 64 3 4 [4,4,4,4] 32 128 0.001 100 75.0 % 1.455

15.06.2018 99 Lamellen(7) 128 128 3 2 [4,4] 32 64 0.0001 100 75.0 % 1.505

15.06.2018 100 Lamellen(7) 128 128 3 2 [3,3] 32 64 0.0001 100 75.0 % 0.714

15.06.2018 116 Lamellen(7) 128 128 3 2 [3,3] 32 128 0.0001 100 75.0 % 1.464

15.06.2018 117 Lamellen(7) 128 128 3 3 [6,6,4] 32 128 0.0001 100 75.0 % 0.858

15.06.2018 118 Lamellen(7) 128 128 3 3 [6,4,4] 32 128 0.0001 100 75.0 % 1.015

15.06.2018 121 Lamellen(7) 128 128 3 4 [6,6,6,4] 32 128 0.0001 100 75.0 % 0.712

15.06.2018 125 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 128 0.0001 100 75.0 % 1.001

15.06.2018 141 Lamellen(7) 128 128 3 5 [6,6,6,6,4] 32 256 0.0001 100 75.0 % 0.985

15.06.2018 152 Lamellen(7) 128 128 3 3 [3,3,3] 32 64 0.001 100 75.0 % 0.868

15.06.2018 163 Lamellen(7) 128 128 3 2 [4,4] 32 128 0.001 100 75.0 % 2.166

15.06.2018 57 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 64 0.001 100 74.6 % 1.330

15.06.2018 84 Lamellen(7) 256 64 3 2 [3,3] 32 256 0.001 100 74.6 % 1.277

15.06.2018 19 Lamellen(7) 256 64 3 2 [4,4] 32 128 0.0001 100 74.2 % 0.903

15.06.2018 32 Lamellen(7) 256 64 3 5 [3,3,3,3,3] 32 128 0.0001 100 74.2 % 0.731

15.06.2018 34 Lamellen(7) 256 64 3 2 [6,4] 32 256 0.0001 100 74.2 % 1.013

15.06.2018 36 Lamellen(7) 256 64 3 2 [3,3] 32 256 0.0001 100 74.2 % 1.095

15.06.2018 50 Lamellen(7) 256 64 3 2 [6,4] 32 64 0.001 100 74.2 % 1.064

15.06.2018 98 Lamellen(7) 128 128 3 2 [6,4] 32 64 0.0001 100 74.2 % 0.857

15.06.2018 131 Lamellen(7) 128 128 3 2 [4,4] 32 256 0.0001 100 74.2 % 1.221

15.06.2018 61 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 64 0.001 100 73.8 % 0.970

15.06.2018 67 Lamellen(7) 256 64 3 2 [4,4] 32 128 0.001 100 73.4 % 1.112

15.06.2018 78 Lamellen(7) 256 64 3 5 [6,6,4,4,4] 32 128 0.001 100 73.4 % 0.770

15.06.2018 89 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 256 0.001 100 73.4 % 1.603

15.06.2018 113 Lamellen(7) 128 128 3 2 [6,6] 32 128 0.0001 100 73.4 % 2.286

15.06.2018 129 Lamellen(7) 128 128 3 2 [6,6] 32 256 0.0001 100 73.4 % 1.854

15.06.2018 130 Lamellen(7) 128 128 3 2 [6,4] 32 256 0.0001 100 73.4 % 1.641

15.06.2018 134 Lamellen(7) 128 128 3 3 [6,4,4] 32 256 0.0001 100 73.4 % 1.447

15.06.2018 146 Lamellen(7) 128 128 3 2 [6,4] 32 64 0.001 100 73.4 % 1.973

15.06.2018 149 Lamellen(7) 128 128 3 3 [6,6,4] 32 64 0.001 100 73.4 % 2.572

15.06.2018 178 Lamellen(7) 128 128 3 2 [6,4] 32 256 0.001 100 73.4 % 1.456

15.06.2018 9 Lamellen(7) 256 64 3 4 [6,6,6,4] 32 64 0.0001 100 73.0 % 1.176

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 93

15.06.2018 18 Lamellen(7) 256 64 3 2 [6,4] 32 128 0.0001 100 73.0 % 1.277

15.06.2018 29 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 128 0.0001 100 73.0 % 1.225

15.06.2018 93 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 256 0.001 100 73.0 % 0.960

15.06.2018 83 Lamellen(7) 256 64 3 2 [4,4] 32 256 0.001 100 72.7 % 1.514

15.06.2018 180 Lamellen(7) 128 128 3 2 [3,3] 32 256 0.001 100 72.7 % 1.693

15.06.2018 1 Lamellen(7) 256 64 3 2 [6,6] 32 64 0.0001 100 71.9 % 0.945

15.06.2018 3 Lamellen(7) 256 64 3 2 [4,4] 32 64 0.0001 100 71.9 % 0.863

15.06.2018 33 Lamellen(7) 256 64 3 2 [6,6] 32 256 0.0001 100 71.9 % 1.545

15.06.2018 82 Lamellen(7) 256 64 3 2 [6,4] 32 256 0.001 100 71.9 % 0.878

15.06.2018 13 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 64 0.0001 100 71.5 % 1.033

15.06.2018 65 Lamellen(7) 256 64 3 2 [6,6] 32 128 0.001 100 71.5 % 2.007

15.06.2018 66 Lamellen(7) 256 64 3 2 [6,4] 32 128 0.001 100 71.1 % 0.883

15.06.2018 81 Lamellen(7) 256 64 3 2 [6,6] 32 256 0.001 100 71.1 % 0.905

15.06.2018 145 Lamellen(7) 128 128 3 2 [6,6] 32 64 0.001 100 71.1 % 2.375

15.06.2018 97 Lamellen(7) 128 128 3 2 [6,6] 32 64 0.0001 100 70.3 % 2.029

15.06.2018 114 Lamellen(7) 128 128 3 2 [6,4] 32 128 0.0001 100 70.3 % 0.960

15.06.2018 161 Lamellen(7) 128 128 3 2 [6,6] 32 128 0.001 100 70.3 % 1.938

15.06.2018 162 Lamellen(7) 128 128 3 2 [6,4] 32 128 0.001 100 70.3 % 2.375

15.06.2018 177 Lamellen(7) 128 128 3 2 [6,6] 32 256 0.001 100 70.3 % 1.702

15.06.2018 179 Lamellen(7) 128 128 3 2 [4,4] 32 256 0.001 100 70.3 % 1.413

15.06.2018 49 Lamellen(7) 256 64 3 2 [6,6] 32 64 0.001 100 69.9 % 1.588

15.06.2018 45 Lamellen(7) 256 64 3 5 [6,6,6,6,4] 32 256 0.0001 100 68.8 % 1.211

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 94

Lamellenpilze Testreihe 3

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

21.06.2018 6 Lamellen(7) 128 128 3 4 [4, 4, 3, 3] 32 256 0.00001 300 84.4 % 0.800

21.06.2018 4 Lamellen(7) 128 128 3 4 [4, 4, 3, 3] 32 64 0.00001 300 83.6 % 0.703

21.06.2018 18 Lamellen(7) 128 128 3 5 [3, 3, 3, 3, 3] 32 256 0.00001 300 82.8 % 0.792

21.06.2018 25 Lamellen(7) 128 128 3 5 [6, 6, 4, 4, 4] 32 64 0.00001 300 82.8 % 0.620

21.06.2018 12 Lamellen(7) 128 128 3 4 [6, 6, 4, 4] 32 256 0.00001 300 82.0 % 0.815

21.06.2018 17 Lamellen(7) 128 128 3 5 [3, 3, 3, 3, 3] 32 128 0.00001 300 82.0 % 0.744

21.06.2018 21 Lamellen(7) 128 128 3 5 [4, 4, 3, 3, 3] 32 256 0.00001 300 82.0 % 0.632

21.06.2018 3 Lamellen(7) 128 128 3 4 [3, 3, 3, 3] 32 256 0.00001 300 81.3 % 0.686

21.06.2018 14 Lamellen(7) 128 128 3 4 [6, 6, 6, 4] 32 128 0.00001 300 81.3 % 0.570

21.06.2018 2 Lamellen(7) 128 128 3 4 [3, 3, 3, 3] 32 128 0.00001 300 80.5 % 0.608

21.06.2018 5 Lamellen(7) 128 128 3 4 [4, 4, 3, 3] 32 128 0.00001 300 80.5 % 0.670

21.06.2018 9 Lamellen(7) 128 128 3 4 [4, 4, 4, 4] 32 256 0.00001 300 80.5 % 0.649

21.06.2018 8 Lamellen(7) 128 128 3 4 [4, 4, 4, 4] 32 128 0.00001 300 79.7 % 0.627

21.06.2018 10 Lamellen(7) 128 128 3 4 [6, 6, 4, 4] 32 64 0.00001 300 79.7 % 0.644

21.06.2018 15 Lamellen(7) 128 128 3 4 [6, 6, 6, 4] 32 256 0.00001 300 79.7 % 0.715

21.06.2018 20 Lamellen(7) 128 128 3 5 [4, 4, 3, 3, 3] 32 128 0.00001 300 79.7 % 0.676

21.06.2018 22 Lamellen(7) 128 128 3 5 [4, 4, 4, 4, 4] 32 64 0.00001 300 79.7 % 0.871

21.06.2018 23 Lamellen(7) 128 128 3 5 [4, 4, 4, 4, 4] 32 128 0.00001 300 79.7 % 0.622

21.06.2018 24 Lamellen(7) 128 128 3 5 [4, 4, 4, 4, 4] 32 256 0.00001 300 79.7 % 0.641

21.06.2018 26 Lamellen(7) 128 128 3 5 [6, 6, 4, 4, 4] 32 128 0.00001 300 79.7 % 0.740

21.06.2018 1 Lamellen(7) 128 128 3 4 [3, 3, 3, 3] 32 64 0.00001 300 78.9 % 0.647

21.06.2018 16 Lamellen(7) 128 128 3 5 [3, 3, 3, 3, 3] 32 64 0.00001 300 78.9 % 0.757

21.06.2018 19 Lamellen(7) 128 128 3 5 [4, 4, 3, 3, 3] 32 64 0.00001 300 78.9 % 0.666

21.06.2018 27 Lamellen(7) 128 128 3 5 [6, 6, 4, 4, 4] 32 256 0.00001 300 78.9 % 0.662

21.06.2018 28 Lamellen(7) 128 128 3 5 [6, 6, 6, 6, 4] 32 64 0.00001 300 78.9 % 0.750

21.06.2018 7 Lamellen(7) 128 128 3 4 [4, 4, 4, 4] 32 64 0.00001 300 78.1 % 0.656

21.06.2018 11 Lamellen(7) 128 128 3 4 [6, 6, 4, 4] 32 128 0.00001 300 78.1 % 0.737

21.06.2018 13 Lamellen(7) 128 128 3 4 [6, 6, 6, 4] 32 64 0.00001 300 76.6 % 0.750

21.06.2018 29 Lamellen(7) 128 128 3 5 [6, 6, 6, 6, 4] 32 128 0.00001 300 75.8 % 0.815

21.06.2018 30 Lamellen(7) 128 128 3 5 [6, 6, 6, 6, 4] 32 256 0.00001 300 73.4 % 0.880

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 95

Röhrlinge Testreihe 1

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

13.06.2018 4 Röhrling (8) 256 64 3 2 [4,4] 32 32 0.0001 100 62.9 % 1.093

13.06.2018 19 Röhrling (8) 256 64 3 3 [8,6,4] 32 64 0.0001 100 61.3 % 1.541

13.06.2018 36 Röhrling (8) 256 64 3 4 [8,6,4,4] 32 128 0.0001 100 61.3 % 1.105

13.06.2018 32 Röhrling (8) 256 64 3 3 [6,6,4] 32 128 0.0001 100 60.9 % 2.168

13.06.2018 24 Röhrling (8) 256 64 3 4 [8,6,4,4] 32 64 0.0001 100 60.2 % 1.685

13.06.2018 21 Röhrling (8) 256 64 3 4 [10,8,6,6] 32 64 0.0001 100 59.8 % 1.286

13.06.2018 72 Röhrling (8) 256 128 3 4 [8,6,4,4] 32 128 0.0001 100 59.8 % 1.246

13.06.2018 16 Röhrling (8) 256 64 3 2 [4,4] 32 64 0.0001 100 59.4 % 1.192

13.06.2018 35 Röhrling (8) 256 64 3 4 [8,6,6,4] 32 128 0.0001 100 59.4 % 1.185

13.06.2018 7 Röhrling (8) 256 64 3 3 [8,6,4] 32 32 0.0001 100 59.0 % 1.202

13.06.2018 8 Röhrling (8) 256 64 3 3 [6,6,4] 32 32 0.0001 100 59.0 % 1.187

13.06.2018 12 Röhrling (8) 256 64 3 4 [8,6,4,4] 32 32 0.0001 100 59.0 % 1.265

13.06.2018 23 Röhrling (8) 256 64 3 4 [8,6,6,4] 32 64 0.0001 100 59.0 % 1.358

13.06.2018 28 Röhrling (8) 256 64 3 2 [4,4] 32 128 0.0001 100 59.0 % 1.325

13.06.2018 71 Röhrling (8) 256 128 3 4 [8,6,6,4] 32 128 0.0001 100 59.0 % 1.672

13.06.2018 106 Röhrling (8) 256 256 3 4 [8,8,6,4] 32 128 0.0001 100 59.0 % 1.519

13.06.2018 20 Röhrling (8) 256 64 3 3 [6,6,4] 32 64 0.0001 100 58.6 % 1.483

13.06.2018 48 Röhrling (8) 256 128 3 4 [8,6,4,4] 32 32 0.0001 100 58.6 % 1.337

13.06.2018 59 Röhrling (8) 256 128 3 4 [8,6,6,4] 32 64 0.0001 100 58.6 % 2.192

13.06.2018 60 Röhrling (8) 256 128 3 4 [8,6,4,4] 32 64 0.0001 100 58.6 % 1.228

13.06.2018 94 Röhrling (8) 256 256 3 4 [8,8,6,4] 32 64 0.0001 100 58.6 % 1.853

13.06.2018 29 Röhrling (8) 256 64 3 3 [10,8,6] 32 128 0.0001 100 57.8 % 2.054

13.06.2018 33 Röhrling (8) 256 64 3 4 [10,8,6,6] 32 128 0.0001 100 57.8 % 1.222

13.06.2018 67 Röhrling (8) 256 128 3 3 [8,6,4] 32 128 0.0001 100 57.8 % 1.841

13.06.2018 10 Röhrling (8) 256 64 3 4 [8,8,6,4] 32 32 0.0001 100 57.4 % 1.668

13.06.2018 44 Röhrling (8) 256 128 3 3 [6,6,4] 32 32 0.0001 100 57.4 % 1.254

13.06.2018 5 Röhrling (8) 256 64 3 3 [10,8,6] 32 32 0.0001 100 57.0 % 1.908

13.06.2018 46 Röhrling (8) 256 128 3 4 [8,8,6,4] 32 32 0.0001 100 57.0 % 2.032

13.06.2018 95 Röhrling (8) 256 256 3 4 [8,6,6,4] 32 64 0.0001 100 57.0 % 1.833

13.06.2018 108 Röhrling (8) 256 256 3 4 [8,6,4,4] 32 128 0.0001 100 57.0 % 1.249

13.06.2018 47 Röhrling (8) 256 128 3 4 [8,6,6,4] 32 32 0.0001 100 56.2 % 1.529

13.06.2018 66 Röhrling (8) 256 128 3 3 [8,8,6] 32 128 0.0001 100 56.2 % 2.674

13.06.2018 107 Röhrling (8) 256 256 3 4 [8,6,6,4] 32 128 0.0001 100 56.2 % 1.441

13.06.2018 9 Röhrling (8) 256 64 3 4 [10,8,6,6] 32 32 0.0001 100 55.9 % 1.489

13.06.2018 15 Röhrling (8) 256 64 3 2 [6,6] 32 64 0.0001 100 55.9 % 1.250

13.06.2018 13 Röhrling (8) 256 64 3 2 [10,10] 32 64 0.0001 100 55.5 % 1.366

13.06.2018 31 Röhrling (8) 256 64 3 3 [8,6,4] 32 128 0.0001 100 55.5 % 2.120

13.06.2018 57 Röhrling (8) 256 128 3 4 [10,8,6,6] 32 64 0.0001 100 55.5 % 1.887

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 96

13.06.2018 65 Röhrling (8) 256 128 3 3 [10,8,6] 32 128 0.0001 100 55.5 % 3.032

13.06.2018 93 Röhrling (8) 256 256 3 4 [10,8,6,6] 32 64 0.0001 100 55.5 % 1.887

13.06.2018 96 Röhrling (8) 256 256 3 4 [8,6,4,4] 32 64 0.0001 100 55.5 % 1.448

13.06.2018 30 Röhrling (8) 256 64 3 3 [8,8,6] 32 128 0.0001 100 55.1 % 2.247

13.06.2018 82 Röhrling (8) 256 256 3 4 [8,8,6,4] 32 32 0.0001 100 55.1 % 1.631

13.06.2018 40 Röhrling (8) 256 128 3 2 [4,4] 32 32 0.0001 100 54.7 % 1.302

13.06.2018 41 Röhrling (8) 256 128 3 3 [10,8,6] 32 32 0.0001 100 54.7 % 2.590

13.06.2018 50 Röhrling (8) 256 128 3 2 [8,8] 32 64 0.0001 100 54.7 % 3.006

13.06.2018 58 Röhrling (8) 256 128 3 4 [8,8,6,4] 32 64 0.0001 100 54.7 % 2.268

13.06.2018 64 Röhrling (8) 256 128 3 2 [4,4] 32 128 0.0001 100 54.7 % 1.278

13.06.2018 11 Röhrling (8) 256 64 3 4 [8,6,6,4] 32 32 0.0001 100 54.3 % 1.361

13.06.2018 17 Röhrling (8) 256 64 3 3 [10,8,6] 32 64 0.0001 100 54.3 % 1.529

13.06.2018 26 Röhrling (8) 256 64 3 2 [8,8] 32 128 0.0001 100 54.3 % 2.378

13.06.2018 34 Röhrling (8) 256 64 3 4 [8,8,6,4] 32 128 0.0001 100 54.3 % 1.534

13.06.2018 68 Röhrling (8) 256 128 3 3 [6,6,4] 32 128 0.0001 100 54.3 % 2.227

13.06.2018 69 Röhrling (8) 256 128 3 4 [10,8,6,6] 32 128 0.0001 100 54.3 % 1.990

13.06.2018 70 Röhrling (8) 256 128 3 4 [8,8,6,4] 32 128 0.0001 100 54.3 % 1.259

13.06.2018 14 Röhrling (8) 256 64 3 2 [8,8] 32 64 0.0001 100 53.9 % 2.578

13.06.2018 101 Röhrling (8) 256 256 3 3 [10,8,6] 32 128 0.0001 100 53.9 % 3.532

13.06.2018 105 Röhrling (8) 256 256 3 4 [10,8,6,6] 32 128 0.0001 100 53.9 % 3.219

13.06.2018 27 Röhrling (8) 256 64 3 2 [6,6] 32 128 0.0001 100 53.5 % 1.924

13.06.2018 56 Röhrling (8) 256 128 3 3 [6,6,4] 32 64 0.0001 100 53.5 % 1.288

13.06.2018 43 Röhrling (8) 256 128 3 3 [8,6,4] 32 32 0.0001 100 53.1 % 1.433

13.06.2018 49 Röhrling (8) 256 128 3 2 [10,10] 32 64 0.0001 100 53.1 % 3.753

13.06.2018 103 Röhrling (8) 256 256 3 3 [8,6,4] 32 128 0.0001 100 53.1 % 1.507

13.06.2018 6 Röhrling (8) 256 64 3 3 [8,8,6] 32 32 0.0001 100 52.7 % 1.523

13.06.2018 22 Röhrling (8) 256 64 3 4 [8,8,6,4] 32 64 0.0001 100 52.7 % 1.296

13.06.2018 18 Röhrling (8) 256 64 3 3 [8,8,6] 32 64 0.0001 100 52.3 % 1.425

13.06.2018 62 Röhrling (8) 256 128 3 2 [8,8] 32 128 0.0001 100 52.3 % 3.041

13.06.2018 79 Röhrling (8) 256 256 3 3 [8,6,4] 32 32 0.0001 100 52.3 % 1.665

13.06.2018 25 Röhrling (8) 256 64 3 2 [10,10] 32 128 0.0001 100 52.0 % 2.379

13.06.2018 84 Röhrling (8) 256 256 3 4 [8,6,4,4] 32 32 0.0001 100 52.0 % 2.769

13.06.2018 3 Röhrling (8) 256 64 3 2 [6,6] 32 32 0.0001 100 51.6 % 1.366

13.06.2018 52 Röhrling (8) 256 128 3 2 [4,4] 32 64 0.0001 100 51.6 % 1.408

13.06.2018 90 Röhrling (8) 256 256 3 3 [8,8,6] 32 64 0.0001 100 51.6 % 1.603

13.06.2018 45 Röhrling (8) 256 128 3 4 [10,8,6,6] 32 32 0.0001 100 51.2 % 1.551

13.06.2018 54 Röhrling (8) 256 128 3 3 [8,8,6] 32 64 0.0001 100 51.2 % 2.436

13.06.2018 55 Röhrling (8) 256 128 3 3 [8,6,4] 32 64 0.0001 100 51.2 % 2.998

13.06.2018 81 Röhrling (8) 256 256 3 4 [10,8,6,6] 32 32 0.0001 100 51.2 % 1.821

13.06.2018 88 Röhrling (8) 256 256 3 2 [4,4] 32 64 0.0001 100 51.2 % 1.450

13.06.2018 92 Röhrling (8) 256 256 3 3 [6,6,4] 32 64 0.0001 100 51.2 % 2.674

13.06.2018 1 Röhrling (8) 256 64 3 2 [10,10] 32 32 0.0001 100 50.8 % 2.355

13.06.2018 2 Röhrling (8) 256 64 3 2 [8,8] 32 32 0.0001 100 50.8 % 1.794

13.06.2018 42 Röhrling (8) 256 128 3 3 [8,8,6] 32 32 0.0001 100 50.4 % 2.509

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 97

13.06.2018 104 Röhrling (8) 256 256 3 3 [6,6,4] 32 128 0.0001 100 50.4 % 3.049

13.06.2018 39 Röhrling (8) 256 128 3 2 [6,6] 32 32 0.0001 100 50.0 % 2.213

13.06.2018 51 Röhrling (8) 256 128 3 2 [6,6] 32 64 0.0001 100 50.0 % 2.029

13.06.2018 61 Röhrling (8) 256 128 3 2 [10,10] 32 128 0.0001 100 49.2 % 3.387

13.06.2018 63 Röhrling (8) 256 128 3 2 [6,6] 32 128 0.0001 100 49.2 % 3.289

13.06.2018 100 Röhrling (8) 256 256 3 2 [4,4] 32 128 0.0001 100 49.2 % 2.959

13.06.2018 53 Röhrling (8) 256 128 3 3 [10,8,6] 32 64 0.0001 100 48.4 % 3.534

13.06.2018 102 Röhrling (8) 256 256 3 3 [8,8,6] 32 128 0.0001 100 48.4 % 3.552

13.06.2018 38 Röhrling (8) 256 128 3 2 [8,8] 32 32 0.0001 100 48.0 % 2.758

13.06.2018 83 Röhrling (8) 256 256 3 4 [8,6,6,4] 32 32 0.0001 100 48.0 % 1.543

13.06.2018 85 Röhrling (8) 256 256 3 2 [10,10] 32 64 0.0001 100 48.0 % 4.787

13.06.2018 97 Röhrling (8) 256 256 3 2 [10,10] 32 128 0.0001 100 48.0 % 4.069

13.06.2018 98 Röhrling (8) 256 256 3 2 [8,8] 32 128 0.0001 100 48.0 % 4.046

13.06.2018 37 Röhrling (8) 256 128 3 2 [10,10] 32 32 0.0001 100 47.7 % 2.125

13.06.2018 80 Röhrling (8) 256 256 3 3 [6,6,4] 32 32 0.0001 100 47.7 % 1.521

13.06.2018 89 Röhrling (8) 256 256 3 3 [10,8,6] 32 64 0.0001 100 47.7 % 3.023

13.06.2018 87 Röhrling (8) 256 256 3 2 [6,6] 32 64 0.0001 100 47.3 % 4.059

13.06.2018 76 Röhrling (8) 256 256 3 2 [4,4] 32 32 0.0001 100 46.5 % 1.606

13.06.2018 91 Röhrling (8) 256 256 3 3 [8,6,4] 32 64 0.0001 100 46.5 % 1.791

13.06.2018 99 Röhrling (8) 256 256 3 2 [6,6] 32 128 0.0001 100 46.5 % 3.245

13.06.2018 77 Röhrling (8) 256 256 3 3 [10,8,6] 32 32 0.0001 100 45.7 % 2.067

13.06.2018 86 Röhrling (8) 256 256 3 2 [8,8] 32 64 0.0001 100 45.7 % 4.246

13.06.2018 73 Röhrling (8) 256 256 3 2 [10,10] 32 32 0.0001 100 44.1 % 1.722

13.06.2018 74 Röhrling (8) 256 256 3 2 [8,8] 32 32 0.0001 100 43.4 % 2.460

13.06.2018 75 Röhrling (8) 256 256 3 2 [6,6] 32 32 0.0001 100 43.4 % 4.346

13.06.2018 78 Röhrling (8) 256 256 3 3 [8,8,6] 32 32 0.0001 100 43.0 % 3.161

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 98

Röhrlinge Testreihe 2

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

15.06.2018 60 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 128 0.0001 100 69.5 % 0.971

15.06.2018 92 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 256 0.0001 100 66.4 % 0.994

15.06.2018 156 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 128 0.0001 100 66.4 % 0.976

15.06.2018 96 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 256 0.00001 100 66.0 % 1.049

15.06.2018 17 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 256 0.0001 100 66.0 % 1.006

15.06.2018 68 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 256 0.0001 100 65.6 % 1.047

15.06.2018 20 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 256 0.0001 100 65.6 % 1.020

15.06.2018 2 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 64 0.0001 100 65.2 % 1.159

15.06.2018 51 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 64 0.0001 100 65.2 % 0.927

15.06.2018 167 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 256 0.00001 100 64.4 % 1.046

15.06.2018 33 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 128 0.0001 100 64.4 % 1.034

15.06.2018 41 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 256 0.0001 100 64.1 % 1.917

15.06.2018 34 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 128 0.0001 100 64.1 % 1.252

15.06.2018 148 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 64 0.0001 100 64.1 % 1.185

15.06.2018 130 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 128 0.0001 100 63.7 % 1.820

15.06.2018 107 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 128 0.0001 100 63.7 % 1.531

15.06.2018 180 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 128 0.0001 100 63.7 % 1.060

15.06.2018 76 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 64 0.0001 100 63.7 % 1.058

15.06.2018 163 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 256 0.0001 100 63.7 % 1.035

15.06.2018 18 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 256 0.0001 100 63.7 % 1.022

15.06.2018 129 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 128 0.0001 100 63.3 % 1.285

15.06.2018 147 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 64 0.0001 100 63.3 % 1.248

15.06.2018 145 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 64 0.0001 100 62.9 % 1.418

15.06.2018 97 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 64 0.0001 100 62.9 % 1.263

15.06.2018 4 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 64 0.0001 100 62.9 % 1.239

15.06.2018 188 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 256 0.0001 100 62.9 % 1.136

15.06.2018 1 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 64 0.0001 100 62.9 % 1.052

15.06.2018 88 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 128 0.00001 100 62.9 % 1.049

15.06.2018 67 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 256 0.0001 100 62.9 % 1.015

15.06.2018 98 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 64 0.0001 100 62.5 % 1.192

15.06.2018 161 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 256 0.0001 100 62.5 % 1.192

15.06.2018 25 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 64 0.0001 100 62.5 % 1.040

15.06.2018 65 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 256 0.0001 100 62.1 % 1.594

15.06.2018 64 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 128 0.00001 100 62.1 % 1.075

15.06.2018 113 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 256 0.0001 100 62.1 % 1.072

15.06.2018 11 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 128 0.0001 100 62.1 % 1.055

15.06.2018 164 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 256 0.0001 100 62.1 % 1.028

15.06.2018 146 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 64 0.0001 100 61.7 % 1.503

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 99

15.06.2018 114 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 256 0.0001 100 61.7 % 1.249

15.06.2018 176 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 64 0.00001 100 61.7 % 1.209

15.06.2018 71 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 256 0.00001 100 61.7 % 1.098

15.06.2018 192 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 256 0.00001 100 61.7 % 1.09

15.06.2018 184 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 128 0.00001 100 61.7 % 1.089

15.06.2018 52 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 64 0.0001 100 61.7 % 1.083

15.06.2018 137 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 256 0.0001 100 61.3 % 1.422

15.06.2018 155 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 128 0.0001 100 61.3 % 1.316

15.06.2018 117 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 256 0.00001 100 61.3 % 1.093

15.06.2018 84 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 128 0.0001 100 60.9 % 1.521

15.06.2018 58 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 128 0.0001 100 60.9 % 1.432

15.06.2018 57 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 128 0.0001 100 60.9 % 1.272

15.06.2018 9 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 128 0.0001 100 60.9 % 1.223

15.06.2018 153 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 128 0.0001 100 60.9 % 1.179

15.06.2018 108 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 128 0.0001 100 60.5 % 1.188

15.06.2018 191 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 256 0.00001 100 60.5 % 1.163

15.06.2018 168 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 256 0.00001 100 60.5 % 0.994

15.06.2018 91 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 256 0.0001 100 60.2 % 1.896

15.06.2018 42 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 256 0.0001 100 60.2 % 1.697

15.06.2018 162 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 256 0.0001 100 60.2 % 1.469

15.06.2018 100 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 64 0.0001 100 60.2 % 1.200

15.06.2018 80 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 64 64 0.00001 100 60.2 % 1.167

15.06.2018 172 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 64 64 0.0001 100 60.2 % 1.139

15.06.2018 105 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 128 0.0001 100 60.2 % 1.071

15.06.2018 121 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 64 0.0001 100 59.8 % 1.422

15.06.2018 59 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 128 0.0001 100 59.8 % 1.352

15.06.2018 83 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 128 0.0001 100 59.8 % 1.128

15.06.2018 21 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 256 0.00001 100 59.8 % 1.087

15.06.2018 179 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 128 0.0001 100 59.4 % 1.453

15.06.2018 75 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 64 0.0001 100 59.4 % 1.269

15.06.2018 49 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 64 0.0001 100 59.4 % 1.171

15.06.2018 160 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 128 0.00001 100 59.4 % 1.061

15.06.2018 187 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 256 0.0001 100 59.0 % 1.248

15.06.2018 151 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 64 0.00001 100 59.0 % 1.248

15.06.2018 118 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 256 0.00001 100 59.0 % 1.127

15.06.2018 43 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 256 0.0001 100 58.6 % 2.130

15.06.2018 171 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 64 0.0001 100 58.6 % 1.590

15.06.2018 66 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 256 0.0001 100 58.6 % 1.508

15.06.2018 154 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 128 0.0001 100 58.6 % 1.242

15.06.2018 166 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 256 0.00001 100 58.6 % 1.180

15.06.2018 141 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 256 0.00001 100 58.6 % 1.178

15.06.2018 61 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 128 0.00001 100 58.6 % 1.160

15.06.2018 37 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 128 0.00001 100 58.6 % 1.081

15.06.2018 116 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 256 0.0001 100 58.2 % 1.329

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 100

15.06.2018 183 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 128 0.00001 100 58.2 % 1.258

15.06.2018 95 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 256 0.00001 100 58.2 % 1.113

15.06.2018 22 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 256 0.00001 100 58.2 % 1.085

15.06.2018 101 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 64 0.00001 100 57.8 % 1.204

15.06.2018 12 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 128 0.0001 100 57.8 % 1.189

15.06.2018 120 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 256 0.00001 100 57.8 % 1.173

15.06.2018 50 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 64 0.0001 100 57.8 % 1.171

15.06.2018 45 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 256 0.00001 100 57.8 % 1.164

15.06.2018 109 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 32 128 0.00001 100 57.8 % 1.154

15.06.2018 29 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 64 64 0.00001 100 57.8 % 1.145

15.06.2018 185 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 256 0.0001 100 57.4 % 1.795

15.06.2018 26 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 64 0.0001 100 57.4 % 1.296

15.06.2018 106 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 128 0.0001 100 57.4 % 1.227

15.06.2018 72 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 256 0.00001 100 57.4 % 1.120

15.06.2018 139 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 256 0.0001 100 57.0 % 2.623

15.06.2018 36 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 128 0.0001 100 57.0 % 1.438

15.06.2018 89 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 256 0.0001 100 57.0 % 1.359

15.06.2018 53 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 64 0.00001 100 56.6 % 1.324

15.06.2018 38 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 128 0.00001 100 56.6 % 1.216

15.06.2018 6 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 64 0.00001 100 56.6 % 1.191

15.06.2018 159 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 32 128 0.00001 100 56.6 % 1.172

15.06.2018 69 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 32 256 0.00001 100 56.6 % 1.138

15.06.2018 138 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 256 0.0001 100 56.3 % 2.954

15.06.2018 82 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 128 0.0001 100 56.3 % 1.269

15.06.2018 70 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 256 0.00001 100 56.3 % 1.225

15.06.2018 10 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 128 0.0001 100 56.3 % 1.221

15.06.2018 125 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 64 0.00001 100 56.3 % 1.204

15.06.2018 133 Röhrling (8) 256 128 3 4 [3, 3, 3, 3 ] 64 128 0.00001 100 56.3 % 1.162

15.06.2018 132 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 128 0.0001 100 55.9 % 2.545

15.06.2018 178 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 128 0.0001 100 55.9 % 1.789

15.06.2018 55 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 64 0.00001 100 55.9 % 1.371

15.06.2018 158 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 128 0.00001 100 55.9 % 1.211

15.06.2018 157 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 128 0.00001 100 55.9 % 1.196

15.06.2018 111 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 128 0.00001 100 55.9 % 1.188

15.06.2018 152 Röhrling (8) 256 128 3 5 [3, 3, 3, 3, 3] 32 64 0.00001 100 55.9 % 1.180

15.06.2018 44 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 256 0.0001 100 55.5 % 2.194

15.06.2018 3 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 64 0.0001 100 55.5 % 1.563

15.06.2018 150 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 32 64 0.00001 100 55.5 % 1.313

15.06.2018 94 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 256 0.00001 100 55.5 % 1.270

15.06.2018 14 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 32 128 0.00001 100 55.5 % 1.238

15.06.2018 28 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 64 0.0001 100 55.1 % 2.491

15.06.2018 115 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 256 0.0001 100 55.1 % 2.000

15.06.2018 27 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 64 0.0001 100 55.1 % 1.333

15.06.2018 16 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 128 0.00001 100 55.1 % 1.252

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 101

15.06.2018 90 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 256 0.0001 100 55.1 % 1.232

15.06.2018 13 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 128 0.00001 100 55.1 % 1.218

15.06.2018 123 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 64 0.0001 100 54.7 % 1.551

15.06.2018 102 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 64 0.00001 100 54.7 % 1.188

15.06.2018 35 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 128 0.0001 100 54.3 % 1.766

15.06.2018 19 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 256 0.0001 100 54.3 % 1.398

15.06.2018 112 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 128 0.00001 100 54.3 % 1.232

15.06.2018 73 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 64 0.0001 100 53.9 % 2.519

15.06.2018 134 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 128 0.00001 100 53.9 % 1.335

15.06.2018 46 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 256 0.00001 100 53.9 % 1.291

15.06.2018 175 Röhrling (8) 256 128 3 5 [4, 4, 4, 4, 4] 64 64 0.00001 100 53.9 % 1.287

15.06.2018 62 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 128 0.00001 100 53.9 % 1.227

15.06.2018 140 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 256 0.0001 100 53.5 % 3.321

15.06.2018 186 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 256 0.0001 100 53.5 % 2.100

15.06.2018 177 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 128 0.0001 100 53.5 % 1.667

15.06.2018 54 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 32 64 0.00001 100 53.5 % 1.258

15.06.2018 104 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 32 64 0.00001 100 53.5 % 1.221

15.06.2018 63 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 32 128 0.00001 100 53.5 % 1.161

15.06.2018 122 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 64 0.0001 100 53.1 % 1.914

15.06.2018 74 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 64 0.0001 100 53.1 % 1.888

15.06.2018 15 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 128 0.00001 100 53.1 % 1.232

15.06.2018 81 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 128 0.0001 100 52.7 % 2.917

15.06.2018 169 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 64 0.0001 100 52.7 % 1.909

15.06.2018 131 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 128 0.0001 100 52.7 % 1.737

15.06.2018 99 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 64 0.0001 100 52.7 % 1.693

15.06.2018 86 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 128 0.00001 100 52.7 % 1.373

15.06.2018 165 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 256 0.00001 100 52.7 % 1.346

15.06.2018 7 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 64 0.00001 100 52.7 % 1.292

15.06.2018 23 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 32 256 0.00001 100 52.7 % 1.280

15.06.2018 79 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 64 0.00001 100 52.7 % 1.252

15.06.2018 124 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 64 0.0001 100 52.3 % 2.268

15.06.2018 87 Röhrling (8) 256 64 3 5 [4, 4, 4, 4, 4] 64 128 0.00001 100 52.3 % 1.304

15.06.2018 56 Röhrling (8) 256 64 3 5 [3, 3, 3, 3, 3] 32 64 0.00001 100 52.3 % 1.292

15.06.2018 5 Röhrling (8) 256 64 3 4 [3, 3, 3, 3 ] 32 64 0.00001 100 52.3 % 1.285

15.06.2018 30 Röhrling (8) 256 64 3 4 [4, 4, 4, 4] 64 64 0.00001 100 52.0 % 1.413

15.06.2018 170 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 64 0.0001 100 51.6 % 2.628

15.06.2018 119 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 256 0.00001 100 51.6 % 1.352

15.06.2018 149 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 32 64 0.00001 100 51.2 % 1.286

15.06.2018 32 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 64 0.00001 100 51.1 % 1.473

15.06.2018 24 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 256 0.00001 100 51.1 % 1.175

15.06.2018 77 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 64 0.00001 100 50.8 % 1.339

15.06.2018 8 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 32 64 0.00001 100 50.8 % 1.321

15.06.2018 39 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 128 0.00001 100 50.4 % 1.569

15.06.2018 47 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 256 0.00001 100 50.4 % 1.435

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 102

15.06.2018 40 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 128 0.00001 100 50.4 % 1.343

15.06.2018 110 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 32 128 0.00001 100 49.6 % 1.266

15.06.2018 31 Röhrling (8) 256 64 3 4 [6, 6, 4, 4] 64 64 0.00001 100 49.2 % 1.520

15.06.2018 142 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 256 0.00001 100 49.2 % 1.443

15.06.2018 136 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 128 0.00001 100 48.8 % 1.528

15.06.2018 182 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 128 0.00001 100 48.8 % 1.405

15.06.2018 143 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 256 0.00001 100 48.4 % 1.584

15.06.2018 174 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 64 0.00001 100 48.0 % 1.460

15.06.2018 48 Röhrling (8) 256 64 3 4 [6, 6, 6, 4] 64 256 0.00001 100 47.7 % 1.609

15.06.2018 78 Röhrling (8) 256 64 3 5 [6, 6, 4, 4, 4] 64 64 0.00001 100 47.7 % 1.472

15.06.2018 126 Röhrling (8) 256 128 3 4 [4, 4, 4, 4] 64 64 0.00001 100 46.9 % 1.413

15.06.2018 85 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 128 0.00001 100 46.5 % 1.685

15.06.2018 128 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 64 0.00001 100 46.1 % 1.593

15.06.2018 93 Röhrling (8) 256 64 3 5 [6, 6, 6, 6, 4] 64 256 0.00001 100 46.1 % 1.547

15.06.2018 103 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 32 64 0.00001 100 46.1 % 1.503

15.06.2018 144 Röhrling (8) 256 128 3 4 [6, 6, 6, 4] 64 256 0.00001 100 45.3 % 1.959

15.06.2018 173 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 64 0.00001 100 44.9 % 1.520

15.06.2018 135 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 128 0.00001 100 44.5 % 1.663

15.06.2018 127 Röhrling (8) 256 128 3 4 [6, 6, 4, 4] 64 64 0.00001 100 44.1 % 1.622

15.06.2018 189 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 256 0.00001 100 43.8 % 2.163

15.06.2018 181 Röhrling (8) 256 128 3 5 [6, 6, 6, 6, 4] 64 128 0.00001 100 43.8 % 1.736

15.06.2018 190 Röhrling (8) 256 128 3 5 [6, 6, 4, 4, 4] 64 256 0.00001 100 43.0 % 1.622

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 103

Röhrlinge Testreihe 3

Date Test-number

Mushrooms Batch size

Image size

Number of channels

Number of convolutional layers

Filter size Number of filters

Fully connected layer size

Learning rate

Number of epochs

Validation accuracy

Validation loss

21.06.2018 47 Röhrling (8) 128 128 3 5 [3, 3, 3, 3, 3 ] 32 128 0.00001 300 75.0 % 0.879

21.06.2018 51 Röhrling (8) 128 128 3 5 [4, 4, 3, 3, 3 ] 32 256 0.00001 300 75.0 % 0.862

21.06.2018 21 Röhrling (8) 128 64 3 5 [4, 4, 3, 3, 3 ] 32 256 0.00001 300 73.4 % 0.908

21.06.2018 50 Röhrling (8) 128 128 3 5 [4, 4, 3, 3, 3 ] 32 128 0.00001 300 73.4 % 0.838

21.06.2018 6 Röhrling (8) 128 64 3 4 [4, 4, 3, 3] 32 256 0.00001 300 72.7 % 0.912

21.06.2018 31 Röhrling (8) 128 128 3 4 [3, 3, 3, 3 ] 32 64 0.00001 300 72.7 % 0.859

21.06.2018 49 Röhrling (8) 128 128 3 5 [4, 4, 3, 3, 3 ] 32 64 0.00001 300 72.7 % 0.835

21.06.2018 1 Röhrling (8) 128 64 3 4 [3, 3, 3, 3 ] 32 64 0.00001 300 71.9 % 0.860

21.06.2018 18 Röhrling (8) 128 64 3 5 [3, 3, 3, 3, 3 ] 32 256 0.00001 300 71.9 % 0.912

21.06.2018 32 Röhrling (8) 128 128 3 4 [3, 3, 3, 3 ] 32 128 0.00001 300 71.1 % 0.960

21.06.2018 33 Röhrling (8) 128 128 3 4 [3, 3, 3, 3 ] 32 256 0.00001 300 71.1 % 0.870

21.06.2018 35 Röhrling (8) 128 128 3 4 [4, 4, 3, 3] 32 128 0.00001 300 71.1 % 0.943

21.06.2018 46 Röhrling (8) 128 128 3 5 [3, 3, 3, 3, 3 ] 32 64 0.00001 300 71.1 % 0.907

21.06.2018 54 Röhrling (8) 128 128 3 5 [4, 4, 4, 4, 4] 32 256 0.00001 300 71.1 % 0.972

21.06.2018 2 Röhrling (8) 128 64 3 4 [3, 3, 3, 3 ] 32 128 0.00001 300 70.3 % 0.884

21.06.2018 3 Röhrling (8) 128 64 3 4 [3, 3, 3, 3 ] 32 256 0.00001 300 70.3 % 0.984

21.06.2018 5 Röhrling (8) 128 64 3 4 [4, 4, 3, 3] 32 128 0.00001 300 70.3 % 0.916

21.06.2018 7 Röhrling (8) 128 64 3 4 [4, 4, 4, 4] 32 64 0.00001 300 70.3 % 0.938

21.06.2018 9 Röhrling (8) 128 64 3 4 [4, 4, 4, 4] 32 256 0.00001 300 70.3 % 1.015

21.06.2018 17 Röhrling (8) 128 64 3 5 [3, 3, 3, 3, 3 ] 32 128 0.00001 300 70.3 % 0.962

21.06.2018 19 Röhrling (8) 128 64 3 5 [4, 4, 3, 3, 3 ] 32 64 0.00001 300 70.3 % 0.932

21.06.2018 23 Röhrling (8) 128 64 3 5 [4, 4, 4, 4, 4] 32 128 0.00001 300 70.3 % 1.006

21.06.2018 48 Röhrling (8) 128 128 3 5 [3, 3, 3, 3, 3 ] 32 256 0.00001 300 70.3 % 0.992

21.06.2018 52 Röhrling (8) 128 128 3 5 [4, 4, 4, 4, 4] 32 64 0.00001 300 70.3 % 0.887

21.06.2018 53 Röhrling (8) 128 128 3 5 [4, 4, 4, 4, 4] 32 128 0.00001 300 70.3 % 0.840

21.06.2018 20 Röhrling (8) 128 64 3 5 [4, 4, 3, 3, 3 ] 32 128 0.00001 300 69.5 % 1.003

21.06.2018 27 Röhrling (8) 128 64 3 5 [6, 6, 4, 4, 4] 32 256 0.00001 300 69.5 % 0.937

21.06.2018 36 Röhrling (8) 128 128 3 4 [4, 4, 3, 3] 32 256 0.00001 300 69.5 % 0.855

21.06.2018 37 Röhrling (8) 128 128 3 4 [4, 4, 4, 4] 32 64 0.00001 300 69.5 % 0.909

21.06.2018 38 Röhrling (8) 128 128 3 4 [4, 4, 4, 4] 32 128 0.00001 300 69.5 % 0.891

21.06.2018 39 Röhrling (8) 128 128 3 4 [4, 4, 4, 4] 32 256 0.00001 300 69.5 % 0.965

21.06.2018 41 Röhrling (8) 128 128 3 4 [6, 6, 4, 4] 32 128 0.00001 300 69.5 % 0.953

21.06.2018 8 Röhrling (8) 128 64 3 4 [4, 4, 4, 4] 32 128 0.00001 300 68.8 % 0.961

21.06.2018 15 Röhrling (8) 128 64 3 4 [6, 6, 6, 4] 32 256 0.00001 300 68.8 % 1.031

21.06.2018 16 Röhrling (8) 128 64 3 5 [3, 3, 3, 3, 3 ] 32 64 0.00001 300 68.8 % 0.923

21.06.2018 25 Röhrling (8) 128 64 3 5 [6, 6, 4, 4, 4] 32 64 0.00001 300 68.8 % 0.965

21.06.2018 34 Röhrling (8) 128 128 3 4 [4, 4, 3, 3] 32 64 0.00001 300 68.8 % 0.829

21.06.2018 42 Röhrling (8) 128 128 3 4 [6, 6, 4, 4] 32 256 0.00001 300 68.8 % 1.012

14 Anhang 14.5 Testergebnisse Grid-Tests

06.08.2018 Riccardo Jung, Dominik Wagner 104

21.06.2018 59 Röhrling (8) 128 128 3 5 [6, 6, 6, 6, 4] 32 128 0.00001 300 68.8 % 1.077

21.06.2018 4 Röhrling (8) 128 64 3 4 [4, 4, 3, 3] 32 64 0.00001 300 68.0 % 0.962

21.06.2018 12 Röhrling (8) 128 64 3 4 [6, 6, 4, 4] 32 256 0.00001 300 68.0 % 1.077

21.06.2018 22 Röhrling (8) 128 64 3 5 [4, 4, 4, 4, 4] 32 64 0.00001 300 68.0 % 0.993

21.06.2018 40 Röhrling (8) 128 128 3 4 [6, 6, 4, 4] 32 64 0.00001 300 68.0 % 0.979

21.06.2018 44 Röhrling (8) 128 128 3 4 [6, 6, 6, 4] 32 128 0.00001 300 68.0 % 1.049

21.06.2018 56 Röhrling (8) 128 128 3 5 [6, 6, 4, 4, 4] 32 128 0.00001 300 68.0 % 1.131

21.06.2018 57 Röhrling (8) 128 128 3 5 [6, 6, 4, 4, 4] 32 256 0.00001 300 68.0 % 0.906

21.06.2018 10 Röhrling (8) 128 64 3 4 [6, 6, 4, 4] 32 64 0.00001 300 67.2 % 0.989

21.06.2018 11 Röhrling (8) 128 64 3 4 [6, 6, 4, 4] 32 128 0.00001 300 67.2 % 1.009

21.06.2018 24 Röhrling (8) 128 64 3 5 [4, 4, 4, 4, 4] 32 256 0.00001 300 67.2 % 1.060

21.06.2018 45 Röhrling (8) 128 128 3 4 [6, 6, 6, 4] 32 256 0.00001 300 67.2 % 1.266

21.06.2018 55 Röhrling (8) 128 128 3 5 [6, 6, 4, 4, 4] 32 64 0.00001 300 67.2 % 1.031

21.06.2018 13 Röhrling (8) 128 64 3 4 [6, 6, 6, 4] 32 64 0.00001 300 66.4 % 1.131

21.06.2018 26 Röhrling (8) 128 64 3 5 [6, 6, 4, 4, 4] 32 128 0.00001 300 66.4 % 1.058

21.06.2018 14 Röhrling (8) 128 64 3 4 [6, 6, 6, 4] 32 128 0.00001 300 65.6 % 1.160

21.06.2018 28 Röhrling (8) 128 64 3 5 [6, 6, 6, 6, 4] 32 64 0.00001 300 65.6 % 1.055

21.06.2018 29 Röhrling (8) 128 64 3 5 [6, 6, 6, 6, 4] 32 128 0.00001 300 65.6 % 1.208

21.06.2018 58 Röhrling (8) 128 128 3 5 [6, 6, 6, 6, 4] 32 64 0.00001 300 65.6 % 1.049

21.06.2018 60 Röhrling (8) 128 128 3 5 [6, 6, 6, 6, 4] 32 256 0.00001 300 64.8 % 1.140

21.06.2018 30 Röhrling (8) 128 64 3 5 [6, 6, 6, 6, 4] 32 256 0.00001 300 64.1 % 1.071

21.06.2018 43 Röhrling (8) 128 128 3 4 [6, 6, 6, 4] 32 64 0.00001 300 63.3 % 1.184