v4.7.0

v4.7.0 ist ein großes Feature-Release. Die Highlights: Das neue OpenMV AE3-Board (Alif Ensemble, Cortex-M55 + Ethos-U55 NPU) mit einem Dual-Core-openamp-Programmiermodell, ein schreibgeschütztes ROMFS-Dateisystem (/rom) mit mitgelieferten Modellen und Kaskaden, VL53L8CX-8x8-Time-of-Flight-Unterstützung, neue YOLOv8- / YOLO-LC-Postprozessoren und MicroPython 1.25. Außerdem ändert sich, wie eingebaute Modelle und Haar-Kaskaden geladen werden, also lies die nachfolgenden Breaking Changes.

Highlights

  • OpenMV-AE3-Board — das Alif-Ensemble-Board (Cortex-M55 + Ethos-U55 NPU) mit vollständigem Port, Bootloader und ROMFS.

  • Dual-Core-openamp-Modul — lagere Arbeit über RPMsg an den zweiten Alif-Core aus (der @async_remote-Dekorator, Endpoint/EndpointIO).

  • ROMFS — ein schreibgeschütztes /rom-Dateisystem mit eingebauten TFLite-Modellen und Haar-Kaskaden sowie ein neuer tools/mkromfs.py-Host-Builder.

  • VL53L8CX 8x8-Multi-Zone-Time-of-Flight-Sensor-Unterstützung.

  • Neue ML-Postprozessorenyolo_v8_postprocess und yolo_lc_postprocess.

  • MicroPython auf 1.25.0 aktualisiert.

  • Breaking: Eingebaute Modelle und Haar-Kaskaden werden jetzt per Pfad aus /rom geladen (siehe die ml.Model-Änderung und die Haar-Kaskaden-Änderung).

