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 sensorblirimport 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öljandemovenet_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¶
The
protocolmodule — create custom transports and data channels from Python:protocol.init(),protocol.register(),protocol.is_active(), and aprotocol.ProtocolChannelclass withsend_event(), plusCHANNEL_FLAG_*andCHANNEL_ID_*constants. The finalprotocol.init()signature is documented in the protocol module changes.protocol.CBORChannel— ett frystprotocol-tilläggspaket som serialiserar namngivna fält till CBOR med visningswidgetar (etikett, djup) och interaktiva kontroller (växlare, skjutreglage, val).Värdminnes- och strömintrospektion — ett nytt
SYS_MEMORY-protokollkommando exponerar körtidsstatistik för minne per pool till IDE:n, och en nySTREAM_SOURCE-ström-ioctl låter värden välja vilken kamera som matar förhandsvisningen på kort med flera kameror (protokollversion 1.0.1).Strömning med flera kameror —
csi.CSItar ettstream=-argument som väljer vilken sensor som matar IDE-förhandsvisningen; strömbildruterubriken bär nu en EMA-utjämnad FPS så att IDE:n visar bildhastigheten utanclock.fps()-standardkod. Se csi-migreringen och csi-uppföljningarna.GenX320-händelsesensor — ett nytt spatiotemporalt kontrastfilter (
csi.IOCTL_GENX320_SET_STCmed lägenacsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYochcsi.GENX320_STC_TRAIL) och rå händelseläsning (csi.IOCTL_GENX320_READ_EVENTS_RAW), med nya exempelskript.MoveNet— en ny MediaPipe-efterbehandlare för enskild pose (kwargsthreshold,nms_threshold,nms_sigma) som returnerar((x, y, w, h), score, keypoints)med en COCO-nyckelpunktsarray med 17 leder; enmovenet_singlepose_192.tflite-modell och ett exempel medföljer på AE3 och N6.ml.utils.draw_predictions()— ett nytt valfrittscores=-argument lägger till konfidens per etikett, teckensnitt och rutans linjebredd skalas nu automatiskt till bildbredden, och ett nyttformat="point"-läge ritar en mittmarkör för centerpunkts-/toppdetektorer.Den nya
display.TVDisplay-klassen (med en generiskioctl()) ersätter den friståendetv-modulen. Se ändringarna i display-modulen.En ny
find_line_segments()-detektor (ED-Lines) — nu tillgänglig på alla byggen, med ett nyttthreshold=-argument. Se ändringarna i image-modulen.
Ö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älpfunktionenml.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— nyckelordsargumentetload_to_fbtogs bort; modellminne hanteras automatiskt av den enhetliga allokeraren.image.Image.scale()på plats — att skala upp en bild på plats (till exempelimg.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_MODEviacsi.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:
tof.read_depth()ger inte längre upphov till fel vid tillfälliga avståndsmätningsfel och återhämtar sig automatiskt från bussfel; standardtimeouten förtof.read_depth()/tof.snapshot()är nu 100 ms (se tof-ändringarna).Fixade korruption av djupdata i flera zoner för VL53L5CX / VL53L8CX.
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;
cbor2fryst in i den fasta programvaran.Alif (AE3, N6) — lågeffekt-uppvakning via
machine.RTC.Högupplösta AprilTags —
find_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.
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 (windowing → window). Kolumnen för det nya API:et länkar till referensdokumentationen.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Funktioner utan direkt motsvarighet
|
Vad man använder istället |
|---|---|
|
|
|
|
|
Flyttat in i |
|
|
|
Borttaget. Bilden som returneras av |
|
|
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ätterupdate=-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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
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.
AprilTag-bibliotek ersatt
image.Image.find_apriltags() — AprilTag-detektorn ersattes med en ny implementation. Familjeuppsättningen ändrades:
Borttaget |
Tillagt |
|---|---|
|
|
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, ...)
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
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().
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).
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.
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:
Ersätt
import sensormedimport csi; csi0 = csi.CSI()och översätt varjeset_*/get_*-anrop till desscsi.CSI-accessor (csi-migreringen).Packa in koordinatargument till
img.draw_*,get_pixel()ochset_pixel()i tupler (ändringarna i image-modulen).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).Granska
find_line_segments(),get_regression()och eventuellt val avfind_apriltags()-familj (ändringarna i image-modulen).Döp om
timer_ms→poll_msiprotocol.init()-anrop; ta bortprotocol.poll()ochsoft_reboot=(ändringarna i protocol-modulen).För ML-arbetsflöden: se över alla modeller som behövde letterboxad indata (ändringarna i ML-biblioteket).