Ausführen eines Hello-World-Maschinenlernmodell auf STM32-Mikrocontrollern

Von Jacob Beningo

Zur Verfügung gestellt von Nordamerikanische Fachredakteure von DigiKey

Maschinelles Lernen (ML) ist schon seit Jahren der letzte Schrei bei Server- und mobilen Anwendungen, aber jetzt wird es auch auf Geräten am Netzwerkrand (Edge) zu einer kritischen Eigenschaft. Da Edge-Geräte energieeffizient sein müssen, müssen Entwickler lernen und verstehen, wie man ML-Modelle auf Mikrocontroller-basierten Systemen einsetzt. ML-Modelle, die auf einem Mikrocontroller laufen, werden oft als tinyML bezeichnet. Leider ist die Übertragung eines Modells auf einen Mikrocontroller kein triviales Unterfangen. Dennoch wird es immer einfacher, und selbst Entwickler ohne spezielle Ausbildung werden feststellen, dass sie dies in kurzer Zeit tun können.

In diesem Artikel wird untersucht, wie Embedded-Entwickler mit Hilfe der STM32-Mikrocontroller von STMicroelectronics mit ML beginnen können. Zu diesem Zweck wird gezeigt, wie man eine „Hello World“-Anwendung erstellt, indem man ein „TensorFlow Lite für Mikrocontroller“-Modell für die Verwendung in der STM32CubeIDE mit X-CUBE-AI konvertiert.

Einführung in tinyML-Anwendungsfälle

TinyML ist ein wachsender Bereich, der die Leistung von ML auf ressourcen- und strombeschränkte Geräte wie Mikrocontroller überträgt, wobei in der Regel tiefe neuronale Netze verwendet werden. Diese Mikrocontroller-Geräte können dann das ML-Modell ausführen und wertvolle Arbeit am Netzwerkrand leisten. Es gibt mehrere Anwendungsfälle, in denen tinyML inzwischen recht interessant ist.

Der erste Anwendungsfall, der in vielen mobilen Geräten und in der Hausautomatisierung zu finden ist, ist das Aufspüren von Schlüsselwörtern. Beim Keyword-Spotting kann das eingebettete Gerät ein Mikrofon verwenden, um Sprache zu erfassen und vorher trainierte Schlüsselwörter zu erkennen. Das tinyML-Modell verwendet eine Zeitserieneingabe, die die Sprache repräsentiert, und wandelt sie in Sprachmerkmale um, in der Regel ein Spektrogramm. Das Spektrogramm enthält Frequenzinformationen über die Zeit. Das Spektrogramm wird dann in ein neuronales Netz eingespeist, das auf die Erkennung bestimmter Wörter trainiert wurde. Das Ergebnis ist eine Wahrscheinlichkeit, dass ein bestimmtes Wort erkannt wird. Abbildung 1 zeigt ein Beispiel dafür, wie dieser Prozess aussieht.

Bild: Das Keyword-Spotting ist ein interessanter Anwendungsfall für tinyML (zum Vergrößern anklicken)Abbildung 1: Keyword-Spotting ist ein interessanter Anwendungsfall für tinyML. Die eingegebene Sprache wird in ein Spektrogramm umgewandelt und dann in ein trainiertes neuronales Netz eingespeist, um festzustellen, ob ein vorher trainiertes Wort vorhanden ist. (Bildquelle: Arm®)

Der nächste Anwendungsfall für tinyML, an dem viele Embedded-Entwickler interessiert sind, ist die Bilderkennung. Der Mikrocontroller nimmt Bilder von einer Kamera auf, die dann in ein vorab trainiertes Modell eingespeist werden. Das Modell kann erkennen, was auf dem Bild zu sehen ist. Zum Beispiel könnte man feststellen, ob es eine Katze, einen Hund, einen Fisch usw. enthält. Ein großartiges Beispiel für den Einsatz von Bilderkennung am Netzwerkrand sind Videotürklingeln. Die Videotürklingel kann oft erkennen, ob ein Mensch an der Tür steht oder ob ein Paket abgegeben wurde.

