Latex-Dateien der Masterarbeit
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

methoden.tex 66KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. \chapter{Methodik}
  2. In diesem Kapitel geht es nun um die Umsetzung der Navigation des Roboters. Zunächst wird auf Vorarbeiten im Bereich der Indoor-Roboternavigation mittels Machine Learning eingegangen, danach folgt ein Überblick über Hardware, verwendete Technologien und Frameworks. Darauf folgend wird die technische Umsetzung erklärt und anschließend die Evaluierung der Navigation mitsamt Ergebnissen vorgestellt.
  3. \section{Verwandte Arbeiten}
  4. \label{RelatedWork}
  5. Einige Vorarbeiten im Bereich der Roboternavigation mittels Machine Learning im Indoor-Bereich basieren auf Klassifizierung der Eingabebilder nach Steuerbefehlen, z.B. \cite{Kim.11152015} und \cite{Liu.2017}. Ein großer Nachteil der Arbeiten in \cite{Kim.11152015} und \cite{Liu.2017} ist die sehr große Anzahl an Trainingsdaten von mehreren tausend Bildern. \\
  6. Ein weiterer Ansatz für die Roboternavigation ist der Einsatz von Reinforcement Learning \cite{Zhu.2016}. Großer Nachteil hier ist das umfangreiche Vortraining in einer Simulation. Danach muss das Modell nochmal einem Feintuning in der realen Welt unterzogen werden \cite{Zhu.2016}. \\
  7. In \cite{Macias-GarciaDetection.2020} nutzen die Autoren für die Navigation ein \gls{CNN}, das durch RGB-Bilder die Objektdetektion und Hinderniserkennung durchführt. Zusätzlich wird durch den Einsatz einer Stereokamera Tiefeninformation gewonnen und diese Daten mit den Daten aus der Objektdetektion zusammengeführt. Aus dieser Zusammenführung wird eine Trajektorie für den Fahrtweg berechnet \cite{Macias-GarciaDetection.2020}. \\
  8. Die Arbeiten \cite{Nalpantidis.2009} und \cite{PireStereoVision.2012} basieren auf einer Hindernisvermeidung mittels Algorithmen auf Tiefenkarten aus Stereokameras. \\
  9. In \cite{Zhang.2019}, \cite{Chakravarty.2017}, \cite{Alvarez.2016}, \cite{Hatch.2020} und \cite{Yang.2017} realisieren die Autoren die Navigation mittels \gls{CNN}'s, die eine Depth Estimation durchführen, also eine Tiefenkarte aus RGB-Bilder erzeugen und hieraus dann Steuerbefehle ableiten.
  10. \section{Hardware}
  11. In diesem Kapitel wird die Hardware vorgestellt, die in dieser Arbeit zum Einsatz kommt. Als Erstes wird auf die Hardware des Roboters eingegangen, danach auf die Hardware für den Einsatz des Machine-Learning-Modells während der Inferenz.
  12. \subsection{Roboter mit Arduinoboard und Bluetooth-Modul}
  13. Abbildung \ref{fig:Roboterhardware} zeigt den Roboter mit angebundenem Smartphone. Der Roboter hat die Bezeichnung Ubbo Maker v3 und stammt von einem französischen Hersteller. Der Roboter wurde in der Vergangenheit von der codemanufaktur GmbH aufgebaut und war mittels Android-App fernsteuerbar. Die Aktoren des Roboters werden von einem Arduino Mega 2560 und dazugehörigen Shield Mega Sensor V2.4 angesteuert. Das DF-Bluetooth v3 als Bluetooth Bee 2.0 bietet eine Bluetooth-Verbindung zum Arduino-Board.
  14. \begin{figure}[htbp]
  15. \centering
  16. \includegraphics[scale=0.1]{img/Roboter.jpg}
  17. \caption{Roboter mit Smartphone}
  18. \label{fig:Roboterhardware}
  19. \end{figure}
  20. \subsection{Anforderungen und Lösungsansätze bezüglich Hardware}
  21. Die Umsetzung zum autonom fahrenden Roboter sollte so einfach wie möglich gestaltet werden und am besten auf die Bluetooth-Verbindung ansetzen. Folgende Anforderungen und Bedingungen müssen berücksichtigt werden:
  22. \begin{itemize}
  23. \item Umsetzung soll kostengünstig erfolgen
  24. \item Echtzeitfähigkeit
  25. \item Kamera für RGB-Bildaufnahme
  26. \item Steuersignale sollten per Bluetooth oder USB-Verbindung ans Arduino-Board gesendet werden, da kein WLAN-Modul am Arduino-Board vorhanden ist
  27. \item Latenz zur Signalübertragung zum Arduino-Board sollte gering sein
  28. \item genügend Rechenkapazität für die Inferenz
  29. \end{itemize}
  30. Nach der Recherche von den Möglichkeiten von TensorFlow Lite \cite{TensorFlow.8202021} (Unterkapitel \ref{sec:TensorFlowLite}), der Anforderung einer Kamera und der bevorzugten Signalübertragung mittels Bluetooth wurde die Lösung mit Smartphone favorisiert. Wie in Abbildung \ref{fig:Roboterhardware} zu sehen ist, ist auch die Montage des Smartphones an den Roboter einfach. Das Smartphone wird mit einem Gummiband an die Tablethalterung des Roboters befestigt. Folgende Alternativen sind technisch möglich, hätten aber die Umsetzung verteuert oder kompliziert:
  31. \begin{itemize}
  32. \item Raspberry Pi mit Kamera: Nachteile in Bezug auf Rechenkapazität und Montage von Board und Kamera. Erforderliche Powerbank für Stromversorgung
  33. \item Inferenz auf Laptop: Nachteile von Konnektivität (kein WLAN-Modul am Roboter) zwischen erforderlicher Webcam, Laptop und Arduino-Board. Alternativ komplizierte Montage des Laptops an den Roboter
  34. \item \gls{KI}-Board Nvidia Jetson Nano mit Kamera: Nachteil der Montage der Kamera und erforderliche Powerbank für Stromversorgung des Jetson Nano
  35. \end{itemize}
  36. \subsection{Hardware für die Inferenz des Machine-Learning-Modells}
  37. Als Hardware für die Inferenz, Bildaufnahme und Übertragung der Steuerbefehle per Bluetooth wird ein Mittelklasse-Smartphone auf Android-Basis vom Typ Samsung Galaxy A32 4G verwendet. Tabelle \ref{tab:Smartphone} zeigt die technischen Daten.
  38. \begin{table}[htbp]
  39. \centering
  40. \begin{tabularx}{\textwidth}{p{0.25\textwidth}|X}
  41. \hline
  42. Android Version & 11\\
  43. \hline
  44. CPU-Modell & MT6769T Mediatek Helio G80\\
  45. \hline
  46. CPU-Kerne & 8, 2x2,0 GHz Cortex-A75 und 6x1,8 GHz Cortex-A55\\
  47. \hline
  48. Prozessor-Architektur & arm64\\
  49. \hline
  50. GPU-Modell & Mali-G52 MC2\\
  51. \hline
  52. RAM-Typ & LPDDR4X Dual-channel\\
  53. \hline
  54. RAM-Größe & 4 GB\\
  55. \hline
  56. \end{tabularx}
  57. \caption{Technische Daten des Samsung Galaxy A32 4G}
  58. \label{tab:Smartphone}
  59. \end{table}
  60. Alternativ lässt sich auch mit einem iPhone mit dem Betriebssystem iOS die Inferenz durchführen. Hier steigen dann jedoch die Hardwarekosten und der Aufwand der Portierung der App auf das iPhone.
  61. \subsection{Hardware für das Training des Machine-Learning-Modells}
  62. Ein Teil des Machine Learnings wurde mit einem Dell Laptop mit den technischen Daten aus Tabelle \ref{tab:DellLaptop} durchgeführt. Ein großer Nachteil hier ist die fehlende dedizierte Grafikkarte, denn Garfikkarten sind sehr effizient und können schneller viele Berechnungen parallel ausführen im Vergleich zur CPU \cite[494-497]{Goodfellow.2018}.
  63. \begin{table}[htbp]
  64. \centering
  65. \begin{tabularx}{\textwidth}{p{0.25\textwidth}|X}
  66. \hline
  67. Betriebssystem Version & Windows 10 Pro 21H2\\
  68. \hline
  69. CPU-Modell & Intel Core i7-10850H CPU\\
  70. \hline
  71. CPU-Kerne & 6, Basistakt 2,71 GHz\\
  72. \hline
  73. Threads & 12\\
  74. \hline
  75. Prozessor-Architektur & x64\\
  76. \hline
  77. GPU & Intel UHD Graphics\\
  78. \hline
  79. RAM-Größe & 16 GB\\
  80. \hline
  81. \end{tabularx}
  82. \caption{Technische Daten des Dell Laptops}
  83. \label{tab:DellLaptop}
  84. \end{table}
  85. Aufgrund der fehlenden Grafikkarte und der dadurch erheblich langen Trainingszeit von mehreren Stunden wurde das Training später auf Google Colab \cite{Colab.1072021} durchgeführt. Vorteil hier ist eine Laufzeitumgebung in der Cloud mit Nutzung von Grafikkarten und der Anbindung des eigenen Google Drive Speichers. Tabelle \ref{tab:GoogleColabGrafikkarte} zeigt die Daten bezüglich der Grafikkarte und der CUDA Version der Laufzeitumgebung in Google Colab.
  86. \begin{table}[htbp]
  87. \centering
  88. \begin{tabularx}{\textwidth}{p{0.25\textwidth}|X}
  89. \hline
  90. Google Colab Version & Colab Pro\\
  91. \hline
  92. GPU-Modell & Nvidia Tesla P100-PCIE\\
  93. \hline
  94. CUDA Version & 11.2\\
  95. \hline
  96. \end{tabularx}
  97. \caption{Daten der genutzten GPU der Laufzeitumgebung in Google Colab}
  98. \label{tab:GoogleColabGrafikkarte}
  99. \end{table}
  100. Durch die Nutzung der Grafikkarte in Google Colab fallen die Trainingszeiten auf unter 1 Stunde, teilweise auf unter 30 Minuten je nach Modellgröße.
  101. \section{Navigation}
  102. Der Ansatz für die Navigation orientiert sich an den Vorarbeiten \cite{Macias-GarciaDetection.2020}, \cite{Zhang.2019}, \cite{Chakravarty.2017}, \cite{Alvarez.2016}, \cite{Hatch.2020} und \cite{Yang.2017}, die im Kapitel \ref{RelatedWork} vorgestellt wurden. Die Navigation wird in zwei Teilbereiche aufgegliedert, in eine Zielerkennung / Zielverfolgung und eine separaten Hindernisvermeidung / Hindernisumfahrung. Für die Zielerkennung werden als Ziel Bürotüren in der codemanufaktur GmbH ausgewählt. Grund hierfür ist, dass Türen Ein- und Ausgangspunkte von Räumen darstellen und somit die Navigation erweitert werden kann über mehrere Räume eines ganzen Areals. Nachfolgend werden diese beiden Teilbereiche näher erläutert.
  103. \subsection{Zielerkennung als Türdetektion mittels Objektdetektion}
  104. Die Zielerkennung wird als Türerkennung mittels Objektdetektion realisiert. Über die Geometrie der Bounding Box wird die Fahrtrichtung, das Losfahren und Stoppen des Roboters gesteuert. Beispielsweise wird der Roboter nach links fahren, falls die Bounding Box im linken Bereich des Kamerabildes liegt und analog andersherum. Falls die Bounding Box klein ist, suggeriert dies eine weite Entfernung der Tür und der Roboter fährt los. Im Fall, dass die Bounding Box groß ist, wird dies als nah interpretiert und der Roboter stoppt.
  105. \subsection{Hindernisvermeidung durch Depth Estimation}
  106. Es soll eine generelle Hindernisvermeidung implementiert werden. Die Vielzahl an variablen Objekten, die als Hindernis dienen können, machen eine Hindernisvermeidung über Objekterkennung schwierig. Daher wird als Methode die Depth Estimation, also die Abschätzung einer Tiefenkarte aus einem RGB-Bild, implementiert. Aus dem Tiefenbild kann dann pixelweise auf nahe Objekte geschlossen werden, da die Werte jedes Pixels als Disparität (Disparity) interpretiert werden. Die Disparität ist proportional zur Distanz (Distance) und stammt aus der Stereovision mittels Stereokameras \cite{PireStereoVision.2012}. Abbildung \ref{fig:DistanceDisparity} zeigt das Prinzip zwischen Disparität und Distanz. Dieses Prinzip kann ein Machine-Learning-Modell erlernen und als Output eine Tiefenkarte generieren, wobei die Disparitätswerte jedes Pixels zwischen 0 und 1 normiert werden.
  107. \begin{figure}[htbp]
  108. \centering
  109. \includegraphics[scale=0.4]{img/Distance_Disparity.png}
  110. \caption{Darstellung der Distanz zur Disparität \cite{PireStereoVision.2012}}
  111. \label{fig:DistanceDisparity}
  112. \end{figure}
  113. \section{Frameworks für technische Umsetzung}
  114. In diesem Kapitel geht es um die verwendeten Frameworks, um das Machine Learning so einfach wie möglich umzusetzen. Als Erstes wird auf das Framework TensorFlow eingegangen, dann auf die Object Detection API, die auf TensorFlow aufsetzt, und zum Schluss wird TensorFlow Lite vorgestellt.
  115. \subsection{TensorFlow}
  116. TensorFlow ist ein Open-Source-Framework von Google zum Implementieren und Ausführen von Algorithmen des Machine Learnings \cite[425]{Raschka.2018}, \cite{TensorFlow.832021}. Für diese Arbeit wird die TensorFlow Python-API mit TensorFlow 2.0 verwendet. TensorFlow 2.0 teilt sich zudem in eine Low-Level-API und den High-Level-API's TensorFlow Layers und Keras auf \cite[426]{Raschka.2018}. Für diese Masterarbeit wurde ausschließlich die Low-Level-API von TensorFlow 2.0 verwendet. TensorFlow unterstützt zudem das Training und die Inferenz von Modellen auf der CPU sowie der GPU, wobei die Berechnungszeiten auf einer GPU wesentlich schneller ablaufen \cite[425]{Raschka.2018}. Ein wichtiger Grund für die schnellere Berechnung auf der GPU ist, dass GPU's viele parallele Fließkommaoperationen pro Sekunde ausführen \cite[424]{Raschka.2018}.
  117. \subsection{TensorFlow Object Detection API}
  118. Neben TensorFlow 2.0 wurde auch die Object Detection API \cite{GitHub.1062021} für die Erstellung und das Training der Modelle für die Türerkennung verwendet. Die Object Detection API ist nicht in TensorFlow 2.0 enthalten und muss über ein Git-Repository bezogen und zusätzlich über die eigene Python-Umgebung mittels Python-Package-Installer pip installiert werden. Alternativ wird auch eine Installation mittels Docker angeboten. Die Object Detection API enthält zudem einen sogenannten Model Zoo \cite{GitHubDetectionZoo.11152021}, in dem vortrainierte Netze enthalten sind und zusätzlich heruntergeladen werden können. Diese Netze wurden mit dem COCO 2017 Datensatz \cite{coco.8252021} mit 90 Objektklassen trainiert. Die Anzahl der 90 Objektklassen lässt sich in den config-Files nachlesen. Für die Masterarbeit wurde die Objekt Detection API TensorFlow 2 für das Training der Türdetektion und der TensorFlow 2 Model Zoo für das Herunterladen von vortrainierten Netzen verwendet.
  119. \subsection{TensorFlow Lite}
  120. \label{sec:TensorFlowLite}
  121. TensorFlow Lite \cite{TensorFlow.8202021} ist ein Framework, um die Inferenz von Machine-Learning-Modellen auf mobilen Geräten wie Smartphones und eingebetteten / \gls{IoT}-Geräten zu ermöglichen. Dazu wird das Modell in ein FlatBuffer-Format umgewandelt \cite{FlatBuffer.852021}. Hierbei wird das Machine-Learning-Modell in ein binäres Format serialisiert, um auf verschachtelte Objekte wie Structs, Tables, Vectors, etc ohne Kopien und Parsing Zugriff zu bekommen \cite{FlatBuffer.852021}. Vor allem Tables werden über vtables auf Speichergröße und Zugriff optimiert \cite{FlatBuffer.852021}. Zudem werden Objekttypen über Schemas organisiert, um das Parsen zu vermeiden \cite{FlatBuffer.852021}. Mit dem FlatBuffer-Format wird somit erheblich die Inferenz und Modellgröße optimiert.
  122. \subsection{Android Studio}
  123. Für die Entwicklung der App zur Inferenz auf dem Smartphone und somit zur Steuerung des Roboters wird die Entwicklungsumgebung Android Studio mit der Programmiersprache Java verwendet. Die TensorFlow Lite Interpreter API unterstützt neben der Programmiersprache Java, auch C++ und Python. Als Orientierung der Android-App dient das Repository \cite{GitHubTensorFlowAndroidExample.11222021}, das eine Implementierung einer Beispiel-App für die Objektdetektion auf einem Android-Smartphone zeigt.
  124. \section{Machine Learning}
  125. In diesem Kapitel wird nun das Machine Learning der Türdetektion erläutert. Zuerst werden die verwendeten Netzarchitekturen vorgestellt, danach wird der Datensatz besprochen. Darauf folgend wird dann das Training, die Validierung und der Test erklärt, und zum Schluss wird die Konvertierung der trainierten Modelle zum TensorFlow-Lite-Format gezeigt. Die Machine-Learning-Modelle der Depth Estimation werden direkt als fertigtrainierte Modelle aus den Quellen \cite{GitHub.1062021b} und \cite{GitHub.1062021c} als TensorFlow-Lite-Modelle bezogen
  126. \subsection{Netzarchitekturen}
  127. Die Entscheidung über die verwendeten Netzarchitekturen wurden anhand des Model Zoo der TensorFlow 2 Object Detection API \cite{GitHubDetectionZoo.11152021} getroffen. Die durch den COCO-Datensatz vortrainierten Netze ermöglichen ein deutlich schnelleres und einfacheres Training, da die Gewichte und Bias-Parameter schon auf High-Level-Merkmale trainiert sind. Ohne diese vortrainierten Netze würde das Training deutlich aufwändiger und länger werden. Die Methode, vortrainierte Netze für ein eigenes Training zu verwenden, wird auch als Transfer Learning bezeichnet, weil effektiv nur die letzten Schichten des Netzes für andere High-Level-Merkmale umtrainiert werden. \\
  128. Eine wichtige Einschränkung gibt es bei der Auswahl der Modelle aus dem Model Zoo. Für Modelle, die später als TensorFlow-Lite-Modelle für die Objektdetektion verwendet werden, können nur \gls{SSD}-Modelle ausgewählt werden, andere Detektoren werden im TensorFlow Lite Framework noch nicht unterstützt. \\
  129. Tabelle \ref{tab:VortrainierteNetze} zeigt die Modelle mit Auflösung der Eingabeschicht, Inferenzzeit und der \gls{mAP}, die für die Türdetektion ausgewählt wurden \cite{GitHubDetectionZoo.11152021}.
  130. \begin{table}[htbp]
  131. \centering
  132. \begin{tabularx}{\textwidth}{p{0.45\textwidth}|X|X}
  133. \hline
  134. \textbf{Modell-Name} & \textbf{Inferenzzeit (ms)} & \textbf{COCO mAP (\%)}\\
  135. \hline
  136. SSD MobileNet V2 320x320 & 19 & 20,2\\
  137. \hline
  138. SSD MobileNet V2 FPNLite 320x320 & 22 & 22,2\\
  139. \hline
  140. SSD MobileNet V2 FPNLite 640x640 & 39 & 28,2\\
  141. \hline
  142. SSD ResNet50 V1 FPN 640x640 & 46 & 34,3\\
  143. \hline
  144. \end{tabularx}
  145. \caption{Vortrainierte Netze für die Türdetektion \cite{GitHubDetectionZoo.11152021}}
  146. \label{tab:VortrainierteNetze}
  147. \end{table}
  148. Bei der Auswahl wurde unter anderem auf die Inferenzzeit geachtet, aufgrund der Anforderung der Echtzeitfähigkeit der Roboternavigation. Je geringer die Inferenzzeit ist, desto weniger Verzögerung gibt es bei der Steuerung. Deshalb wurden auch keine Modelle mit noch höherer Auflösung der Eingabeschicht ausgewählt, da sonst die Inferenzzeit und Trainingszeit mit der Parameteranzahl / Modellgröße ansteigt \cite{GitHubDetectionZoo.11152021}.
  149. \subsection{Datensatz}
  150. Die Daten für das Training der Türdetektion wurden einerseits automatisiert aus der Google-Bildersuche durch ein Python-Skript mit dem Package Selenium und andererseits durch eigene Fotoaufnahmen von Türen gesammelt. Bei der Google-Bildersuche wurden mehrere Arten von Türen gesammelt, zudem \gls{TN}(True Negative)-Bilder von Fenster, Bilderrahmen und Schranktüren. Alle Bilder sind im jpg-Format und haben unterschiedliche Größen / Auflösungen. Zudem sind alle Bilder durch das Seitenverhältnis im Portrait-Modus und die selbst aufgenommen Bilder per Kamera im 3:4 Format. Das Resizing der Bilder für die Netze wird im Training über die Object Detection API übernommen, wobei hier aufgepasst werden muss bezüglich des \gls{Exif}. Das \gls{Exif} kann beim Resizing die Bilder vom Portrait-Modus in den Landscape-Modus umwandeln, und dadurch zu Bounding Boxen führen, die nicht mehr ins Bild passen. Dies verursacht vor allem Fehler bei Validierung und Test durch die Object Detection API mittels COCO-Metrik. \\
  151. Die Türdetektion wird mit zwei Datensätzen trainiert. Einem Datensatz für eine allgemeine Türdetektion und eine Türdetektion speziell für die Türen der codemanufaktur GmbH, um die beiden Türdetektionen zu vergleichen. Die nachfolgenden Abschnitte zeigen die beiden Datensätze auf. Danach wird auf das Labeln der Bilder, also der Ground Truth der Daten eingegangen.
  152. \subsubsection{Datensatz für allgemeine Türdetektion}
  153. Tabelle \ref{tab:BilderdatenGeneral} zeigt den Datensatz für die allgemeine Türdetektion.
  154. \begin{table}[htbp]
  155. \centering
  156. \begin{tabularx}{\textwidth}{p{0.4\textwidth}|X|X|X}
  157. \hline
  158. \textbf{Kategorie} & \textbf{Anzahl für Training} & \textbf{Anzahl für Validierung} & \textbf{Anzahl für Test}\\
  159. \hline
  160. Schränke & 90 & 10 & 0\\
  161. \hline
  162. Bürotüren & 86 & 10 & 0\\
  163. \hline
  164. Glastüren & 43 & 5 & 0\\
  165. \hline
  166. Bilderrahmen & 25 & 3 & 0\\
  167. \hline
  168. Schiebetüren & 43 & 5 & 0\\
  169. \hline
  170. Spind & 13 & 2 & 0\\
  171. \hline
  172. Fenster & 26 & 3 & 0\\
  173. \hline
  174. Holztür & 43 & 5 & 0\\
  175. \hline
  176. Türen der codemanufaktur & 0 & 0 & 137\\
  177. \hline
  178. Türen vom Erlangen Arcaden, TH Nürnberg und Supermärkten & 143 & 17 & 0\\
  179. \hline
  180. \textbf{Gesamt} & \textbf{512} & \textbf{60} & \textbf{137}\\
  181. \hline
  182. \end{tabularx}
  183. \caption{Bilder für die Daten der allgemeinen Türdetektion}
  184. \label{tab:BilderdatenGeneral}
  185. \end{table}
  186. \FloatBarrier
  187. \subsubsection{Datensatz für spezielle Türdetektion für die codemanufaktur GmbH}
  188. Tabelle \ref{tab:BilderdatenCodemanufaktur} zeigt den Datensatz zum Training auf die Türen des Einsatzortes in der codemanufaktur GmbH.
  189. \begin{table}[htbp]
  190. \centering
  191. \begin{tabularx}{\textwidth}{p{0.4\textwidth}|X|X|X}
  192. \hline
  193. \textbf{Kategorie} & \textbf{Anzahl für Training} & \textbf{Anzahl für Validierung} & \textbf{Anzahl für Test}\\
  194. \hline
  195. Schränke & 90 & 10 & 0\\
  196. \hline
  197. Bürotüren & 86 & 10 & 0\\
  198. \hline
  199. Bilderrahmen & 25 & 3 & 0\\
  200. \hline
  201. Spind & 13 & 2 & 0\\
  202. \hline
  203. Fenster & 26 & 3 & 0\\
  204. \hline
  205. Türen der codemanufaktur & 123 & 14 & 0\\
  206. \hline
  207. Türen vom Erlangen Arcaden, TH Nürnberg und Supermärkten & 0 & 0 & 160\\
  208. \hline
  209. \textbf{Gesamt} & \textbf{363} & \textbf{42} & \textbf{160}\\
  210. \hline
  211. \end{tabularx}
  212. \caption{Bilder für die Daten der Türdetektion in der codemanufaktur}
  213. \label{tab:BilderdatenCodemanufaktur}
  214. \end{table}
  215. \FloatBarrier
  216. \subsubsection{Labeln der Bilder für die Ground Truth}
  217. Für das Training der Objekt Detektion müssen die Bilder gelabelt werden. Dies wurde mit der Open-Source-Software labelImg \cite{GitHub.1062021d} im PascalVOC-Format vorgenommen. Im PascalVOC-Format wird jedem Bild eine xml-Datei zugeordnet, die die Ground Truth Informationen enthält. Diese Informationen enthalten die Bildgröße in Höhe und Breite, die Anzahl der Kanäle des Bildes (bei RGB sind es 3 Kanäle), die Bounding Box mit den xmin-, xmax-, ymin-, ymax-Koordinaten, und den Namen des Objekts \cite[9]{EveringhamDevelopmentKit.2012}. Die Einheit der geometrischen Größen sind die Pixel des Bildes. Neben den genannten Informationen bietet das PascalVOC-Format noch die Optionen truncated und difficult. Truncated bedeutet, dass die Bounding Box das Objekt abschneidet. Difficult ist eine Annotationsmöglichkeit, um schwer zu erkennende Objekte zu klassifizieren, die bei der Evaluierung ignoriert werden \cite[9]{EveringhamDevelopmentKit.2012}.
  218. \subsection{Training, Validierung und Test}
  219. Bevor die vortrainierten Modelle trainiert werden können, muss der gelabelte Datensatz in ein tf-record-Format umgewandelt werden. Das tf-record-Format beinhaltet den Datensatz in einer binären und seriellen Form, die den Speicherbedarf für die Hardware während des Trainings deutlich verringert. Zudem muss eine Label Map angelegt werden, die die Objektklassen einer ID zuordnet. Hierbei ist die ID = 0 für die Background-Klasse (Hintergrund) reserviert. Für die Trainingskonfiguration muss zudem die Konfigurationsdatei (config-File) der Object Detection API von den vortrainierten Netzen für das Transfer Learning angepasst werden. Diese Konfigurationsdatei dient dazu die Hyperparameter des Netzes für das Training anzupassen. Zudem werden weitere wichtige Informationen und Einstellungen für das Training festgelegt, wie das Resizing, die maximale Anzahl der Objektklassen, die Dateipfade zu den tf-record-Dateien für Training, Validierung und Test, den Dateipfad zum Checkpoint des vortrainierten Netzes, den Dateipfad zur Label Map, sowie die Evaluierungs-Metrik.
  220. \subsubsection{Einstellungen der Hyperparameter}
  221. Tabelle \ref{tab:ConfigHyperparameter} zeigt einige eingestellte Hyperparameter aus den Konfigurationsdateien der verwendteten Netze. Die config-Datei enthält folgende Hyperparameter:
  222. \begin{itemize}
  223. \item SSD-Modell-Hyperparameter
  224. \begin{itemize}
  225. \item Anzahl der Objektklassen
  226. \item Image Resizer: Verringerung der Auflösung des Eingabebildes nach Breite und Höhe
  227. \item Backbone-Netz- / Feature Extractor-Hyperparameter
  228. \item Box Coder: Koordinatenumrechnung der Boxkoordinaten bezogen auf das Zentrum der Box zur oberen linken Ecke der Feature Map, da hier der Ursprung (0,0) ist
  229. \item Matcher: Definiert den Schwellwert (Threshold) für ein \gls{TP} (Match)
  230. \item Similarity calculator: Überprüfung von gleichen / doppelten Boxen
  231. \item Box Predictor: Hyperparameter der Netzschichten nach dem Backbone-Netz
  232. \item Anchor Generator: Einstellungen der Standardboxen
  233. \item Post processing: Einstellungen zur Non-Max-Suppression
  234. \item Einstellungen zur Kostenfunktion wie Localization Loss und Classification Loss
  235. \item Hintergrund als Rejectionklasse mit der id=0 belegen
  236. \end{itemize}
  237. \item Trainingskonfiguration
  238. \begin{itemize}
  239. \item Batch size
  240. \item Data augmentation
  241. \item Momentum optimizer: Einstellungen zum Verlauf der Lernrate während des Trainings (Default ist ein Cosine Decay) und des Momentum-Parameter
  242. \item Fine tune checkpoint: Dateipfad zum Checkpoint des vortrainierten Netzes bei dem das Training für das neue Netz starten soll. Hierbei werden die Werte der Gewichte und Biases vom vortrainierten Netz als Initialisierung verwendet.
  243. \item Anzahl der Steps des gesamten Trainings unabhängig von den Steps der Lernratenkurve
  244. \item Begrenzung der Bounding Boxen: Default sind 100
  245. \item Fine tune checkpoint type: Einstellungen, ob es sich um eine Objektdetektion oder Klassifizierung handelt
  246. \end{itemize}
  247. \item Train input reader: Dateipfade zur Label Map und der tf-record-Datei für das Training
  248. \item Evaluierungskonfiguration: Default ist die COCO Detection Metrik, die auch verwendet wurde
  249. \item Eval input reader: Dateipfade zur Label Map und der tf-record-Datei für die Validierung oder Test
  250. \end{itemize}
  251. Beim Modell SSD MobileNet V2 320x320 ohne FPN-Bezeichnung sind noch zwei zusätzliche Punkte zu beachten. Die Bezeichnung 320x320 ist tatsächlich falsch, es handelt sich tatsächlich um ein Mobilenet mit einer Eingabeschicht von 300x300 Pixel. Zudem kann in den Netzschichten nach dem Backbone-Netz des SSD MobileNet V2 320x320 zusätzlich ein Dropout aktiviert werden. Dies wurde auch bei diesem Modell genutzt. Die anderen Modelle unterstützen diese Einstellung in der config-Datei nicht.\\
  252. Die Einstellungen für das Training der Türdetektion für die Türen der codemanufaktur mit der allgemeinen Türdetektion unterscheidet sich nur anhand der Anzahl der Training-Steps und der Steps der Lernratenkurve:
  253. \begin{itemize}
  254. \item Allgemeine Türdetektion: 5000 Steps
  255. \item Türdetektion auf die Türen der codemanufaktur: 10000 / 25000 Steps
  256. \end{itemize}
  257. Die 25000 Steps im Training der Türdetektion für die Türen der codemanufaktur sind zu hoch. Eine geringere Stepzahl hätte hier auch gereicht, da der Zuwachs an der \gls{mAP} gering ausfällt und auch der Total Loss und Validation Loss nicht mehr weiter signifikant abfällt. Bei einer zu hohen Stepanzahl steigt sogar das Risiko eines Overfittings. Es wurden zudem einige Einstellungen an der Lernrate ausprobiert. Hier konnte aber keine signifikante Verbesserung des Trainings- und Validierungs-Loss bewirkt werden. Sollte die Lernrate zu hoch eingestellt sein steigt der Trainings-Loss sogar an. Ansonsten wurden die Einstellungen der Hyperparameter aus den vortrainierten Netzen übernommen, da für das Machine Learning eher die Qualität und Anzahl der Trainingsdaten entscheidend ist \cite[473]{Goodfellow.2018}. Außerdem wurden die vortrainierten Netze mit diesen Voreinstellungen mit guten Resultaten auf den COCO-Datensatz trainiert.
  258. \begin{table}[htbp]
  259. \centering
  260. \begin{tabularx}{\textwidth}{p{0.3\textwidth}|X|X|X|X}
  261. \hline
  262. \textbf{Hyperparameter} & \textbf{SSD MobileNet V2 320x320} & \textbf{SSD MobileNet V2 FPNLite 320x320} & \textbf{SSD MobileNet V2 FPNLite 640x640} & \textbf{SSD ResNet50 V1 FPN 640x640}\\
  263. \hline
  264. Image resizer & 300x300 (Fehler in der Bezeichnung des Netzes) & 320x320 & 640x640 & 640x640\\
  265. \hline
  266. Depth multiplier des Backbone-Netz & 1,0 & 1,0 & 1,0 & 1,0\\
  267. \hline
  268. L2-Regularisierungsparamter des Backbone-Netz & 3,99e-5 & 3,99e-5 & 3,99e-5 & 0,000399\\
  269. \hline
  270. Aktivierungsfunktion des Backbone-Netz & ReLU6 & ReLU6 & ReLU6 & ReLU6\\
  271. \hline
  272. matched threshold & 0,5 & 0,5 & 0,5 & 0,5\\
  273. \hline
  274. L2-Regularisierungsparamter & 3,99e-5 & 3,99e-5 & 3,99e-5 & 0,000399\\
  275. \hline
  276. Aktivierungsfunktion & ReLU6 & ReLU6 & ReLU6 & ReLU\\
  277. \hline
  278. use Dropout & true / false & nicht verfügbar & nicht verfügbar & nicht verfügbar\\
  279. \hline
  280. Dropout keep probability & 0,8 (20\% Dropout) & - & - & -\\
  281. \hline
  282. Non-Max-Suppression IoU-Threshold & 0,6 & 0,6 & 0,6 & 0,6\\
  283. \hline
  284. Batch Size & 8 & 8 & 8 & 8\\
  285. \hline
  286. Augmentation & Random horizontal flip, random crop & Random horizontal flip, random crop & Random horizontal flip, random crop & Random horizontal flip, random crop\\
  287. \hline
  288. Anfangslernrate & 0,013 & 0,026 & 0,026 & 0,013\\
  289. \hline
  290. Maximale Lernrate & 0,08 & 0,08 & 0,08 & 0,04\\
  291. \hline
  292. Warm Up Steps des Trainings & 2000 & 1000 & 1000 & 2000\\
  293. \hline
  294. Maximale Steps der Lernratenkurve & 5000 & 5000 & 5000 & 5000\\
  295. \hline
  296. Maximale Steps des Trainings & 5000 & 5000 & 5000 & 5000\\
  297. \hline
  298. Momentum-Parameter & 0,899 & 0,899 & 0,899 & 0,899\\
  299. \hline
  300. Evaluierungsmetrik & COCO detection metric & COCO detection metric & COCO detection metric & COCO detection metric\\
  301. \hline
  302. Evaluierungs-Epochen & 1 & 1 & 1 & 1\\
  303. \hline
  304. \end{tabularx}
  305. \caption{Einige Einstellungen der Hyperparameter für die allgemeine Türdetektion}
  306. \label{tab:ConfigHyperparameter}
  307. \end{table}
  308. \FloatBarrier
  309. \subsubsection{Test- und Validierungs-Ergebnisse des Machine Learnings}
  310. Nachfolgend werden die Ergebnisse des Test- und Validierungsdatensatzes der Türdetektion anhand der COCO-Metrik dargestellt.
  311. \begin{table}[htbp]
  312. \centering
  313. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X|X|X}
  314. \hline
  315. \textbf{Modell} & \textbf{mAP} & \textbf{mAP@IoU von 0,5} & \textbf{mAP@IoU von 0,75} & \textbf{AR@1} & \textbf{AR@10}\\
  316. \hline
  317. SSD MobileNet V2 320x320 & Test:0,4027, Val:0,6257 & Test:0,6387, Val:0,901 & Test:0,4645, Val:0,6809 & Test:0,3937, Val:0,5585 & Test:0,5816, Val:0,7321\\
  318. \hline
  319. SSD MobileNet V2 320x320 Dropout & Test:0,4324, Val:0,6092 & Test:0,6723, Val:0,887 & Test:0,4834, Val:0,6689 & Test:0,4209, Val:0,566 & Test:0,5861, Val:0,7151\\
  320. \hline
  321. SSD MobileNet V2 FPNLite 320x320 & Test:0,5116, Val:0,7179 & Test:0,7494, Val:0,9467 & Test:0,6108, Val:0,8255 & Test:0,5127, Val:0,6226 & Test:0,638, Val:0,7698\\
  322. \hline
  323. SSD MobileNet V2 FPNLite 640x640 & Test:0,534, Val:0,7084 & Test:0,7406, Val:0,9292 & Test:0,6311, Val:0,7883 & Test:0,5171, Val:0,6396 & Test:0,6411, Val:0,7491\\
  324. \hline
  325. SSD ResNet50 V1 FPN 640x640 & Test:0,4764, Val:0,7152 & Test:0,6871, Val:0,9465 & Test:0,5624, Val:0,7843 & Test:0,4658, Val:0,6264 & Test:0,6278, Val:0,7679\\
  326. \hline
  327. \end{tabularx}
  328. \caption{Ergebnisse der allgemeinen Türdetektion nach der COCO-Metrik}
  329. \label{tab:AllgemeineDetektionResultateCOCO}
  330. \end{table}
  331. \begin{figure}[htbp]
  332. \centering
  333. \begin{tikzpicture}
  334. \begin{axis}[
  335. xbar, xmajorgrids=true, xmin=0, xmax=0.6, width=11cm, height=10cm, enlarge y limits=0.2, xlabel={\textbf{mAP}}, symbolic y coords={SSD MobileNet V2 320x320, SSD MobileNet V2 320x320 Dropout, SSD MobileNet V2 FPNLite 320x320, SSD MobileNet V2 FPNLite 640x640, SSD ResNet50 V1 FPN 640x640}, y tick label style={anchor=east,text width=5cm,align=right},ytick=data, nodes near coords, nodes near coords align={horizontal},
  336. ]
  337. \addplot coordinates
  338. {(0.4027,SSD MobileNet V2 320x320)(0.4324,SSD MobileNet V2 320x320 Dropout) (0.5116,SSD MobileNet V2 FPNLite 320x320) (0.534,SSD MobileNet V2 FPNLite 640x640) (0.4764,SSD ResNet50 V1 FPN 640x640)};
  339. \end{axis}
  340. \end{tikzpicture}
  341. \caption{Ergebnisse des Testsets der allgemeinen Türdetektion nach der COCO-Metrik}
  342. \label{fig:BalkendiagrammAllgemeinCOCO}
  343. \end{figure}
  344. \begin{table}[htbp]
  345. \centering
  346. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X|X|X}
  347. \hline
  348. \textbf{Modell} & \textbf{mAP} & \textbf{mAP@IoU von 0,5} & \textbf{mAP@IoU von 0,75} & \textbf{AR@1} & \textbf{AR@10}\\
  349. \hline
  350. SSD MobileNet V2 320x320 & Test:0,1622, Val:0,7728 & Test:0,3198, Val:0,9637 & Test:0,1602, Val:0,8927 & Test:0,1745, Val:0,6677 & Test:0,3113, Val:0,8323\\
  351. \hline
  352. SSD MobileNet V2 FPNLite 320x320 & Test:0,2393, Val:0,8678 & Test:0,4839, Val:0,9969 & Test:0,2471, Val:0,959 & Test:0,2236, Val:0,7516 & Test:0,3726, Val:0,8935\\
  353. \hline
  354. SSD MobileNet V2 FPNLite 640x640 & Test:0,2162, Val:0,8161 & Test:0,4013, Val:0,9723 & Test:0,2245, Val:0,9254 & Test:0,2335, Val:0,6839 & Test:0,3608, Val:0,871\\
  355. \hline
  356. \end{tabularx}
  357. \caption{Ergebnisse der Türdetektion für die codemanufaktur nach der COCO-Metrik}
  358. \label{tab:CodemanufakturDetektionResultateCOCO}
  359. \end{table}
  360. \begin{figure}[htbp]
  361. \centering
  362. \begin{tikzpicture}
  363. \begin{axis}[
  364. xbar, xmajorgrids=true, xmin=0, xmax=0.6, width=11cm, height=6.5cm, enlarge y limits=0.3, xlabel={\textbf{mAP}}, symbolic y coords={SSD MobileNet V2 320x320, SSD MobileNet V2 FPNLite 320x320, SSD MobileNet V2 FPNLite 640x640}, y tick label style={anchor=east,text width=5cm,align=right},ytick=data, nodes near coords, nodes near coords align={horizontal},
  365. ]
  366. \addplot coordinates
  367. {(0.1622,SSD MobileNet V2 320x320) (0.2393,SSD MobileNet V2 FPNLite 320x320) (0.2162,SSD MobileNet V2 FPNLite 640x640)};
  368. \end{axis}
  369. \end{tikzpicture}
  370. \caption{Ergebnisse des Testsets der codemanufaktur Türdetektion nach der COCO-Metrik}
  371. \label{fig:BalkendiagrammCodemanufakturCOCO}
  372. \end{figure}
  373. \FloatBarrier
  374. \subsubsection{Trainings-Ergebnisse des Generalisierungsfehlers des Machine Learnings}
  375. Die nachfolgenden Tabellen zeigen die Ergebnisse des Classification-, Localization- und Total Loss aus dem Machine-Learning-Training an. Hieraus lässt sich die Generalisierungsfähigkeit der trainierten Netze abschätzen.
  376. \begin{table}[htbp]
  377. \centering
  378. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X}
  379. \hline
  380. \textbf{Modell} & \textbf{Classification Loss} & \textbf{Localization Loss} & \textbf{Total Loss}\\
  381. \hline
  382. SSD MobileNet V2 320x320 & Test:0,6382, Val:0,2473, Train:0,2469 & Test:0,1966, Val:0,1253, Train:0,07865 & Test:0,9552, Val:0,4931 Train:0,446\\
  383. \hline
  384. SSD MobileNet V2 320x320 Dropout & Test:0,5824, Val:0,2541, Train:0,1005 & Test:0,203, Val:0,1006, Train:0,05682 & Test:0,9102, Val:0,4795, Train:0,2822\\
  385. \hline
  386. SSD MobileNet V2 FPNLite 320x320 & Test:0,4605, Val:0,2023, Train:0,03997 & Test:0,1727, Val:0,07645, Train:0,01214 & Test:0,7802, Val:0,4258 Train:0,1991\\
  387. \hline
  388. SSD MobileNet V2 FPNLite 640x640 & Test:0,5613,Val:0,235, Train:0,03561 & Test:0,1931, Val:0,06567, Train:9,9128e-3 & Test:0,8991, Val:0,4454, Train:0,1902\\
  389. \hline
  390. SSD ResNet50 V1 FPN 640x640 & Test:0,5942, Val:0,242, Train:0,03345 & Test:0,1525, Val:0,08062, Train:7,6636e-3 & Test:0,9437, Val:0,5196, Train:0,2381\\
  391. \hline
  392. \end{tabularx}
  393. \caption{Ergebnisse der allgemeinen Türdetektion}
  394. \label{tab:AllgemeineDetektionResultate}
  395. \end{table}
  396. \begin{table}[htbp]
  397. \centering
  398. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X}
  399. \hline
  400. \textbf{Modell} & \textbf{Classification Loss} & \textbf{Localization Loss} & \textbf{Total Loss}\\
  401. \hline
  402. SSD MobileNet V2 320x320 & Test:1,622, Val:0,1437, Train:0,04133 & Test:0,4797, Val:0,05379, Train:0,01276 & Test:2,216, Val:0,3119 Train:0,1684\\
  403. \hline
  404. SSD MobileNet V2 FPNLite 320x320 & Test:1,451, Val:0,1484, Train:0,02067 & Test:0,3947, Val:0,04495, Train:1,4115e-3 & Test:1,929, Val:0,2769 Train:0,1057\\
  405. \hline
  406. SSD MobileNet V2 FPNLite 640x640 & Test:1,374, Val:0,2921, Train:0,02359 & Test:0,4033, Val:0,05568, Train:2,6841e-3 & Test:1,899, Val:0,4694, Train:0,1479\\
  407. \hline
  408. \end{tabularx}
  409. \caption{Ergebnisse der Türdetektion für die codemanufaktur}
  410. \label{tab:CodemanufakturDetektionResultate}
  411. \end{table}
  412. \FloatBarrier
  413. \subsubsection{Dauer des Machine Learnings}
  414. Aus Tabelle \ref{tab:DauerTraining} lässt sich die Trainingsdauer der Netze mit GPU und CPU ablesen.
  415. \begin{table}[htbp]
  416. \centering
  417. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X|X}
  418. \hline
  419. \textbf{Modell} & \textbf{Dauer bei 5000 Steps mit GPU} & \textbf{Steps per Sekunde mit GPU} & \textbf{Dauer bei 10000/25000 Steps mit CPU} & \textbf{Steps per Sekunde mit CPU}\\
  420. \hline
  421. SSD MobileNet V2 320x320 & 17 Minuten 10 Sekunden & 4,797 & 4 Stunden 39 Minuten 4 Sekunden bei 10000 Steps & 0,5927\\
  422. \hline
  423. SSD MobileNet V2 320x320 Dropout & 23 Minuten 29 Sekunden & 3,472 & - & -\\
  424. \hline
  425. SSD MobileNet V2 FPNLite 320x320 & 29 Minuten 56 Sekunden & 2,716 & 15 Stunden 45 Minuten 35 Sekunden bei 25000 Steps & 0,437\\
  426. \hline
  427. SSD MobileNet V2 FPNLite 640x640 & 43 Minuten 31 Sekunden & 1,879 & 21 Stunden 0 Minuten 53 Sekunden bei 10000 Steps & 0,1311\\
  428. \hline
  429. SSD ResNet50 V1 FPN 640x640 & 45 Minuten 21 Sekunden & 1,804 & Nach 8 Stunden 4 Minuten 22 Sekunden bei Step 1300 abgebrochen & 0,04126\\
  430. \hline
  431. \hline
  432. \end{tabularx}
  433. \caption{Dauer des Trainings}
  434. \label{tab:DauerTraining}
  435. \end{table}
  436. \FloatBarrier
  437. \subsubsection{Plots des Trainings des SSD MobileNet FPNLite 320x320}
  438. Folgende Abbildungen \ref{fig:AllgemeinLoss}, \ref{fig:AllgemeinLernrateStepsProSekunde}, \ref{fig:AllgemeinCOCO}, \ref{fig:Loss}, \ref{fig:LernrateStepsProSekunde}, \ref{fig:COCO} zeigen die Plots des Trainings und der Validierung des SSD MobileNet V2 FPNLite 320x320.
  439. \begin{figure}[htbp]
  440. \centering
  441. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/TotalLoss.pdf}
  442. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/ClassificationLoss.pdf}
  443. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/LocalizationLoss.pdf}
  444. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/RegularizationLoss.pdf}
  445. \caption{Trainings- und Validierungs-Loss der allgemeinen Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  446. \label{fig:AllgemeinLoss}
  447. \end{figure}
  448. \begin{figure}[htbp]
  449. \centering
  450. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/Lernrate.pdf}
  451. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/StepsProSekunde.pdf}
  452. \caption{Lernkurve nach Cosine Decay und Steps pro Sekunde der allgemeinen Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  453. \label{fig:AllgemeinLernrateStepsProSekunde}
  454. \end{figure}
  455. \begin{figure}[htbp]
  456. \centering
  457. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/mAP.pdf}
  458. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/mAP50.pdf}
  459. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/mAP75.pdf}
  460. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/Recall1.pdf}
  461. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCSV/Recall10.pdf}
  462. \caption{Ergebnisse der Validierung nach der COCO-Metrik der allgemeinen Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  463. \label{fig:AllgemeinCOCO}
  464. \end{figure}
  465. \begin{figure}[htbp]
  466. \centering
  467. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/TotalLoss.pdf}
  468. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/ClassificationLoss.pdf}
  469. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/LocalizationLoss.pdf}
  470. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/RegularizationLoss.pdf}
  471. \caption{Trainings- und Validierungs-Loss der codemanufaktur Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  472. \label{fig:Loss}
  473. \end{figure}
  474. \begin{figure}[htbp]
  475. \centering
  476. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/Lernrate.pdf}
  477. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/StepsPerSec.pdf}
  478. \caption{Lernkurve nach Cosine Decay und Steps pro Sekunde der codemanufaktur Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  479. \label{fig:LernrateStepsProSekunde}
  480. \end{figure}
  481. \begin{figure}[htbp]
  482. \centering
  483. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/mAP.pdf}
  484. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/mAP50.pdf}
  485. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/mAP75.pdf}
  486. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/Recall1.pdf}
  487. \includegraphics[scale=0.21]{img/ssdMobilenetFPNLiteCCSV/Recall10.pdf}
  488. \caption{Ergebnisse der Validierung nach der COCO-Metrik der codemanufaktur Türdetektion des SSD MobileNet V2 FPNLite 320x320}
  489. \label{fig:COCO}
  490. \end{figure}
  491. \FloatBarrier
  492. \subsection{Konvertierung des Modells zu TensorFlow Lite}
  493. Die Konvertierung der trainierten Modelle in Tensorflow-Lite-Modelle erfolgt in mehreren Schritten. Nachfolgend sind die einzelnen Schritte aufgezeigt:
  494. \begin{itemize}
  495. \item Umwandlung der aus dem Training generierten Checkpoints in ein Saved-Model
  496. \item Umwandlung des Saved-Model in ein Saved-Model als TFLite-Graph
  497. \item Umwandlung des Saved-Model als TFLite-Graph in ein (quantisiertes) TFLite-Model als tflite-Datei (optimiertes Flatbuffer-Format)
  498. \item Hinzufügen von Meta-Daten (Beschreibungsdaten) zur tflite-Datei
  499. \end{itemize}
  500. In Bezug auf die Checkpoints stellen diese Speicherpunkte der Parameter des Modells dar und werden beim Training alle 1000 Steps angelegt. Mit dem Saved-Model-Format können die Modelle dann wiederum in der TensorFlow-Low-Level-API oder der TensorFlow-High-Level-API Keras geladen werden, da diese die Modell-Architektur und die trainierten Parameter enthalten. Für eine Konvertierung zum TensorFlow-Lite-Format muss das Saved-Model in ein Saved-Model mit TFLite-Graph konvertiert werden. Schließlich kann dann dieses Saved-Model in ein TensorFlow-Lite-Modell mit oder ohne Quantisierung mittels TensorFlow-Lite-Konverter über die Python-API von TensorFlow umgewandelt werden \cite{TensorFlow.8102021}, \cite{TensorFlow.8122021}.\\
  501. Die Quantisierung wandelt die Parameter des Modells vom Float32-Datentyp in ganzzahlige Datentypen vom Typ Integer von 8-Bit um \cite{TensorFlow.8122021}, \cite[2-3]{Jacob.12152017}. Formel \ref{eq:Dequantisierung} zeigt die Dequantisierung durch Annäherung von 8-Bit-Werten zu Gleitkommawerten \cite{TensorFlow.8122021}, \cite[4-5]{Krishnamoorthi.2018}, \cite[2-3]{Jacob.12152017}. Formel \ref{eq:Quantisierung} zeigt die Quantisierung von Gleitkommawerten zu 8-Bit-Ganzzahlwerten \cite[4-5]{Krishnamoorthi.2018}.
  502. \begin{align}
  503. r\:{=}\: (q - Z) \cdot S
  504. \label{eq:Dequantisierung}
  505. \end{align}
  506. \begin{align}
  507. q\:{=}\: round\Bigl(\frac{r}{S}\Bigr) + Z
  508. \label{eq:Quantisierung}
  509. \end{align}
  510. Bei den Formeln \ref{eq:Dequantisierung} und \ref{eq:Quantisierung} werden ein Nullpunkt \gls{Nullpunkt} als int8-Wert und ein Scale \gls{Scale} als Float32-Wert festgelegt \cite[2-3]{Jacob.12152017}. Der Scale gibt die Schrittweite der Quantisierung an \cite[2-3]{Jacob.12152017}, \cite[4-5]{Krishnamoorthi.2018}. \gls{Ganzzahl} gibt den quantisierten Ganzzahlwert, \gls{Floatzahl} den Gleitkommawert an. Sowohl für Gewichte als auch Aktivierungen kann die Quantisierung angewendet werden. Folgende Übersicht zeigt die Unterschiede zwischen der Quantisierung von Gewichten und Aktivierungen an:
  511. \begin{itemize}
  512. \item Gewichte pro Achse (Kanal) oder pro Tensor, durch int8-Zweierkomplementwerte im Bereich [-127, 127] mit Nullpunkt \gls{Nullpunkt} gleich 0
  513. \item Aktivierungen/Eingaben pro Tensor, durch int8-Zweierkomplementwerte im Bereich [-128, 127], mit einem Nullpunkt \gls{Nullpunkt} im Bereich [-128, 127]
  514. \end{itemize}
  515. Es gibt unterschiedliche Stufen der Quantisierung in TensorFlow Lite. Tabelle \ref{tab:Quantisierung} zeigt die Quantisierungsmethoden.
  516. \begin{table}[htbp]
  517. \centering
  518. \begin{tabularx}{\textwidth}{p{0.3\textwidth}|X|X}
  519. \hline
  520. \textbf{Technik} & \textbf{Leistung} & \textbf{Hardware}\\
  521. \hline
  522. Quantisierung des Dynamikbereichs & 4x kleineres Modell, 2x-3x Beschleunigung / schnellere Inferenzzeit & Zentralprozessor (CPU)\\
  523. \hline
  524. Vollständige ganzzahlige Quantisierung & 4x kleineres Modell, 3x+ Beschleunigung / schnellere Inferenzzeit & CPU, Edge-TPU, Mikrocontroller\\
  525. \hline
  526. Float16-Quantisierung & 2x kleiner, GPU-Beschleunigung & CPU, GPU\\
  527. \hline
  528. \end{tabularx}
  529. \caption{Quantisierungsmethoden \cite{TensorFlow.8122021}}
  530. \label{tab:Quantisierung}
  531. \end{table}
  532. Quantisierung des Dynamikbereichs bedeutet die Quantisierung der Gewichte und Bias. Eine vollständige Quantisierung beinhaltet neben der Quantisierung der Gewichte auch die Quantisierung von Aktivierungen, Eingabe- und Ausgabeschichten \cite{TensorFlow.8122021}. \\
  533. Modelleingaben, Aktivierungen und Modellausgaben sind im Gegensatz zu Gewichten und Bias variable Tensoren (variable mehrdimensionale Arrays), bei denen der min-max-Bereich der Gleitkommawerte nicht im Vornherein geschätzt oder kalibriert werden kann. Hier muss für eine Schätzung eine Inferenz des Modells mit einer Teilmenge des Trainingsdatensatzes durchgeführt werden \cite{TensorFlow.8122021}. Für die trainierten Modelle dieser Arbeit wurde die TensorFlow-Lite-Konvertierung mit und ohne Quantisierung vorgenommen. Tabelle \ref{tab:QuantisierungModelle} zeigt die Quantisierungsmethoden der trainierten Netze.
  534. \begin{table}[htbp]
  535. \centering
  536. \begin{tabularx}{\textwidth}{p{0.3\textwidth}|X|X|X}
  537. \hline
  538. \textbf{Modell} & \textbf{Technik} & \textbf{Modellgröße in Kilobyte (KB)} & \textbf{Hardware}\\
  539. \hline
  540. SSD MobileNet V2 320x320 & Unquantisiert & 18036 & CPU, GPU\\
  541. \hline
  542. SSD MobileNet V2 320x320 & Quantisierung des Dynamikbereichs & 5015 & CPU\\
  543. \hline
  544. SSD MobileNet V2 320x320 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 5090 & CPU\\
  545. \hline
  546. \hline
  547. \hline
  548. SSD MobileNet V2 FPNLite 320x320 & Unquantisiert & 11233 & CPU, GPU\\
  549. \hline
  550. SSD MobileNet V2 FPNLite 320x320 & Quantisierung des Dynamikbereichs & 3524 & CPU\\
  551. \hline
  552. SSD MobileNet V2 FPNLite 320x320 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 3673 & CPU\\
  553. \hline
  554. \hline
  555. \hline
  556. SSD MobileNet V2 FPNLite 640x640 & Unquantisiert & 11832 & CPU, GPU\\
  557. \hline
  558. SSD MobileNet V2 FPNLite 640x640 & Quantisierung des Dynamikbereichs & 4123 & CPU\\
  559. \hline
  560. SSD MobileNet V2 FPNLite 640x640 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 4273 & CPU\\
  561. \hline
  562. \hline
  563. \hline
  564. SSD ResNet50 V1 FPN 640x640 & Unquantisiert & 197944 & CPU, GPU\\
  565. \hline
  566. SSD ResNet50 V1 FPN 640x640 & Quantisierung des Dynamikbereichs & 51023 & CPU\\
  567. \hline
  568. SSD ResNet50 V1 FPN 640x640 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 51184 & CPU\\
  569. \hline
  570. \end{tabularx}
  571. \caption{Quantisierungsmethoden der trainierten Modelle}
  572. \label{tab:QuantisierungModelle}
  573. \end{table}
  574. Wie in Tabelle \ref{tab:QuantisierungModelle} zu sehen, sind die Modelle ohne Quantisierung deutlich größer (um circa den Faktor 3 bis 4). Die Modellgröße hat dementsprechend auch eine große Auswirkung auf die Inferenzzeit. Zudem muss beachtet werden, dass ein quantisiertes Modell auf der GPU nicht mit Integer-Berechnungen ausgeführt werden kann. GPU's rechnen immer mit Gleitkommawerten.\\
  575. Nach der Quantisierung werden zu den TensorFlow-Lite-Modellen noch Beschreibungsinformationen in Form von Meta-Daten hinzugefügt, um eine Fehlermeldung beim Ausführen der Modelle zu verhindern. Über das Open Source Tool Netron \cite{GitHub.1282021b} lässt sich die Netzarchitketur der TensorFlow-Lite-Modelle visualisieren und die Eingabe- und Ausgabeschicht nach Größe und Datentypen kontrollieren.
  576. \section{Implementierung der Navigation mittels Android App}
  577. In den nachfolgenden Abschnitten wird auf die Einbindung der TensorFlow-Lite-Modelle, die Algorithmen für die Türdetektion und Hindernisvermeidung und deren Zusammenführung mittels Zustandsautomaten in einer Android-App eingegangen.
  578. \subsection{Einbindung der trainierten Netze}
  579. Die Einbindung der Modelle als TensorFlow-Lite-Modelle erfolgt über die TensorFlow Lite Interpreter API mittels der Programmiersprache Java. Über die Interpreter API können folgende Optionen für die Inferenz der Modelle definiert werden:
  580. \begin{itemize}
  581. \item NnApiDelegate(): Standardmäßige Inferenz über CPU
  582. \item setNumThreads(numThreads): Anzahl der Threads über die CPU, die für Operationen verwendet werden sollen, sofern sie Multithreading unterstützen
  583. \item GpuDelegate(): Inferenz über die GPU
  584. \item setUseXNNPACK: (Experimentell) Optimierte Ausführung von Gleitkommaberechnungen auf Gleitkomma-CPU-Kernels
  585. \end{itemize}
  586. Die Inferenz über die TensorFlow Lite Interpreter API mittels Java wird dann bei einem Eingang und einem Ausgang über den Funktionsaufruf \textit{interpreter.run(inputImageBuffer, outputByteBuffer)} ausgeführt. Bei mehreren Eingängen und Ausgängen wie bei der Objektdetektion, wo die Ausgabe mehrere Werte wie Bounding Box Koordinaten, Confidence, Anzahl der Detektionen und Name der Objekte enthält, wird der Funktionsaufruf \textit{interpreter.runForMultipleInputsOutputs(inputArray, outputMap)} verwendet.\\
  587. Die Aufnahmen als einzelne RGB-Bilder der Smartphone-Kamera als Input für die Modelle werden mittels der Android Camera API verarbeitet. Die Camera2 API wird vom Smartphone nicht unterstützt. Die Bildwiederholrate (Frames per Second) schwankt zwischen 15 und 20 Bilder pro Sekunde. Theoretisch wären durch die Smartphone-Kamera maximal 30 Bilder pro Sekunde möglich, jedoch nehmen die Umwandlung vom Kamerabild im Format YUV420SP zu RGB Performance weg. Zusätzlich müssen die Eingangsdaten, die als RGB-Bilder vorliegen, für die unquantisierten Modelle, die Float32-Werte verarbeiten, standardisiert werden:
  588. \begin{itemize}
  589. \item Unquantisierte Modelle der Türdetektion: Image\_Mean=127,5; Image\_Std=127,5
  590. \item MiDAs für Depth Estimation: Image\_Mean = 115,0; Image\_Std = 58,0
  591. \item PyDNet für Depth Estimation: Image\_Mean=0,0; Image\_Std=255,0
  592. \end{itemize}
  593. Die RGB-Bilder liegen als 8-Bit-Werte im Bereich [0; 255] vor. Die Image\_Mean entspricht dem Mittelwert \gls{MittelwertX}, die Image\_Std der Standardabweichung \gls{StandardabweichungX}. Nun kann anhand von Formel \ref{eq:Standardisierung} aus Kapitel \ref{StandardisierungNormierung}, die Standardisierung durchgeführt werden. Für die unquantisierten Modelle der Türdetektion ergibt sich nach der Standardisierung ein Bereich von [-1,0; 1,0]. \\
  594. Die Inferenz der Türdetektion und Depth Estmation laufen beide in einem Background-Thread, wobei als erstes die Türdetektion-Inferenz und danach die Depth Estimation-Inferenz ausgeführt wird. Dadurch addieren sich die Inferenzzeiten der Türdetektion und Depth Estimation in diesem Background-Thread.
  595. \subsection{Algorithmus der Zielnavigation mittels Türdetektion}
  596. Die Türdetektion und Zielnavigation zur Tür basiert auf der Breite, Höhe und Position der Bounding Box, skaliert auf die Bildschirmauflösung des Smartphones und der Sensororientierung der Smartphone-Kamera im Potrait-Modus, da das Smartphone vertikal an den Roboter befestigt ist. Algorithmus \ref{alg:Zielnavigation} und Abbildung \ref{fig:Zielnavigation} zeigen die Zielnavigation mittels der Größe und Position der Bounding Boxen der Türdetektion bezogen auf die Auflösung des Smartphone-Bildschirms. Zur Erklärung in Algorithmus \ref{alg:Zielnavigation} für die Fälle, dass die Höhe und Breite der Bounding Box größer als 90 \% der Höhe und Breite der Auflösung des Smartphone-Screens sind, soll dies als Fehldetektion eingestuft werden. Dieses Vorgehen soll Fehldetektionen im Algorithmus abfangen.
  597. \SetKw{Or}{or}
  598. \SetKw{And}{and}
  599. \SetKwInOut{Input}{input}
  600. \SetKwInOut{Output}{output}
  601. \begin{algorithm}[htbp]
  602. \SetAlgoLined
  603. \Input{List<TrackedRecognition> trackedObjects, List<Pair<Float, Detector.Recognition> > rectsToTrack}
  604. \Output{String commandMessage}
  605. \If{rectanglesToTrack.isEmpty()}{
  606. commandMessage $\leftarrow$ No door\;
  607. }
  608. \ForEach{recogonizedElement in trackedObjects}{
  609. \If{recognizedElement.title.equals(Door)}{
  610. rgbFrameToScreen.mapRectangle(detectionScreenRectangleNav, recognizedElement.location)\;
  611. \If{detectionScreenRectangleNav.width() $>$ (maxWidthScreen * $0.9$)}{
  612. commandMessage $\leftarrow$ No door\;
  613. }
  614. \If{detectionScreenRectangleNav.width() $>$ (maxHeightScreen * $0.9$)}{
  615. commandMessage $\leftarrow$ No door\;
  616. }
  617. \If{detectionScreenRectangleNav.width() $<$ (maxWidthScreen * $0.6$)}{
  618. commandMessage $\leftarrow$ Door not reached\;
  619. }
  620. \uElseIf{detectionScreenRectangleNav.width() $>$ (maxWidthScreen * $0.6$) \And detectionScreenRectangleNav.width() $<$ (maxWidthScreen * $0.7$)}{
  621. commandMessage $\leftarrow$ Door reached\;
  622. }
  623. \If{detectionScreenRectangleNav.centerX() $<$ (maxWidthScreen / $4$) \And detectionScreenRectangleNav.width() $<$ (maxWidthScreen * $0.5$)}{
  624. commandMessage $\leftarrow$ Door left\;
  625. }
  626. \uElseIf{detectionScreenRectangleNav.centerX() $>$ (maxWidthScreen * $0.75$) \And detectionScreenRectangleNav.width() $<$ (maxWidthScreen * $0.5$)}{
  627. commandMessage $\leftarrow$ Door right\;
  628. }
  629. }
  630. }
  631. \caption{Zielnavigation mittels Türdetektion}
  632. \label{alg:Zielnavigation}
  633. \end{algorithm}
  634. \begin{figure}[htbp]
  635. \centering
  636. \begin{tikzpicture}
  637. \node[rectangle,
  638. draw = lightgray,
  639. minimum width = 1cm,
  640. minimum height = 2cm] (r) at (0,0) {Tür};
  641. \node[rectangle,
  642. draw = lightgray,
  643. minimum width = 1cm,
  644. minimum height = 2cm] (s) at (4,0) {Tür};
  645. \node[rectangle,
  646. draw = lightgray,
  647. minimum width = 1cm,
  648. minimum height = 2cm] (t) at (8,0) {Tür};
  649. \node[rectangle,
  650. draw = lightgray,
  651. minimum width = 3cm,
  652. minimum height = 6cm] (u) at (4,-5) {Tür};
  653. \draw[-latex] (3,0) -- (r.east) node[midway, above] {Turn left};
  654. \draw[-latex] (5,0) -- (t.west) node[midway, above] {Turn right};
  655. % Labels
  656. \node[below=0.9cm, scale=1.0] at (s){Forward};
  657. \node[below=0.8cm, scale=1.0] at (u){Stop};
  658. \end{tikzpicture}
  659. \caption{Veranschaulichung der Zielnavigation}
  660. \label{fig:Zielnavigation}
  661. \end{figure}
  662. \FloatBarrier
  663. \subsection{Algorithmus der Hindernisvermeidung}
  664. Die Hindernisvermeidung wird mittels Depth Estimation (Kapitel \ref{DepthEstimation}) realisiert und der Ansatz für den Algorithmus aus \cite{PireStereoVision.2012} und \cite{Nalpantidis.2009} übernommen und angepasst. Dazu wird anhand der Tiefenkarte (Depth Map) aus dem neuronalen Netz heuristisch untersucht, ob Objekte vor der Smartphone-Kamera im Weg stehen. Hierzu wird zunächst die Ausgabe des Netzes als Float-Array ausgelesen und die Werte in den Bereich [0,0; 255,0] anhand von Formel \ref{eq:Normierung} normiert. Danach wird das normierte Float-Array mit den Disparitätswerten im Bereich [0,0; 255,0] auf Integer gecastet und in eine Bitmap überführt. Diese Bitmap wird dann in der Breite in 4 gleiche große Bereiche mit einem Rand geteilt. Die zwei mittleren Bereiche werden dann als zentralen Bildbereich (Central screen) zusammengefasst neben dem linken und rechten Bereich der Bitmap. Abbildung \ref{fig:Bitmap} zeigt die Aufteilung der Bitmap. Anschließend wird der Algorithmus \ref{alg:Hindernisvermeidung} zur heuristischen Analyse für die Hindernisvermeidung angewendet, in dem die Anzahl der Pixel \textit{p} über einen bestimmten Schwellwert \textit{T} des Disparitätswert \textit{D} gezählt werden. Diese Anzahl im Verhältnis zur gesamten Anzahl der Pixel im zentralen Bereich der Bitmap wird wiederum über einen Schwellwert \textit{r} ausgewertet und signalisiert, ob ein Hindernis im Weg ist. Falls ein Hindernis im Weg ist, werden im linken und rechten Bereich der Bitmap die durchschnittliche Disparität berechnet und dadurch die Ausweichrichtung bestimmt. Für die Schwellwerte wurden folgende Werte empirisch festgelegt:
  665. \begin{itemize}
  666. \item Schwellwert T=160
  667. \item Schwellwert r=0,1
  668. \end{itemize}
  669. Kleine Schwellwerte erhöhen die Sensitivität der Hindernisvermeidung und können die Geradeausfahrt behindern. Größere Schwellwerte erhöhen das Risiko einer fehlgeschlagenen Hindernisvermeidung.
  670. \begin{figure}[htbp]
  671. \centering
  672. \begin{tikzpicture}
  673. \node[rectangle,
  674. draw = lightgray,
  675. minimum width = 2cm,
  676. minimum height = 4cm] (r) at (0,0) {Left};
  677. \node[rectangle,
  678. draw = lightgray,
  679. minimum width = 2cm,
  680. minimum height = 4cm] (s) at (2,0) {Central};
  681. \node[rectangle,
  682. draw = lightgray,
  683. minimum width = 2cm,
  684. minimum height = 4cm] (t) at (4,0) {Central};
  685. \node[rectangle,
  686. draw = lightgray,
  687. minimum width = 2cm,
  688. minimum height = 4cm] (u) at (6,0) {Right};
  689. \draw (-1.5,2.5) -- (7.5,2.5) -- (7.5,-2.5) -- (-1.5,-2.5) -- (-1.5,2.5);
  690. \end{tikzpicture}
  691. \caption{Veranschaulichung der Aufteilung der Bitmap zur Hindernisvermeidung}
  692. \label{fig:Bitmap}
  693. \end{figure}
  694. \begin{algorithm}[htbp]
  695. \SetAlgoLined
  696. \Input{Depth map as a bitmap}
  697. \Output{String obstacleMessage}
  698. \ForAll{the pixels p of the central window}{
  699. \If{D(p) $>$ T}{
  700. counter++\;
  701. }
  702. numC++\;
  703. }
  704. \eIf{counter $<$ r[0,1] of numC}{
  705. obstacleMessage $\leftarrow$ No obstacle\;
  706. }{
  707. \ForAll{the pixels p of the left window}{
  708. sumL =+ D(p)\;
  709. numL++\;
  710. }
  711. \ForAll{the pixels p of the right window}{
  712. sumR =+ D(p)\;
  713. numR++\;
  714. }
  715. avL = sumL / numL\;
  716. avR = sumR / numR\;
  717. \eIf{avL $<$ avR}{
  718. obstacleMessage $\leftarrow$ Obstacle right\;
  719. }{
  720. obstacleMessage $\leftarrow$ Obstacle left\;
  721. }
  722. }
  723. \caption{Hindernisvermeidung}
  724. \label{alg:Hindernisvermeidung}
  725. \end{algorithm}
  726. \FloatBarrier
  727. \subsection{Zustandsautomat zur Zusammenführung der Türdetektion und Hindernisvermeidung}
  728. Um die Navigation des Roboters aus Zielnavigation und Hindernisvermeidung zusammenzuführen, wird ein Zustandsautomat (State Machine) in der Android App verwendet. Dieser Zustandsautomat wird alle 100 Millisekunden in einer Schleife im Main (UI)-Thread ausgeführt. Abbildung \ref{fig:Zustandsautomat} zeigt den Zustandsautomaten.
  729. \begin{figure}[htbp]
  730. \centering
  731. \begin{tikzpicture} [draw=cyan!70!black, node distance = 11cm, on grid, auto,
  732. every loop/.style={stealth-}]
  733. % State START
  734. \node (START) [state, initial, accepting, scale=0.6, initial text = {start}] {START};
  735. % State DOOR
  736. \node (DOOR) [state, scale=0.6, below right of = START] {DOOR};
  737. % State FINDDOORAGAIN
  738. \node (FINDDOORAGAIN) [state, scale=0.6, below of = DOOR] {FINDDOORAGAIN};
  739. % State OBSTACLE
  740. \node (OBSTACLE) [state, scale=0.6, below right of = FINDDOORAGAIN] {OBSTACLE};
  741. % State PASSOBSTACLE
  742. \node (PASSOBSTACLE) [state, scale=0.6, below left of = FINDDOORAGAIN] {PASSOBSTACLE};
  743. % State END
  744. \node (END) [state, accepting, scale=0.6, right of = DOOR] {END};
  745. % Arrows
  746. \path [-stealth, thick]
  747. (START) edge [loop above, scale=0.7] node [scale=0.7] {No door, Left turn for search door} ( )
  748. (START) edge[bend left] node [scale=0.7] {Door is detected} (DOOR)
  749. (DOOR) edge [loop above] node [scale=0.7] {Door not reached, no obstacle, Forward} ( )
  750. (DOOR) edge[bend right] node [scale=0.7] {Door reached, Stop} (END)
  751. (DOOR) edge [loop left] node [scale=0.7] {Door left, no obstacle, Left turn} ( )
  752. (DOOR) edge [loop right] node [scale=0.7] {Door right, no obstacle, Right turn} ( )
  753. (DOOR) edge[bend left] node [scale=0.7] {Obstacle left/right, Stop} (OBSTACLE)
  754. (DOOR) edge[bend left] node [scale=0.7] {No door} (FINDDOORAGAIN)
  755. (OBSTACLE) edge[bend left] node [scale=0.7] {No obstacle, Forward} (PASSOBSTACLE)
  756. (OBSTACLE) edge [loop below] node [scale=0.7] {Obstacle left, Right turn} ( )
  757. (OBSTACLE) edge [loop above] node [scale=0.7] {Obstacle right, Left turn} ( )
  758. (PASSOBSTACLE) edge node [scale=0.7] {Obstacle left/right, Stop} (OBSTACLE)
  759. (PASSOBSTACLE) edge [loop below] node [scale=0.7] {State Time $<$ 3000 ms, Forward} ( )
  760. (PASSOBSTACLE) edge[bend left] node [scale=0.7] {State Time $>$ 3000 ms} (FINDDOORAGAIN)
  761. (FINDDOORAGAIN) edge[loop left] node [scale=0.7] {No door, obstacle was left, Left turn} ( )
  762. (FINDDOORAGAIN) edge[loop right] node [scale=0.7] {No door, obstacle was right, Right turn} ( )
  763. (FINDDOORAGAIN) edge[loop below] node [scale=0.7] {No door, no obstacle was on the way, Forward} ( )
  764. (FINDDOORAGAIN) edge[bend left] node [scale=0.7] {No door, obstacle right/left, Stop} (OBSTACLE)
  765. (FINDDOORAGAIN) edge[bend left] node [scale=0.7] {Door is detected} (DOOR)
  766. (END) edge[loop below] node [scale=0.7] {Door reached, Stop} ( );
  767. \end{tikzpicture}
  768. \caption{Zustandsautomat der Roboternavigation}
  769. \label{fig:Zustandsautomat}
  770. \end{figure}
  771. \section{Evaluierung der Navigation durch Experiment}
  772. Die Evaluierung der Roboternavigation dient dafür die Zielnavigation mittels allgemeiner- und codemanufaktur-Türdetektion zu vergleichen und die Hindernisvermeidung mittels Depth Estimation zu untersuchen.
  773. Die Evaluierung gliedert sich in die Bereiche Türdetektion / Zielnavigation, Hindernisvermeidung und der kompletten Roboternavigation. Die Evaluierung wird als Experiment in den öffentlichen Büroflächen der codemanufaktur GmbH durchgeführt. Vor allem der Bereich der Cafeteria wird für die Evaluierung der Hindernisvermeidung und der kompletten Navigation, aufgrund des ausreichenden Platzbedarfs genutzt. Die Evaluierung wird mit den Modellen der allgemeinen Türdetektion und der speziell auf die Türen der codemanufaktur GmbH trainierten Modelle durchgeführt.
  774. \subsection{Fernsteuerung und Spiegelung des Smartphone-Screens}
  775. Für die Evaluierung wird dazu noch das Open Source Tool scrcpy von Genymobile \cite{GitHub.1282021} für die Spiegelung des Screens und die Fernsteuerung des Android-Smartphones verwendet.
  776. \subsection{Evaluierung der Türdetektion}
  777. Die Evaluierung der Türdetektion wird anhand der Detektion der verschiedenen Türen der codemanufaktur und der Zielnavigation des Roboters zu den Türen, sowie der Inferenzzeit der Modelle durchgeführt. Außerdem wird das Experiment mit dem SSD Mobilenet V2 FPNLite 320x320 durchgeführt, aufgrund der besten \gls{mAP} nach Tabellen \ref{tab:AllgemeineDetektionResultateCOCO} und \ref{tab:CodemanufakturDetektionResultateCOCO} neben dem SSD Mobilenet V2 FPNLite 640x640. Das SSD Mobilenet V2 FPNLite 640x640 hat den großen Nachteil des erhöhten Rechenaufwands bezüglich der doppelten Auflösung der Eingabeschicht und der daraus resultierenden höheren Inferenzzeit von circa 203 ms bei der quantisierten Variante. Tabelle \ref{tab:InferenzzeitModelle} zeigt die Inferenzzeiten der einzelnen Modelle auf dem verwendeten Smartphone mit CPU bei 4 Threads. Das quantisierte SSD Mobilenet V2 FPNLite 320x320 hat eine Inferenzzeit von circa 50 ms.
  778. \begin{table}[htbp]
  779. \centering
  780. \begin{tabularx}{\textwidth}{p{0.3\textwidth}|X|X|X}
  781. \hline
  782. \textbf{Modell} & \textbf{Technik} & \textbf{Modellgröße in Kilobyte (KB)} & \textbf{Inferenzzeit in Millisekunden (ms)}\\
  783. \hline
  784. SSD MobileNet V2 320x320 & Unquantisiert & 18036 & 63\\
  785. \hline
  786. SSD MobileNet V2 320x320 & Quantisierung des Dynamikbereichs & 5015 & 93\\
  787. \hline
  788. SSD MobileNet V2 320x320 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 5090 & 42\\
  789. \hline
  790. \hline
  791. \hline
  792. SSD MobileNet V2 FPNLite 320x320 & Unquantisiert & 11233 & 102
  793. \\
  794. \hline
  795. SSD MobileNet V2 FPNLite 320x320 & Quantisierung des Dynamikbereichs & 3524 & 144\\
  796. \hline
  797. SSD MobileNet V2 FPNLite 320x320 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 3673 & 50\\
  798. \hline
  799. \hline
  800. \hline
  801. SSD MobileNet V2 FPNLite 640x640 & Unquantisiert & 11832 & 352\\
  802. \hline
  803. SSD MobileNet V2 FPNLite 640x640 & Quantisierung des Dynamikbereichs & 4123 & 485\\
  804. \hline
  805. SSD MobileNet V2 FPNLite 640x640 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 4273 & 203\\
  806. \hline
  807. \hline
  808. \hline
  809. SSD ResNet50 V1 FPN 640x640 & Unquantisiert & 197944 & 5116\\
  810. \hline
  811. SSD ResNet50 V1 FPN 640x640 & Quantisierung des Dynamikbereichs & 51023 & 2080\\
  812. \hline
  813. SSD ResNet50 V1 FPN 640x640 & Quantisierung des Dynamikbereichs und der Eingabeschicht & 51184 & 1670\\
  814. \hline
  815. \end{tabularx}
  816. \caption{Inferenzzeiten der trainierten Modelle}
  817. \label{tab:InferenzzeitModelle}
  818. \end{table}
  819. Die Minimum Confidence für die Verarbeitung der Werte aus den Tür-Detektionen-Modellen in der Smartphone-App wird wie folgt eingestellt:
  820. \begin{itemize}
  821. \item Allgemeine Türdetektion, Minimum Confidence: 0,5
  822. \item codemanufaktur Türdetektion, Minimum Confidence: 0,8
  823. \end{itemize}
  824. Grund für die Unterschiede ist, dass die Netze, die mit den codemanufaktur-Türen trainiert wurden, eine viel höhere Confidence (Wahrscheinlichkeit) der Detektion auf die Türen der codemanufaktur GmbH aufweisen. Für die Netze der allgemeinen Türdetektion sind die Türen der codemanukatur GmbH bisher unbekannt und daher die Confidence (Wahrscheinlichkeit) der Detektion geringer.
  825. \FloatBarrier
  826. \subsubsection{Voruntersuchung der Detektion}
  827. Für die Voruntersuchung der Türdetektion wurde das Smartphone in die Hand genommen und die Smartphone-Kamera an die verschiedenen Türen der codemanufaktur GmbH gerichtet, um zu überprüfen ob die Türen detektiert werden. Hierbei wurde ausschließlich das SSD Mobilenet V2 FPNLite 320x320 in den unterschiedlichen Quantisierungsvarianten verwendet.
  828. \subsubsection{Evaluierung der Zielnavigation}
  829. Für die Evaluierung der Zielnavigation wurde das Smartphone an den Roboter mit einem Gummiband befestigt (siehe Abbildung \ref{fig:Roboter}) und vom verwendteten Laptop mittels scrcpy ferngesteuert. Die Anfangsentfernung zur Tür wurde gemessen und der Roboter in einem Winkel von -30° versetzt zur Tür aufgestellt. In einen noch größeren Winkel konnte der Roboter nicht aufgestellt werden, da ansonsten eine andere Tür und nicht die gewünschte Tür angefahren wird. Abbildung \ref{fig:ZielnavigationRoboter} zeigt die Initialstellungen des Roboters zu den Türen. \\
  830. Untersucht wird die Zielnavigation auf die Glasschiebetür in der Cafeteria, eine Holztür und zwei Glastüren, siehe Abbildung \ref{fig:ZielnavigationRoboter}. Für das Experiment werden 10 Läufe durchgeführt und ausgewertet, wie oft der Roboter an der jeweiligen Tür ankommt und im besten Fall auch direkt vor der Tür stehenbleibt. Zudem werden in einigen Läufen mittels scrcpy Videoaufzeichnungen des Smartphonescreens aufgenommen. Das grafische Interface der Smartphone-App ist in Abbildung \ref{fig:SmartphoneInterface} dargestellt.
  831. \begin{figure}[htbp]
  832. \centering
  833. \includegraphics[scale=0.07]{img/BilderExperiment/RoboterCafeteriaSchiebetuer.jpg}
  834. \includegraphics[scale=0.07]{img/BilderExperiment/RoboterMassband.jpg}
  835. \includegraphics[scale=0.07]{img/BilderExperiment/RoboterHolzTuer.jpg}
  836. \includegraphics[scale=0.07]{img/BilderExperiment/RoboterGlasTuer.jpg}
  837. \caption{Initialstellung des Roboters für die Zielnavigation}
  838. \label{fig:ZielnavigationRoboter}
  839. \end{figure}
  840. \begin{figure}[htbp]
  841. \centering
  842. \includegraphics[scale=0.2]{img/SmartphoneScreen/ScreenshotDoor1.jpg}
  843. \caption{Grafisches Interface der Smartphone-App}
  844. \label{fig:SmartphoneInterface}
  845. \end{figure}
  846. \FloatBarrier
  847. \subsection{Evaluierung der Navigation mit Hindernisvermeidung und kompletter Navigation}
  848. Für die Evaluierung der Hindernisvermeidung und der kompletten Navigation wird grundsätzlich ein ähnliches Setting wie in der Evaluierung der Zielnavigation gewählt mit dem Unterschied, dass ein Hindernis auf dem Weg zur Tür gelegt wird. Aufgrund des Platzbedarfs für das Ausweichen des Hindernisses wurde hierfür ausschließlich die Glasschiebetür im Cafeteria-Bereich ausgewählt. Auch hier werden pro Hindernis 10 Läufe durchgeführt. Folgende Hindernisse werden evaluiert:
  849. \begin{itemize}
  850. \item Zwei Getränkekästen aufeinander gestappelt
  851. \item Stuhl
  852. \item Bürostuhl
  853. \item Pflanzenvase
  854. \item Person
  855. \end{itemize}
  856. Abbildung \ref{fig:HindernissenavigationRoboter} zeigt die verwendteten Objekte ohne Person als Hindernisse. Abbildung \ref{fig:HindernisvermeidungSetting} zeigt den Versuchsaufbau mit der Pflanzenvase als Hindernis.
  857. \begin{figure}[htbp]
  858. \centering
  859. \includegraphics[scale=0.07]{img/HindernisExperiment/Beverage.jpg}
  860. \includegraphics[scale=0.07]{img/HindernisExperiment/Stuhl.jpg}
  861. \includegraphics[scale=0.07]{img/HindernisExperiment/BueroStuhl.jpg}
  862. \includegraphics[scale=0.07]{img/HindernisExperiment/Pflanzenvase.jpg}
  863. \caption{Hindernisse der Evaluierung der Hindernisvermeidung ohne Person}
  864. \label{fig:HindernissenavigationRoboter}
  865. \end{figure}
  866. \begin{figure}[htbp]
  867. \centering
  868. \includegraphics[scale=0.07]{img/HindernisExperiment/SettingHindernisvermeidung.jpg}
  869. \includegraphics[scale=0.07]{img/HindernisExperiment/HindernisBeverage.jpg}
  870. \includegraphics[scale=0.07]{img/HindernisExperiment/HindernisStuhl.jpg}
  871. \caption{Versuchsaufbau der Hindernisvermeidung mit Pflanzenvase als Hindernis}
  872. \label{fig:HindernisvermeidungSetting}
  873. \end{figure}
  874. Die Inferenzzeit der Depth Estimation Modelle zeigt Tabelle \ref{tab:InferenzzeitDepthEstimation}. Die Hindernisvermeidung und Gesamtnavigation wurde ausschließlich mit dem MiDaS-Modell durchgeführt, da aus Zeitgründen die Anpassung der Schwellwerte T und r des Algorithmus \ref{alg:Hindernisvermeidung} nur mit dem MiDaS-Modell aufgrund der deutlich besseren Inferenzzeit möglich war. Für das PyDNet-Modell müssten die Schwellwerte aus Algorithmus \ref{alg:Hindernisvermeidung} empirisch neu eingestellt werden. Mit der Evaluierung der Hindernisvermeidung wird gleichzeitig auch die Gesamtnavigation evaluiert.
  875. \begin{table}[htbp]
  876. \centering
  877. \begin{tabularx}{\textwidth}{p{0.2\textwidth}|X|X|X|X}
  878. \hline
  879. \textbf{Modell} & \textbf{Technik} & \textbf{Modellgröße in Kilobyte (KB)} & \textbf{Device} & \textbf{Inferenzzeit in Millisekunden (ms)}\\
  880. \hline
  881. MiDaS & Unquantisiert & 64784 & GPU & 183\\
  882. \hline
  883. MiDaS & Unquantisiert & 64784 & CPU bei 4 Threads & 304\\
  884. \hline
  885. PyDNet & Unquantisiert & 7730 & GPU & 330\\
  886. \hline
  887. PyDNet & Unquantisiert & 7730 & CPU bei 4 Threads & 485\\
  888. \hline
  889. \end{tabularx}
  890. \caption{Inferenzzeiten der Depth Estimation}
  891. \label{tab:InferenzzeitDepthEstimation}
  892. \end{table}