Forum: Digitale Signalverarbeitung / DSP / Machine Learning KI: PC -> Mikrocontroller


von NatürlicheDummheit (Gast)


Lesenswert?

Hallo,
gibt es eine Möglichkeit

1) ein neuronales Netz am PC komfortabel zu entwerfen, zu trainieren und 
zu testen

2) und dann das fertige Modell als C-Code zu exportieren, der z.B. für 
einen Mikrocontroller kompiliert werden kann

???

Punkt 1 kann man ja z.B. mit Python und Keras einigermaßen gut lösen. 
Aber wie man von da zu C-Code kommt ist mir nicht klar. Gibt es ggf. 
ganz andere Vorgehensweisen?

: Verschoben durch Admin
von Jan B. (diphthong)


Lesenswert?

Mit TensorFlow Lite ist das möglich.
https://www.tensorflow.org/lite/microcontrollers

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

NatürlicheDummheit schrieb:
> ein neuronales Netz am PC komfortabel zu entwerfen, zu trainieren und
> zu testen
>
> und dann das fertige Modell als C-Code zu exportieren, der z.B. für
> einen Mikrocontroller kompiliert werden kann

vorab: ich kenne mich mit neuronalen Netzen fast garnicht aus.

Nach meinem Verständniss ist ein neuronales Netz "ein Haufen von 
Algorithmen", und das Ergebniss des Trainings das Modell, und dieses 
wird in geeigneten Datenstrukturen abgespeichert. Das können natürlich 
auch Algorithmen und Datenstrukturen sein, welche in "C" erstellt worden 
sind.

-->

Du suchst also eine Möglichkeit, eine Datenstruktur (dein Modell) vom PC 
zu einem Mikrocontroller zu übertragen, wo es dann in "C-gemäßen" 
Datenstrukturen vorliegt? (es würde sich anbieten, eine derartige 
Datenkonvertierung direkt am PC vorzunehmen)

Oder geht es dir um den Transportweg vom PC zum Mikrocontroller?

Welche Algorithmen willst du denn auf deinem Mikrocontroller als 
"KI-Anwendung" laufen lassen? Und wie interagiert diese Anwendung mit 
Sensoren und Aktoren in deinem Mikrocontroller-Umfeld?

Was hindert dich denn daran, deine Algorithmen "am PC" ebenfalls in C zu 
erstellen, und dann damit dein neuronales Netz "zu entwerfen, zu 
trainieren und zu testen"? Dann fällt ja die Portierung auf den 
Mikrocontroller "relativ einfach" aus, denn C-Compiler für 
Microcontroller sind ja eigentlich "Standard".

Wird der Lernprozess am PC abgeschlossen sein, und der Mikrocontroller 
führt nur noch das einmal Erlernte aus? Oder soll "die KI" am 
Mikrocontroller ebenfalls aktiv (nach-) lernen können?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

> NatürlicheDummheit schrieb:
 > Nach meinem Verständniss ist ein neuronales Netz "ein Haufen von
> Algorithmen", und das Ergebniss des Trainings das Modell, und dieses
> wird in geeigneten Datenstrukturen abgespeichert. Das können natürlich
> auch Algorithmen und Datenstrukturen sein, welche in "C" erstellt worden
> sind.

Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix 
mit sog. "Gewichten" bzw. "Faktoren" (die beim Training entstehen). 
Diese werden mit immer den gleichen Algorithmen auf die durchlaufenden 
Informationen angewandt, um diese zu spezifizieren.

Ein NN skaliert also primär mit der Anzahl der "Neuronen" und den 
zugehörigen Faktoren (und damit dem Speicherbedarf), weniger mit dem 
eigentlichen Programmcode.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Frank E. schrieb:
> Eher nicht.

Eher doch.

Aus was soll ein Computersystem denn sonst bestehen, wenn nicht aus 
"Algorithmen und Datenstrukturen" (und natürlich aus zugehöriger 
Hardware)

Ob die Algorithmen "Nummern fressen", während sie durch eine Matrix 
huschen (machen sie ja bei Bildverarbeitungen auch), oder ob sie nur 
Bits an irgendwelchen Ports ein und ausschalten, ist ja erst mal 
grundsätzlich unerheblich.

In der gegebenen Aufgabenstellung (PC -> µC) wäre vielleicht interessant 
zu wissen, wie die Portierung statt finden soll, und was dann mit der 
"Erkenntniss" der KI passiert:
1. Sensoren: z.B. eine Kamera am PC wird sicherlich anders angesteuert 
werden als eine am µC.
2. Die eigentlichen KI-Lern-Algorithmen (bzw. Auswerte-Algorithmen) 
sollten (incl. der zugehörigen Datenstrukturen) vermutlich vom PC zum µC 
portierbar sein.
3. Aktoren: Die "Erkenntniss" das es sich (z.B. bei Bilderkennung) z.B. 
um einen Schuh handelt ist am PC ja einfach darzustellen als "Es wurde 
ein Schuh erkannt". Im µC werden doch aber sicherlich darauf hin noch 
weitere Aktionen daraus folgen, bei dem irgendwelche Aktoren gesteuert 
werden (halt irgendwelche Steueraufgaben, die dann folgen)

