TensorFlow Lite für Mikrocontroller: Eine Einführung
über
Mit TensorFlow Lite können Sie Machine-Learning-Modelle auf kleinen, ressourcenbeschränkten Mikrocontrollern ausführen. Lassen Sie uns einen genaueren Blick darauf werfen und es zusammen mit Edge Impulse für die Spracherkennung auf einem Arduino Nano 33 BLE Sense verwenden.
KI am Rande
Künstliche Intelligenz (KI) und Maschinelles Lernen (ML) sind die neuen Schlagworte, und manchmal werden sie fälschlicherweise synonym verwendet. Facebook, Amazon, Google und viele andere setzen ML-Systeme ein, um Ihnen Inhalte zu präsentieren, die so genau wie möglich auf Ihre Vorlieben und Gewohnheiten zugeschnitten sind. ChatGPT ist ein weiteres Beispiel für einen spektakulären und beliebten Dienst, der Künstliche Intelligenz einsetzt. Diese Unternehmen haben eins gemeinsam: Sie verfügen über Server mit enormer Rechenleistung. Damit trainieren sie die Modelle und reagieren flüssig auf die Anfragen einer großen Zahl von Nutzern – und das alles durch die Verarbeitung riesiger Datenmengen.
Dies ändert sich jedoch mit dem Aufkommen von KI „on the edge“. Edge-KI bezieht sich auf den Einsatz von Algorithmen der Künstlichen Intelligenz und ihre Verarbeitung am Rande des Netzwerks. Das heißt, dass die Daten näher an der Datenquelle und weit entfernt von einem Server verarbeitet werden. Die Latenz ist geringer und die Bandbreite wird besser genutzt, so dass Daten in Echtzeit analysiert und Entscheidungen getroffen werden können. Der Begriff „Netzwerk“ wird dabei häufig verwendet, aber es funktioniert auch ganz ohne Netzwerk – zum Beispiel auf einem einfachen Mikrocontroller-Board, das gar nicht mit dem Internet verbunden ist.
TensorFlow Lite für Mikrocontroller
Vor einigen Jahren kam es zu einer interessanten Entwicklung in diesem Bereich, als TensorFlow Lite für Mikrocontroller (TFLite Micro, ) auf den Markt kam. Es handelt sich dabei um eine abgespeckte Version von TensorFlow, einem von Google entwickelten Open-Source-Framework für Maschinelles Lernen, das für die Ausführung von maschinellen Lernmodellen auf Mikrocontrollern entwickelt wurde und ML-Anwendungen auf kleinen, ressourcenbeschränkten Einheiten ermöglicht. Man kann TFlite Micro auf einem Arduino-Board betreiben.; nicht auf allen Arduinos, aber auf einigen. Es ist in C++ der Version 17 geschrieben und erfordert nur eine 32-Bit-Plattform sowie einige Kilobyte RAM. Es kann mit vielen ARM Cortex-M-Mikrocontrollern verwendet werden und ist auch mit ESP32 kompatibel. Die vollständige Liste der kompatiblen Plattformen finden Sie unter . Während der ehrwürdige Arduino Uno der Aufgabe nicht gewachsen ist, kann der Arduino Nano 33 BLE Sense (Bild 1) verwendet werden. Dieses leistungsstarke Board ist perfekt für alle, die gerne mit TFlite Micro herumspielen möchten. das Board ist bereits mit Sensoren ausgestattet, darunter ein 9-achsiger Trägheitssensor, ein Feuchtigkeits-, Temperatur-, Lichtfarben- und Lichtintensitätssensor, ein Drucksensor und ein Mikrofon.
Dieses Arduino-Board ist zwar leistungsstark, aber es reicht trotzdem nicht aus, um das Modell direkt auf dem Board zu trainieren. Die übliche Methode bei mikrocontrollerbasierten ML-Projekten ist, die Quelldaten vorzubereiten und ein Modell auf einem leistungsfähigen Rechner zu trainieren, zum Beispiel auf einem PC oder einem Remote-Server. So entsteht eine binäre Modelldatei, die anschließend in eine C-Header-Datei konvertiert werden muss. Schließlich erstellen Sie mit den Funktionen der TFLite-Micro-Bibliothek ein Arduino-Programm und kompilieren es mit der Arduino-IDE.
Für alle, die gerne selbst anpacken und sich nicht scheuen, „die Hände schmutzig“ zu machen, ist die Lektüre der offiziellen TensorFlow-Lite-Dokumentation ein Muss. Ich habe auch interessante Artikel gefunden, die von DigiKey veröffentlicht wurden und in denen empfohlen wird, einen Linux-PC mit Python zu verwenden und dann unter anderem TensorFlow, Keras, Anaconda, Jupyter Notebook und andere Hilfsmittel zu installieren. Die bessere Lösung ist die Ausführung von Python-Code in Google Colab , einer kostenlosen Cloud-basierten Plattform von Google, die es Nutzern ermöglicht, Python-Code in einer Online-Umgebung zu schreiben und auszuführen. Als Einsteiger in die Materie muss ich sagen, dass die TensorFlow-Dokumentation für mich schwer zu verstehen war. Es erfordert ein gutes Verständnis von neuronalen Netzen, um etwas funktionierendes Sinnvolles zu tun. Und wer damit noch nicht vertraut ist, wird schnell entmutigt und könnte vorschnell die Flinte ins Korn werfen.
Einfache Beispiele
Tutorials im Internet zeigen sehr oft sehr ähnliche Dinge, von denen einigen ein wenig der praktische Nutzen fehlt, um wirklich anregend zu sein. So wird zum Beispiel oft gezeigt, wie man ein Modell so trainiert, dass es einen Ausgabewert erzeugt, der einer Annäherung an den Sinus des Eingabewertes entspricht. Dabei werden natürlich die vorberechneten Werte der Sinusfunktion als Trainingsdatensatz verwendet. So kann das Modell, wenn es einmal richtig trainiert ist, bei einem Eingabewert x zwischen 0...2π und ohne Verwendung einer mathematisch implementierten Sinusfunktion eine Näherung von sin(x) als Ausgangswert liefern. Natürlich ist dies wahrscheinlich die absurdeste und unpraktischste Art, einen Sinus zu berechnen, insbesondere auf einem Mikrocontroller mit begrenzten Rechenressourcen.
Ein anderes, nützlicheres Beispiel ist die Spracherkennung. So kann der Mikrocontroller über ein Mikrofon hören, was in seiner Umgebung vor sich geht, einige Wörter erkennen (zum Beispiel ja und nein oder Katze und Hund und so weiter) und verschiedene Aktionen auslösen. Für diesen Artikel, der von einem Anfänger für Anfänger geschrieben wurde, möchte ich die Dinge einfach halten und deshalb die Verwendung der Spracherkennung auf einem Arduino Nano 33 BLE Sense demonstrieren.
Erkennung von Sprache
Hierfür werde ich das Google Speech Command Dataset verwenden. Er enthält 65.000 einsekündige Beispiele, wobei jeder Clip eines von 30 verschiedenen Wörtern enthält, die von Tausenden verschiedener Personen gesprochen wurden. Um das Modell zu trainieren, verwende ich Edge Impulse , eine Plattform, mit der Entwickler Machine-Learning-Modelle auf Edge-Geräten wie Mikrocontrollern erstellen, trainieren und einsetzen können. Es unterstützt intern TensorFlow Lite für Mikrocontroller und bietet eine einfache Möglichkeit, das Modell und die TFLite-Bibliothek auf dem Arduino-Board selbst einzusetzen, was sehr praktisch ist.
Um loszulegen, brauchen Sie einige Audiobeispiele. Erstellen Sie einen Ordner, der Ihr Arbeitsordner sein wird. Ich habe meinen tflite_elektor genannt. Laden Sie das Google Speech Command Dataseti> herunter. Sorgen Sie für eine gute Internetverbindung; die Datei ist 2,3 GB groß. An der Extension .tar.gz sehen Sie, dass die Datei gleich doppelt komprimiert wurde. Verwenden Sie zum Entpacken der .tar-Datei 7-Zip oder eine vergleichbare Software; das in Windows eingebaute Tool ist für so große Dateien nicht zu empfehlen), und dekomprimieren Sie dann den Inhalt. Das Ergebnis ist der Ordner speech_commands_v0.02. Verschieben Sie diesen Ordner in Ihren Arbeitsordner. Sie können den Ordner einen einfacheren Namen geben, in meinem Fall schlicht dataset.
Vorbereiten der Daten
Als nächstes müssen Sie die Daten vorbereiten. Hierfür empfehle ich das ausgezeichnete Python-Skript von Shawn Hymel, das er großzügigerweise unter einer Open-Source-Lizenz zur Verfügung stellt. Laden Sie die Dateien dataset-curation.py und utils.py aus seinem GitHub-Repository herunter und speichern Sie sie in Ihrem Arbeitsordner. Dieses Skript erfordert, dass der Ordner _background_noise_ innerhalb von dataset von den Schlüsselwörtern getrennt wird. Ziehen Sie also diesen Ordner per Drag & Drop aus dataset heraus und legen Sie ihn in Ihrem Arbeitsordner ab. Sie können ihn auch beispielsweise in noise umbenennen. Ihr Arbeitsordner enthält jetzt die beiden Ordner dataset und noise sowie die beiden Python-Dateien (Bild 2).
Das Python-Skript erleichtert die Nutzung der riesigen Datenmenge, die im Google-Datensatz enthalten ist, erheblich. Außerdem ist es, wie Sie später sehen werden, sehr flexibel. Sie können es auch mit anderen Datensätzen und mit selbst aufgenommenen Audiodateien verwenden. Es wäre unpraktisch, mehrere Gigabyte an Daten auf die Server von Edge Impulse hochzuladen. Wählen Sie deshalb zunächst ein oder mehrere Schlüsselwörter als die Zielwörter aus, die der Arduino erkennen soll. Für dieses Beispiel habe ich das Wort zero gewählt. Das Skript erstellt für jedes Ziel-Schlüsselwort einen Ordner, in diesem Fall also einen einzigen Ordner mit dem Namen zero, sowie einen Ordner namens _noise, der zufällige Geräusche enthält, und einen Ordner namens _unknown, der zufällige Wörter enthält, die nicht die Ziel-Schlüsselwörter sind.
Das Skript mischt Hintergrundrauschen mit Schlüsselwort-Mustern, um die Robustheit des Modells zu erhöhen. Zunächst erstellt es die benötigten Ordner, dann extrahiert es kleinere Geräuschclips aus Hintergrundgeräuschsegmenten. Anschließend mischt es diese Geräuschclips mit Mustern von Ziel-Schlüsselwörtern und Nicht-Ziel-Schlüsselwörtern. Auf diese Weise wird die Widerstandsfähigkeit des Modells gegenüber Hintergrundgeräuschen verbessert und ein kuratierter Datensatz erstellt, der mit etwa 140 Megabyte viel kleiner ist und mit dem Edge Impulse problemlos arbeiten kann.
Arbeiten mit Python
Der Code wurde mit Python 3.7 getestet. Um mehrere verschiedene Python-Umgebungen mit unterschiedlichen Versionen und installierten Paketen zu verwalten, können Sie Anaconda verwenden, mit dem Sie leicht eine saubere Installation der gewünschten Version erstellen können. Hier erstelle ich eine neue Umgebung namens jf:
conda create -n jf python=3.7
Als nächstes müssen Sie die Pakete librosa, numpy und soundfile installieren:
python -m pip install librosa numpy soundfile
Das Paket shutil ist ebenfalls erforderlich, ist aber normalerweise in Python 3.7 schon vorhanden. Navigieren Sie von der Anaconda-Eingabeaufforderung oder vom Befehlszeilen-Interface Ihres Systems zu Ihrem Arbeitsverzeichnis und führen Sie das Skript mit dem Befehl
python dataset-curation.py -t "zero" -n 1500 -w 1.0 -g 0.1 -s 1.0 -r 16000 -e PCM_16 -b "./noise" -o "./keywords_curated" "./dataset"
Warten Sie ein paar Minuten, bis der Vorgang abgeschlossen ist (Bild 3).
un ein kurzer Blick auf die Argumente, die das Skript benötigt:
-t steht für die Zielschlüsselwörter. Hier verwende ich -t "zero".
-n ist die Anzahl der ausgegebenen Muster pro Kategorie. 1500 ist ein guter Ausgangspunkt.
-w und -g sind die Lautstärkepegel des gesprochenen Wortes beziehungsweise des Hintergrundgeräusches. -w 1.0 -g 0.1 sind empfohlene Werte.
-s und -r sind die Längen der Samples (1 s) und die Abtastrate (16 kHz). Verwenden Sie -s 1.0 -r 16000.
-e ist die Bittiefe, hier verwenden wir 16-Bit-PCM.
-b ist der Ort des Hintergrundgeräusch-Ordners, -o ist der Ausgabe-Ordner und schließlich ist das letzte Argument ohne Label die Liste der Eingabe-Ordner. Hier ist es der Ordner dataset.
Wenn das Skript fertig ist, sollte es einen Ordner keywords_curated mit drei Ordnern erstellt haben: _noise, _unknown und zero (Bild 4).
Import in Edge Impulse
Der nächste Schritt besteht darin, diese Dateien in Edge Impulse zu importieren. Gehen Sie zur Website des Anbieters und erstellen Sie ein Konto, falls Sie noch keines haben. Nachdem Sie sich angemeldet haben, erstellen Sie ein neues Projekt. Navigieren Sie im linken Menü zu Datenerfassung und klicken Sie dann auf Daten hinzufügen und Daten hochladen. Klicken Sie auf Ordner auswählen und wählen Sie den ersten Ordner, zum Beispiel_noise.
Vergewissern Sie sich, dass die Option Automatically split between training and testing aktiviert ist. Auf diese Weise verwendet Edge Impulse zunächst 80 % der hochgeladenen Proben zum Trainieren des Modells. Anschließend können wir die Leistung des trainierten Modells testen, indem wir es bitten, Daten zu verarbeiten, die es noch nicht gesehen hat; die restlichen 20 % sind für diesen Zweck reserviert.
Aktivieren Sie auch die Option Etikett: infer from filename, damit Edge Impulse anhand des Dateinamens erkennt, welche Proben das zu erkennende Wort oder die zu erkennenden Wörter enthalten und welche Proben Rauschen enthalten. Klicken Sie abschließend auf die Schaltfläche „Daten hochladen“ in der unteren rechten Ecke und warten Sie, bis die Übertragung abgeschlossen ist. Wiederholen Sie den Vorgang für die beiden verbleibenden Ordner _unknown und zero.
Nach dem Upload gehen Sie zurück zu Data Acquisition sehen sich alle hochgeladenen Proben an. Kontrollieren Sie, ob etwa 20 % Ihrer Dateien im Testsatz und der Rest im Trainingssatz enthalten sind und auch, ob die Labels korrekt gelesen wurden (Bild 5).
Als nächstes müssen Sie einen Verarbeitungsblock (Processing Block) hinzufügen. In Edge Impulse ist dies eine Komponente, die dazu dient, Sensor-Rohdaten in ein Format umzuwandeln, das für das Training und die Inferenz von Machine-Learning-Modellen geeignet ist. Er umfasst viele komplexe Dinge in einem einfachen Block, zum Beispiel die Vorverarbeitung der rohen Eingangsdaten, die Extraktion von Merkmalen (siehe unten), optionale Schritte wie Fourier-Transformationen und schließlich gibt er die Daten in einem Format aus, das mit den nächsten Schritten in der ML-Kette kompatibel ist.
Im allgemeinen Sprachgebrauch des Maschinellen Lernens sind Merkmale eindeutige, quantifizierbare Attribute oder Eigenschaften der beobachteten Daten. In diesem Fall handelt es sich bei den zu extrahierenden Merkmalen um die Mel-Frequenz-Cepstral-Koeffizienten (MFCCs) , die in der Audiosignalverarbeitung und Spracherkennung häufig verwendet werden. Sie stellen das kurzfristige Leistungsspektrum eines Tonsignals auf einer nichtlinearen Mel-Skala der Frequenz dar.
Gehen Sie also zu Impulse Design und klicken Sie auf die Schaltfläche Add a Processing Block. Wählen Sie die erste Option Audio (MFCC), indem Sie auf der rechten Seite auf Hinzufügen klicken. Klicken Sie dann auf die Schaltfläche Add a Learning Block und wählen Sie die erste Option, die empfohlen wird, nämlich Classification. Klicken Sie schließlich rechts auf Save Impulse (Bild 6).
Training des Modells
Wählen Sie im linken Menü unter Impulse Design die Option MFCC. Navigieren Sie zum Tab Generate Features und klicken Sie auf Generate Features (Bild 7). Warten Sie, bis die Generierung der Merkmale abgeschlossen ist. Wechseln Sie anschließend zum Abschnitt Classifier, der sich direkt unter MFCC im linken Menü befindet. Klicken Sie in der oberen rechten Ecke auf target und wählen Sie Arduino Nano 33 BLE Sense. Sie können die Parameter des neuronalen Netzwerks anpassen, aber die Standardeinstellungen sind, wenig überraschend, besser als alles, was ich selbst hätte tun können.
Sie können das neuronale Netzwerk mit dem grafischen Tool bearbeiten oder über das Popup-Menü in den Expertenmodus wechseln, wenn Sie mit Keras vertraut sind. In diesem Beispiel klicke ich einfach unten auf der Seite auf Start Training, um mit dem Training des auf den Daten beruhenden Modells zu beginnen. Wenn das Training beendet ist, können Sie die Ergebnisse im Model-Rahmen unten rechts überprüfen. Sie sehen dort eine allgemeine Bewertung der Genauigkeit, und 90 % gilt als recht gut; hier habe ich sogar 92,8 % erreicht (Bild 8).
Außerdem gibt es eine Matrix, die so genannte confusion matrix. Damit kann man überprüfen, wie gut das Modell funktioniert. Die Zeilen zeigen die tatsächlichen Bezeichnungen, die Spalten die vorhergesagten Bezeichnungen. Die Zahlen entlang der Diagonale, bei denen die vorhergesagte Bezeichnung mit der tatsächlichen Bezeichnung übereinstimmt, sollten viel höher sein als die anderen Werte. Hier zeigt die Diagonale 98,8 %, 87 % und 92,8 %, was gut genug sein sollte. Ein schwierigerer Test besteht darin, das Modell zu bewerten, indem man ihm Daten liefert, die es noch nicht gesehen hat. Gehen Sie dazu in den Abschnitt Model testing im linken Menü. Klicken Sie auf Classify All und lassen Sie den Test durchlaufen. Im unteren Results-Fenster ist die Punktzahl ein paar Prozent niedriger als zuvor, aber das war zu erwarten. Hier habe ich 90,56 % erreicht, was ein gutes Zeichen ist (Bild 9).
Arbeit für den Arduino
Gehen wir nun auf die Seite Deployment. Edge Impulse bietet mehrere Optionen für die Paketierung des Modells: eine generische C++-Bibliothek für die allgemeine Verwendung bei Mikrocontrollern, Cube MX für STM32-CPUs, WebAssembly für JavaScript-Umgebungen und viele mehr. Klicken Sie auf Search deployment options und wählen Sie die Arduino library aus. Klicken Sie dann unten auf der Seite auf die Schaltfläche Build. Ein paar Sekunden später lädt Ihr Browser eine ZIP-Datei mit der Arduino-Bibliothek herunter.
Ich verwende die Arduino-IDE-Version 1.8.19. Öffnen Sie die Arduino-IDE und verbinden Sie Ihren Arduino Nano 33 BLE Sense mit Ihrem Computer. Wenn Sie dies zum ersten Mal tun, schlägt die IDE vor, das Arduino Mbed OS Nano Boards package herunterzuladen, was tatsächlich erforderlich ist. Sie können Sie die Bibliothek mit der üblichen Technik hinzufügen, indem Sie auf Sketch -> Bibliothek einbinden -> .ZIP-Bibliothek hinzufügen... klicken und die ZIP-Datei auswählen, die Sie gerade von Edge Impulse heruntergeladen haben. Gehen Sie dann zu Datei -> Beispiele und suchen Sie die soeben installierte Bibliothek. Möglicherweise müssen Sie die Arduino-IDE neu starten, damit sie erscheint. Der Name sollte mit dem Namen deines Edge-Impulse-Projekts übereinstimmen, bei mir ist es also tflite_elektor_inferencing.
Beachten Sie, dass es zwei separate Ordner gibt: nano_ble33_sense und nano_ble33_sense_rev2 (Bild 10). Das hier verwendete Beispiel microphone_continuous erscheint nur im ersten Ordner, aber ich habe es mit beiden Versionen der Hardware mit Erfolg getestet. Andererseits müssen Sie wahrscheinlich die richtige Version auswählen, je nachdem, welches Board Sie haben, wenn Sie mit den anderen Beispielsketches spielen wollen, die den integrierten Beschleunigungssensor verwenden. Öffnen Sie das Beispiel microphone_continuous.
Sie können sich den Beispielsketch ansehen, um zu verstehen, wie alles aufgebaut ist. Der Mikrocontroller wartet in einer Endlosschleife, bis der Mikrofonpuffer voll ist. Dann ruft er die Funktion run_classifier_continuous auf, um die Inferenz mit dem neuronalen Netz auf den aufgezeichneten Audiodaten durchzuführen. Die Ergebnisse werden nur einmal pro Sekunde auf dem Seriellen Monitor ausgegeben. Der Code in der mitgelieferten Bibliothek ist manchmal nicht einfach zu verstehen, aber die Übung macht den Meister. Also auszuprobieren und sehen, was unter der Haube steckt!
Flashen des Boards
Stellen Sie im Werkzeuge-Menü der Arduino-IDE sicher, dass das richtige Board (Nano 33 BLE Sense) ausgewählt sowie der richtige COM-Port ausgewählt ist. Den zugewiesenen COM-Port finden Sie im Geräte-Manager, falls Sie Windows nutzen. Klicken Sie auf die Schaltfläche Upload und üben Sie sich in Geduld. Das Kompilieren des Projekts dauert eine Weile, da die Bibliothek, die die TensorFlow-Lite-Funktionen für die Inferenz sowie das auf Edge Impulse erstellte Modell im Binärformat enthält, recht umfangreich ist. Sobald der Vorgang abgeschlossen ist, werden etwa 171 kByte Flash-Speicher und ungefähr 47 kByte RAM für globale Variablen verwendet.
Es funktioniert!
Öffne nun den Seriellen Monitor, um die Ausgabe zu beobachten. Jede Sekunde gibt das System drei Zahlen aus, die die Wahrscheinlichkeiten angeben, dass ein bestimmtes Muster erkannt wurde, darunter zufälliges Rauschen, ein Wort, das nicht „zero“ ist, und schließlich das Wort „zero“. Bild 11 zeigt ein Beispiel, in dem nichts Besonderes passiert. Wenn ich das Wort „zero“ relativ nah am Arduino-Board sage, erreicht der dritte Wert einen sehr hohen Wert, fast 100 % (siehe Bild 12).
Nicht schlecht! Der nächste Schritt wäre, das Arduino-Board dazu zu bringen, mit diesen Informationen etwas Nützliches zu machen. Ich bin sicher, dass Sie interessante Anwendungen finden, um Sprachbefehle an Arduino-gesteuerte Geräte zu senden. Der oben beschriebene Prozess und das von Shawn Hymel entworfene Python-Skript können auch verwendet werden, um mehr als ein Wort zu erkennen. Die maximale Anzahl wird durch den Speicherplatz im Flash-Speicher des Arduino und die verfügbare Rechenleistung begrenzt. Im Code zeigt uns die Zeile #define EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW 4, dass jedes Ein-Sekunden-Fenster in vier 250-ms-Scheiben unterteilt wird. Die Ausgabe im Seriellen Monitor zeigt, dass die vom Sketch verwendete Zeit 76 ms + 6 ms = 82 ms pro 250-ms-Slice beträgt, was ungefähr 33 % CPU-Auslastung entspricht. Es bleibt also noch Rechenleistung übrig, um ein eigenes Programm hinzuzufügen.
Weiterführende Schritte
Um es einfach zu halten, habe ich eines der bereits im Datensatz Google Speech Command verfügbaren Wörter verwendet. Wenn Sie ein Modell trainieren möchten, um ein Wort zu erkennen, das nicht Teil dieses Sets ist, muss eine große Anzahl von Audiodaten mit dem gesprochenen Wort aufgenommen werden, vorzugsweise von vielen verschiedenen Personen mit unterschiedlichen Stimmen, Altersgruppen und Intonationen gesprochen. Während der Google-Datensatz Tausende von Beispielen pro Wort enthält, könnten fünfzig bis hundert Aufnahmen eigene Wörter ein guter Anfang sein. Natürlich habe ich mit diesem einfachen Beispiel nur an der Oberfläche gekratzt. Es ist sehr zu empfehlen, tiefer zu gehen, wenn Sie daran interessiert sind! Haben Sie schon eine schöne Projektidee im Kopf, bei der Sie Maschinelles Lernen einsetzen möchten?
Der Artikel "TensorFlow Lite auf kleinen Mikrocontrollern" (240357-02) erscheint in Elektor November/Dezember 2024.
Diskussion (0 Kommentare)