{"id":42335,"date":"2023-06-07T16:06:45","date_gmt":"2023-06-07T14:06:45","guid":{"rendered":"https:\/\/www.inovex.de\/?p=42335"},"modified":"2024-04-24T11:40:49","modified_gmt":"2024-04-24T09:40:49","slug":"tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/","title":{"rendered":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen"},"content":{"rendered":"<p>Machine Learning Algorithmen findet man mittlerweile \u00fcberall: auf dem Smartphone, im Auto, auf Cloud-Servern, usw. Allerdings haben diese Algorithmen oft hohe Anforderungen an Rechenleistung und Speicherkapazit\u00e4t. Ist es m\u00f6glich, ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?<!--more--><\/p>\n<p>Die Anwendungsfelder f\u00fcr solche Algorithmen sind vielf\u00e4ltig, wie zum Beispiel Wearables, die Sensordaten on-board auswerten oder IoT-Setups mit geringer Bandbreite oder gar keiner Internetverbindung.<\/p>\n<p>Um diese Anwendungen zu erm\u00f6glichen, m\u00fcssen Machine Learning Modelle entwickelt werden, die so kompakt sind, dass sie auf einen Mikrocontroller mit wenigen MB Speicher passen und mit begrenzter Rechenleistung ausgef\u00fchrt werden k\u00f6nnen.<\/p>\n<p>In diesem Blog-Artikel beleuchten wir diese Problemstellung n\u00e4her und stellen die Herausforderungen sowie m\u00f6gliche L\u00f6sungswege anhand eines Showcases der TinyML-Technologie vor.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Was-ist-TinyML\" >Was ist TinyML?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Implementierung-eines-TinyML-Showcase\" >Implementierung eines TinyML-Showcase<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Aufbau-des-Projekts\" >Aufbau des Projekts<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Welche-TinyML-Frameworks-gibt-es\" >Welche TinyML-Frameworks gibt es?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Hardware-Auswahl\" >Hardware-Auswahl<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Aufbau-des-Teststands\" >Aufbau des Teststands<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Generierung-der-Trainingsdaten\" >Generierung der Trainingsdaten<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Erstellung-des-Datensatzes\" >Erstellung des Datensatzes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Analyse-des-Zaehlerstands\" >Analyse des Z\u00e4hlerstands<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Loesung-des-Computer-Vision-%E2%80%93-Tasks\" >L\u00f6sung des Computer Vision &#8211; Tasks<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Formulierung-des-ML-Problems\" >Formulierung des ML-Problems<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Aufteilung-in-Training-Validation-und-Test-Datensatz\" >Aufteilung in Training-, Validation- und Test-Datensatz<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Architektur-und-Beschreibung-des-Ausgangsmodell\" >Architektur und Beschreibung des Ausgangsmodell<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Performance-Evaluierung-des-urspruenglichen-CNN\" >Performance-Evaluierung des urspr\u00fcnglichen CNN<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Wie-verkleinert-man-ein-tiefes-neuronales-Netz\" >Wie verkleinert man ein tiefes neuronales Netz?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Pruning\" >Pruning<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Quantization\" >Quantization<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Knowledge-Distillation\" >Knowledge Distillation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Kernel-Optimierungen\" >Kernel Optimierungen<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Verkleinerung-des-Netzes-fuer-das-TinyMeter-Ergebnisse\" >Verkleinerung des Netzes f\u00fcr das TinyMeter: Ergebnisse<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#PerformanceLeistung-im-Vergleich\" >Performance\/Leistung im Vergleich<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Erkenntnis-und-finales-Modell\" >Erkenntnis und finales Modell<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#TinyMeter-Das-Gesamtsystem\" >TinyMeter: Das Gesamtsystem<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Firmware\" >Firmware<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Desktop-Anwendung\" >Desktop-Anwendung<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Finale-Performance-Evaluierung-des-TinyMeters\" >Finale Performance-Evaluierung des TinyMeters<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Testaufbau\" >Testaufbau<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Auswertung\" >Auswertung<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#Fazit\" >Fazit<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Was-ist-TinyML\"><\/span>Was ist TinyML?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Der Begriff TinyML (Tiny Machine Learning) ist nicht streng definiert. Die \u201etinyML Foundation\u201c umschreibt mit diesem Begriff ein \u201eschnell wachsendes Feld an Machine-Learning-Technologien und -Anwendungen einschlie\u00dflich Hardware, Algorithmen und Software, die in der Lage sind, mit sehr niedrigem Stromverbrauch on-device Sensordaten zu analysieren. Dies erm\u00f6glicht eine Reihe von always-on Use Cases und zielt auch auf akkubetriebene Ger\u00e4te ab.\u201c<br \/>\nEin TinyML-Projekt zeichnet sich ma\u00dfgeblich durch einen optimalen Kompromiss zwischen der Performance (Inferenzzeit und Genauigkeit der Vorhersagen) und der Gr\u00f6\u00dfe des Modells aus.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Implementierung-eines-TinyML-Showcase\"><\/span>Implementierung eines TinyML-Showcase<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Um die Herausforderungen eines TinyML-Projekts darzustellen, haben wir einen konkreten Showcase mit dem Projektnamen \u201eTinyMeter\u201c implementiert. Die Problemstellung beinhaltet, den Z\u00e4hlerstand eines analogen Wasserz\u00e4hlers anhand eines Kamerabilds zu ermitteln.\u00a0Dabei haben wir einen klassischen Ansatz des \u00fcberwachten Lernens verfolgt: ein gro\u00dfer Trainingsdatensatz mit vielen Bildern von unterschiedlichen Z\u00e4hlerst\u00e4nden und dem dazu passenden Wert des Z\u00e4hlerstands als Label wird verwendet, um ein Machine Learning Modell zu trainieren.<\/p>\n<p>Die Herausforderung ist es, das Machine Learning Modell so zu verkleinern und zu optimieren, dass es auf einem kleinen und vor allem g\u00fcnstigen Mikrocontroller ausgef\u00fchrt werden kann.\u00a0Da die Anwendung von neuronalen Netzen f\u00fcr unsere Problemstellung aus dem Bereich Computer Vision pr\u00e4destiniert ist, stellen wir die Herausforderungen eines TinyML-Projekt im Folgenden spezifisch anhand von neuronalen Netzen dar.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Aufbau-des-Projekts\"><\/span>Aufbau des Projekts<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<figure id=\"attachment_42408\" aria-describedby=\"caption-attachment-42408\" style=\"width: 883px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/TinyML_Projektablauf-1.svg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42408\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/TinyML_Projektablauf-1.svg\" alt=\"\" width=\"883\" height=\"169\" \/><\/a><figcaption id=\"caption-attachment-42408\" class=\"wp-caption-text\">Abb. 1 Projektablauf<\/figcaption><\/figure>\n<p>TinyML ist eine interdisziplin\u00e4re Thematik, daher muss man die Anforderungen aus zwei Perspektiven zu betrachten: Machine Learning und Hardware\/Embedded.<\/p>\n<p>Eine Anforderung an die Hardware ist zum Beispiel, dass sie klein und g\u00fcnstig ist. Daraus folgt, dass nur begrenzte Rechenleistung und Speicherkapazit\u00e4t zur Verf\u00fcgung stehen. Andererseits muss die Hardware aber auch die g\u00e4ngigen ML-Frameworks unterst\u00fctzen und \u00fcber gen\u00fcgend Speicher (Arbeits- &amp; Flash-Speicher) verf\u00fcgen, damit das neuronale Netz tats\u00e4chlich ausgef\u00fchrt werden kann. F\u00fcr das neuronale Netz musste trotz geringer Gr\u00f6\u00dfe eine gewisse Komplexit\u00e4t erhalten bleiben.<\/p>\n<p>Mit diesen Anforderungen im Hinterkopf haben wir die Hardware und das ML-Framework, wie im Folgenden beschrieben wird, f\u00fcr unseren Showcase ausgew\u00e4hlt. Im weiteren Verlauf des Artikels stellen wir den Aufbau unseres Teststands f\u00fcr den Showcase dar und wie wir damit geeignete Datens\u00e4tze zur Entwicklung unserer Machine-Learning-Modelle generiert haben. In der zweiten H\u00e4lfte des Artikels geben wir eine \u00dcbersicht \u00fcber Methoden zur Verkleinerung von neuronalen Netzen und wenden diese Methoden auf unsere Problemstellung an. Schlie\u00dflich beschreiben und bewerten wir das Gesamtsystem und diskutieren die wesentlichen Erkenntnisse aus unserer Showcase-Implementierung.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Welche-TinyML-Frameworks-gibt-es\"><\/span>Welche TinyML-Frameworks gibt es?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>TinyML ist ein junges Thema und dementsprechend ist die Auswahl an verf\u00fcgbaren Frameworks klein. Nennenswert sind eigentlich nur drei: PyTorch Mobile, Edge Impulse und TensorFlow Lite.<\/p>\n<p><strong>PyTorch Mobile<\/strong> ist auf mobile Endger\u00e4te ausgelegt und deswegen gibt es keine dedizierte Bibliothek f\u00fcr Mikrocontroller.<\/p>\n<p><strong>Edge Impulse<\/strong> erm\u00f6glicht eine einfache und intuitive M\u00f6glichkeit, neuronale Netze zu trainieren und zu implementieren. Die vereinfachte Bedienung kommt aber zu einem Preis, denn man ist auf die Nutzung der Weboberfl\u00e4che von Edge Impulse beschr\u00e4nkt und schreibt eigentlich keinen eigenen Code. Eines der Hauptziele des Projekts ist es, die Herausforderungen jedes einzelnen Schrittes in einem TinyML-Projekt in Erfahrung zu bringen. Edge Impulse vereinfacht viele dieser Schritte und nimmt somit Erfahrungen vorweg, die wir selber machen wollen. Aus diesem Grund haben wir uns gegen Edge Impulse entschieden.<\/p>\n<p><strong>TensorFlow Lite<\/strong> ist eine kompakte Version von TensorFlow, das die Implementierung von neuronalen Netzen auf mobilen Endger\u00e4ten, Mikrocontrollern und anderen Edge-Ger\u00e4ten erm\u00f6glicht. Als etablierte Plattform kann TensorFlow neben einer sehr guten Dokumentation und vielen Code-Beispielen vor allem dadurch punkten, dass es man neuronale Netze in kompaktere TensorFlow-Lite-Netze (.tflite Files) umwandeln kann. TensorFlow Lite bietet eine Erweiterung namens TF-Lite-Micro, die die Ausf\u00fchrung der TF-Lite Netze auf Mikrocontrollern erm\u00f6glicht. Dazu werden die .tflite-Files in C-Byte Array umgewandelt, die in den Firmware Code des Microcontrollers eingebunden werden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Hardware-Auswahl\"><\/span>Hardware-Auswahl<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Die erste Herausforderung eines TinyML-Projekts ist die Auswahl einer geeigneten Hardware-Plattform. Bei der Auswahl f\u00fcr den Showcase sind mehrere Anforderungen relevant: unter anderem die Kompatibilit\u00e4t mit TensorFlow Lite, ausreichend Speicher, und die Kompatibilit\u00e4t mit Kamera-Modulen. F\u00fcr den Showcase w\u00e4hlen wir dar\u00fcber hinaus gezielt Hardware, die tats\u00e4chlich \u201etiny\u201c ist, das hei\u00dft, sehr eingeschr\u00e4nkt in Speicher und Rechenleistung und vor allem g\u00fcnstig ist \u2013 in unserem Fall unter 30 Euro.<\/p>\n<figure id=\"attachment_42410\" aria-describedby=\"caption-attachment-42410\" style=\"width: 300px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-42410\" style=\"background: transparent;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-300x300.webp\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-300x300.webp 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-150x150.webp 150w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-768x768.webp 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-400x400.webp 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-650x650.webp 650w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32-360x360.webp 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/ESP-EYE-ESP32.webp 1000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption id=\"caption-attachment-42410\" class=\"wp-caption-text\">Abb. 2: ESP-EYE<\/figcaption><\/figure>\n<p>Auf dem Markt gibt es mittlerweile viele Mikrocontroller, die diesen Anforderungen gr\u00f6\u00dftenteils gen\u00fcgen, wie zum Beispiel Mikrocontroller aus dem Arduino Umfeld, die ESP Modelle von Espressif oder verschiedene Mikrocontroller von STM, und weiteren Herstellern.\u00a0F\u00fcr unseren Showcase nutzen wir das ESP-EYE Board von Espressif mit einem ESP32 Chip, einem Kameramodul, 8,5 MB Arbeitsspeicher und 4 MB Flash-Speicher. Dieser Mikrocontroller hat mehrere Vorteile; unter anderem ein bereits verbautes Kameramodul und externen SPI RAM. Au\u00dferdem ist er g\u00fcnstig und das hauseigene Framework ESP-IDF von Espressif liefert Funktionalit\u00e4ten wie Kameratreiber sowie viel Beispiel-Code.<\/p>\n<p>Der Vergleich zwischen einem Raspberry Pi 3 B und dem ESP-EYE in Tab. 1 verdeutlicht, dass der ESP-EYE tats\u00e4chlich \u201etiny\u201c ist:<\/p>\n<table border=\"1\">\n<caption>Tab. 1: Vergleich ESP-EYE &amp; Raspberry Pi<\/caption>\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">ESP-EYE<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">Raspberry Pi 3 B<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">RAM \/ Flash<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">8,5 MB \/ 4 MB<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">1 GB \/ je nach SD-Karte<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">Prozessor<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">32 Bit \/ 2 Kerne \/ 240 MHz<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">64 Bit \/ 4 Kerne \/ 1.2GHz<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">Preis (1\/2023)<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">~ 25 \u20ac<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">~ 60 \u20ac<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">Gewicht<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">20 g\u00a0<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">42 g<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>F\u00fcr den Showcase haben wir bewusst einen Wasserz\u00e4hler mit einfachem Aufbau (Modell: Kaltwasserz\u00e4hler 3\/4&#8243; von KNM) gew\u00e4hlt, der es uns erm\u00f6glicht den Z\u00e4hlerstand leicht zu manipulieren, was unerl\u00e4sslich ist, um einen Trainingsdatensatz zu erstellen<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Aufbau-des-Teststands\"><\/span>Aufbau des Teststands<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Um gro\u00dfe Trainings- und Testdatens\u00e4tze zu erstellen, ist es unerl\u00e4sslich, eine m\u00f6glichst automatisierte Methode zu entwickeln, mit der schnell und einfach eine gro\u00dfe Menge an unterschiedlichen Z\u00e4hlerst\u00e4nden generiert werden kann.<\/p>\n<figure id=\"attachment_42412\" aria-describedby=\"caption-attachment-42412\" style=\"width: 238px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42412\" style=\"background: transparent;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-745x1024.png\" alt=\"\" width=\"238\" height=\"327\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-745x1024.png 745w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-218x300.png 218w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-768x1056.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-1118x1536.png 1118w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-1490x2048.png 1490w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-400x550.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand-360x495.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/Teststand.png 1501w\" sizes=\"auto, (max-width: 238px) 100vw, 238px\" \/><figcaption id=\"caption-attachment-42412\" class=\"wp-caption-text\">Abb. 3: Teststand<\/figcaption><\/figure>\n<p>Der Wasserz\u00e4hler (in Abb. 3) besteht aus zwei Einheiten, dem unteren Teil, der an die Wasserleitung angeschlossen wird, und dem oberen Teil, dem Z\u00e4hlwerk. Im unteren Teil befindet sich eine Turbine, die vom Wasser angetrieben wird und die Rotationsbewegung mit einem Magnet an einen weiteren Magneten im Z\u00e4hlwerk \u00fcbertr\u00e4gt. So k\u00f6nnen beide Teile wasserdicht getrennt werden. Diese Eigenschaft machen wir uns zunutze, um den Z\u00e4hlerstand zu manipulieren. Die Rotation der Turbine wird durch einen Magneten simuliert, der an dem Schaft eines DC-Motors befestigt wird. Mit Hilfe eines 3D-gedruckten Geh\u00e4uses f\u00fcr den DC-Motor und das Z\u00e4hlwerk werden beide Komponenten im richtigen Abstand und Ausrichtung zueinander gehalten.<\/p>\n<p>Eine weitere 3D-gedruckte Halterung erlaubt die Befestigung des ESP Boards vor dem Z\u00e4hlwerk, so dass die Kamera auf den Z\u00e4hlerstand ausgerichtet ist. Diese Halterung wird nur f\u00fcr einen Teil der Aufnahmen genutzt, sodass Datens\u00e4tze mit unterschiedlichen Rahmenbedingungen erstellt werden k\u00f6nnen. Zum Beispiel haben wir den Abstand und die Ausrichtung der Kamera gegen\u00fcber dem Z\u00e4hler und die Beleuchtung variiert. Folglich weisen die Bilder in den Trainingsdatens\u00e4tzen schon nach der Erstellung eine gewisse Vielfalt auf, was f\u00fcr eine robuste Performanz des neuronalen Netzes wichtig ist.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Generierung-der-Trainingsdaten\"><\/span>Generierung der Trainingsdaten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Erstellung-des-Datensatzes\"><\/span>Erstellung des Datensatzes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Mit dem Teststand ist es m\u00f6glich, schnell einen gro\u00dfen Datensatz an Bildern mit unterschiedlichen Z\u00e4hlerst\u00e4nden zu erstellen. Dabei gehen wir wie folgt vor:<\/p>\n<ol>\n<li>Der DC-Motor wird mit Spannung versorgt (2V-2.5V, sonst dreht der Z\u00e4hlerstand zu schnell hoch).<\/li>\n<li>Ein Python-Skript schickt in regelm\u00e4\u00dfigen Abst\u00e4nden HTTP-GET Requests an den Webserver, der auf dem ESP l\u00e4uft.<\/li>\n<li>Der ESP antwortet mit einem Bild des aktuellen Z\u00e4hlerstands mit einem Zeitstempel als Dateiname.<\/li>\n<li>Es wird ein gro\u00dfer Datensatz mit \u00fcber 1000 Bildern erstellt.<\/li>\n<li>Im Nachgang wird jedes 50. Bild des Datensatzes manuell mit einem Label (hier der Z\u00e4hlerstand) versehen.<\/li>\n<li>Die Label der restlichen Bilder werden mit Hilfe dieser manuell gelabelten St\u00fctzstellen und dem Zeitstempel interpoliert.<\/li>\n<\/ol>\n<p>Mit dieser Methode haben wir viele unterschiedliche Datens\u00e4tze erstellt, mit unterschiedlicher Beleuchtung, Ausrichtung und Aufl\u00f6sung.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Analyse-des-Zaehlerstands\"><\/span>Analyse des Z\u00e4hlerstands<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Der erste Datensatz mit ca. 1000 Bildern wurde in der Aufl\u00f6sung 320&#215;240 und in Farbe aufgenommen. Sp\u00e4ter haben wir herausgefunden, dass es vorteilhaft ist, den Datensatz in Graut\u00f6nen zu erstellen. Durch den Wechsel von Farb- zu Graustufenbildern kann gleichzeitig die Gr\u00f6\u00dfe des neuronalen Netzes reduziert und insbesondere durch die gesparte Laufzeit die Aufl\u00f6sung der Bilder auf das Doppelte erh\u00f6ht werden (640&#215;480).<br \/>\nIn Abb. 4 ist ein Beispiel einer Aufnahme eines Z\u00e4hlerstands dargestellt.<\/p>\n<figure id=\"attachment_42414\" aria-describedby=\"caption-attachment-42414\" style=\"width: 399px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-42414\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Aufnahme_Zaehlerstand-300x225.jpg\" alt=\"\" width=\"399\" height=\"299\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Aufnahme_Zaehlerstand-300x225.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Aufnahme_Zaehlerstand-400x300.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Aufnahme_Zaehlerstand-360x270.jpg 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/Aufnahme_Zaehlerstand.jpg 640w\" sizes=\"auto, (max-width: 399px) 100vw, 399px\" \/><figcaption id=\"caption-attachment-42414\" class=\"wp-caption-text\">Abb. 4: Z\u00e4hlerstand Beispiel<\/figcaption><\/figure>\n<p>Der Z\u00e4hlerstand in Kubikmeter wird durch 8 Ziffern dargestellt, von denen 5 der Vorkommastelle entsprechen und 3 der Nachkommastelle. Die vierte Nachkommastelle wird durch eine rotierende Scheibe dargestellt, diese wurde im Showcase jedoch au\u00dfen vor gelassen, da die Bestimmung dieser Nachkommastelle wenig Mehrwert bringt und aufgrund der anderen Darstellung im Vergleich zu den \u00fcbrigen Ziffern die Komplexit\u00e4t des Problems deutlich erh\u00f6ht h\u00e4tte. Wie man in Abb. 4 erkennen kann, entsteht bei der Bestimmung der dritten Nachkommastelle ein weiteres Problem: die kontinuierliche Bewegung der Zahl erzeugt Zust\u00e4nde, die zwischen zwei Ziffern liegen. Die anderen Zahlen bewegen sich nicht kontinuierlich, sondern springen direkt auf die n\u00e4chste volle Zahl um.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Loesung-des-Computer-Vision-%E2%80%93-Tasks\"><\/span>L\u00f6sung des Computer Vision &#8211; Tasks<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Formulierung-des-ML-Problems\"><\/span>Formulierung des ML-Problems<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Bei der Erkennung von Zahlen oder Text auf Bildern handelt es sich um eine klassische Problemstellung f\u00fcr \u00fcberwachtes Lernen. Das Erkennen des analogen Z\u00e4hlerstands l\u00e4sst sich herunterbrechen auf das Erkennen der einzelnen Ziffern. Nun handelt es sich lediglich um ein Klassifikationsproblem, das f\u00fcr jede einzelne Ziffer gel\u00f6st und zu dem gesamten Z\u00e4hlerstand zusammengef\u00fcgt werden muss.<\/p>\n<p>Um dieses Klassifikationsproblem zu l\u00f6sen, trainieren wir ein neuronales Netz, das die folgenden Ein- und Ausgabe hat:<\/p>\n<ul>\n<li>Eingabe: Ausschnitt einer Ziffer in Grauwerten.<\/li>\n<li>Ausgabe: Wert f\u00fcr Wahrscheinlichkeit, dass das Eingangsbild Ziffer (0-9) darstellt. Die Summe dieser Werte ergibt immer 100.<\/li>\n<\/ul>\n<p>Als Klassifikationsergebnis wird die Ziffer gew\u00e4hlt, f\u00fcr die die Wahrscheinlichkeit am h\u00f6chsten ist. Dieser Vorgang wird f\u00fcr alle Ziffern durchgef\u00fchrt und die Ergebnisse werden anschlie\u00dfend zu einem Z\u00e4hlerstand zusammengef\u00fcgt.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Aufteilung-in-Training-Validation-und-Test-Datensatz\"><\/span>Aufteilung in Training-, Validation- und Test-Datensatz<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Aus den Bildern des kompletten Wasserz\u00e4hlerstandes k\u00f6nnen die einzelnen Ziffern anhand der Bildkoordinaten ausgeschnitten werden, die zur Vereinfachung am Anfang einmal manuell bestimmt werden. So muss das Modell sp\u00e4ter nur eine Klassifikation einer einzelnen Ziffer ausf\u00fchren. Dadurch entstehen 10 Klassen (0-9), die durch die f\u00fchrenden Nullen stark unbalanciert sind, d.h. es gibt viel mehr Nullen als andere Ziffern. Da unbalancierte Datens\u00e4tze zu einem schlechten Klassifikator f\u00fchren, werden die Klassen durch Over- und Undersampling balanciert. Dadurch wird sichergestellt, dass die Klassen nahezu gleich verteilt\u00a0sind.<\/p>\n<p>Die Daten werden anschlie\u00dfend in jeweils ein Trainings-, Validations- und Test-Set aufgeteilt, entsprechend mit einem 70\/20\/10-prozentigen Anteil. Um eine robustere Performance des neuronalen Netzes zu erreichen, bietet es sich an, die Vielfalt der Daten k\u00fcnstlich zu erh\u00f6hen. Die Trainings-, Validierungs- und Testdatens\u00e4tze lassen sich durch <a href=\"https:\/\/journalofbigdata.springeropen.com\/articles\/10.1186\/s40537-019-0197-0\" target=\"_blank\" rel=\"noopener\">Data Augmentation<\/a> erweitern. Daf\u00fcr werden die Helligkeit, Rotation, Sch\u00e4rfe und der Kontrast variiert. Da jedes Bild mit dem Z\u00e4hlerstand als Label versehen ist, kann auch jeder einzelnen Ziffer das richtige Label zugeordnet werden. So k\u00f6nnen die Datens\u00e4tze umgewandelt werden und zu einer Sammlung an Aufnahmen von einzelnen Ziffern und dem dazugeh\u00f6rigen Label umgewandelt werden. Mit diesen Datens\u00e4tzen kann nun das neuronale Netz trainiert werden.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Architektur-und-Beschreibung-des-Ausgangsmodell\"><\/span>Architektur und Beschreibung des Ausgangsmodell<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die Basis unseres Convolutional Neural Networks (CNN) stammt aus den <a href=\"https:\/\/keras.io\/examples\/vision\/mnist_convnet\/\" target=\"_blank\" rel=\"noopener\">Beispielen<\/a> zur L\u00f6sung des MNIST-Datensatzes. Dieses wird mittels Hyperparameter-Tuning optimiert, wobei die Zielfunktion des Tunings aus der Anzahl an Parametern des Netzes und der Accuracy besteht, die mit dem Netz erreicht wird. Dadurch werden Hyperparameter selektiert, die zu einem besonders schlanken und effektiven Netz f\u00fchren. Mit diesen ermittelten Werten wird das Netz in Abbildung 5 erzeugt: Das Eingangsbild wird durch zwei <a href=\"https:\/\/paperswithcode.com\/method\/convolution\" target=\"_blank\" rel=\"noopener\">Convolutional<\/a> Layer verarbeitet, bestehend aus <a href=\"https:\/\/paperswithcode.com\/method\/batch-normalization\" target=\"_blank\" rel=\"noopener\">Batch Normalization<\/a>, Faltung und <a href=\"https:\/\/paperswithcode.com\/method\/max-pooling#:~:text=Max%20Pooling%20is%20a%20pooling,used%20after%20a%20convolutional%20layer.\" target=\"_blank\" rel=\"noopener\">Max Pooling<\/a>. Vor dem Flatten Layer (Reduktion der Dimension) werden die Tensoren nochmals mit der Batch-Normalization normalisiert und anschlie\u00dfend wird die Klasse im finalen Output Layer ermittelt.<\/p>\n<figure id=\"attachment_42766\" aria-describedby=\"caption-attachment-42766\" style=\"width: 196px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42766 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/OriginalModell.png\" alt=\"Graphische Darstellung des Ausgangsmodell\" width=\"196\" height=\"878\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/OriginalModell.png 196w, https:\/\/www.inovex.de\/wp-content\/uploads\/OriginalModell-67x300.png 67w\" sizes=\"auto, (max-width: 196px) 100vw, 196px\" \/><figcaption id=\"caption-attachment-42766\" class=\"wp-caption-text\">Abb. 5: Graphische Darstellung des Ausgangsmodell<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"Performance-Evaluierung-des-urspruenglichen-CNN\"><\/span>Performance-Evaluierung des urspr\u00fcnglichen CNN<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Um Vergleichswerte f\u00fcr die sp\u00e4tere Evaluierung der Leistung des Netzes auf dem Mikrokontroller zu bestimmen, evaluieren wir das oben dargestellte Netz auf einem Entwicklersystem. Auf einem Macbook Pro 2018 ben\u00f6tigt dieses Ausgangsmodell f\u00fcr die Klassifikation einer Ziffer ~52 ms. Im Schnitt liegt die balancierte Accuracy des Modells bei 98,8 % \u2013 f\u00fcr unseren Showcase ausreichend. Das Ausgangsmodell ist hierbei mit 2,5 MB so gro\u00df, dass es nicht vom ESP geladen werden kann. Deswegen liegen nur die gemessenen Inferenzzeiten auf der Entwicklungsmaschine vor. Die Ergebnisse sind in Tab. 2 nochmals zusammengefasst.<\/span><\/p>\n<table border=\"1\">\n<caption>Tab. 2: Performance des Ausgangsmodells<\/caption>\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"width: 106.312px; height: 21px; text-align: center;\" colspan=\"2\" rowspan=\"1\">\n<div>Tensorflow 2<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 21px;\">\n<td style=\"width: 106.312px; height: 21px; text-align: center;\">\u00a0Inferenz Zeit<\/td>\n<td style=\"width: 132.688px; height: 21px; text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>52,68 ms<\/div>\n<\/td>\n<\/tr>\n<tr style=\"height: 21px;\">\n<td style=\"width: 106.312px; height: 21px; text-align: center;\">\u00a0Accuracy<\/td>\n<td style=\"width: 132.688px; height: 21px; text-align: center;\">98,80 %<\/td>\n<\/tr>\n<tr style=\"height: 21px;\">\n<td style=\"width: 106.312px; height: 21px; text-align: center;\">Gr\u00f6\u00dfe<\/td>\n<td style=\"width: 132.688px; height: 21px; text-align: center;\">2.588 KB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span class=\"ez-toc-section\" id=\"Wie-verkleinert-man-ein-tiefes-neuronales-Netz\"><\/span>Wie verkleinert man ein tiefes neuronales Netz?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Das oben beschriebene Ausgangsmodell muss verkleinert werden, um es auf dem Zielsystem, hier dem ESP, lauff\u00e4hig zu machen, m\u00f6glichst ohne dabei die Accuracy der Ergebnisse zu kompromittieren. Es gibt verschiedene Verfahren, um neuronale Netze in dieser Hinsicht zu optimieren. Einen Teil dieser Optimierungsm\u00f6glichkeiten stellen wir im Folgenden vor <\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Pruning\"><\/span>Pruning<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Beim\u00a0<a href=\"https:\/\/www.tensorflow.org\/model_optimization\/guide\/pruning\" target=\"_blank\" rel=\"noopener\">Pruning<\/a> (dt. Beschneidung) werden die Gewichtsmatrizen des neuronalen Netzes w\u00e4hrend des Trainings nach und nach auf Null gesetzt, um eine sogenannte \u201csparse matrix\u201c (dt. <\/span><span style=\"font-weight: 400;\">d\u00fcnnbesetzte<\/span><span style=\"font-weight: 400;\"> Matrix) zu erhalten. Die resultierende <\/span><span style=\"font-weight: 400;\">d\u00fcnnbesetzte<\/span><span style=\"font-weight: 400;\"> Matrix l\u00e4sst sich effizient komprimieren und die Inferenzzeit des Netzes wird verbessert, da Multiplikationen mit 0 ignoriert werden k\u00f6nnen. In unseren Experimenten best\u00e4tigt sich, dass sich\u00a0<\/span><span style=\"font-weight: 400;\">d\u00fcnnbesetzte <\/span><span style=\"font-weight: 400;\">Modelle deutlich effizienter komprimieren lassen. Das bringt zwar Vorteile bei der \u00dcbertragung und Persistierung der Modelle, aber aufgrund einer Limitierung des TFLite Frameworks \u2013 es unterst\u00fctzt noch kein sogenanntes Structural Pruning \u2013 werden die 0-Operationen nicht ignoriert. Zudem erreicht das komprimierte Modell nach dem Entpacken wieder seine urspr\u00fcngliche Gr\u00f6\u00dfe. Folglich setzen wir f\u00fcr unsere Zwecke kein Pruning ein, da sich f\u00fcr uns kein sichtbarer Vorteil erschlie\u00dfen l\u00e4sst.<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Quantization\"><\/span>Quantization<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Bei der <a href=\"https:\/\/leimao.github.io\/article\/Neural-Networks-Quantization\/\" target=\"_blank\" rel=\"noopener\">Quantisierung<\/a> werden kostenintensive Floating Point Operationen durch g\u00fcnstigere Integer Operationen ersetzt. Dadurch reduziert sich der Speicherbedarf des Netzes und die Latenz zur Inferenz. Ein Modell l\u00e4sst sich sowohl nach dem Training quantisieren, Post-Training Quantization (kurz PTQ) als auch w\u00e4hrend des Trainings, Quantization-Aware Training (kurz QAT). Beide Methoden sind mit Verlust der Performance behaftet, wobei QAT laut Literatur den geringeren Verlust vorweisen soll. Daf\u00fcr lassen sich mit PTQ bereits trainierte Modelle einfach konvertieren. Bei unseren Vorab-Experimenten erwies sich der Unterschied des Verlusts zwischen PYQ und QAT als geringf\u00fcgig (0,02 %), wodurch wir uns f\u00fcr PTQ entschieden haben, da wir hiermit sowohl ein quantisiertes als auch ein nicht-quantisiertes Modell erhalten. Quantisierung ist bei unserem Showcase eine der wichtigsten Optimierungen, da bei der Initialisierung der Tensoren auf dem Mikrocontroller 8-Bit-Integer anstatt 32-Bit-Floats allokiert werden, was mit einem deutlich geringerem Speicherverbrauch einhergeht.\u00a0<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Knowledge-Distillation\"><\/span>Knowledge Distillation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/neptune.ai\/blog\/knowledge-distillation\" target=\"_blank\" rel=\"noopener\">Knowledge Distillation<\/a> ist eine Form der Komprimierung, bei der das Wissen eines sogenannten Teacher-Modells auf einen Student \u00fcbertragen werden kann. Diese Methode wird h\u00e4ufig bei gro\u00dfen, komplexen neuronalen Netzen angewendet, bei denen ein Modell zu gro\u00df f\u00fcr die Anwendung ist. Stattdessen kann das Modell als Teacher genutzt werden, um das gelernte Wissen auf einen kleineren Student zu transferieren. Diese Technik ist f\u00fcr unseren Showcase besonders interessant, da der verf\u00fcgbare Speicher auf dem Mikrocontroller begrenzt ist. Wir nutzen sogenannte Response-based Knowledge Distillation, bei welcher der Student versucht, die Vorhersagen des Teachers nachzuahmen, indem \u00fcber den sogenannten \u201edistillation loss\u201c der Fehler zwischen den Logits des Studenten und des Teachers minimiert wird.<\/span><\/p>\n<figure id=\"attachment_42637\" aria-describedby=\"caption-attachment-42637\" style=\"width: 710px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42637\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3.webp\" alt=\"Grafische Darstellung Knowledge Distillation\" width=\"710\" height=\"259\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3.webp 1213w, https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3-300x110.webp 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3-1024x374.webp 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3-768x280.webp 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3-400x146.webp 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Knowledge-Distillation_3-360x131.webp 360w\" sizes=\"auto, (max-width: 710px) 100vw, 710px\" \/><figcaption id=\"caption-attachment-42637\" class=\"wp-caption-text\">Abb. 5: Grafische Darstellung Knowledge Distillation<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Dadurch lernt der Student die gleichen Vorhersagen wie der Teacher zu treffen. In unseren Experimenten konnten wir dadurch Studenten trainieren, die teilweise nur 25 % der Teacher Model Gr\u00f6\u00dfe besitzen. Dies verringert sowohl die Laufzeit f\u00fcr die Inferenz als auch den ben\u00f6tigten Speicher. Die Komprimierung ist nat\u00fcrlich verlustbehaftet, was sich bei uns mit einem Verlust von ~0,4 % (Balanced Accuracy) bemerkbar macht. Mehr Details zum Thema Knowledge Distillation gibt es im Blogeintrag <\/span><a href=\"https:\/\/www.inovex.de\/de\/blog\/greater-than-the-sum-of-its-parts-a-critical-analysis-of-online-distillation\/\"><span style=\"font-weight: 400;\">Deep Mutual Learning: A Critical Analysis of Online Distillation<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Kernel-Optimierungen\"><\/span>Kernel Optimierungen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Neben der Optimierung der Hyperparameter der Netze kann auch die Ausf\u00fchrung der Modelle optimiert werden. Hierf\u00fcr kann die Implementierung von Tensorflow Micro bestimmte Operationen durch f\u00fcr die Hardware optimierte Operationen ersetzen, die teilweise in Assembler geschrieben sind. F\u00fcr unseren Showcase nutzen wir die von Google Developers entwickelten <\/span><a href=\"https:\/\/github.com\/espressif\/esp-nn\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Kernel-Optimierungen<\/span><\/a><span style=\"font-weight: 400;\">, die beim kompilieren der Firmware eingebettet werden.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Verkleinerung-des-Netzes-fuer-das-TinyMeter-Ergebnisse\"><\/span>Verkleinerung des Netzes f\u00fcr das TinyMeter: Ergebnisse<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"PerformanceLeistung-im-Vergleich\"><\/span>Performance\/Leistung im Vergleich<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Wie im vorherigen Kapitel erw\u00e4hnt, ist das Ausgangsmodell zu gro\u00df, um es auf den ESP laden zu k\u00f6nnen. Die beschriebenen Optimierungen sind daher notwendig, um das Modell auf dem ESP ausf\u00fchren zu k\u00f6nnen. In Tab. 3 werden die Auswirkungen der Optimierungsschritte dargestellt. Die Tabelle enth\u00e4lt zur \u00dcbersicht nur die wichtigsten Daten. Die nicht quantisierten Modelle konnten nicht auf den ESP geladen und ausgef\u00fchrt werden, deshalb sind diese nicht aufgef\u00fchrt. Auch ist die quantisierte Tensorflow-2-Version f\u00fcr uns nicht interessant. Die Tensorflow 2- und Lite-Modelle wurden auf einem Macbook Pro 2018 ausgef\u00fchrt.<\/span><\/p>\n<table style=\"height: 412px;\" border=\"1\" width=\"1960\">\n<caption>Tab. 3: Vergleichstabelle der verschiedenen Techniken<\/caption>\n<tbody>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Framework<\/td>\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Tensorflow Micro (ESP32s3)<\/td>\n<td style=\"text-align: center;\" colspan=\"4\" rowspan=\"1\">Tensorflow Lite<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">Tensorflow 2<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Quantisiert<\/td>\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">\u2716\ufe0e<\/td>\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">\u2716\ufe0e<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Knowledge Distillation<\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2716\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2716\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2716\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2716\ufe0e<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Optimierte Inferenz (ms)<\/td>\n<td style=\"text-align: center;\">225,43<\/td>\n<td style=\"text-align: center;\">386,43<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>6,39<\/div>\n<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>17,36<\/div>\n<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>0,58<\/div>\n<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>0,74<\/div>\n<\/td>\n<td style=\"text-align: center;\" colspan=\"1\" rowspan=\"1\">\n<div>52,68<\/div>\n<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Inferenz (ms)<\/td>\n<td style=\"text-align: center;\">914,45<\/td>\n<td style=\"text-align: center;\">2355,3<\/td>\n<td style=\"text-align: center;\">&#8212;<\/td>\n<td style=\"text-align: center;\">&#8212;<\/td>\n<td style=\"text-align: center;\">&#8212;<\/td>\n<td style=\"text-align: center;\">&#8212;<\/td>\n<td style=\"text-align: center;\">&#8212;<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Accuracy (%)<\/td>\n<td style=\"text-align: center;\">98,50<\/td>\n<td style=\"text-align: center;\">98,70<\/td>\n<td style=\"text-align: center;\">98,50<\/td>\n<td style=\"text-align: center;\">98,70<\/td>\n<td style=\"text-align: center;\">98,39<\/td>\n<td style=\"text-align: center;\">98,80<\/td>\n<td style=\"text-align: center;\">98,80<\/td>\n<\/tr>\n<tr style=\"text-align: center;\">\n<td style=\"text-align: center;\" colspan=\"2\" rowspan=\"1\">Gr\u00f6\u00dfe (KB)<\/td>\n<td style=\"text-align: center;\">54<\/td>\n<td style=\"text-align: center;\">192<\/td>\n<td style=\"text-align: center;\">54<\/td>\n<td style=\"text-align: center;\">192<\/td>\n<td style=\"text-align: center;\">192<\/td>\n<td style=\"text-align: center;\">744<\/td>\n<td style=\"text-align: center;\">2.588<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<figure id=\"attachment_42645\" aria-describedby=\"caption-attachment-42645\" style=\"width: 319px\" class=\"wp-caption alignright\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42645\" style=\"color: #505d6d;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/model-e1677140177949.png\" alt=\"Grafische Darstellung der Modelle und ihrer Parameter\" width=\"319\" height=\"529\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/model-e1677140177949.png 579w, https:\/\/www.inovex.de\/wp-content\/uploads\/model-e1677140177949-181x300.png 181w, https:\/\/www.inovex.de\/wp-content\/uploads\/model-e1677140177949-400x663.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/model-e1677140177949-360x597.png 360w\" sizes=\"auto, (max-width: 319px) 100vw, 319px\" \/><figcaption id=\"caption-attachment-42645\" class=\"wp-caption-text\">Abb. 6: Grafische Darstellung der Modelle und ihrer Parameter<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Zusammenfassend l\u00e4sst sich sagen, dass die Optimierungen unserer Modelle die Gr\u00f6\u00dfe von 2.588 KB auf 54 KB reduzieren. Der Performanceverlust ist mit ~0,3 % Accuracy, gemessen an der Reduktion des Speicherbedarfs, bemerkenswert gering. Dies ist aber h\u00f6chstwahrscheinlich spezifisch f\u00fcr unsere Problemstellung und nicht direkt generalisierbar. In unserem Fall kann Knowledge Distillation die Gr\u00f6\u00dfe des Netzes um ~25 % reduzieren. Die genutzten Kernel-Optimierungen haben jeweils einen gro\u00dfen Effekt auf quantisierten Netzen.\u00a0<\/span><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Erkenntnis-und-finales-Modell\"><\/span>Erkenntnis und finales Modell<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Der Grund hierbei ist, dass nach dem Aufruf der Aktivierungsfunktion der Output nochmals quantisiert werden muss. Die Kernel-Optimierungen verbessern diesen Schritt, wodurch die Quantisierung erst ihre volle St\u00e4rke zeigt. Tab. 3 zeigt die Laufzeiten f\u00fcr TF Lite, TF Micro und TF2 . In diesem Fall k\u00f6nnen nur die quantisierten Modelle auf den ESP geladen werden, da die Modelle sonst zu gro\u00df sind. <\/span><span style=\"font-weight: 400;\">Abb. 6 vergleicht schematisch den Aufbau des Ausgangsmodells und des optimierten Modells. Die Gr\u00f6\u00dfen der Fully Connected Layer und der Convolutional Layer wurden bei der Knowledge Distillation jeweils halbiert. Insgesamt l\u00e4sst sich zusammenfassend sagen, dass wir die Modellgr\u00f6\u00dfe bei nur geringen Performance-Verlusten stark reduzieren konnten.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"TinyMeter-Das-Gesamtsystem\"><\/span>TinyMeter: Das Gesamtsystem<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Das hinsichtlich der Gr\u00f6\u00dfe optimierte Modell ist, wie oben dargestellt, klein genug, um auf dem ESP-EYE ausgef\u00fchrt zu werden. Um den Showcase zu vervollst\u00e4ndigen und das Modell final zu bewerten, wird das Modell in eine Gesamtapplikation eingebettet. Das Modell besteht dabei lediglich aus einem Array aus Hexadezimal-Werten, das als Variable von der Firmware eingebunden werden kann, die auf dem ESP-EYE l\u00e4uft. Dar\u00fcber hinaus gibt es eine Desktop-Anwendung, \u00fcber die das System konfiguriert und Z\u00e4hlerst\u00e4nde ausgelesen werden k\u00f6nnen. Die Funktionalit\u00e4t der einzelnen Komponenten wird im Folgenden n\u00e4her beschrieben.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Firmware\"><\/span>Firmware<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die Firmware auf dem ESP-EYE implementiert folgende Funktionalit\u00e4ten:<\/p>\n<ol>\n<li>Fotoaufnahme mit dem Kamera-Modul.<\/li>\n<li>Algorithmus zur Bestimmung des Z\u00e4hlerstands (mittels des oben beschriebenen neuronalen Netzes).<\/li>\n<li>REST API zur Kommunikation mit der Desktop-Applikation.<\/li>\n<\/ol>\n<p>Die Firmware stellt somit alle Funktionalit\u00e4ten zur Verf\u00fcgung, um den Z\u00e4hlerstand mit Hilfe des Kamerabilds zu ermitteln und um die Kommunikation mit einem Frontend zu errichten. Das erm\u00f6glicht eine einfache Bedienung durch den Endbenutzer.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Desktop-Anwendung\"><\/span>Desktop-Anwendung<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die Desktop-Anwendung erm\u00f6glicht es Endbenutzer:innen, auf den ESP-EYE zuzugreifen und den Z\u00e4hlerstand zu ermitteln. Sie erf\u00fcllt folgende Funktionen:<\/p>\n<ol>\n<li>Darstellung des Kamerabildes<\/li>\n<li>Auswahl der einzelnen Ziffern im Kamerabild<\/li>\n<li>Anfrage &amp; Darstellung des Z\u00e4hlerstands<\/li>\n<li>Speichern von Z\u00e4hlerst\u00e4nden<\/li>\n<li>Pr\u00fcfung auf Plausibilit\u00e4t und Konsistenz der Z\u00e4hlerst\u00e4nde<\/li>\n<\/ol>\n<p>Der Konfigurationsprozess beginnt mit dem Laden des aktuellen Kamerabildes. Der User kann auf diesem nun die einzelnen Ziffern mit einer entsprechend gro\u00dfen Box per Mausklick aus (Abb. 7). Die Informationen \u00fcber Position und Gr\u00f6\u00dfe der Ziffern werden im n\u00e4chsten Schritt an den ESP-EYE \u00fcbermittelt. Nun kann man eine Bestimmung des Z\u00e4hlerstandes anfragen. Dieser wird unter dem Z\u00e4hlerstand auf dem Kamerabild angezeigt \u2013 f\u00fchrende Nullen werden ignoriert. Als letzten Schritt kann der ermittelte Z\u00e4hlerstand gespeichert werden.<\/p>\n<figure id=\"attachment_42416\" aria-describedby=\"caption-attachment-42416\" style=\"width: 1637px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-42416 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661.png\" alt=\"Screenshot der Desktop Anwendung\" width=\"1637\" height=\"596\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661.png 1637w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-300x109.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-1024x373.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-768x280.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-1536x559.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-400x146.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Frontend_GUI-e1677162741661-360x131.png 360w\" sizes=\"auto, (max-width: 1637px) 100vw, 1637px\" \/><figcaption id=\"caption-attachment-42416\" class=\"wp-caption-text\">Abb. 5: Desktop Anwendung<\/figcaption><\/figure>\n<p>Im Tab History k\u00f6nnen die gespeicherten Z\u00e4hlerst\u00e4nde eingesehen werden. Bei gespeicherten Z\u00e4hlerst\u00e4nden, die unplausibel wirken (etwa weil ein kleinerer Wert ermittelt wurde, als ein Zeitschritt davor), wird eine Warnung angezeigt, aus der hervorgeht, dass dieser Z\u00e4hlerstand \u00fcberpr\u00fcft werden muss. Endbenutzer:innen k\u00f6nnen dann den Z\u00e4hlerstand h\u00e4ndisch korrigieren.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Finale-Performance-Evaluierung-des-TinyMeters\"><\/span>Finale Performance-Evaluierung des TinyMeters<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Testaufbau\"><\/span>Testaufbau<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die Performance des Algorithmus wird in einem letzten Test auf dem ESP-EYE getestet. F\u00fcr diesen Test nimmt der ESP-EYE neue Bilder auf und im Anschluss wird der Z\u00e4hlerstand ermittelt. Bei diesem Live-Test haben wir die Bilder und die zugeh\u00f6rigen Z\u00e4hlerst\u00e4nde manuell \u00fcberpr\u00fcft, um die Accuracy des Algorithmus auf komplett neuen Bildern mit unterschiedlicher Belichtung, Winkel, etc. zu bestimmen.<\/p>\n<p>Wie bereits im Kapitel \u201eGenerierung der Trainingsdaten\u201c angesprochen, ist die Ermittlung der letzten Ziffer besonders herausfordernd, da durch die kontinuierliche Bewegung dieser Drehscheibe oft Zwischenzust\u00e4nde zwischen zwei Ziffern entstehen. Diese Zwischenzust\u00e4nde sind eine Herausforderung f\u00fcr unseren Algorithmus und sind oft der Grund, weswegen der gesamte Z\u00e4hlerstand nicht korrekt ermittelt wird.<\/p>\n<p>Aus diesem Grund wird die Accuracy mit unterschiedlichen Metriken berechnet, um die St\u00e4rken und Schw\u00e4chen unseres Algorithmus hervorzuheben. So wird einerseits die Accuracy der einzelnen Ziffern als auch die des gesamten Z\u00e4hlerstands ermittelt. Au\u00dferdem wird auch die Accuracy bestimmt, wenn die f\u00fchrenden Nullen (sehr einfach zu ermitteln) und die letzte Ziffer jeweils bewusst ignoriert werden, um zu verdeutlichen, wie der Accuracy-Verlust zustande kommt (Tab. 4).<\/p>\n<table border=\"1\">\n<caption>Tab. 4: Metriken f\u00fcr die Accuracy bei dem Live Test<\/caption>\n<tbody>\n<tr>\n<td>\n<p style=\"text-align: center;\"><strong>Richtige\u00a0<\/strong><\/p>\n<p style=\"text-align: center;\"><strong>Vorhersage von<\/strong><\/p>\n<\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">f\u00fchrende Nullen\u00a0<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">letzte Ziffer<\/span><\/td>\n<td style=\"text-align: center;\"><span style=\"font-weight: 400;\">Accuracy<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><strong>Alle Ziffern (1)<\/strong><\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\"><b> 96,62 %<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><strong>Alle Ziffern (2)<\/strong><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\"><b>93,24 %<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><strong>Alle Ziffern (3)<\/strong><\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: center;\"><b>99,77 %<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><strong>Alle Ziffern (4)<\/strong><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: center;\"><\/td>\n<td style=\"text-align: center;\"><b>99,45 %<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\"><strong>Gesamter Z\u00e4hlerstand<\/strong><\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\">\u2714\ufe0e<\/td>\n<td style=\"text-align: center;\"><b>73,77 %<\/b><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Auswertung\"><\/span>Auswertung<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Wie unschwer zu erkennen ist, reduziert die Vorhersage der letzten Ziffer die Accuracy nicht unerheblich (Vergleich (1) und (3)). Au\u00dferdem verbessert eine gro\u00dfe Anzahl an Nullen im Z\u00e4hlerstand die Accuracy minimal (Vergleich(4) und (3)). Bei der Berechnung der Accuracy des gesamten Z\u00e4hlerstand wird betrachtet, ob jede einzelne Ziffer im Z\u00e4hlerstand richtig ermittelt wurde. Dies zusammen mit der angef\u00fchrten Problematik der letzten Ziffer f\u00fchrt dazu, dass die Accuracy des gesamten Z\u00e4hlerstands auf jeden Fall noch ausbauf\u00e4hig ist. Zur weiteren Verbesserung w\u00e4re jedoch eine Erweiterung des Ansatzes notwendig und dies ist unabh\u00e4ngig von der erfolgreichen Reduktion der Gr\u00f6\u00dfe des Modells zu sehen.<\/p>\n<p>Die Ergebnisse dieser Tests decken sich mit den Ergebnissen aus den bisherigen Tests, die mit dem Testdatensatz durchgef\u00fchrt wurden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Fazit<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In diesem Blog-Artikel haben wir einen funktionierenden und anschaulichen Showcase f\u00fcr die TinyML-Technologie beschrieben und dabei die Herausforderungen, die ein solches Projekt, das stets eine enge Zusammenarbeit von Data Scientists und Embedded-Entwickler:innen erfordert, mit sich bringt, diskutiert.\u00a0Im Speziellen haben wir etablierte Verfahren zur Verkleinerung neuronaler Netze aufgezeigt und praktisch an unserem Showcase demonstriert. Mit diesen Verfahren war es uns m\u00f6glich, ein mehrere MB gro\u00dfes neuronales Netz auf ca. 50 KB bei minimalem Performanceverlust zu verkleinern. Der Showcase wurde durch die Einbettung des neuronalen Netzes in ein funktionierendes und benutzerfreundliches Gesamtsystem vervollst\u00e4ndigt.<\/p>\n<p>Einige \u201eLessons learned\u201c, die auch f\u00fcr zuk\u00fcnftige Projekte relevant sind, werden im Folgenden zusammengefasst:<\/p>\n<ol>\n<li>Machine-Learning-Modelle auf leistungsschwacher Hardware auszuf\u00fchren ist m\u00f6glich. G\u00e4ngige Frameworks, wie TensorFlow, unterst\u00fctzen bereits Verfahren zur Verkleinerung und Optimierung dieser Modelle.<\/li>\n<li>Ein klassisches neuronales Netz kann deutlich verkleinert werden. In unserem Fall, sogar ohne gro\u00dfe Einbu\u00dfen bei der Performance.<\/li>\n<li>TinyML ist bereits soweit ausgereift, dass man auch praktisch relevante Projekte damit implementieren kann. Sowohl die Hardware und auch die Software sind f\u00fcr die breite Masse verf\u00fcgbar.<\/li>\n<li>Eine optimale L\u00f6sung von komplizierten F\u00e4llen bzw. Sonderf\u00e4lle bei \u00fcberwachtem Lernen (wie die Ermittlung der letzten Ziffer in unserem Showcase) stellen eine gr\u00f6\u00dfere Herausforderung dar und ben\u00f6tigen oft zus\u00e4tzlichen Aufwand, um zu guten Ergebnissen zu gelangen. Gerade im Embedded-Kontext ist typischerweise eine Kosten\/Nutzen-Abw\u00e4gung f\u00fcr den konkreten Anwendungsfall notwendig.<\/li>\n<li>Wir konnten f\u00fcr unseren Showcase die Plattform, mit der wir gearbeitet haben, und die Frameworks, die wir benutzt haben, selber aussuchen. In der Praxis ist dies h\u00e4ufig nicht der Fall und weitere Einschr\u00e4nkungen und zus\u00e4tzliche Anforderungen auf Kundenseite k\u00f6nnen zu weiteren Herausforderungen f\u00fchren.<\/li>\n<\/ol>\n<blockquote class=\"c-mrkdwn__quote\" data-stringify-type=\"quote\"><p>Zusammenfassend sind wir der \u00dcberzeugung, dass TinyML als Technologie ein gro\u00dfes Potenzial aufweist und damit in Zukunft bei der L\u00f6sung vieler spannender Anwendungsf\u00e4lle, eine entscheidende Rolle spielen wird.<\/p><\/blockquote>\n<div class=\"mceTemp\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Machine Learning Algorithmen findet man mittlerweile \u00fcberall: auf dem Smartphone, im Auto, auf Cloud-Servern, usw. Allerdings haben diese Algorithmen oft hohe Anforderungen an Rechenleistung und Speicherkapazit\u00e4t. Ist es m\u00f6glich, ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?<\/p>\n","protected":false},"author":28,"featured_media":48891,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[],"service":[76,436,505,712],"coauthors":[{"id":28,"display_name":"Dominik Helleberg","user_nicename":"dhelleberg"},{"id":149,"display_name":"Robert Pesch","user_nicename":"rpesch"},{"id":328,"display_name":"Sven Reinelt","user_nicename":"sreinelt"},{"id":313,"display_name":"Loris Schmit","user_nicename":"lschmit"},{"id":330,"display_name":"Max von Haugwitz","user_nicename":"mhaugwitz"},{"id":329,"display_name":"David Zerulla","user_nicename":"dzerulla"}],"class_list":["post-42335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","service-artificial-intelligence","service-computer-vision","service-embedded-systems","service-internet-of-things-iot"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T14:06:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-24T09:40:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dominik Helleberg, Robert Pesch, Sven Reinelt, Loris Schmit, Max von Haugwitz, David Zerulla\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML-1024x601.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dominik Helleberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"21\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Dominik Helleberg, Robert Pesch, Sven Reinelt, Loris Schmit, Max von Haugwitz, David Zerulla\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/\"},\"author\":{\"name\":\"Dominik Helleberg\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/06304ff82aba2dab872dffe9aa8dadfa\"},\"headline\":\"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen\",\"datePublished\":\"2023-06-07T14:06:45+00:00\",\"dateModified\":\"2024-04-24T09:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/\"},\"wordCount\":4262,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tiny-ML.png\",\"articleSection\":[\"Applications\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/\",\"name\":\"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tiny-ML.png\",\"datePublished\":\"2023-06-07T14:06:45+00:00\",\"dateModified\":\"2024-04-24T09:40:49+00:00\",\"description\":\"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tiny-ML.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tiny-ML.png\",\"width\":1500,\"height\":880,\"caption\":\"Grafische Darstellung eines kleinen android-f\u00f6rmigen Roboters, dem Bin\u00e4rcode nach oben aus dem durchsichtigen Kopf mit Gehirn l\u00e4uft auf ge\u00f6ffneter Handfl\u00e4che.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/06304ff82aba2dab872dffe9aa8dadfa\",\"name\":\"Dominik Helleberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=gf1c36101030c1dba8dbde503deac84cb\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=g\",\"caption\":\"Dominik Helleberg\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/dhelleberg\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH","description":"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/","og_locale":"de_DE","og_type":"article","og_title":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH","og_description":"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?","og_url":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2023-06-07T14:06:45+00:00","article_modified_time":"2024-04-24T09:40:49+00:00","og_image":[{"width":1500,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png","type":"image\/png"}],"author":"Dominik Helleberg, Robert Pesch, Sven Reinelt, Loris Schmit, Max von Haugwitz, David Zerulla","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML-1024x601.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Dominik Helleberg","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten","Written by":"Dominik Helleberg, Robert Pesch, Sven Reinelt, Loris Schmit, Max von Haugwitz, David Zerulla"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/"},"author":{"name":"Dominik Helleberg","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/06304ff82aba2dab872dffe9aa8dadfa"},"headline":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen","datePublished":"2023-06-07T14:06:45+00:00","dateModified":"2024-04-24T09:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/"},"wordCount":4262,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png","articleSection":["Applications","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/","url":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/","name":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png","datePublished":"2023-06-07T14:06:45+00:00","dateModified":"2024-04-24T09:40:49+00:00","description":"Ist es m\u00f6glich, mit TinyML ein Machine Learning Modell auf einem kleinen und leistungsschwachen, aber daf\u00fcr sehr g\u00fcnstigen Ger\u00e4t zu implementieren?","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tiny-ML.png","width":1500,"height":880,"caption":"Grafische Darstellung eines kleinen android-f\u00f6rmigen Roboters, dem Bin\u00e4rcode nach oben aus dem durchsichtigen Kopf mit Gehirn l\u00e4uft auf ge\u00f6ffneter Handfl\u00e4che."},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/tinyml-komplexe-machine-learning-modelle-auf-eingebetteten-systemen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"TinyML: Komplexe Machine-Learning-Modelle auf eingebetteten Systemen"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/06304ff82aba2dab872dffe9aa8dadfa","name":"Dominik Helleberg","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=gf1c36101030c1dba8dbde503deac84cb","url":"https:\/\/secure.gravatar.com\/avatar\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7d3cb71b928b4c3043db2b703d1ef4eebb825d9f0d3581f04869d502e23a1698?s=96&d=retro&r=g","caption":"Dominik Helleberg"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/dhelleberg\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/42335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=42335"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/42335\/revisions"}],"predecessor-version":[{"id":53201,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/42335\/revisions\/53201"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/48891"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=42335"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=42335"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=42335"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=42335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}