Ein letzter Anwendungsfall, der sich großer Beliebtheit erfreut, ist die Verwendung von tinyML für die vorausschauende Wartung. Bei der vorausschauenden Wartung wird ML zur Vorhersage von Anlagenzuständen auf der Grundlage von Anomalieerkennung, Klassifizierungsalgorithmen und Vorhersagemodellen eingesetzt. Auch hier gibt es eine Vielzahl von Anwendungen, die von HLK-Systemen bis hin zu Fabrikanlagen reichen.

Während die drei oben genannten Anwendungsfälle derzeit für tinyML am beliebtesten sind, gibt es zweifellos viele potenzielle Anwendungsfälle, die Entwickler finden können. Hier ist eine kurze Liste:

  • Klassifizierung von Gesten
  • Anomalie-Erkennung
  • Ablesung analoger Messgeräte
  • Lenkung und Kontrolle (GNC)
  • Erkennung von Verpackungen

Unabhängig vom Anwendungsfall ist der beste Weg, sich mit tinyML vertraut zu machen, eine „Hello World“-Anwendung, die Entwicklern hilft, den grundlegenden Prozess zu erlernen und zu verstehen, den sie befolgen müssen, um ein minimales System zum Laufen zu bringen. Es sind fünf Schritte erforderlich, um ein tinyML-Modell auf einem STM32-Mikrocontroller auszuführen:

  1. Erfassen von Daten
  2. Kennzeichnung der Daten
  3. Trainieren des neuronalen Netzwerks
  4. Konvertierung des Modells
  5. Ausführen des Modells auf dem Mikrocontroller

Erfassen, Kennzeichnen und Trainieren eines „Hello World“-Modells

Den Entwicklern stehen in der Regel viele Möglichkeiten zur Verfügung, wie sie die für das Training ihres Modells benötigten Daten erfassen und kennzeichnen können. Erstens gibt es eine Vielzahl von Online-Trainingsdatenbanken. Entwickler können nach Daten suchen, die jemand gesammelt und gekennzeichnet hat. Für die einfache Bilderkennung gibt es zum Beispiel CIFAR-10 oder ImageNet. Um ein Modell zur Erkennung von Lächeln auf Fotos zu trainieren, gibt es auch dafür eine Bildersammlung. Online-Datenspeicher sind eindeutig ein guter Ausgangspunkt.

Wenn die benötigten Daten nicht bereits im Internet öffentlich zugänglich sind, können die Entwickler auch ihre eigenen Daten generieren. Matlab oder andere Tools können zur Erstellung der Datensätze verwendet werden. Wenn die automatische Datengenerierung nicht möglich ist, kann sie manuell durchgeführt werden. Und wenn Ihnen das alles zu zeitaufwändig erscheint, können Sie einige Datensätze auch über das Internet erwerben. Das manuelle Sammeln von Daten ist oft die spannendste und interessanteste Option, aber auch die arbeitsintensivste.

Das „Hello World“-Beispiel, das hier untersucht wird, zeigt, wie man ein Modell trainiert, um eine Sinuswelle zu erzeugen und es auf einem STM32 einzusetzen. Das Beispiel wurde von Pete Warden und Daniel Situnayake als Teil ihrer Arbeit bei Google an „TensorFlow Lite für Mikrocontroller“ zusammengestellt. Das macht die Arbeit leichter, denn sie haben ein einfaches, öffentliches Tutorial zur Erfassung, Kennzeichnung und zum Training des Modells zusammengestellt. Es kann hier auf Github gefunden werden; sobald Sie dort sind, sollten Sie auf die Schaltfläche „Run in Google Colab“ klicken. Google Colab, die Abkürzung für Google Collaboratory, ermöglicht Entwicklern das Schreiben und Ausführen von Python in ihrem Browser ohne jegliche Konfiguration und bietet kostenlosen Zugang zu Google GPUs.

Die Ausgabe des Trainingsbeispiels wird zwei verschiedene Modelldateien enthalten: ein model.tflite TensorFlow-Modell, das für Mikrocontroller quantisiert ist, und ein model_no_quant.tflite Modell, das nicht quantisiert ist. Die Quantisierung gibt an, wie die Modellaktivierungen und der Bias numerisch gespeichert werden. Die quantisierte Version ergibt ein kleineres Modell, das besser für einen Mikrocontroller geeignet ist. Die Ergebnisse des trainierten Modells im Vergleich zu den tatsächlichen Sinuswellenergebnissen sind in Abbildung 2 zu sehen. Das Ergebnis des Modells ist in rot dargestellt. Die Sinuswellenausgabe ist nicht perfekt, aber für ein „Hello World“-Programm reicht sie aus.

