v5.0.0#

v5.0.0 är en större utgåva. I rampljuset: den ombyggda OpenMV Protocol V2-värdlänken, ett klassbaserat csi-kamera-API som skalar till kort med flera kameror, ett körbart simulator-mål, MoveNet enskild poseuppskattning, MicroPython 1.28 och en stor uppsättning fixar för kamera, ML och ToF. Den medför även ett antal brytande API-ändringar — varje användarsynlig ändring sedan v4.8.1 listas nedan, tillsammans med exakt hur man migrerar.

Höjdpunkter#

  • OpenMV Protocol V2. Värd-/IDE-länken byggdes om från grunden: ramad, sekvenserad, CRC-kontrollerad, med multiplexade kanaler för stdio, strömförhandsvisningen och användardata. En ny protocol-modul låter skript skapa sina egna transporter och datakanaler. Se ändringarna i protocol-modulen.

  • Klassbaserat csi-kamera-API. import sensor blir import csi / csi.CSI, med inbyggt stöd för flera kameror. Se csi-migreringen.

  • Simulatormål. Den fasta programvaran byggs och körs nu under Arm FVP / QEMU-simulatorn (MPS2/MPS3), inklusive emulering av NPU, ROMFS och PSRAM — syns- och ML-skript kan köras utan ansluten hårdvara.

  • MoveNet poseuppskattning. En ny MoveNet-efterbehandlare plus en medföljande movenet_singlepose_192.tflite-modell på OpenMV AE3 och N6.

  • MicroPython 1.28 och ulab 6.12.0, ST Edge AI 4.0-verktyg, och den externaliserade OpenMV SDK (se bygg-/verktygsändringarna).

Nya funktioner#

Övriga ändringar och förbättringar#

  • MicroPython uppdaterad till 1.28.0 från v4.8.1-basen. Lägger till höghastighetsläge för SD-kort på H5/H7/N6, AHB5-klockning i lågeffektläge och styrbara JTAG-stift som GPIO:er på OPENMV_AE3.

  • ulab uppdaterad till 6.12.0 — inbyggd %-operator på ndarrays (hjälpfunktionen ml.utils.mod() har tagits bort; se ändringarna i ML-biblioteket).

  • ST Edge AI-verktyg uppdaterade till 4.0 — påverkar ST-modellkompilering och -driftsättning på enheten.

  • ml.Model — nyckelordsargumentet load_to_fb togs bort; modellminne hanteras automatiskt av den enhetliga allokeraren.

  • image.Image.scale() på plats — att skala upp en bild på plats (till exempel img.scale(x_scale=2.0, y_scale=2.0)) växer nu bildbufferten för att passa istället för att misslyckas.

  • Större stdio-buffert — standardtextbufferten till IDE:n växte från 512 till 1024 byte på OpenMV 2/3/4, Nicla Vision, AE3 och N6, så att större print()-skurar inte trunkeras.

  • Jämnare värdhändelseflöde — stdout NOTIFY-händelser till värden begränsas till högst en per värdläsning istället för en per print() som korsar ringbuffertens vattenmärke.

  • Avbrytbara långa operationer — långa väntsnurror för bildritning, GPU (Nema/Dave2D) och NPU betjänar nu händelser med ett deterministiskt intervall, så att skript förblir lyhörda för IDE-stoppknappen under tungt arbete.

Felrättningar#

Kamera och sensorer:

  • find_apriltags() korrumperar inte längre resultat på D-cache/GPU-kort (N6, AE3), och fungerar nu på AE3.

  • Fixade Bayer-bildutmatning från STM32 N6 ISP efter byte av pixelformat.

  • Fixade grön automatisk vitbalansurblåsning på ljusa scener och ett fall med oinitierad AWB-statistik för första bildrutan; höjde STM32 ISP-gamma-clampen (32 till 63) för ett bredare gamma-/kontrast-/ljusstyrkeområde.

  • PS5520 automatisk exponering oscillerar inte längre i starkt ljus; PAG7936 AEC/AGC-beteende omarbetades (kombinerad styrning, korrigerat förstärkningstak).

  • OV5640 autofokus-firmwareuppladdning återställd på Portenta/Nicla (MIMXRT I2C SUSPEND-fix).

  • Fixade ett dödläge vid kamerafångst när en bildhastighetsgräns kombineras med JPEG-fångst (STM32).

  • GenX320 csi.IOCTL_GENX320_READ_EVENTS_RAW-läsningar förvränger inte längre IDE-förhandsvisningen.

  • FLIR Lepton csi.IOCTL_LEPTON_SET_MODE via csi.CSI.ioctl() fungerar nu när den anropas med ett enda argument.