Neue Funktionen

  • OpenMV AE3 — neues Alif-Ensemble-Board (Cortex-M55-Anwendungskern + Ethos-U55 NPU), mit Port, Bootloader, Board-Konfiguration, RGB-LED und ROMFS-Unterstützung.

  • openamp — ein neues Modul für das Alif-Dual-Core-RPC-Modell (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback und der @async_remote-Dekorator zum Auslagern marshallter Funktionen an den zweiten Core. Die HE-/HP-Cores liefern einen standardmäßigen asyncio-basierten _boot.py-Task-Runner mit.

  • audio — der Alif-Port fügt das Audiomodul (PDM-Mikrofon) mit einer callback-basierten Streaming-API (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) auf dem AE3 hinzu.

  • ROMFS — ein schreibgeschütztes /rom-Dateisystem mit eingebauten Assets (TFLite-Modelle, Haar-Kaskaden, …), pro Board paketiert, ein neues tools/mkromfs.py-Host-Tool (tflite, tflite+vela, Haar-Kaskade, Text, Binärdatei) und ein scripts/libraries/romfs.py-Helfer, der ls_romfs() bereitstellt.

  • ML-Postprocessing — neue Klassen yolo_v8_postprocess (YOLOv8) und yolo_lc_postprocess (leichtgewichtige tiny-YOLOv2-Variante mit für Embedded optimierten Standard-Anchors), die jeweils threshold, nms_threshold und nms_sigma annehmen.

  • GenX320-Anti-Flicker — ein neuer IOCTL_GENX320_SET_AFK-ioctl zum Aktivieren und Konfigurieren des Anti-Flicker-Filters des Ereignissensors (min./max. Flimmerfrequenz in Hz), mit einem genx320_grayscale_set_afk.py-Beispiel.

  • VL53L8CX — Unterstützung für den 8x8-Multi-Zone-Time-of-Flight-Sensor über das tof-Modul (automatisch erkannt, 8x8 bei 15 Hz).

Weitere Änderungen und Verbesserungen

  • MicroPython auf 1.25.0 aktualisiert (STM32- und i.MX-RT-Ports), mit dem hinzugefügten Upstream-Alif-Port und entfernten alten BT-HCI-Treibern aus den STM32- / i.MX-RT-Ports.

  • GenX320 — eine neue ISSD-Sequenz verdoppelt den internen Pixeltakt (24 → 48 MHz) für höhere Bildraten.

  • STM32N6 / ST Edge AI — Grundlagen für die STM32N6-Neural-ART-Modellbereitstellung (ST-Edge-AI-Tooling und ROMFS-Unterstützung).

  • PAG7936 — die CSI-PHY-Bitrate wird jetzt gesetzt, was den Betrieb dieses Sensors verbessert.

Fehlerbehebungen

Kamera und Sensoren:

  • Die IMU über I2C behoben — Boards, die die LSM6DSx-IMU über I2C verdrahten, initialisieren und lesen jetzt korrekt (der I2C-Pfad nutzte zuvor einen fehlerhaften Lesepfad und falsche Konstanten).

  • Die FLIR-Boson-Initialisierung wiederholt jetzt bis zu 10 Mal für ältere Sensoren (< IDD 4.x), die ~10 s zum Booten brauchen, und die Werkseinstellungen werden beim Reset wiederhergestellt, sodass extern geladene Einstellungen die Videoausgabe nicht beeinträchtigen können.

  • Behoben, dass GenX320-psee_ehc_activate_override die falsche (null) Akkumulationszeit schrieb.

  • Auf STM32-Boards ohne FastMode+-Hardware wird die Anforderung des I2C-Fast-Mode jetzt korrekt abgesichert, statt den Bus stillschweigend fehlzukonfigurieren.

Maschinelles Lernen:

  • Das Sammeln von Begrenzungsrahmen und die np.nonzero-Behandlung in den YOLOv2- / YOLOv5-Postprozessoren behoben, was die Zuverlässigkeit der Erkennung verbessert.

Hardware- und Board-Unterstützung

  • OpenMV AE3 — neues Alif-Ensemble-Board (Cortex-M55 + Ethos-U55 NPU).

  • VL53L8CX — 8x8-Multi-Zone-Time-of-Flight-Sensor; der ToF-Sensor des AE3 wurde vom VL53L5CX auf den VL53L8CX umgestellt.

  • STM32N6 — Grundlagen für die ST-Edge-AI-(Neural-ART)-Modellbereitstellung.

Breaking API Changes

Für Benutzer sichtbare API-Brüche zwischen v4.6.20 und v4.7.0. 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 — eingeschränkte API; betrifft nur Skripte, die sie verwendet haben.

  • behavior — gleiche API, andere Ergebnisse; abgestimmte Skripte erneut überprüfen.

Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert. Wenn du nur deinen Code portieren möchtest, springe für eine kompakte To-do-Liste zur Migrations-Checkliste am Ende. Jeder Commit-Hash verweist auf seinen Diff auf GitHub.

Eingebaute Modelle werden per Pfad geladen, nicht per Name (major)

ml.Model lädt ein eingebautes Modell nicht mehr aus einem reinen Namens-String. Modelle werden jetzt per Pfad aus dem Dateisystem / ROMFS geladen:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

Das C-seitige model.labels-Attribut wurde entfernt; Labels werden jetzt vom Python-ml.Model-Wrapper aus einer begleitenden <model>.txt-Datei geladen (None, falls nicht vorhanden). Alle mitgelieferten Beispiele und ml/apps.py wurden auf /rom/*.tflite-Pfade aktualisiert.

Commits: 978fa436c, 3f55d956c, 416bc4613

Haar-Kaskaden werden aus ROMFS geladen (minor)

image.HaarCascade() lädt eingebaute Kaskaden jetzt über das VFS / ROMFS. Die Standard-Frontal-Gesichtskaskaden-Datei wurde von haarcascade_frontalface_default.xml in haarcascade_frontalface.xml umbenannt, und ein Ladefehler löst jetzt einen RuntimeError („Failed to load Haar cascade“) statt eines OSError aus.

Commit: 9de1220d8

Semantik von tof.reset() / tof.deinit() (behavior)

Im tof-Modul war reset() zuvor ein Alias für init(), und es gab kein echtes Deinit. tof.reset() führt jetzt einen tatsächlichen Sensor-Reset durch, und tof.deinit() fährt den Sensor ordnungsgemäß herunter (mit VL53L5CX-Shutdown-Unterstützung). Code, der sich darauf verließ, dass reset() den Sensor neu initialisiert, sollte erneut überprüft werden.

Commits: 20d6b53f8, c743cab6a

GenX320-Timing- und Ereignismodus-Einschränkungen (behavior)

Die neue GenX320-ISSD-Sequenz ändert die Zeitbasis des Sensors: Bildraten- und Belichtungsargumente werden jetzt in 1-MHz-Einheiten ausgedrückt, statt taktskaliert zu sein, und das HSYNC-Blanking wird dynamisch an die angeforderte Bildrate angepasst. Skripte, die GenX320-Timing-Werte fest codiert haben, müssen neu abgestimmt werden. Die Ereignismodus-Erfassung löst jetzt einen Fehler aus, wenn die Bildtransposition aktiviert ist (sie wird in dieser Konfiguration nicht unterstützt).

Commits: 660a783d6, 7a718c6af

Migrations-Checkliste

Für eine saubere Portierung auf v4.7.0 fallen typischerweise folgende Arbeiten an:

  1. Ändere das Laden eingebauter Modelle von einem Namens-String auf einen /rom/<name>.tflite-Pfad und stelle Labels über eine begleitende <name>.txt-Datei bereit (die ml.Model-Änderung).

  2. Aktualisiere haarcascade_frontalface_default.xml auf haarcascade_frontalface.xml und fange bei einem Kaskaden-Ladefehler einen RuntimeError (nicht OSError) ab (die Haar-Kaskaden-Änderung).

  3. Entferne Code, der sich darauf verließ, dass tof.reset() den Sensor neu initialisiert (die tof-Änderung).

  4. Stimme alle fest codierten GenX320-Bildraten- / Belichtungswerte auf 1-MHz-Einheiten neu ab und aktiviere im Ereignismodus keine Transposition (die GenX320-Änderung).