Grafik der TensorFlow-Modellvorhersagen für eine Sinuswelle im Vergleich zu den tatsächlichen WertenAbbildung 2: Ein Vergleich zwischen den TensorFlow-Modellvorhersagen für eine Sinuswelle und den tatsächlichen Werten. (Bildquelle: Beningo Embedded Group)

Auswahl eines Entwicklungsboards

Bevor wir uns ansehen, wie man das TensorFlow-Modell konvertiert, damit es auf einem Mikrocontroller läuft, muss ein Mikrocontroller für den Einsatz des Modells ausgewählt werden. Dieser Artikel konzentriert sich auf STM32-Mikrocontroller, da STMicroelectronics viele tinyML/ML-Tools anbietet, die sich gut zum Konvertieren und Ausführen von Modellen eignen. Darüber hinaus bietet STMicroelectronics eine Vielzahl von Bauteilen an, die mit seinen ML-Tools kompatibel sind (Abbildung 3).

Tabelle des KI-Ökosystems von STMicroelectronics (zum Vergrößern anklicken)Abbildung 3: Abgebildet sind die Mikrocontroller und die Mikroprozessoreinheit (MPU), die derzeit vom STMicroelectronics KI-Ökosystem unterstützt werden. (Bildquelle: STMicroelectronics)

Wenn eines dieser Boards im Büro herumliegt, ist es ideal, um die Anwendung „Hello World“ auszuprobieren. Wer jedoch über dieses Beispiel hinausgehen und sich mit Gestensteuerung oder Keyword-Spotting beschäftigen möchte, sollte sich für den Discovery-IoT-Knoten STM32 B-L4S5I-IOT01A entscheiden (Abbildung 4).

Dieses Board verfügt über einen Arm-Cortex®-M4-Prozessor, der auf der STM32L4+ Serie basiert. Der Prozessor verfügt über 2 Megabyte (MByte) Flash-Speicher und 640 Kilobyte (KByte) RAM, was reichlich Platz für tinyML-Modelle bietet. Das Modul ist für Experimente mit tinyML-Anwendungsfällen geeignet, da es auch über das MEMS-Mikrofon MP34DT01 von STMicroelectronics verfügt, das für die Entwicklung von Keyword-Spotting-Anwendungen verwendet werden kann. Darüber hinaus kann der integrierte Drei-Achsen-Beschleunigungssensor LIS3MDLTR, ebenfalls von STMicroelectronics, zur tinyML-basierten Gestenerkennung verwendet werden.

Bild: Discovery-IoT-Knoten STM32 B-L4S5I-IOT01A von STMicroelectronicsAbbildung 4: Der Discovery-IoT-Knoten STM32 B-L4S5I-IOT01A ist aufgrund seines integrierten Arm-Cortex-M4-Prozessors, des MEMS-Mikrofons und des dreiachsigen Beschleunigungsmessers eine anpassungsfähige Experimentierplattform für tinyML. (Bildquelle: STMicroelectronics)

Konvertierung und Ausführung des TensorFlow-Lite-Modells mit STM32Cube.AI

Bewaffnet mit einem Entwicklungsboard, das zur Ausführung des tinyML-Modells verwendet werden kann, können Entwickler nun damit beginnen, das TensorFlow-Lite-Modell in etwas umzuwandeln, das auf dem Mikrocontroller ausgeführt werden kann. Das TensorFlow-Lite-Modell kann direkt auf dem Mikrocontroller laufen, aber es benötigt eine Laufzeitumgebung, um es zu verarbeiten.

Bei der Ausführung des Modells muss eine Reihe von Funktionen ausgeführt werden. Diese Funktionen beginnen mit der Erfassung der Sensordaten, filtern diese, extrahieren die erforderlichen Merkmale und geben sie an das Modell weiter. Das Modell spuckt ein Ergebnis aus, das dann weiter gefiltert werden kann, und dann wird - normalerweise - eine Aktion ausgeführt. Abbildung 5 gibt einen Überblick darüber, wie dieser Prozess aussieht.

