v4.8.0

v4.8.0 ist ein großes Feature-Release. Die Höhepunkte: ein brandneues klassenbasiertes csi-Kameramodul mit Unterstützung für mehrere Kameras, das OpenMV N6 (STM32N6) Board mit einer Neural-ART NPU, ein NPU-Inferenz-Backend, der GenX320 RAW-Event-Modus für Event-Kameras, ein neues crc-Modul, eine neu strukturierte ML-Nachbearbeitungsbibliothek und MicroPython 1.26. Außerdem werden einige veraltete APIs entfernt — das buzzer-Modul und die FLIR-Lepton-Steuerung des fir-Moduls — lies daher die folgenden Breaking Changes.

Höhepunkte

  • Neues csi-Kameramodul. Eine klassenbasierte csi.CSI-API mit Unterstützung für mehrere gleichzeitige Kameras, eingeführt neben dem veralteten sensor-Modul.

  • OpenMV N6. Das STM32N6 Board mit einer Neural-ART NPU, Triple Buffering, Soft-CSI und einem ToF-Modul.

  • NPU-Inferenz. Ein ST Neural-ART (STAI) Backend für hardwarebeschleunigte Modell-Inferenz.

  • GenX320 Event-Modus. RAW-Event-Ausgabe sowie draw_event_histogram() für das Rendering von Event-Kameras.

  • Neu strukturierte ML-Nachbearbeitung — Hersteller-Unterpakete (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) mit neuen BlazeFace- / BlazePalm- sowie Hand- und Gesichts-Landmark-Detektoren.

  • Neues crc-Modul — hardwarebeschleunigtes CRC-16 / CRC-32.

  • MicroPython auf 1.26.0 aktualisiert.

  • Breaking: das buzzer-Modul und die Lepton-Steuerung des fir-Moduls wurden entfernt (das Lepton ist jetzt eine reguläre Kamera). Siehe die fir/Lepton-Änderung und die Entfernung des buzzer.

Neue Funktionen

  • Das neue csi-Kameramodul — ein klassenbasiertes csi.CSI-Objekt mit mehreren gleichzeitigen Kameras (bis zu drei auf dem N6), nicht-blockierendem Schnappschuss, benutzerdefinierten (w, h)-Einzelbildgrößen und einer informativen print() / repr. Es wird neben dem veralteten sensor-Modul eingeführt (kein direkter Ersatz).

  • crccrc.crc16() und crc.crc32(), hardwarebeschleunigt mit Software-Fallback, auf dem OpenMV N6 und AE3.

  • image.Image.draw_image() hat ein transform=-Schlüsselwort erhalten (eine 2-D-Float-ndarray-Matrix für affine/perspektivische Verzerrungen, GPU-beschleunigt auf STM32 und Alif); dieselbe Transformation steht bei der Bildkonvertierung zur Verfügung.

  • draw_event_histogram() — rendert Histogramme von Event-Kameras.

  • GenX320 RAW-Event-Moduscsi.IOCTL_GENX320_SET_MODE mit csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, Event-Typ-Konstanten und neue Beispielskripte.

  • ML — ein ST Neural-ART (STAI) NPU-Inferenz-Backend; ml.Model hat ein postprocess=-Schlüsselwort erhalten (der Nachbearbeiter läuft jetzt automatisch innerhalb von predict(), auch ohne Callback); ml.postprocessing wurde in Hersteller-Unterpakete umstrukturiert — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo) und ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — die alten snake_case-Namen bleiben als Aliase erhalten; ml.utils.draw_keypoints() und ml.utils.draw_skeleton() wurden hinzugefügt; die mitgelieferten ROMFS-Modelle wurden erweitert (BlazeFace, YOLO-LC, YOLOv8n, Palm-/Hand-/Gesichts-Landmarks).

  • audio — MDF-Digitalmikrofon-Eingang auf dem STM32N6.

  • Display — ein SSD1351 OLED-Treiber und Beispiel; SPIDisplay-Controller können ihre Init-Befehle überschreiben; der SPI-Display-Konstruktor hat hmirror / vflip-Schlüsselwörter erhalten.

  • On-Device-Profiler — SysTick + Armv8.1-M PMU Zyklus-/Event-Zähler mit Instrumentierung auf Funktionsebene, auslesbar über die Debug-Verbindung (pyopenmv hat Profiling- und ELF-Symbol-Unterstützung erhalten).

  • Neue Sensorunterstützung — PixArt PS5520; FLIR BOSON auf dem OpenMV H7 Plus; GenX320 Auto-Erkennung.

