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