v5.0.0#
v5.0.0 ist ein Major-Release. Die wichtigsten Neuerungen: die neu aufgebaute OpenMV Protocol V2-Host-Verbindung, eine klassenbasierte csi-Kamera-API, die auf Boards mit mehreren Kameras skaliert, ein lauffähiges Simulator-Target, MoveNet-Einzelposenschätzung, MicroPython 1.28 und eine große Reihe von Korrekturen für Kamera, ML und ToF. Außerdem bringt es einige API-Brüche mit sich — jede für Benutzer sichtbare Änderung seit v4.8.1 ist unten aufgeführt, zusammen mit genauen Migrationshinweisen.
Highlights#
OpenMV Protocol V2. Die Host-/IDE-Verbindung wurde von Grund auf neu aufgebaut: gerahmt, sequenziert, CRC-geprüft, mit gemultiplexten Kanälen für stdio, die Stream-Vorschau und Benutzerdaten. Ein neues
protocol-Modul ermöglicht es Skripten, eigene Transports und Datenkanäle zu erstellen. Siehe die Änderungen am protocol-Modul.Klassenbasierte
csi-Kamera-API.import sensorwird zuimport csi/csi.CSI, mit nativer Unterstützung für mehrere Kameras. Siehe die csi-Migration.Simulator-Target. Die Firmware lässt sich nun unter dem Arm FVP / QEMU-Simulator (MPS2/MPS3) bauen und ausführen, einschließlich NPU-, ROMFS- und PSRAM-Emulation — Vision- und ML-Skripte können ohne angeschlossene Hardware laufen.
MoveNet-Posenschätzung. Ein neuer
MoveNet-Postprozessor sowie ein mitgeliefertesmovenet_singlepose_192.tflite-Modell auf OpenMV AE3 und N6.MicroPython 1.28 und ulab 6.12.0, ST Edge AI 4.0-Tooling sowie das ausgelagerte OpenMV SDK (siehe die Build-/Tooling-Änderungen).
Neue Funktionen#
Das
protocol-Modul — erstellen Sie benutzerdefinierte Transports und Datenkanäle aus Python:protocol.init(),protocol.register(),protocol.is_active()und eineprotocol.ProtocolChannel-Klasse mitsend_event(), plusCHANNEL_FLAG_*- undCHANNEL_ID_*-Konstanten. Die endgültige Signatur vonprotocol.init()ist in den Änderungen am protocol-Modul dokumentiert.protocol.CBORChannel— ein eingefrorenesprotocol-Erweiterungspaket, das benannte Felder in CBOR serialisiert, mit Anzeige-Widgets (Label, Tiefe) und interaktiven Steuerelementen (Umschalter, Schieberegler, Auswahl).Host-Speicher- und Stream-Introspektion — ein neuer
SYS_MEMORY-Protokollbefehl stellt der IDE Laufzeit-Speicherstatistiken pro Pool bereit, und ein neuerSTREAM_SOURCE-Stream-ioctl ermöglicht es dem Host, auf Boards mit mehreren Kameras auszuwählen, welche Kamera die Vorschau speist (Protokollversion 1.0.1).Streaming mit mehreren Kameras —
csi.CSInimmt einstream=-Argument entgegen, das auswählt, welcher Sensor die IDE-Vorschau speist; der Stream-Frame-Header trägt nun eine EMA-geglättete FPS-Angabe, sodass die IDE die Bildrate ohneclock.fps()-Boilerplate anzeigt. Siehe die csi-Migration und die csi-Folgeänderungen.GenX320-Event-Sensor — ein neuer Spatio-Temporal-Contrast-Filter (
csi.IOCTL_GENX320_SET_STCmit den Modicsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYundcsi.GENX320_STC_TRAIL) sowie das Lesen von Roh-Events (csi.IOCTL_GENX320_READ_EVENTS_RAW), mit neuen Beispielskripten.MoveNet— ein neuer MediaPipe-Einzelposen-Postprozessor (threshold-,nms_threshold-,nms_sigma-Schlüsselwortargumente), der((x, y, w, h), score, keypoints)mit einem 17-Gelenk-COCO-Keypoint-Array zurückgibt; einmovenet_singlepose_192.tflite-Modell und ein Beispiel sind auf dem AE3 und N6 mitgeliefert.ml.utils.draw_predictions()— ein neues optionalesscores=-Argument hängt die Konfidenz pro Label an, Schriftart und Box-Strichstärke skalieren nun automatisch mit der Bildbreite, und ein neuerformat="point"-Modus zeichnet eine Mittelpunktmarkierung für Centerpoint-/Peak-Detektoren.Die neue
display.TVDisplay-Klasse (mit einem generischenioctl()) ersetzt das eigenständigetv-Modul. Siehe die Änderungen am display-Modul.Ein neuer
find_line_segments()-Detektor (ED-Lines) — nun in allen Builds verfügbar, mit einem neuenthreshold=-Argument. Siehe die Änderungen am image-Modul.
Weitere Änderungen und Verbesserungen#
MicroPython auf 1.28.0 aktualisiert von der v4.8.1-Basis. Fügt Hochgeschwindigkeits-SD-Karten-Modus auf H5/H7/N6, AHB5-Taktung im Low-Power-Modus und als GPIOs steuerbare JTAG-Pins auf dem OPENMV_AE3 hinzu.
ulab auf 6.12.0 aktualisiert — nativer
%-Operator auf ndarrays (der Hilfsfunktionml.utils.mod()wurde entfernt; siehe die Änderungen an der ML-Bibliothek).ST Edge AI-Tooling auf 4.0 aktualisiert — betrifft die Kompilierung und Bereitstellung von ST-Modellen auf dem Gerät.
ml.Model— das Schlüsselwortargumentload_to_fbwurde entfernt; der Modellspeicher wird automatisch vom vereinheitlichten Allokator verwaltet.image.Image.scale()direkt vor Ort — das direkte Hochskalieren eines Bildes (zum Beispielimg.scale(x_scale=2.0, y_scale=2.0)) vergrößert nun den Framebuffer passend, anstatt fehlzuschlagen.Größerer stdio-Puffer — der Standard-Textpuffer zur IDE wuchs auf OpenMV 2/3/4, Nicla Vision, AE3 und N6 von 512 auf 1024 Byte, sodass größere
print()-Schübe nicht abgeschnitten werden.Gleichmäßigerer Host-Event-Fluss — stdout-NOTIFY-Events an den Host werden auf höchstens eines pro Host-Lesevorgang gedrosselt statt eines pro
print(), das die Ringpuffer-Wassermarke überschreitet.Unterbrechbare lange Operationen — lange Bildzeichen-, GPU- (Nema/Dave2D) und NPU-Warteschleifen bedienen Events nun in einem deterministischen Intervall, sodass Skripte während aufwändiger Arbeit für den Stop-Button der IDE ansprechbar bleiben.
Fehlerbehebungen#
Kamera und Sensoren:
find_apriltags()beschädigt auf D-Cache-/GPU-Boards (N6, AE3) keine Ergebnisse mehr und funktioniert nun auf dem AE3.Bayer-Bildausgabe vom STM32 N6 ISP nach dem Umschalten von Pixelformaten korrigiert.
Grünstich-Überstrahlung beim automatischen Weißabgleich in hellen Szenen sowie einen Fall mit nicht initialisierten AWB-Statistiken im ersten Einzelbild behoben; den STM32-ISP-Gamma-Clamp (32 auf 63) für einen größeren Gamma-/Kontrast-/Helligkeitsbereich angehoben.
PS5520-Autobelichtung oszilliert in hellem Licht nicht mehr; das PAG7936-AEC/AGC-Verhalten wurde überarbeitet (kombinierte Steuerung, korrigierte Verstärkungsobergrenze).
OV5640-Autofokus-Firmware-Upload auf Portenta/Nicla wiederhergestellt (MIMXRT-I2C-SUSPEND-Fix).
Einen Deadlock bei der Kameraerfassung behoben, wenn ein Bildraten-Limit mit JPEG-Erfassung kombiniert wird (STM32).
GenX320
csi.IOCTL_GENX320_READ_EVENTS_RAW-Lesevorgänge verzerren die IDE-Vorschau nicht mehr.FLIR Lepton
csi.IOCTL_LEPTON_SET_MODEübercsi.CSI.ioctl()funktioniert nun, wenn es mit einem einzigen Argument aufgerufen wird.
Bildverarbeitung:
draw_image()/blend()Alpha-Blending korrigiert, wenn eine Maske angegeben wird.Bit-Reihenfolge beim 1-Bit-(BINARY-)PNG-Encode/Decode sowie die Graustufen-aus-1-Bit-Dekodierung korrigiert.
mjpeg.Mjpeg-Metadaten zur Aufnahmedauer/FPS korrigiert.Einen Stack-Überlauf bei der Software-JPEG-Dekodierung auf Boards mit kleinem Stack (OpenMV M7) behoben.
JPEG-/PNG-Dateiformat-Autoerkennung auf Nicht-ARM-Hosts (Simulator) korrigiert.
Time-of-Flight:
tof.read_depth()löst bei vorübergehenden Entfernungsmessfehlern keine Ausnahme mehr aus und erholt sich automatisch von Busfehlern; das Standard-Timeout vontof.read_depth()/tof.snapshot()beträgt nun 100 ms (siehe die tof-Änderungen).VL53L5CX / VL53L8CX-Mehrzonen-Tiefendaten-Beschädigung korrigiert.
ML und System:
Die NPU wird korrekt bereinigt, wenn die Inferenz auf dem N6 unterbrochen wird.
Deep-Sleep-/Standby-Aufwachen auf dem N6 wiederhergestellt; der AE3-Jump-to-Bootloader-Hänger ist behoben.
Speicherlecks beim Soft-Reset (STM32 Nema GPU) sowie einen vorzeitig eingesammelten zusätzlichen Framebuffer behoben.
Benutzerdefinierte Python-Protokollkanäle überstehen nun einen Soft-Reboot, der USB-Transport erholt sich von Bus-Reset / blockierten Endpoints, und das Überfluten durch USB-SOF-Interrupts ist behoben.
Hardware- und Board-Unterstützung#
OpenMV N6 — Ethernet aktiviert (kabelgebundenes Netzwerk); NPU AXI SRAM (1,75 MB) in einen gemeinsamen transienten Pool zusammengeführt für mehr RAM zwischen Inferenzen; Deep-Sleep-/Standby-Aufwachen; mitgelieferte TFLite-Modelle und Haar-Kaskaden in ROMFS.
OpenMV AE3 — mitgelieferte Modelle und Kaskaden in ROMFS;
cbor2in die Firmware eingefroren.Alif (AE3, N6) — Low-Power-
machine.RTC-Aufwachen.Hochauflösende AprilTags —
find_apriltags()in voller Sensorauflösung auf dem AE3, Arduino Giga und Arduino Portenta H7.Simulator-Targets — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), mit NPU-, ROMFS- und PSRAM-Emulation.
API-Brüche#
Für Benutzer sichtbare API-Brüche zwischen v4.8.1 und v5.0.0. Umfang: Python-C-Module in modules/ und Python-Bibliotheken in scripts/libraries/.
Jede Änderung ist mit ihrer Auswirkung gekennzeichnet:
major — die meisten Skripte müssen angepasst werden.
minor — schmale API; betrifft nur Skripte, die sie verwendet haben.
behavior — gleiche API, andere Ergebnisse; abgestimmte Skripte erneut prüfen.
tooling — betrifft nur das Bauen aus dem Quellcode / nachgelagerte Forks.
Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert — zuerst major, dann minor, behavior und tooling. Wenn Sie Ihren Code lediglich portieren möchten, springen Sie zur Migrations-Checkliste am Ende für eine komprimierte To-do-Liste. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub.
sensor ersetzt durch csi (major)#
Jedes offizielle Beispiel wurde umgeschrieben, um import sensor zugunsten von import csi aufzugeben. Die alte funktionale API auf Modulebene (sensor.reset(), sensor.set_pixformat(), …) wird durch die klassenbasierte csi.CSI-API abgelöst, die natürlich auf Boards mit mehreren Kameras skaliert (csi0, csi1, …) und für alle neuen Funktionen erforderlich ist (das stream=-Schlüsselwortargument, Multi-Sensor-Streaming, …).
Das sensor-qstr ist in modules/py_csi.c weiterhin für rückwärtskompatible Firmware-Builds verdrahtet, erhält aber keine neuen Funktionen, und alle Beispiele, Dokumentationen und Bibliothekscode setzen nun csi voraus.
Vom Modul zur Klasse
Vorher (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
Nachher (csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
Setter-/Getter-Paare zu kombinierten Accessoren zusammengefasst
In der neuen API gibt eine ohne Argumente aufgerufene Methode den aktuellen Wert zurück; mit einem Wert aufgerufen, setzt sie ihn. Die set_*-/get_*-Präfixe sind verschwunden. Methodennamen verloren außerdem das ing-Suffix, wo es redundant war (windowing → window). Die Spalte der neuen API verlinkt auf die Referenzdokumentation.
|
|
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Funktionen ohne direkte Entsprechung
| Was stattdessen zu verwenden ist |
|---|---|
|
|
|
|
| In den |
| |
| Entfernt. Das von |
|
|
Neu bei csi.CSI
csi.CSI(stream=True|False)— ein Selektor zur Konstruktionszeit, der auswählt, welche CSI den Vorschau-Framebuffer speist (ersetzt dasupdate=-Schlüsselwortargument pro Schnappschuss, siehe die csi-Folgeänderungen).csi.CSI(cid=N)/csi.devices()— Multi-CSI-Unterstützung für Boards mit mehr als einem Bildsensor.
image-Modul — Überarbeitung der Signaturen (major)#
Das image-Modul erfuhr nach csi die umfangreichste API-Änderung — Zeichensignaturen, Ergebnisobjekte und mehrere Detektoren haben sich alle geändert.
Koordinatenargumente müssen Tupel sein
modules/py_image.c wurde auf Basis von mp_arg_parse_all neu geschrieben. Alle Zeichen-/Pixelmethoden, die zuvor separate x, y, ...-Positionsargumente entgegennahmen, erfordern nun, dass diese Koordinaten in ein einzelnes Tupel gepackt werden.
Commits: d18bbc472, 0c60c94b9 (PR #3061)
Vorher | Nachher |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Alle sind Methoden von image.Image.
Ergebnisobjekte in attrtuple umgewandelt
Diese Typen sind nun MicroPython-attrtuple-Objekte: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Der Attributzugriff ohne Klammern ist nun die kanonische Form.
Commit: 3399d302e
Vorher (Methoden-Stil):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
Nachher (Attribut-Stil):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob und histogram sind unverändert — sie behalten ihre bestehenden Typen und ()-Accessoren (ein attrtuple kann die verzögert berechneten Werte eines Blobs oder die argumentbasierten Accessoren eines Histogramms nicht abbilden).
Umbenennung des find_features-haar-Parameters
image.Image.find_features() — scale_factor= wurde in scale= umbenannt.
Commit: be4c5cd73
get_regression — nun immer robust, target_size hinzugefügt
image.Image.get_regression() verwendet nun immer die robuste (Theil-Sen-)Regression. Der alte schnelle Pfad der kleinsten Quadrate wurde entfernt, sodass das robust=-Schlüsselwort verschwunden ist — was früher robust=True erforderte, ist nun das einzige Verhalten. Ein neues target_size=(w, h)-Schlüsselwortargument (Standard (80, 60)) skaliert den ROI flächenmäßig herunter, bevor der O(N^2)-Theil-Sen-Fit ausgeführt wird, sodass er stets auf einer vernünftigen Bildgröße läuft; die Endpunkte der gefitteten Linie werden auf die Quellkoordinaten zurückgerechnet. Das Beispiel linear_regression_robust.py wurde gelöscht und linear_regression_fast.py in linear_regression.py umbenannt.
find_line_segments — neuer Algorithmus
image.Image.find_line_segments() — der alte LSD-Detektor wurde durch ED-Lines ersetzt, und er erhielt ein neues threshold=50-Schlüsselwortargument. Die Ausgabe zuvor abgestimmter Skripte wird sich unterscheiden.
AprilTag-Bibliothek ersetzt
image.Image.find_apriltags() — der AprilTag-Detektor wurde durch eine neue Implementierung ersetzt. Der Satz an Familien änderte sich:
Entfernt | Hinzugefügt |
|---|---|
|
|
Commit: e813bada7
csi-Modul-Folgeänderung (minor)#
Kleinere csi-Folgeänderungen aufbauend auf der csi-Migration.
snapshot(update=…) entfernt
Das update-Schlüsselwortargument bei csi.CSI.snapshot() ist verschwunden. Um zu verhindern, dass ein CSI-Gerät den Vorschau-Framebuffer speist, deaktivieren Sie dies zur Konstruktionszeit:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
framebuffers()-expand-Argument entfernt
csi.CSI.framebuffers() — das dritte Positionsargument (expand) ist verschwunden; die Signatur lautet nun framebuffers([count]).
Commit: 86cb3a5de
protocol-Modul (minor)#
Betrifft nur Skripte, die die Host-Verbindung direkt angesteuert haben. Siehe protocol.
timer_ms in poll_ms umbenannt
protocol.init() — das timer_ms-Argument wurde in poll_ms umbenannt.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() entfernt
Die Protokollaufgabe wird nun intern geplant. Aufrufe von protocol.poll() lösen AttributeError aus.
Commit: 8a0635e8c
soft_reboot-Konfigurationsargument entfernt
protocol.init() — das soft_reboot-Argument ist verschwunden. Alle aktuellen Transports tolerieren Soft-Reboots, sodass das Verhalten nun bedingungslos ist.
Commit: 0bf766aa2
display-Module (minor)#
Die TV-Ausgabe läuft nun über ein display.TVDisplay-Objekt anstelle des eigenständigen tv-Moduls. display erhielt außerdem ein generisches ioctl().
tof-Modul (behavior)#
Gleiche API wie zuvor; die Standardwerte und die Fehlerbehandlung haben sich geändert. Siehe tof.
Standard-Timeout geändert
tof.read_depth() und tof.snapshot() (mit timeout=-1 aufgerufen) verwenden nun standardmäßig 100 ms statt unbegrenzt zu warten. Übergeben Sie einen expliziten größeren Wert, wenn Sie das alte Verhalten benötigen.
Commit: b6772b80d
Automatische Wiederherstellung
Der Treiber setzt nun bei Entfernungsmess-/Timeout-Fehlern den I2C-Bus und den Sensor hart zurück. Die Beispiele rufen tof.reset() nicht mehr in ihren Ausnahmehandlern auf — Benutzercode, der eine manuelle Wiederherstellung durchführte, sollte sie entfernen (sie würde gegen die neue automatische Wiederherstellung arbeiten).
ML-Bibliothek (behavior)#
Gleiche API, andere Zahlen — prüfen Sie jede abgestimmte ML-Pipeline erneut.
Die Vorverarbeitung streckt nun statt Letterboxing anzuwenden
Normalization verwendet nun image.SCALE_ASPECT_IGNORE (Strecken) anstelle von image.SCALE_ASPECT_EXPAND (Letterbox). Die NMS-Nachverarbeitung wechselte ebenfalls zu unabhängiger x/y-Skalierung.
Bemerkung
Auswirkung. YOLO-artige Detektoren und Keypoint-Regressoren verbessern sich im Allgemeinen. Die Beispiele BlazeFace, BlazePalm, FaceLandmarks und HandLandmarks erfordern nun einen manuellen quadratischen Zuschnitt des Eingabe-ROI — die Beispielskripte wurden aktualisiert; benutzerdefinierter Code muss dasselbe tun.
Commit: 68dc29a33
ml.utils.mod()-Hilfsfunktion entfernt
ulab 6.12.0 unterstützt % auf ndarrays nativ. Code, der mod aus ml.utils importierte, muss a % b verwenden.
Build / Tooling (tooling)#
Nichts davon betrifft MicroPython-Skripte. Das Bauen der Firmware aus dem Quellcode erfordert nun das externe OpenMV SDK (1.6.0, zuvor im Baum). Mehrere im Baum befindliche Build-Tools wurden entfernt und der N6 wurde auf den TinyUSB-Stack umgestellt; nachgelagerte Forks sollten die Historie des Firmware-Repositorys prüfen — insbesondere die file_open()-Signatur, die ihr buffered-Argument verloren hat.
Migrations-Checkliste#
Für eine saubere Portierung auf v5.0.0 ist die typische Arbeit:
Ersetzen Sie
import sensordurchimport csi; csi0 = csi.CSI()und übersetzen Sie jedenset_*-/get_*-Aufruf in seinencsi.CSI-Accessor (die csi-Migration).Packen Sie Koordinatenargumente an
img.draw_*,get_pixel()undset_pixel()in Tupel (die Änderungen am image-Modul).Lassen Sie die
()bei attrtuple-Ergebnis-Accessoren weg, wenn Sie die neue idiomatische Form wünschen, oder belassen Sie den alten Stil, da attrtuples weiterhin aufrufbare Accessoren unterstützen (die Änderungen am image-Modul).Überprüfen Sie
find_line_segments(),get_regression()und jede Wahl derfind_apriltags()-Familie (die Änderungen am image-Modul).Benennen Sie
timer_ms→poll_msinprotocol.init()-Aufrufen um; entfernen Sieprotocol.poll()undsoft_reboot=(die Änderungen am protocol-Modul).Für ML-Workflows: überarbeiten Sie jedes Modell, das letterboxte Eingaben benötigte (die Änderungen an der ML-Bibliothek).