Diagramm der Datenflüsse von den Sensoren zur Laufzeitumgebung und dann zur AusgabeAbbildung 5: Der Datenfluss von den Sensoren zur Laufzeitumgebung und dann zur Ausgabe in einer tinyML-Anwendung. (Bildquelle: Beningo Embedded Group)

Das X-CUBE-AI-Plug-in für STM32CubeMx stellt die Laufzeitumgebung zur Interpretation des TensorFlow-Lite-Modells zur Verfügung und bietet alternative Laufzeiten und Konvertierungswerkzeuge, die Entwickler nutzen können. Das X-CUBE-AI-Plug-in ist nicht standardmäßig in einem Projekt aktiviert. Nach der Erstellung eines neuen Projekts und der Initialisierung des Boards gibt es jedoch unter Software Packs -> Select Components die Option, die AI-Laufzeitumgebung zu aktivieren. Hier gibt es mehrere Optionen; stellen Sie sicher, dass für dieses Beispiel die Vorlage „Application“ verwendet wird, wie in Abbildung 6 gezeigt.

Bild: Das X-CUBE-AI-Plug-in muss aktiviert werdenAbbildung 6: Das X-CUBE-AI-Plugin muss in der Anwendungsvorlage für dieses Beispiel aktiviert werden. (Bildquelle: Beningo Embedded Group)

Sobald X-CUBE-AI aktiviert ist, erscheint eine STMicroelectronics-X-CUBE-AI-Kategorie in der Toolkette. Durch Anklicken der Kategorie kann der Entwickler die von ihm erstellte Modelldatei auswählen und die Modellparameter einstellen, wie in Abbildung 7 dargestellt. Über die Schaltfläche „Analyze“ wird das Modell analysiert, und die Entwickler erhalten Informationen zu RAM, ROM und Ausführungszyklus. Es wird dringend empfohlen, dass Entwickler die Modelloptionen von Keras und TFLite vergleichen. Bei dem Sinuswellenmodell, das klein ist, ist der Unterschied nicht groß, aber spürbar. Das Projekt kann dann durch Klicken auf „Generate Code“ erstellt werden.

Bild: Informationen zu RAM, ROM und AusführungszyklusAbbildung 7: Über die Schaltfläche „Analyze“ erhalten Entwickler Informationen zu RAM, ROM und Ausführungszyklus. (Bildquelle: Beningo Embedded Group)

Der Codegenerator initialisiert das Projekt und baut die Laufzeitumgebung für das tinyML-Modell ein. Standardmäßig wird das Modell jedoch nicht gefüttert. Die Entwickler müssen Code hinzufügen, um die Eingabewerte des Modells - die x-Werte - bereitzustellen, die das Modell dann interpretiert und verwendet, um die Sinuswerte y zu erzeugen. Die Funktionen „acquire_and_process_data“ und „post_process“ müssen um einige Codestücke ergänzt werden, wie in Abbildung 8 dargestellt.

Bild: Der gezeigte Code verbindet gefälschte EingangssensorwerteAbbildung 8: Der gezeigte Code verbindet gefälschte Eingangssensorwerte mit dem Sinuswellenmodell. (Bildquelle: Beningo Embedded Group)

Das Beispiel ist nun ablaufbereit. Hinweis: Fügen Sie einige printf-Anweisungen hinzu, um die Modellausgabe zur schnellen Überprüfung zu erhalten. Eine schnelle Kompilierung und Bereitstellung führt dazu, dass das tinyML-Modell „Hello World“ läuft. Das Ziehen des Modellausgangs für einen vollen Zyklus ergibt die in Abbildung 9 dargestellte Sinuswelle. Sie ist nicht perfekt, aber für eine erste tinyML-Anwendung ist sie hervorragend. Von hier aus könnten die Entwickler den Ausgang mit einem Pulsweitenmodulator (PWM) verbinden und die Sinuswelle erzeugen.