Weitere Änderungen und Verbesserungen

  • MicroPython auf 1.26.0 aktualisiert.

  • Kamerastart — der Sensortakt wurde vom CSI-Status entkoppelt, die Kameraerkennung beim Booten ist schneller (die häufigste Konfiguration wird zuerst versucht) und der Standardtakt des OpenMV 3 OV7725 wurde korrigiert.

  • Bildqualität — die Software-ISP-Gammakorrektur (Alif und STM32) und die Bad-Pixel-Korrektur (STM32) sind standardmäßig aktiviert; die Sensoren PAG7936 und PS5520 haben Auto-Weißabgleich-Steuerungen erhalten.

  • Leistungimage.Image.to_ndarray() ist mit Helium SIMD beschleunigt und der FOMO-Nachbearbeiter wurde mit ulab vektorisiert.

  • FLIR-Lepton-Treiber neu geschrieben, um Einzelbilder asynchron im Hintergrund zu empfangen — Rotation/transpose funktioniert jetzt, das Zeichnen skaliert bilinear hoch und der Reset ist schneller.

  • Aufnahmedurchsatz — das i.MX RT1062 CSI nutzt jetzt vollständiges DMA-Offload und das STM32 N6 verfügt über ein Hardware-GPU-draw_image().

Fehlerbehebungen

Kamera und Sensoren:

  • RGB565- / GRAYSCALE- / BAYER- / YUV422-Modi über die STM32-Sensoren, PAJ6100 auf dem OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565 und die N6 CSI Mono- / RGB-YUV-Konfiguration korrigiert; die Software-Testkamera setzt sich jetzt deterministisch zurück.

  • Der Auto-Weißabgleich färbt das Bild bei niedrigen oder variablen Bildraten nicht mehr grün (ein gleitender Durchschnitt über 250 ms ersetzt die Abtastung alle 100 Einzelbilder) und das PS5520-Luminanzflackern wurde behoben.

Bildverarbeitung:

  • Ein Rendering-Fehler beim Linienzeichnen wurde behoben; image.Image.flush() leert jetzt den JPEG-Puffer des Bildes, auf dem es aufgerufen wurde; Normalization wendet Mittelwert/Standardabweichung jetzt auf Float-Eingaben an; die Bildallokation aus Dateien wurde korrigiert.

Kameraaufnahme:

  • Schwerwiegende Bildkorruption bei Nicht-JPEG-Übertragungen behoben (der Einzelbild-Interrupt wird jetzt nur im JPEG-Modus aktiviert), JPEG-Modus-3-Unterstützung sowie DMA-Zeilengröße und Lockups bei kleinen Puffern auf STM32; die VOSPI- / Lepton-Synchronisation ist zuverlässiger, insbesondere auf dem N6.

Verschiedenes:

  • omv.board_id() gibt die korrekte UID auf dem RT1060 zurück; YoloV2 stürzt nicht mehr ab, wenn es ohne explizite Anker konstruiert wird.

Hardware- und Board-Unterstützung

  • OpenMV N6 — STM32N6 mit einer Neural-ART NPU, Triple Buffering, SPI-LCD-/TV-Ausgabe, Soft-CSI, dem tof-Modul und mitgelieferten ROMFS-Modellen.

  • Arduino GIGA — MIPI-DSI-Display-Ausgabe.

  • Neue Sensoren — PixArt PS5520; FLIR BOSON auf dem OpenMV H7 Plus; GenX320 Auto-Erkennung.

  • OpenMV Pure Thermal — das FLIR Lepton ist jetzt ein regulärer (sekundärer) Kamerasensor.

  • Alif AE3 — Software-ISP-Gammakorrektur, das crc-Modul und SPI-Fehlerbehebungen.

Breaking API-Änderungen

Für Benutzer sichtbare API-Änderungen zwischen v4.7.0 und v4.8.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 verwendeten, müssen angepasst werden.

  • minor — schmale API; betrifft nur Skripte, die sie verwendeten.

  • behavior — gleiche API, andere Ergebnisse; überprüfe optimierte Skripte erneut.

  • tooling — betrifft nur Host-Tools / das Bauen aus dem Quellcode.

Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert — zuerst major, dann minor, behavior und tooling. Wenn du nur deinen Code portieren möchtest, springe zur Migrations-Checkliste am Ende für eine komprimierte To-do-Liste. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub.

FLIR Lepton vom fir-Modul verschoben (major)

Das FLIR Lepton wird jetzt als regulärer Kamerasensor angesteuert, statt über das fir-Modul. Die Lepton-Steuerung wurde aus fir entfernt: der FIR_LEPTON-Typ und die Methoden radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() und trigger_ffc() sind verschwunden. Nimm das Lepton wie jede andere Kamera auf (es erscheint als sekundärer Sensor auf dem OpenMV Pure Thermal); das Pure-Thermal-Beispiel wurde auf die neue API umgeschrieben. Die Nicht-Lepton-fir-Sensoren (Grid-EYE, MLX, AMG8833) sind unverändert.

Commits: bacfb7aeb, 117710566, 592a22902, 1a614202e

buzzer-Modul entfernt (minor)

Das buzzer-Modul wurde aus den STM32- und i.MX RT-Ports entfernt. Steuere den Buzzer stattdessen mit machine.PWM; ein Pure-Thermal-Buzzer-Beispiel mit PWM wurde hinzugefügt.

