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#
Modulen
protocol— skapa egna transporter och datakanaler från Python:protocol.init(),protocol.register(),protocol.is_active(), och enprotocol.ProtocolChannel-klass medsend_event(), samt konstanternaCHANNEL_FLAG_*ochCHANNEL_ID_*. Den slutliga signaturen förprotocol.init()finns dokumenterad i ändringar i protocol-modulen.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.
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.
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).