v4.5.6

v4.5.6 ist das große Machine-Learning-Release. Das TensorFlow-C-Modul tf wurde durch ein neues, engine-unabhängiges ml-Paket auf Basis von TensorFlow Lite Micro (TFLM) ersetzt, die Bild→Tensor-Konvertierung wurde nach image.to_ndarray() verschoben, und Dual-Core-Boards wurden auf Open-AMP umgestellt. Es gibt mehrere Breaking Changes — lesen Sie sie weiter unten, bevor Sie ML-Skripte aktualisieren.

Höhepunkte

  • Neues ml-Paket — das alte tf-Modul wurde in ein engine-unabhängiges ml-Paket umgeschrieben (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf bleibt als Alias erhalten.

  • TFLM-Backend — das veraltete libtf wurde durch das Upstream-basierte TensorFlow Lite Micro ersetzt: ~20 % schnellere Inferenz und kleinere Bibliotheken.

  • Open-AMP Dual-Core — GIGA und Portenta H7 nutzen jetzt Open-AMP/RPMsg für die M7/M4-Kommunikation zwischen den Kernen (der alte CM4-Mechanismus wurde entfernt).

  • Onboard-Bluetooth — CYW43-Bluetooth-Firmware auf Nicla Vision, Portenta H7 und GIGA aktiviert.

  • MicroPython 1.23.0, ulab 6.5.2 (mit Unterstützung für 4-D-ndarrays).

  • Breaking: die ML-API hat sich erheblich geändert und Haar-Kaskaden sind auf den meisten Boards standardmäßig deaktiviert — siehe die Breaking Changes.

Neue Funktionen

  • ml-Paketml.Model mit predict() (roi, callback, Liste mehrerer Eingaben), Pro-Tensor-Attributen für Shape/dtype/Scale/Zero-Point, ml.preprocessing.Normalization, ml.utils (NMS) und ml.apps (ein reiner Python-MicroSpeech-Keyword-Spotter mit listen() und nicht-blockierendem timeout=-1-Streaming sowie draw_predictions()).

  • Integriertes Modellsystem — in models/index.txt aufgeführte Modelle werden je nach Board bedingt eingebettet (FOMO auf allen ML-Boards, Audiomodelle auf Boards mit Mikrofonen).

  • image.to_ndarray(dtype, buffer=...) — konvertiert ein Bild in ein ulab-ndarray (optional in-place).

  • Image() aus rohen Arrays — neue Keyword-Argumente shape=, strides= und scale= erzeugen Graustufen-/RGB565-Bilder aus rohen Pixellisten.

  • Kantenglättendes draw_circle().

  • ssl-Modul in die Firmware eingefroren auf GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 und Pico.

  • Audioaudio.init() erhielt ein samples=-Keyword (PDM-Samples pro Kanal); gain_db wirkt jetzt auch auf DFSDM-Mikrofonen (z. B. Nicla Vision).

  • Debug-Protokoll — ein neuer GET_STATE-Befehl liefert Run-/Text-/JPEG-Flags, Frame-Geometrie und Text in einem einzigen Paket und reduziert so die Host-Roundtrips.

  • Open-AMP-vuart-Beispiel für die Kommunikation zwischen den Kernen.

Weitere Änderungen und Verbesserungen

  • MicroPython auf 1.23.0 aktualisiert; ulab auf 6.5.2 mit Unterstützung für 4-D-ndarrays.

  • Schnellere Inferenz — das ML-Backend behält persistenten Status/Speicher über Aufrufe hinweg bei (~20 % schneller, unterstützt LSTM-artige Modelle).

  • get_similarity() wurde auf dem draw_image-Backend neu implementiert (breitere Format-/Operationsunterstützung).

  • morph() und die mean()-Filterfamilie wurden auf Keyword-Argument-Parsing umgestellt; mask= akzeptiert jetzt ein veränderbares Bild.

  • Speicherlayout überarbeitet — DMA-Bereiche an Zweierpotenzen ausgerichtet, umordbare GC-Blöcke, mehrere Heaps; weniger frühe Heap-Fragmentierung auf Boards mit wenig RAM; RT1060 erhält zusätzlichen GC-Heap.

  • WLAN (CYW43) wird jetzt beim Soft-Reset deinitialisiert; das SPI-TV-Display leert nur den Framebuffer-Bereich aus dem Cache für flüssigere Aktualisierungen.

Fehlerbehebungen

Kamera und Sensoren:

  • Behebung einer versehentlichen CPU-Cache-Invalidierung im Framebuffer-/Sensor-Pfad auf STM32 und i.MX RT, die Bilddaten beschädigen konnte.

  • Behebung der MLX90640/MLX90641-Thermal-I2C-Reads auf i.MX-RT-Boards (große Übertragungen werden jetzt in Blöcke aufgeteilt).

Maschinelles Lernen:

  • Behebung der ml.Model-Behandlung von load_to_fb, der Größenbestimmung des Eingabe-bytearray, der ndarray-ndim-Prüfungen und der Normalization-Bildformat-/Shape-Validierung.

Bild / System:

  • Hinzufügen der fehlenden image.BLACK_BACKGROUND-Zeichenhinweis-Konstante und einer Plausibilitätsprüfung der Bild-/Tensor-Pufferlänge.

  • Behebung von FIR- und Audio-GC-Root-Pointern, die den Collector im Gebrauch befindliche Puffer freigeben lassen konnten.

  • Das Servo-Shield-Beispiel verwendet jetzt SoftI2C, damit es auf OpenMV-RT-Boards funktioniert.

Hardware- und Board-Unterstützung

  • Arduino GIGA — HM01B0-/HM0360-Sensorunterstützung; Open-AMP Dual-Core.

  • Bluetooth — CYW43-BT-Firmware auf Nicla Vision, Portenta H7 und GIGA.

  • Portenta H7 — Open-AMP M7/M4 RPMsg.

  • OpenMV RT1060 — zusätzliche GC-Heap-Blöcke (mehr Python-Speicher).

Breaking-API-Änderungen

Für Benutzer sichtbare API-Brüche zwischen v4.5.5 und v4.5.6. Umfang: Python-C-Module in modules/ und Python-Bibliotheken in scripts/libraries/.

Jede Änderung ist mit ihrer Auswirkung gekennzeichnet:

  • major — die meisten Skripte, die es verwendet haben, müssen angepasst werden.

  • minor — schmale API; betrifft nur Skripte, die es verwendet haben.

  • behavior — gleiche API, andere Ergebnisse; getunte Skripte erneut prüfen.

  • tooling — betrifft Dual-Core-/Board-Mechanismen, nicht die Python-API.

Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert. Wenn Sie nur Ihren Code portieren möchten, springen Sie zur Migrations-Checkliste am Ende. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub.

tf-Modul durch das ml-Paket ersetzt (major)

Das TensorFlow-C-Modul tf wurde in ein engine-unabhängiges ml-Paket umgeschrieben (tf bleibt als abwärtskompatibler Alias erhalten, aber neuer Code sollte ml verwenden). Die modulebene-Funktionen tf.load, tf.load_builtin_model und die Methoden detect()/segment()/Klassifizierung wurden entfernt — erstellen Sie ein ml.Model und rufen Sie predict() auf. ml.Model(path) gibt jetzt nur noch das Modell zurück (kein (labels, model)-Tupel); Labels sind ein model.labels-Attribut. predict() gibt jetzt ulab-ndarrays zurück (keine Float-Tupel), unterstützt Modelle mit mehreren Eingaben (Liste übergeben), und NMS wurde nach ml.utils verschoben; die Eingabenormalisierung wurde nach ml.preprocessing.Normalization verschoben. Das alte ml.py ist jetzt ml.apps.

Commits: c7228cbb4, 6c212409c, 3e37f46db, 9a186f4e2, 70b89f474, 3f8491cb0, 4506682c2, 8b38f3837

image.unpack() entfernt — verwenden Sie to_ndarray() (major)

Das kurzlebige image.unpack() wurde entfernt; konvertieren Sie ein Bild stattdessen mit image.to_ndarray(dtype, buffer=...) in einen Tensor und wenden Sie Scale-/Mean-/Stdev-Normalisierung mit ml.preprocessing.Normalization an, statt des alten eingebauten Bildskalierungspfads.

Commits: 9848eed12, de0d46fa6

Image()-Roh-Array-scale-Argument (minor)

Beim Erstellen eines Image aus einem rohen Pixel-Array nimmt das scale-Argument jetzt einen (min, max)-Bereich statt (scale, add).

Commit: 7b79fb4c7

Haar-Kaskaden auf den meisten Boards standardmäßig deaktiviert (behavior)

Um Flash-Speicher freizugeben, ist die Haar-Kaskaden-Gesichtserkennung (find_features() / image.HaarCascade()) jetzt standardmäßig auf Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO und OpenMV Pure Thermal deaktiviert. Skripte, die auf diesen Boards Haar-Kaskaden verwenden, müssen die Firmware mit aktivierter Funktion neu bauen.

Commit: 6ce27c910

Skriptunterbrechung und Tensor-Skalierung (behavior)

Der USB-Debugger unterbricht ein laufendes Skript jetzt über die VM-Abort-Funktion von MicroPython statt über einen erzwungenen PendSV-Sprung (sauberer, aber der Unterbrechungspunkt unterscheidet sich). Die SCALE_S128_127-Eingabeskalierung wurde korrigiert, sodass 0–255 ohne fehlerhafte Verstärkung auf −128–127 abgebildet werden — Modelle, die auf der alten (fehlerhaften) Skalierung beruhen, liefern andere Ergebnisse.

Commits: e758a0f95, a4d97c572

CM4-Koprozessor durch Open-AMP ersetzt (tooling)

Der veraltete CM4-Koprozessor-Firmware-Mechanismus auf GIGA / Nicla Vision / Portenta H7 wurde entfernt und durch Open-AMP/RPMsg ersetzt. Dual-Core-Code muss auf das Open-AMP-Modell umgestellt werden (ein vuart-Beispiel ist beigefügt).

Commits: 3cc57fea4, 93f2d4c41

Migrations-Checkliste

Für eine saubere Portierung auf v4.5.6 ist typischerweise folgende Arbeit nötig:

  1. ML-Code auf ml portieren: ml.Model(path) erstellen, predict() aufrufen, model.labels lesen, ndarray-Ausgaben erwarten und die Normalisierung nach ml.preprocessing.Normalization sowie NMS nach ml.utils verschieben (die Änderung am ml-Paket).

  2. image.unpack() durch image.to_ndarray() ersetzen (die Entfernung von unpack).

  3. Jedes Image()-Roh-Array-scale-Argument auf einen (min, max)-Bereich aktualisieren (die Image-Scale-Änderung).

  4. Wenn Sie Haar-Kaskaden auf einem betroffenen Board verwenden, mit aktivierter Funktion neu bauen (die Haar-Kaskaden-Änderung).

  5. Modelle, die von SCALE_S128_127 abhingen, erneut validieren (die Skalierungsänderung).

  6. Dual-Core-Code auf Open-AMP umstellen (die CM4-Änderung).