Bildbehandling:

  • Fixade alfablandning för draw_image() / blend() när en mask anges.

  • Fixade bitordning vid 1-bitars (BINARY) PNG-kodning/-avkodning och gråskala-från-1-bit-avkodning.

  • Fixade metadata för inspelningslängd/FPS i mjpeg.Mjpeg.

  • Fixade ett stacköverskott vid programvaru-JPEG-avkodning på kort med liten stack (OpenMV M7).

  • Fixade automatisk identifiering av JPEG-/PNG-filformat på icke-ARM-värdar (simulator).

Time-of-Flight:

ML och system:

  • NPU:n städas upp korrekt när inferens avbryts på N6.

  • Uppvakning från djupsömn/standby återställd på N6; hängningen vid hopp till startladdaren på AE3 är fixad.

  • Fixade minnesläckor vid mjuk återställning (STM32 Nema GPU) och en för tidigt insamlad extra bildbuffert.

  • Egna Python-protokollkanaler överlever nu en mjuk omstart, USB-transporten återhämtar sig från bussåterställning / låsta ändpunkter, och översvämning av USB SOF-avbrott är fixad.

Hårdvaru- och kortstöd#

  • OpenMV N6 — Ethernet aktiverat (trådbundet nätverk); NPU AXI SRAM (1,75 MB) sammanslaget i en delad transient pool för mer RAM mellan inferenser; uppvakning från djupsömn/standby; medföljande TFLite-modeller och Haar-kaskader i ROMFS.

  • OpenMV AE3 — medföljande modeller och kaskader i ROMFS; cbor2 fryst in i den fasta programvaran.

  • Alif (AE3, N6) — lågeffekt-uppvakning via machine.RTC.

  • Högupplösta AprilTagsfind_apriltags() med full sensorupplösning på AE3, Arduino Giga och Arduino Portenta H7.

  • Simulatormål — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), med emulering av NPU, ROMFS och PSRAM.

Brytande API-ändringar#

Användarsynliga API-brott mellan v4.8.1 och v5.0.0. Omfattning: Python C-moduler i modules/ och Python-bibliotek i scripts/libraries/.

Varje ändring är märkt med sin påverkan:

  • major — de flesta skript behöver redigeras.

  • minor — smalt API; påverkar bara skript som använde det.

  • behavior — samma API, andra resultat; kontrollera trimmade skript på nytt.

  • tooling — påverkar bara byggande från källkod / nedströms forkar.

Ändringarna grupperas efter påverkan i den ordningen — major först, sedan minor, behavior och tooling. Om du bara vill porta din kod, hoppa till migreringschecklistan i slutet för en komprimerad att-göra-lista. Varje commit-hash länkar till sin diff på GitHub.

sensor ersatt av csi (major)#

Varje officiellt exempel skrevs om för att slopa import sensor till förmån för import csi. Det äldre funktionella API:et på modulnivå (sensor.reset(), sensor.set_pixformat(), …) ersätts av det klassbaserade csi.CSI-API:et, som skalar naturligt till kort med flera kameror (csi0, csi1, …) och krävs för alla nya funktioner (kwargen stream=, strömning med flera sensorer, …).

sensor-qstr:en är fortfarande inkopplad i modules/py_csi.c för bakåtkompatibla firmwarebyggen, men den får inga nya funktioner, och alla exempel, dokumentation och bibliotekskod antar nu csi.

Commits: 945c5853c, 61f835b7e

Modul till klass

Före (sensor):

import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()

