v5.0.0#
v5.0.0 is een grote release. De belangrijkste punten: de opnieuw opgebouwde OpenMV Protocol V2 hostverbinding, een op klassen gebaseerde csi-camera-API die opschaalt naar borden met meerdere camera’s, een uitvoerbare simulator-target, MoveNet single-pose-schatting, MicroPython 1.28 en een grote reeks camera-, ML- en ToF-fixes. Het bevat ook een aantal breaking API-wijzigingen — elke voor de gebruiker zichtbare wijziging sinds v4.8.1 staat hieronder vermeld, samen met precies hoe je migreert.
Hoogtepunten#
OpenMV Protocol V2. De host/IDE-verbinding is volledig opnieuw opgebouwd: opgedeeld in frames, gesequenced, CRC-gecontroleerd, met gemultiplexte kanalen voor stdio, de stream-preview en gebruikersdata. Een nieuwe
protocol-module laat scripts hun eigen transports en datakanalen maken. Zie de wijzigingen in de protocol-module.Op klassen gebaseerde
csicamera-API.import sensorwordtimport csi/csi.CSI, met native ondersteuning voor meerdere camera’s. Zie de csi-migratie.Simulator-target. De firmware bouwt en draait nu onder de Arm FVP / QEMU-simulator (MPS2/MPS3), inclusief NPU-, ROMFS- en PSRAM-emulatie — vision- en ML-scripts kunnen draaien zonder dat er hardware is aangesloten.
MoveNet pose-schatting. Een nieuwe
MoveNet-postprocessor plus een meegeleverdmovenet_singlepose_192.tflite-model op de OpenMV AE3 en N6.MicroPython 1.28 en ulab 6.12.0, ST Edge AI 4.0-tooling en de geëxternaliseerde OpenMV SDK (zie de build-/tooling-wijzigingen).
Nieuwe functies#
De
protocolmodule — maak aangepaste transports en datakanalen vanuit Python:protocol.init(),protocol.register(),protocol.is_active(), en eenprotocol.ProtocolChannel-klasse metsend_event(), plusCHANNEL_FLAG_*- enCHANNEL_ID_*-constanten. De definitieve handtekening vanprotocol.init()wordt gedocumenteerd in de wijzigingen in de protocol-module.protocol.CBORChannel— een bevrorenprotocol-uitbreidingspakket dat benoemde velden naar CBOR serialiseert met weergavewidgets (label, diepte) en interactieve besturingselementen (toggle, slider, select).Host-geheugen- en stream-introspectie — een nieuw
SYS_MEMORY-protocolcommando stelt per-pool runtime-geheugenstatistieken beschikbaar aan de IDE, en een nieuweSTREAM_SOURCE-stream-ioctl laat de host kiezen welke camera de preview voedt op borden met meerdere camera’s (protocolversie 1.0.1).Streaming met meerdere camera’s —
csi.CSIneemt eenstream=-argument dat selecteert welke sensor de IDE-preview voedt; de stream-frameheader bevat nu een EMA-vereffende FPS zodat de IDE de framerate toont zonderclock.fps()-boilerplate. Zie de csi-migratie en de csi-vervolgwijzigingen.GenX320-event-sensor — een nieuw Spatio-Temporal Contrast-filter (
csi.IOCTL_GENX320_SET_STCmet de modicsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYencsi.GENX320_STC_TRAIL) en raw-event-lezen (csi.IOCTL_GENX320_READ_EVENTS_RAW), met nieuwe voorbeeldscripts.MoveNet— een nieuwe MediaPipe single-pose-postprocessor (threshold-,nms_threshold-,nms_sigma-kwargs) die((x, y, w, h), score, keypoints)teruggeeft met een COCO-sleutelpuntarray met 17 gewrichten; eenmovenet_singlepose_192.tflite-model en voorbeeld worden meegeleverd op de AE3 en N6.ml.utils.draw_predictions()— een nieuw optioneelscores=-argument voegt per-label de betrouwbaarheid toe, lettertype en kaderdikte schalen nu automatisch mee met de afbeeldingsbreedte, en een nieuweformat="point"-modus tekent een centrummarkering voor centerpoint-/peak-detectoren.De nieuwe
display.TVDisplayklasse (met een generiekeioctl()) vervangt de losstaandetv-module. Zie de wijzigingen in de display-module.Een nieuwe
find_line_segments()detector (ED-Lines) — nu beschikbaar op alle builds, met een nieuwthreshold=-argument. Zie de wijzigingen in de image-module.
Overige wijzigingen en verbeteringen#
MicroPython bijgewerkt naar 1.28.0 vanaf de v4.8.1-basis. Voegt high-speed SD-kaartmodus toe op H5/H7/N6, AHB5-klokken in low-power-modus en bestuurbare JTAG-pinnen als GPIO’s op de OPENMV_AE3.
ulab bijgewerkt naar 6.12.0 — native
%-operator op ndarrays (deml.utils.mod()-helper is verwijderd; zie de wijzigingen in de ML-bibliotheek).ST Edge AI-tooling bijgewerkt naar 4.0 — beïnvloedt on-device ST-modelcompilatie en -deployment.
ml.Model— hetload_to_fb-keyword-argument is verwijderd; modelgeheugen wordt automatisch beheerd door de unified allocator.image.Image.scale()in place — een afbeelding in place opschalen (bijvoorbeeldimg.scale(x_scale=2.0, y_scale=2.0)) laat de framebuffer nu groeien om te passen in plaats van te falen.Grotere stdio-buffer — de standaard tekstbuffer naar de IDE groeide van 512 naar 1024 bytes op OpenMV 2/3/4, Nicla Vision, AE3 en N6, zodat grotere
print()-bursts niet worden afgekapt.Soepelere host-event-flow — stdout-NOTIFY-events naar de host worden begrensd tot ten hoogste één per host-lezing in plaats van één per
print()die de watermarkering van de ringbuffer overschrijdt.Onderbreekbare langlopende bewerkingen — langlopende wachtlussen voor afbeelding-tekenen, GPU (Nema/Dave2D) en NPU verwerken events nu op een deterministisch interval, zodat scripts responsief blijven voor de Stop-knop van de IDE tijdens zwaar werk.
Bugfixes#
Camera en sensoren:
find_apriltags()corrumpeert resultaten niet langer op D-cache-/GPU-borden (N6, AE3), en werkt nu op de AE3.Bayer-afbeeldingsuitvoer van de STM32 N6 ISP na het wisselen van pixelformaten gerepareerd.
Groene auto-white-balance-overbelichting bij heldere scènes gerepareerd, evenals een niet-geïnitialiseerd AWB-stats-geval bij het eerste frame; de gamma-clamp van de STM32 ISP verhoogd (32 naar 63) voor een groter gamma-/contrast-/helderheidsbereik.
PS5520-auto-belichting oscilleert niet langer bij fel licht; het PAG7936 AEC/AGC-gedrag is herzien (gecombineerde besturing, gecorrigeerd versteringsplafond).
OV5640-autofocus-firmware-upload hersteld op Portenta/Nicla (MIMXRT I2C SUSPEND-fix).
Een camera-capture-deadlock gerepareerd wanneer een framerate-limiet wordt gecombineerd met JPEG-capture (STM32).
GenX320
csi.IOCTL_GENX320_READ_EVENTS_RAW-lezingen verstoren de IDE-preview niet langer.FLIR Lepton
csi.IOCTL_LEPTON_SET_MODEviacsi.CSI.ioctl()werkt nu wanneer aangeroepen met een enkel argument.
Beeldverwerking:
draw_image()/blend()alpha-blending gerepareerd wanneer een masker wordt meegegeven.1-bit (BINARY) PNG-encode/decode-bitvolgorde en grijswaarden-uit-1-bit-decodering gerepareerd.
mjpeg.Mjpeg-opnameduur/FPS-metadata gerepareerd.Een stack-overflow bij software-JPEG-decodering op borden met een kleine stack (OpenMV M7) gerepareerd.
JPEG/PNG-bestandsformaat-autodetectie op niet-ARM-hosts (simulator) gerepareerd.
Time-of-Flight:
tof.read_depth()werpt niet langer een fout bij tijdelijke afstandsmeetfouten en herstelt automatisch van busfouten; de standaard-timeout vantof.read_depth()/tof.snapshot()is nu 100 ms (zie de tof-wijzigingen).VL53L5CX / VL53L8CX multi-zone-dieptedatacorruptie gerepareerd.
ML en systeem:
De NPU wordt correct opgeruimd wanneer inferentie wordt onderbroken op de N6.
Deep-sleep-/standby-ontwaken hersteld op de N6; de AE3 jump-to-bootloader-hang is gerepareerd.
Geheugenlekken bij soft-reset (STM32 Nema GPU) en een voortijdig opgeruimde hulp-framebuffer gerepareerd.
Aangepaste Python-protocolkanalen overleven nu een soft-reboot, het USB-transport herstelt van busreset / vastgelopen endpoints, en USB-SOF-interruptoverstroming is gerepareerd.
Hardware- en bordondersteuning#
OpenMV N6 — Ethernet ingeschakeld (bedrade netwerken); NPU AXI SRAM (1,75 MB) samengevoegd in een gedeelde transient pool voor meer RAM tussen inferenties; deep-sleep-/standby-ontwaken; meegeleverde TFLite-modellen en Haar Cascades in ROMFS.
OpenMV AE3 — meegeleverde modellen en cascades in ROMFS;
cbor2bevroren in de firmware.Alif (AE3, N6) — low-power
machine.RTC-ontwaken.AprilTags met hoge resolutie —
find_apriltags()op volledige sensorresolutie op de AE3, Arduino Giga en Arduino Portenta H7.Simulator-targets — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), met NPU-, ROMFS- en PSRAM-emulatie.
Breaking API-wijzigingen#
Voor de gebruiker zichtbare API-breaks tussen v4.8.1 en v5.0.0. Scope: Python C-modules in modules/ en Python-bibliotheken in scripts/libraries/.
Elke wijziging is getagd met de impact ervan:
major — de meeste scripts hebben aanpassingen nodig.
minor — smalle API; betreft alleen scripts die hem gebruikten.
behavior — dezelfde API, andere resultaten; controleer afgestelde scripts opnieuw.
tooling — betreft alleen het bouwen vanaf de broncode / downstream-forks.
Wijzigingen zijn in die volgorde gegroepeerd op impact — eerst major, dan minor, behavior en tooling. Als je alleen je code wilt porten, ga dan naar de migratiechecklist aan het eind voor een beknopte takenlijst. Elke commit-hash linkt naar de bijbehorende diff op GitHub.
sensor vervangen door csi (major)#
Elk officieel voorbeeld is herschreven om import sensor te laten vallen ten gunste van import csi. De verouderde functionele API op moduleniveau (sensor.reset(), sensor.set_pixformat(), …) wordt vervangen door de op klassen gebaseerde csi.CSI-API, die natuurlijk opschaalt naar borden met meerdere camera’s (csi0, csi1, …) en vereist is voor alle nieuwe functies (de stream=-kwarg, multi-sensor-streaming, …).
De sensor-qstr is nog steeds aangesloten in modules/py_csi.c voor achterwaarts compatibele firmware-builds, maar krijgt geen nieuwe functies, en alle voorbeelden, documentatie en bibliotheekcode gaan nu uit van csi.
Module naar klasse
Voorheen (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
Daarna (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-paren samengevoegd tot gecombineerde accessors
In de nieuwe API geeft een methode die zonder argumenten wordt aangeroepen de huidige waarde terug; aangeroepen met een waarde stelt deze in. De set_*/get_*-prefixen zijn weg. Methodenamen verloren ook het ing-achtervoegsel waar dat overbodig was (windowing → window). De kolom met de nieuwe API linkt naar de referentiedocumentatie.
|
|
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
Functies zonder direct equivalent
| Wat in plaats daarvan te gebruiken |
|---|---|
|
|
|
|
| Verplaatst naar de |
| |
| Verwijderd. De afbeelding die door |
|
|
Nieuw op csi.CSI
csi.CSI(stream=True|False)— een selector tijdens de constructie die kiest welke CSI de preview-framebuffer voedt (vervangt deupdate=-kwarg per snapshot, zie de csi-vervolgwijzigingen).csi.CSI(cid=N)/csi.devices()— multi-CSI-ondersteuning voor borden met meer dan één beeldsensor.
image-module — herziening van de handtekeningen (major)#
De image-module onderging na csi de grootste API-wijziging — teken-handtekeningen, resultaatobjecten en verschillende detectoren veranderden allemaal.
Coördinaatargumenten moeten tuples zijn
modules/py_image.c is herschreven bovenop mp_arg_parse_all. Alle teken-/pixelmethoden die voorheen afzonderlijke x, y, ...-positionele argumenten namen, vereisen nu dat die coördinaten in een enkele tuple worden verpakt.
Commits: d18bbc472, 0c60c94b9 (PR #3061)
Voorheen | Daarna |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Het zijn allemaal methoden van image.Image.
Resultaatobjecten omgezet naar attrtuple
Deze types zijn nu MicroPython attrtuple-objecten: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Attribuuttoegang zonder haakjes is nu de canonieke vorm.
Commit: 3399d302e
Voorheen (methode-stijl):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
Daarna (attribuut-stijl):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob en histogram zijn ongewijzigd — ze behouden hun bestaande types en ()-accessors (een attrtuple kan de lazy berekende waarden van een blob of de argument-nemende accessors van een histogram niet uitdrukken).
find_features haar-parameter hernoemd
image.Image.find_features() — scale_factor= is hernoemd naar scale=.
Commit: be4c5cd73
get_regression — nu altijd robuust, target_size toegevoegd
image.Image.get_regression() gebruikt nu altijd de robuuste (Theil-Sen) regressie. Het oude snelle least-squares-pad is verwijderd, dus het robust=-keyword is weg — wat voorheen robust=True vereiste is nu het enige gedrag. Een nieuwe target_size=(w, h)-kwarg (standaard (80, 60)) schaalt het aandachtsgebied (ROI) qua oppervlak omlaag vóór de O(N^2) Theil-Sen-fit zodat deze altijd op een verstandige afbeeldingsgrootte draait; de eindpunten van de gefitte lijn worden teruggemapt naar broncoördinaten. Het voorbeeld linear_regression_robust.py is verwijderd en linear_regression_fast.py is hernoemd naar linear_regression.py.
find_line_segments — nieuw algoritme
image.Image.find_line_segments() — de oude LSD-detector is vervangen door ED-Lines, en hij kreeg een nieuwe threshold=50-kwarg. De uitvoer van eerder afgestelde scripts zal verschillen.
AprilTag-bibliotheek vervangen
image.Image.find_apriltags() — de AprilTag-detector is vervangen door een nieuwe implementatie. De familieset is veranderd:
Verwijderd | Toegevoegd |
|---|---|
|
|
Commit: e813bada7
csi-module vervolg (minor)#
Kleinere csi-vervolgwijzigingen bovenop de csi-migratie.
snapshot(update=…) verwijderd
De update-kwarg op csi.CSI.snapshot() is weg. Om te voorkomen dat een CSI-apparaat de preview-framebuffer voedt, kies je bij de constructie ervoor om af te zien:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
framebuffers() expand-argument verwijderd
csi.CSI.framebuffers() — het derde positionele argument (expand) is weg; de handtekening is nu framebuffers([count]).
Commit: 86cb3a5de
protocol-module (minor)#
Betreft alleen scripts die de hostverbinding rechtstreeks aanstuurden. Zie protocol.
timer_ms hernoemd naar poll_ms
protocol.init() — het timer_ms-argument is hernoemd naar poll_ms.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() verwijderd
De protocoltaak wordt nu intern gepland. Aanroepen van protocol.poll() werpen een AttributeError.
Commit: 8a0635e8c
soft_reboot config-argument verwijderd
protocol.init() — het soft_reboot-argument is weg. Alle huidige transports tolereren soft-reboots, dus het gedrag is nu onvoorwaardelijk.
Commit: 0bf766aa2
display-modules (minor)#
TV-uitvoer gaat nu via een display.TVDisplay-object in plaats van de losstaande tv-module. display kreeg ook een generieke ioctl().
tof-module (behavior)#
Dezelfde API als voorheen; de standaardwaarden en foutafhandeling zijn veranderd. Zie tof.
Standaard-timeout gewijzigd
tof.read_depth() en tof.snapshot() (aangeroepen met timeout=-1) gaan nu standaard uit van 100 ms in plaats van onbepaald te wachten. Geef een expliciet grotere waarde mee als je het oude gedrag nodig hebt.
Commit: b6772b80d
Automatisch herstel
De driver hard-reset nu de I2C-bus en de sensor bij afstandsmeet-/timeoutfouten. Voorbeelden roepen tof.reset() niet langer aan in hun exception-handlers — gebruikerscode die handmatig herstel deed moet dit verwijderen (het zal botsen met het nieuwe auto-herstel).
ML-bibliotheek (behavior)#
Dezelfde API, andere getallen — controleer elke afgestelde ML-pipeline opnieuw.
Voorbewerking rekt nu uit in plaats van letterboxen
Normalization gebruikt nu image.SCALE_ASPECT_IGNORE (uitrekken) in plaats van image.SCALE_ASPECT_EXPAND (letterbox). NMS-postprocessing schakelde ook over op onafhankelijke x/y-schaling.
Notitie
Impact. YOLO-achtige detectoren en sleutelpunt-regressors verbeteren over het algemeen. De voorbeelden BlazeFace, BlazePalm, FaceLandmarks en HandLandmarks vereisen nu een handmatige vierkante crop op het invoer-aandachtsgebied (ROI) — de voorbeeldscripts zijn bijgewerkt; aangepaste gebruikerscode moet hetzelfde doen.
Commit: 68dc29a33
ml.utils.mod()-helper verwijderd
ulab 6.12.0 ondersteunt % op ndarrays native. Code die mod importeerde uit ml.utils moet a % b gebruiken.
Build / tooling (tooling)#
Niets hiervan beïnvloedt MicroPython-scripts. Firmware bouwen vanaf de broncode vereist nu de externe OpenMV SDK (1.6.0, voorheen in-tree). Verschillende in-tree-buildtools zijn verwijderd en de N6 is overgestapt op de TinyUSB-stack; downstream-forks zouden de geschiedenis van de firmware-repository moeten doornemen — met name de file_open()-handtekening die het buffered-argument laat vallen.
Migratiechecklist#
Voor een schone port naar v5.0.0 is het typische werk:
Vervang
import sensordoorimport csi; csi0 = csi.CSI()en vertaal elkeset_*/get_*-aanroep naar de bijbehorendecsi.CSI-accessor (de csi-migratie).Verpak coördinaatargumenten aan
img.draw_*,get_pixel()enset_pixel()in tuples (de wijzigingen in de image-module).Laat
()weg bij attrtuple-resultaataccessors als je de nieuwe idiomatische vorm wilt, of laat de oude stijl met rust aangezien attrtuples nog steeds aanroepbare accessors ondersteunen (de wijzigingen in de image-module).Controleer
find_line_segments(),get_regression()en elke keuze in defind_apriltags()-familie (de wijzigingen in de image-module).Hernoem
timer_ms→poll_msinprotocol.init()-aanroepen; verwijderprotocol.poll()ensoft_reboot=(de wijzigingen in de protocol-module).Voor ML-workflows: bekijk elk model opnieuw dat letterboxed invoer nodig had (de wijzigingen in de ML-bibliotheek).