Commits: ccb947924, 444120f2d

omv.disable_fb() entfernt (minor)

Die Funktion omv.disable_fb() wurde entfernt; das Framebuffer-Streaming wird jetzt über die Kamera-API gesteuert. Die veralteten RPC-Desktop-Skripte, die darauf angewiesen waren, wurden ebenfalls entfernt.

Commits: 84c3db58a, 6fe99051c

csi ist neu — seine API ist noch nicht eingefroren (minor)

Das csi-Modul wird in v4.8.0 eingeführt und seine API hat sich während des Releases weiterentwickelt: csi.fb() wurde entfernt und csi.CSI.snapshot() (image=...) erfordert jetzt ein veränderbares Bild und zeichnet/skaliert das aufgenommene Einzelbild hinein, statt eine rohe Tiefenkopie zu erstellen. Frühe Anwender des neuen Moduls sollten erneut testen; die veraltete sensor-API ist nicht betroffen.

Commits: 0bc0385eb, 8cd7a309f

image.ImageIO Stream-Modus und close() (minor)

image.ImageIO — das mode-Argument akzeptiert jetzt nur noch kleingeschriebenes 'r' / 'w' (Großschreibung wird mit einer aktualisierten Fehlermeldung abgelehnt), und das Öffnen mit 'w' kürzt/erstellt die Datei jetzt immer neu, statt einen bestehenden Stream zu erhalten. ImageIO.close() ist jetzt idempotent (das Schließen eines bereits geschlossenen Streams löst keinen Fehler mehr aus) und gibt None zurück statt des Stream-Objekts.

Commits: 715c4cbba, 21ceec422

BlazeFace- / BlazePalm-Rückgabewert (minor)

Die Nachbearbeiter BlazeFace und BlazePalm (neu in diesem Release) geben jetzt eine einzelne Begrenzungsrahmen-Liste zurück statt der vollständigen Liste pro Klasse — Aufrufer indizieren das Ergebnis direkt statt mit [0].

Commit: 75e16b573

ML-Nachbearbeiter-Callback erhält rohe Tensoren (behavior)

Ein predict()-Nachbearbeitungs-Callback von ml.Model erhält jetzt die rohen (quantisierten) Ausgabe-Tensor-Referenzen statt vorab konvertierter Float-ndarrays — dies vermeidet Speichererschöpfung bei großen Modellen. Wenn kein Callback angegeben wird, wird weiterhin das Float-ndarray zurückgegeben. Benutzerdefinierte Callbacks müssen die Tensoren selbst dequantisieren (die eingebauten Nachbearbeiter tun dies bereits).

Commit: 84e6ee650

Kameratakt vom CSI-Status entkoppelt (behavior)

Der Sensortakt ist jetzt unabhängig vom CSI-Status. set_clock / set_frequency konfiguriert den Takt nur dann neu, wenn die angeforderte Frequenz um mehr als eine Toleranz abweicht, und get_clk_frequency nimmt einen Boolean entgegen, um die exakte (statt der nominalen) Frequenz zurückzugeben. Der Standardtakt beträgt 24 MHz auf dem OpenMV N6 und AE3, sodass beim Booten kein explizites set_clock() erforderlich ist. Skripte, die den Takt für zeitkritische Aufnahmen umschalteten, sollten ihre Annahmen erneut überprüfen.

Commits: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

USB-Debug-Protokoll und Firmware-Targets (tooling)

Nichts davon betrifft MicroPython-Skripte. Veraltete USBDBG-Befehle (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) wurden entfernt und nicht unterstützte Befehle älterer IDEs werden jetzt geleert, statt TinyUSB-Boards beim Verbinden zum Absturz zu bringen; das veraltete STM32 UVC-Firmware-Target wurde entfernt. Alte Host-Tools sollten aktualisiert werden; siehe die Historie des Firmware-Repositorys für Details.

Commits: 90bd11e93, 657c9a632, 35182f035

Migrations-Checkliste

Für eine saubere Portierung auf v4.8.0 ist die typische Arbeit:

  1. Wenn du das FLIR Lepton über fir verwendet hast, wechsle dazu, es als Kamerasensor aufzunehmen (die fir/Lepton-Änderung).

  2. Ersetze jede buzzer-Verwendung durch machine.PWM (die Entfernung des buzzer).

  3. Entferne omv.disable_fb()-Aufrufe (die Entfernung von omv.disable_fb()).

  4. Für image.ImageIO: verwende kleingeschriebenes 'r'/'w' und erwarte, dass 'w' kürzt (die ImageIO-Änderung).

  5. Für benutzerdefinierte ML-Nachbearbeitungs-Callbacks: dequantisiere die rohen Tensor-Referenzen selbst oder verlasse dich auf den standardmäßigen Float-Pfad (die Callback-Änderung).

  6. Überprüfe jedes Skript erneut, das den Sensortakt für zeitkritische Aufnahmen ansteuerte (die Takt-Änderung).