Efter (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-par sammanslagna till kombinerade accessorer

I det nya API:et returnerar en metod som anropas utan argument det aktuella värdet; anropad med ett värde sätter den det. Prefixen set_*/get_* är borta. Metodnamnen tappade också ing-suffixet där det var överflödigt (windowingwindow). Kolumnen för det nya API:et länkar till referensdokumentationen.

sensor (gammalt)

csi.CSI (nytt)

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

Funktioner utan direkt motsvarighet

sensor (borttaget)

Vad man använder istället

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

image.Image (w, h, pixfmt) — en vanlig heap-allokerad bild. Bildbufferten styckas inte längre upp för användarbuffertar.

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

csi.CSI.snapshot() — skip-frames inarbetat i snapshot via dess argument time= / frames=.

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

Flyttat in i csi.CSI-konstruktorn: csi.CSI(delays=False) / csi.CSI(fflush=False).

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

Borttaget. Bilden som returneras av csi.CSI.snapshot() är det kanoniska handtaget.

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — argumentet expand togs bort (se csi-uppföljningarna).

Nytt på csi.CSI

  • csi.CSI(stream=True|False) — en väljare vid konstruktionstillfället som väljer vilken CSI som matar förhandsvisningsbildbufferten (ersätter update=-kwargen per stillbild, se csi-uppföljningarna).

  • csi.CSI(cid=N) / csi.devices() — stöd för flera CSI:er på kort med fler än en bildsensor.

image-modulen — signaturöversyn (major)#

image-modulen såg den bredaste API-ändringen efter csi — ritsignaturer, resultatobjekt och flera detektorer ändrades alla.

Koordinatargument måste vara tupler

modules/py_image.c skrevs om ovanpå mp_arg_parse_all. Alla rit-/pixelmetoder som tidigare tog separata positionsargument x, y, ... kräver nu att dessa koordinater packas i en enda tupel.

Commits: d18bbc472, 0c60c94b9 (PR #3061)

Före

Efter

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)

Alla är metoder i image.Image.

Resultatobjekt konverterade till attrtuple

Dessa typer är nu MicroPython attrtuple-objekt: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Attributåtkomst utan parenteser är nu det kanoniska sättet.

Commit: 3399d302e

Före (metodstil):

img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())

Efter (attributstil):

img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)

blob och histogram är oförändrade — de behåller sina befintliga typer och ()-accessorer (en attrtuple kan inte uttrycka en blobs lat-beräknade värden eller en histograms argumenttagande accessorer).

find_features haar-parameteromdöpning

image.Image.find_features()scale_factor= döptes om till scale=.

Commit: be4c5cd73

get_regression — nu alltid robust, target_size tillagt

image.Image.get_regression() använder nu alltid den robusta (Theil-Sen) regressionen. Den gamla snabba minsta-kvadrat-vägen togs bort, så nyckelordet robust= är borta — det som tidigare krävde robust=True är nu det enda beteendet. Ett nytt target_size=(w, h)-kwarg (standard (80, 60)) ytskalar ner ROI:n före O(N^2) Theil-Sen-anpassningen så att den alltid körs på en rimlig bildstorlek; den anpassade linjens ändpunkter mappas tillbaka till källkoordinater. Exemplet linear_regression_robust.py togs bort och linear_regression_fast.py döptes om till linear_regression.py.

Commits: c7c2e69a0, 0ff2afa72

find_line_segments — ny algoritm

image.Image.find_line_segments() — den gamla LSD-detektorn ersattes av ED-Lines, och den fick ett nytt threshold=50-kwarg. Utdata från tidigare trimmade skript kommer att skilja sig.

Commits: 87da2a7b7, 2c47b5735

AprilTag-bibliotek ersatt

image.Image.find_apriltags() — AprilTag-detektorn ersattes med en ny implementation. Familjeuppsättningen ändrades:

Commit: e813bada7

csi-moduluppföljning (minor)#

Mindre csi-uppföljningar ovanpå csi-migreringen.

snapshot(update=…) borttaget

update-kwargen på csi.CSI.snapshot() är borta. För att hindra en CSI-enhet från att mata förhandsvisningsbildbufferten, välj bort det vid konstruktionstillfället:

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 borttaget

csi.CSI.framebuffers() — det tredje positionsargumentet (expand) är borta; signaturen är nu framebuffers([count]).

Commit: 86cb3a5de