Punkt 2 (anscheinend die "Kernfrage" des Thread-Eröffners) scheint mir 
das geringste Problem zu sein, enn man schon direkt am PC passende Tools 
verwendet (z.B. das erwähnte TensorFlow)

Frank E. schrieb:
> Ein NN skaliert also ...

Das war ja gar ncht mein Einwand bzw. Hinweis in meinem Beitrag, ob oder 
wie stark ein NN skaliert. Derartiges hat natürlich generell Bedeutung 
bei der Dimensionierung der "Mikrocontroller-Portierung", da dessen 
Ressourcen im algemeinen knapp(er) bemessen sind als bei einem PC, 
insbesondere was den RAM-Speicher betrifft (in dem ja die Datenstruktur, 
d.h. Matrix, vorgehalten werden muss)

: Bearbeitet durch User
von NatürlicheDummheit (Gast)


Lesenswert?

Jan B. schrieb:
> Mit TensorFlow Lite ist das möglich.
> https://www.tensorflow.org/lite/microcontrollers

Richtig guter Tipp. Das ist GENAU das, was ich gesucht habe.

Wegstaben V. schrieb:
> 1. Sensoren: z.B. eine Kamera am PC wird sicherlich anders angesteuert
> werden als eine am µC.

Das "Außenrum" ist ja eher unkritisch. Am PC verwende ich zuvor 
aufgezeichnete Daten vom µC. Am µC selbst kann ich die Daten natürlich 
direkt vom Sensor auslesen.


Als erstes Projekt möchte ich damit ein paar einfache Brettspiele 
Umsetzen (Tic Tac Toe, 4 Gewinnt...). Eine SK6812 LED Matrix, ein paar 
Buttons und einen ESP32 sollen dafür ls Hardwareplatform dienen.
Danach würde ich mit dem ESP32 und einem entsprechenden Sensor gerne 
eine Gestensteuerung realisieren.

von Vincent H. (vinci)


Lesenswert?

Von ARM gibts auch noch die CMSIS NN:
https://www.keil.com/pack/doc/CMSIS/NN/html/index.html

Auf YT gibts einige Talks dazu die zeigen wie man mit diversen 
Frameworks vorab ein Modell trainieren kann und anschließend für den µC 
"zusammenstaucht".

Jene Image-Recognition Demo hier auf einem Cortex M7 find ich eigentlich 
schon recht beeindruckend. Klar, das Set ist winzig, aber könnt mir 
durchaus die ein oder andere Anwendung dafür vorstellen:
https://youtu.be/PdWi_fvY9Og

von Bastler (Gast)


Lesenswert?

Wegstaben V. schrieb:
> vorab: ich kenne mich mit neuronalen Netzen fast garnicht aus.

Warum antwortest Du dann?


Wegstaben V. schrieb:
> Frank E. schrieb:
>> Eher nicht.
>
> Eher doch.

Selber sagst Du, Du hast keine Ahnung. Dann kommt einer, der hat Ahnung. 
Und nun willst Du rum diskutieren? Wozu? Du hast doch keine Ahnung über 
das Thema!?


Frank E. schrieb:
> Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix

Genau so sieht es aus.

Vielleicht möchte "Wegstaben V." mal Google bemühen, was ein "Tensor" 
ist...

von MaWin (Gast)


Lesenswert?

NatürlicheDummheit schrieb:
> gibt es eine Möglichkeit

Ja.

Eine wurde dir genannt und findest du gut.

Dein neuronales Netz auf dem Mikrocontroller ist deiner Beschreibung 
nach nicht mehr lernfähig.
Damit ist es eine einfache Matrizenmultiplikation.

Interessanter ist die Aufbereitung der Rohdaten, woher die auch immer 
kommen, vielleicht sind es ja Bilder mit Featureerkennung. Der dazu 
nötige Proigrammcode kann schnell umfangreicher werden, als dein 
Mikrocontroller verarbeiten kann.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Bastlerschrieb:
> Frank E. schrieb:
>> Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix
>
> Genau so sieht es aus.
>
> Vielleicht möchte "Wegstaben V." mal Google bemühen, was ein "Tensor"
> ist...

Ich weiß schon was ein Tensor ist. Technisch halt einfach ein Vektor 
bzw. eine Matrix von Zahlenwerten. Auf der werden Rechenoperationen 
durchgeführt.

Nichts anderes habe ich mit meinem Beitrag behauptet. Es ging mir halt 
(nur) darum heruaszustellen, wo (PC bzw. µC) welche Verarbeitung statt 
findet. Das hat der Threaderöffner ja nun geklärt.

vielleicht möchtest du mal gogle bemühen, was "Algorithmen" bzw. 
"Datenstrukturen" sind.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

NatürlicheDummheit schrieb:
> Jan B. schrieb:
>> Mit TensorFlow Lite ist das möglich.
>> https://www.tensorflow.org/lite/microcontrollers
>
> Richtig guter Tipp. Das ist GENAU das, was ich gesucht habe.

