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).