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