In diesem kurzen Beitrag fasse ich meine Entwicklungsumgebung mit PlatformIO & CLion zusammen. Ich habe die Datei platformio.ini angepasst, um die benötigten Bibliotheken und Dateien einzubinden – damit du loslegen kannst. EdgeImpulse bietet eine ähnliche Konfiguration, die sich eignet, wenn du mit der Arduino-IDE arbeitest.
Hintergrund
Ich nutze PlatformIO als Entwicklungsplattform für Embedded-Projekte und CLION als meine IDE. Beide sind integriert und bieten zusammen eine einheitliche Vorgehensweise für Programmierung, Kompilierung und Bereitstellung – unabhängig von der verwendeten MCU/CPU. Ich versuche, die Arduino-Bibliotheken zu nutzen, da diese bis zu einem gewissen Grad Plattformunabhängigkeit bieten. Außerdem sind für Arduino viele Bibliotheken verfügbar. Um das maschinelle Lernen zu erleichtern, setze ich auf EdgeImpulse – eine Cloud-Plattform, die den End-to-End-Zyklus des maschinellen Lernens unterstützt – kurz gesagt:
- Platformio – Plattform für die Embedded-Entwicklung
- Clion – Integrierte Entwicklungsumgebung mit Platformio-Integration
- EdgeImpulse – Entwicklungsplattform für maschinelles Lernen auf Edge-Geräten
Das i-Tüpfelchen: EdgeImpulse
EdgeImpulse nimmt dir die beiden kompliziertesten Teile ab: das Modelldesign/-training und die Merkmalsextraktion. Es ist eine Wissenschaft für sich, einen kontinuierlichen Inversionsprozess auf einer kleinen MCU (z. B. ESP32) auszuführen, der die Sprachaufzeichnung, die Durchführung einer Fourier-Transformation, die Anwendung einer MEL-Transformation und schließlich die Einspeisung der Merkmale in das Modell umfasst. Da die Merkmalsextraktion während des Trainings (in der Cloud oder auf einem Desktop-PC) und später während der Inversion (auf dem ESP) sowohl logisch als auch zeitlich genau denselben Regeln folgen muss, erhöht dies die Komplexität von Embedded-ML-Projekten zusätzlich. Syntiant ist eine Partnerschaft mit EdgeImpulse eingegangen – daher wurden der Merkmalsextraktions- und der Inversionsprozess speziell auf den NDP 101 zugeschnitten – du musst dich also nicht tief in dessen Architektur einarbeiten.
Also… was bekomme ich und wie baue ich tatsächlich etwas?
Sobald das Training abgeschlossen ist (ausführliche Beschreibung von EdgeImpulse), bietet EdgeImpulse dir zwei Möglichkeiten, die Software auf dein Gerät herunterzuladen: Du kannst direkt ein Binärimage herunterladen und dein Modell testen oder – und hier wird es richtig interessant – den Quellcode herunterladen, der Folgendes enthält:
- Software zur Merkmalsextraktion (DSP…)
- Trainiertes Modell
- Modellinversion (Merkmale in das Modell einspeisen und die Inversion ausführen)
- Bibliothek zur Integration der „Modellentscheidung = Inversionsergebnis“ in den C-Code
- Beispielprogramm, das all das auf Basis des Arduino-Frameworks nutzt – und tatsächlich zeigt, wie es funktioniert
- Für NDP101 enthält es außerdem die Bibliotheken zur direkten Kommunikation mit dem NDP101 über SPI-Befehle (Modell laden, Modell ausführen…..). Ich bin noch dabei, die verschiedenen Befehle und Optionen zu erkunden
Quellcode – Einsatzbereites Paket auf GitHub
Meine erste Vorlagenversion für diese Konfiguration ist auf GitHub verfügbar: https://github.com/happychriss/Goodwatch_NDP101_SpeeechRecognition
Um dies zu erstellen, habe ich das Syntiant/EdgeImpulse-Repository heruntergeladen und die Dateistruktur an das Platformio-Build-System angepasst; außerdem habe ich die Datei platformio.ini angepasst, um die benötigten Bibliotheken einzubinden.
Bitte beachte, dass du eine der Bibliotheken patchen musst; die Basis für meine Arbeit sowie Anweisungen zum Patchen der lokalen Bibliotheken findest du hier.
Ein nützliches Extra ist das Skript download_model.sh – es verbindet sich mit EdgeImpulse, lädt ein *Build*-Modell herunter und legt die Dateien in den richtigen Ordnern ab (./src/edgeimpulse) – so kannst du deine Binärdatei direkt aus dem Modell neu erstellen und auf das Board hochladen. Du musst in CLION eine Laufkonfiguration hinzufügen, damit du das Skript direkt starten kannst. Der API-Code für die Autorisierung auf EdgeImpulse muss zu den Parametern hinzugefügt werden.

So sieht es aus, wenn alles eingerichtet ist. Viel Spaß beim Entwickeln.