protocol-modulen (minor)#

Påverkar bara skript som drev värdlänken direkt. Se protocol.

timer_ms omdöpt till poll_ms

protocol.init() — argumentet timer_ms döptes om till poll_ms.

protocol.init(..., poll_ms=10)   # was: timer_ms=10

Commits: 8a0635e8c, 95a290607

protocol.poll() borttaget

Protokolluppgiften schemaläggs nu internt. Anrop till protocol.poll() ger upphov till AttributeError.

Commit: 8a0635e8c

soft_reboot config-argument borttaget

protocol.init() — argumentet soft_reboot är borta. Alla nuvarande transporter tolererar mjuka omstarter, så beteendet är nu ovillkorligt.

Commit: 0bf766aa2

display-moduler (minor)#

TV-utmatning går nu genom ett display.TVDisplay-objekt istället för den fristående tv-modulen. display fick också en generisk ioctl().

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

tof-modulen (behavior)#

Samma API som tidigare; standardvärdena och felhanteringen ändrades. Se tof.

Standardtimeout ändrad

tof.read_depth() och tof.snapshot() (anropade med timeout=-1) har nu som standard 100 ms istället för att vänta i oändlighet. Skicka ett uttryckligt större värde om du behöver det gamla beteendet.

Commit: b6772b80d

Automatisk återhämtning

Drivrutinen hård-återställer nu I2C-bussen och sensorn vid avstånds-/timeout-fel. Exemplen anropar inte längre tof.reset() i sina undantagshanterare — användarkod som gjorde manuell återhämtning bör ta bort den (den kommer att motarbeta den nya automatiska återhämtningen).

Commits: b6772b80d, 80ffaa5c3

ML-bibliotek (behavior)#

Samma API, andra siffror — kontrollera alla trimmade ML-pipelines på nytt.

Förbehandling sträcker nu istället för letterboxar

Normalization använder nu image.SCALE_ASPECT_IGNORE (sträck) istället för image.SCALE_ASPECT_EXPAND (letterbox). NMS-efterbehandling växlade också till oberoende x/y-skalning.

Observera

Påverkan. YOLO-liknande detektorer och nyckelpunktsregressorer förbättras generellt. Exemplen BlazeFace, BlazePalm, FaceLandmarks och HandLandmarks kräver nu en manuell kvadratisk beskärning av in-ROI:n — exempelskripten uppdaterades; egen användarkod måste göra detsamma.

Commit: 68dc29a33

ml.utils.mod()-hjälpfunktion borttagen

ulab 6.12.0 stöder % på ndarrays inbyggt. Kod som importerade mod från ml.utils måste använda a % b.

Commits: 35ece5728, 82fbd858c

Bygg / verktyg (tooling)#

Inget av detta påverkar MicroPython-skript. Att bygga den fasta programvaran från källkod kräver nu den externa OpenMV SDK (1.6.0, tidigare i trädet). Flera bygg-verktyg i trädet togs bort och N6 flyttades till TinyUSB-stacken; nedströms forkar bör granska historiken i firmware-arkivet — särskilt att file_open()-signaturen släpper sitt buffered-argument.

Migreringschecklista#

För en ren portning till v5.0.0 är det typiska arbetet:

  1. Ersätt import sensor med import csi; csi0 = csi.CSI() och översätt varje set_*/get_*-anrop till dess csi.CSI-accessor (csi-migreringen).

  2. Packa in koordinatargument till img.draw_*, get_pixel() och set_pixel() i tupler (ändringarna i image-modulen).

  3. Slopa () från attrtuple-resultataccessorer om du vill ha den nya idiomatiska formen, eller lämna den gamla stilen ifred eftersom attrtupler fortfarande stöder anropbara accessorer (ändringarna i image-modulen).

  4. Granska find_line_segments(), get_regression() och eventuellt val av find_apriltags()-familj (ändringarna i image-modulen).

  5. Döp om timer_mspoll_ms i protocol.init()-anrop; ta bort protocol.poll() och soft_reboot= (ändringarna i protocol-modulen).

  6. För ML-arbetsflöden: se över alla modeller som behövde letterboxad indata (ändringarna i ML-biblioteket).