Bild der Ausgabe des Sinuswellenmodells „Hello World“ (zum Vergrößern anklicken)Abbildung 9: Die Ausgabe des Sinuswellenmodells „Hello World“ bei Ausführung auf dem STM32. (Bildquelle: Beningo Embedded Group)

Tipps und Tricks für ML auf eingebetteten Systemen

Entwickler, die mit ML auf mikrocontrollerbasierten Systemen beginnen wollen, haben eine ganze Menge zu tun, um ihre erste tinyML-Anwendung zum Laufen zu bringen. Es gibt jedoch einige „Tipps und Tricks“, die ihre Entwicklung vereinfachen und beschleunigen können:

  • Schauen Sie sich das „TensorFlow Lite für Mikrocontroller“-Beispiel „Hello World“, einschließlich der Google-Colab-Datei an. Nehmen Sie sich etwas Zeit, um die Parameter anzupassen und zu verstehen, wie sie sich auf das trainierte Modell auswirken.
  • Verwenden Sie quantisierte Modelle für Mikrocontroller-Anwendungen. Das quantisierte Modell ist komprimiert, um mit uint8_t anstelle von 32-Bit-Gleitkommazahlen zu arbeiten. Infolgedessen wird das Modell kleiner und schneller ausgeführt.
  • Erkunden Sie die zusätzlichen Beispiele im „TensorFlow Lite für Mikrocontroller“-Repository. Weitere Beispiele sind die Gestenerkennung und die Erkennung von Schlüsselwörtern.
  • Erweitern Sie das Beispiel „Hello World“, indem Sie den Modellausgang mit einer PWM und einem Tiefpassfilter verbinden, um die resultierende Sinuswelle zu sehen. Experimentieren Sie mit der Laufzeit, um die Frequenz der Sinuswelle zu erhöhen oder zu verringern.
  • Wählen Sie eine Entwicklungsplatine, die „zusätzliche“ Sensoren enthält, mit denen Sie eine breite Palette von ML-Anwendungen ausprobieren können.
  • So viel Spaß das manuelle Sammeln von Daten auch machen kann, ist es im Allgemeinen einfacher, eine Open-Source-Datenbank zu kaufen oder zu verwenden, um das Modell zu trainieren.

Entwickler, die diese „Tipps und Tricks“ befolgen, können sich bei der Entwicklung ihrer Anwendung viel Zeit und Ärger ersparen.

Fazit

ML ist am Netzrand angekommen, und ressourcenbeschränkte Mikrocontroller-basierte Systeme sind ein Hauptziel. Die neuesten Tools ermöglichen die Konvertierung und Optimierung von ML-Modellen für die Ausführung auf Echtzeitsystemen. Wie gezeigt, ist es relativ einfach, ein Modell auf einem STM32-Entwicklungsboard zum Laufen zu bringen, obwohl es sehr komplex ist. Während in der Diskussion ein einfaches Modell untersucht wurde, das eine Sinuswelle erzeugt, sind weitaus komplexere Modelle wie Gestenerkennung und Keyword-Spotting möglich.

DigiKey logo

Haftungsausschluss: Die Meinungen, Überzeugungen und Standpunkte der verschiedenen Autoren und/oder Forumsteilnehmer dieser Website spiegeln nicht notwendigerweise die Meinungen, Überzeugungen und Standpunkte der DigiKey oder offiziellen Politik der DigiKey wider.

Über den Autor

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo ist ein Berater für eingebettete Software, der derzeit mit Kunden in mehr als einem Dutzend Ländern zusammenarbeitet, um ihr Unternehmen durch die Verbesserung von Produktqualität, Kosten und Markteinführungszeit dramatisch zu transformieren. Er hat mehr als 200 Artikel über Entwicklungstechniken für eingebettete Software veröffentlicht, ist ein gefragter Redner und technischer Trainer und verfügt über drei Abschlüsse, darunter einen Masters of Engineering der University of Michigan. Bei Interesse können Sie ihn unter jacob@beningo.com kontaktieren oder besuchen Sie seine Website www.beningo.com und melden Sie sich für seinen monatlichen Embedded Bytes Newsletter an.

Über den Verlag

Nordamerikanische Fachredakteure von DigiKey