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.

Anteckning

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