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 csi camera-API. import sensor wordt import 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 meegeleverd movenet_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#

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 (de ml.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 — het load_to_fb-keyword-argument is verwijderd; modelgeheugen wordt automatisch beheerd door de unified allocator.

  • image.Image.scale() in place — een afbeelding in place opschalen (bijvoorbeeld img.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_MODE via csi.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:

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; cbor2 bevroren in de firmware.

  • Alif (AE3, N6) — low-power machine.RTC-ontwaken.

  • AprilTags met hoge resolutiefind_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.

Commits: 945c5853c, 61f835b7e

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 (windowingwindow). De kolom met de nieuwe API linkt naar de referentiedocumentatie.

sensor (oud)

csi.CSI (nieuw)

set_pixformat(fmt) / get_pixformat()

pixformat([fmt])

set_framesize(sz) / get_framesize()

framesize([sz])

set_framerate(fps) / get_framerate()

framerate([fps])

set_windowing(roi) / get_windowing()

window([roi])

set_framebuffers(n) / get_framebuffers()

framebuffers([n])

set_gainceiling(g)

gainceiling([g])

set_brightness(v)

brightness([v])

set_contrast(v)

contrast([v])

set_saturation(v)

saturation([v])

set_quality(v)

quality([v])

set_colorbar(b)

colorbar([b])

set_special_effect(e)

special_effect([e])

set_lens_correction(...)

lens_correction(...)

set_hmirror(b) / get_hmirror()

hmirror([b])

set_vflip(b) / get_vflip()

vflip([b])

set_transpose(b) / get_transpose()

transpose([b])

set_auto_rotation(b) / get_auto_rotation()

auto_rotation([b])

set_auto_gain(b, [db, ceiling]) / get_gain_db()

auto_gain(...) / gain_db()

set_auto_exposure(b, [us]) / get_exposure_us()

auto_exposure(...) / exposure_us()

set_auto_whitebal(b, [rgb]) / get_rgb_gain_db()

auto_whitebal(...) / rgb_gain_db()

set_auto_blc(b, [regs]) / get_blc_regs()

auto_blc(...) / blc_regs()

set_color_palette(p) / get_color_palette()

color_palette([p])

set_frame_callback(cb)

frame_callback(cb)

set_vsync_callback(cb)

vsync_callback(cb)

get_id()

cid()

Functies zonder direct equivalent

sensor (verwijderd)

Wat in plaats daarvan te gebruiken

sensor.alloc_extra_fb(w, h, pixfmt) / sensor.dealloc_extra_fb()

image.Image (w, h, pixfmt) — een gewone, op de heap toegewezen afbeelding. De framebuffer wordt niet langer opgedeeld voor gebruikersbuffers.

sensor.skip_frames(time=..., frames=...)

csi.CSI.snapshot() — skip-frames is gevouwen in snapshot via de time= / frames=-argumenten.

sensor.disable_delays(...) / sensor.disable_full_flush(...)

Verplaatst naar de csi.CSI-constructor: csi.CSI(delays=False) / csi.CSI(fflush=False).

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

Verwijderd. De afbeelding die door csi.CSI.snapshot() wordt teruggegeven is het canonieke handle.

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — het expand-argument is verwijderd (zie de csi-vervolgwijzigingen).

Nieuw op csi.CSI

  • csi.CSI(stream=True|False) — een selector tijdens de constructie die kiest welke CSI de preview-framebuffer voedt (vervangt de update=-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

img.draw_arrow(x0, y0, x1, y1, color=...)

img.draw_arrow((x0, y0, x1, y1), color=...)

img.draw_line(x0, y0, x1, y1, ...)

img.draw_line((x0, y0, x1, y1), ...)

img.draw_cross(x, y, ...)

img.draw_cross((x, y), ...)

img.draw_circle(x, y, r, ...)

img.draw_circle((x, y, r), ...)

img.draw_rectangle(x, y, w, h, ...)

img.draw_rectangle((x, y, w, h), ...)

img.draw_string(x, y, "txt", ...)

img.draw_string((x, y), "txt", ...)

img.draw_ellipse(x, y, rx, ry, rot, ...)

img.draw_ellipse((x, y, rx, ry, rot), ...)

img.flood_fill(x, y, ...)

img.flood_fill((x, y), ...)

img.get_pixel(x, y, rgbtuple=...)

img.get_pixel((x, y), rgbtuple=...)

img.set_pixel(x, y, color)

img.set_pixel((x, y), color)

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.

Commits: c7c2e69a0, 0ff2afa72

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.

Commits: 87da2a7b7, 2c47b5735

AprilTag-bibliotheek vervangen

image.Image.find_apriltags() — de AprilTag-detector is vervangen door een nieuwe implementatie. De familieset is veranderd:

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

Commits: 9a8077827, 26b79a2c5

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

Commits: 8a0635e8c, 95a290607

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

Commits: f0accb389, 1a5a87121, 920c097a0, 9eac55098

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

Commits: b6772b80d, 80ffaa5c3

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.

Commits: 35ece5728, 82fbd858c

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:

  1. Vervang import sensor door import csi; csi0 = csi.CSI() en vertaal elke set_*/get_*-aanroep naar de bijbehorende csi.CSI-accessor (de csi-migratie).

  2. Verpak coördinaatargumenten aan img.draw_*, get_pixel() en set_pixel() in tuples (de wijzigingen in de image-module).

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

  4. Controleer find_line_segments(), get_regression() en elke keuze in de find_apriltags()-familie (de wijzigingen in de image-module).

  5. Hernoem timer_mspoll_ms in protocol.init()-aanroepen; verwijder protocol.poll() en soft_reboot= (de wijzigingen in de protocol-module).

  6. Voor ML-workflows: bekijk elk model opnieuw dat letterboxed invoer nodig had (de wijzigingen in de ML-bibliotheek).