Heim Der Blog Blog Details

Wie implementiert man ein neuronales Netzwerk mit mehreren Klassen mit STM32F103?

June 10 2025
Ampheo

Anfrage

Globaler Lieferant elektronischer Komponenten AMPHEO PTY LTD: Umfangreiches Inventar für One-Stop-Shopping. Einfache Anfragen, schnelle, individuelle Lösungen und Angebote.

SCHNELLE ANFRAGE
ZUR RFQ-LISTE HINZUFÜGEN
Wie implementiert man ein neuronales Netzwerk mit mehreren Klassen mit STM32F103?

Die Implementierung eines mehrklassigen neuronalen Netzwerks auf einem STM32F103 (Cortex-M3, 72 MHz, keine FPU, begrenzter RAM/Flash) ist aufgrund seiner begrenzten Ressourcen eine Herausforderung, aber es ist für kleine Netzwerke und niedrigdimensionale Eingänge (z.B. 2D/3D-Sensoreingänge) möglich.

Wie implementiert man ein neuronales Netzwerk mit mehreren Klassen mit STM32F103?


Hier ist, wie Sie es Schritt für Schritt tun können:

1. Ein kleines neuronales Netz am PC entwerfen

Verwende Python mit TensorFlow/Keras, um ein Modell zu erstellen und zu trainieren:

python
 

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
import numpy as np

# Beispiel-Datensatz
X = np.array([[0.1, 0.2], [0.9, 0.8], [0.2, 0.9], [0.8, 0.1]])
y = to_categorical([0, 1, 2, 0], num_classes=3)

# Kleines neuronales Netz
model = Sequential([
    Dense(6, input_shape=(2,), activation='relu'),
    Dense(3, activation='softmax')  # 3 Klassen
])

model.compile(optimizer='adam', loss='categorical_crossentropy')
model.fit(X, y, epochs=200)


 2. Modell in C konvertieren (ggf. quantisiert)

Möglichkeiten:

  • STM32Cube.AI (offizielles ST-Tool)

    • Wandelt Keras/TensorFlow-Modelle in optimierten C-Code für STM32 um

    • Integriert sich in STM32CubeMX

  • uTensor, CMSIS-NN oder TensorFlow Lite for Microcontrollers (TFLM)

    • Leichtgewichtige Inferenz-Engines für ARM Cortex-M

 Für STM32F103 ist Ganzzahl-Quantisierung (8-Bit) empfehlenswert:

bash
 
# Modell quantisieren (TFLite)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()

 3. In STM32-Projekt integrieren

A. Mit STM32Cube.AI:

  1. STM32CubeMX + STM32Cube.AI Plugin installieren

  2. .h5-Modell importieren

  3. X-CUBE-AI Middleware aktivieren

  4. Code generieren

  5. Mit aiRun() Eingabedaten übergeben und Ausgabeklasse erhalten

B. Manuell (für sehr kleine Modelle):

Wenn manuell:

  • Gewichte und Bias extrahieren

  • Forward-Pass in C implementieren:

c
 

float relu(float x) {
    return x > 0 ? x : 0;
}

void forward(float* input, float* output) {
    // Schicht 1 (2 Eingaben → 6 Neuronen)
    float hidden[6];
    for (int i = 0; i < 6; ++i) {
        hidden[i] = relu(input[0]*w1[i][0] + input[1]*w1[i][1] + b1[i]);
    }

    // Ausgabeschicht (6 → 3)
    for (int i = 0; i < 3; ++i) {
        output[i] = hidden[0]*w2[i][0] + ... + b2[i];
    }
    softmax(output, 3);
}


 4. Ausführen und Testen

  • Firmware mit STM32CubeIDE auf den STM32 flashen

  • Eingabedaten über UART senden oder Sensoren verwenden

  • Vorhergesagte Klasse über UART oder Display ausgeben


 Optimierungstipps

  • Festkomma-Arithmetik verwenden (Q7, Q15 Typen)

  • CMSIS-DSP für Matrixoperationen nutzen

  • Wenn verfügbar, CMSIS-NN verwenden – optimiert für Cortex-M

  • Modell so klein wie möglich halten: z. B. Architektur 2–1–3 oder 2–4–3


 Ressourcen

Ampheo