Du könntest auch ein NVidia Xavier NX verwenden und hättest Du quasi die 
Volllversion von Tensorflow - GPU-beschleunigt mit speziellen 
Tensoreinheiten. Auch da kannst Du alles mögliche an Sensoren direkt 
anklemmen, auch Kameras z.B.

https://www.nvidia.com/de-de/autonomous-machines/embedded-systems/jetson-xavier-nx/

fchk

von NatürlicheDummheit (Gast)


Lesenswert?

Kurzer Statusbericht:

Mit TensorFlow Light klappt das "Deployment" des Modells auf einen ESP32 
wirklich gut (ausprobiert mit PlatformIO und Arduino-Framework).

Das komplette TF-Framework und ein einfaches Modell (z.B. das aus dem 
Sinusgenerator-Beispiel) benötigen knapp 4% des Flashs. Da ist also noch 
genug Luft für größere Modelle :-)

Danke an Jan B. für den Tipp!

von Schorschi (Gast)


Lesenswert?

Falls du einen ARM MCU nutzt, empfehler ich dir CMSIS-NN zu verwenden. 
Da du die Gewichte einzeln portieren müsstest, gibt es ein Framework, 
welches als Basis CMSIS-NN verwendet: NNoM 
(https://majianjia.github.io/nnom/)

Du kannst damit einfach dein Keras Model nach C portieren (die Gewichte 
werden umgerechnet). Achte aber darauf, dass nicht alle Funktionen von 
Keras unterstüzt sind. Ansonsten, wie bereits erwähnt bleibt Tensorflow 
Lite, was ich aber als sehr mühsam zu portieren in Erinnerung habe. Da 
die Keras Gewichte quantisiert werden, kannst du, um eine höhere 
Accuracy zu erreichen bereits dein model mit quantisierten Gewichten 
trainieren (dann hast du keine Verluste beim konvertieren). Dazu kannst 
du QKeras nehmen.
Achte zudem darauf, dass dein Model nicht zu gross wird, ansonsten hast 
du wohl zuwenig Speicher.

Als ARM Prozessor empfehle ich dir mindestens einen Cortex-M4.

von Jan B. (diphthong)


Lesenswert?

NatürlicheDummheit schrieb:
> Mit TensorFlow Light klappt das "Deployment" des Modells auf einen ESP32
> wirklich gut (ausprobiert mit PlatformIO und Arduino-Framework).

Freut mich zu hoeren!

Schorschi schrieb:
> Falls du einen ARM MCU nutzt, empfehler ich dir CMSIS-NN zu verwenden.
> Da du die Gewichte einzeln portieren müsstest, gibt es ein Framework,
> welches als Basis CMSIS-NN verwendet: NNoM
> (https://majianjia.github.io/nnom/)

Es gibt noch etliche andere aehnliche Projekte, die von irgendwelchen 
Einzelpersonen ins Leben gerufen wurden. Problem dabei ist, dass man nie 
weiss, wie lange das nun noch gewartet und auf dem Laufenden gehalten 
wird. Bei TensorFlow wird man sich darum keine Gedanken machen muessen.

von Peter (Gast)


Lesenswert?

Hinter dem ganzen CMSIS-NN Zeug steckten etlicht Leute.
Wer nun alles hinter NNoM steckt habe ich nicht gesehen.
Nach der Aufmachung steckt da kein Hobby Freak dahinter.
Und die verwenden RT-Threat, was hier zwar kaum beachtung findet, aber 
zu den  TOP RTOS zählt. Habe ich auch schon seit 7 Jahren auf einem M4 
drauf, allerdings noch eine alte Version, weil das Projekt abgeschlossen 
ist.

Ansonsten gibt es, wie Du schon sagtest, etliche Hobby NN im WWW.
Und ich bin gerade auch am suchen nach einer guten Lösung und bin noch 
unsicher was nun am besten passt. TensorFlow hört sich gut an, aber da 
wird man ja von Code nur erschalgen und findet kaum das was man 
eigentlich braucht. Einige der Hobby NN habe ich dagegen mir angesehen 
und bei teilweise nur 10 Dateien ist es fast zu übersichtlich.

von Joachim B. (jar)


Lesenswert?


von Schroschi (Gast)


Lesenswert?

Peter schrieb:
> Wer nun alles hinter NNoM steckt habe ich nicht gesehen.

Gemäss github ist das eine Person (Jianjia Ma, http://aircheese.me/).

Tensorflow wäre toll, allerdings blickt da wohl kein normaler durch, wie 
man das auf ein neues Target bringt (klar, für Arduino gehts einfach). 
Zudem besteht da noch nicht für alle ARM-Targets die Möglichkeit den 
CMSIS-NN kernel zu benutzen, welcher die speziellen DSP instruktionen 
(SIMD) verwendet und die Effizient massiv erhöht.

von Peter (Gast)


Lesenswert?

Einer muss das Ding ja anlegen.
Aber wie schon gesagt da wird nicht nur einer hinterstecken, dafür sieht 
das zu Professionel aus.

Zu Tensorflow, genau meine Meinug, Tonnen von Code und keine Sau kommt 
da mal so eben durch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.