v5.0.0¶
v5.0.0 je velké vydání. V čele stojí: přestavěné hostitelské propojení OpenMV Protocol V2, třídní csi API kamery, které škáluje na desky s více kamerami, spustitelný cíl simulátoru, odhad jedné pózy MoveNet, MicroPython 1.28 a velká dávka oprav kamer, ML a ToF. Přináší také řadu zpětně nekompatibilních změn API — každá uživatelsky viditelná změna od v4.8.1 je uvedena níže, spolu s přesným postupem migrace.
Hlavní novinky¶
OpenMV Protocol V2. Propojení hostitel/IDE bylo přestavěno od základu: rámcované, sekvencované, kontrolované CRC, s multiplexovanými kanály pro stdio, náhled streamu a uživatelská data. Nový modul
protocolumožňuje skriptům vytvářet vlastní přenosy a datové kanály. Viz změny modulu protocol.Třídní
csiAPI kamery.import sensorse mění naimport csi/csi.CSI, s nativní podporou více kamer. Viz migrace na csi.Cíl simulátoru. Firmware se nyní sestavuje a běží pod simulátorem Arm FVP / QEMU (MPS2/MPS3), včetně emulace NPU, ROMFS a PSRAM — skripty pro vidění a ML mohou běžet bez připojeného hardwaru.
Odhad pózy MoveNet. Nový post-processor
MoveNetplus přibalený modelmovenet_singlepose_192.tflitena OpenMV AE3 a N6.MicroPython 1.28 a ulab 6.12.0, nástroje ST Edge AI 4.0 a externalizovaná sada OpenMV SDK (viz změny sestavení / nástrojů).
Nové funkce¶
Modul
protocol— vytváření vlastních přenosů a datových kanálů z Pythonu:protocol.init(),protocol.register(),protocol.is_active()a třídaprotocol.ProtocolChannelssend_event(), plus konstantyCHANNEL_FLAG_*aCHANNEL_ID_*. Konečná signaturaprotocol.init()je zdokumentována v změnách modulu protocol.protocol.CBORChannel— zmrazený rozšiřující balíčekprotocol, který serializuje pojmenovaná pole do CBOR se zobrazovacími widgety (label, depth) a interaktivními ovládacími prvky (toggle, slider, select).Introspekce hostitelské paměti a streamu — nový příkaz protokolu
SYS_MEMORYzpřístupňuje IDE statistiky běhové paměti po jednotlivých poolech a nový stream ioctlSTREAM_SOURCEumožňuje hostiteli vybrat, která kamera napájí náhled na deskách s více kamerami (verze protokolu 1.0.1).Streamování z více kamer —
csi.CSIpřijímá argumentstream=, který vybírá, který senzor napájí náhled IDE; hlavička snímku streamu nyní nese EMA vyhlazené FPS, takže IDE zobrazuje snímkovou frekvenci bez boilerplate kóduclock.fps(). Viz migrace na csi a navazující změny csi.Událostní senzor GenX320 — nový filtr Spatio-Temporal Contrast (
csi.IOCTL_GENX320_SET_STCs režimycsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYacsi.GENX320_STC_TRAIL) a čtení surových událostí (csi.IOCTL_GENX320_READ_EVENTS_RAW), s novými ukázkovými skripty.MoveNet— nový MediaPipe post-processor pro jednu pózu (kwargsthreshold,nms_threshold,nms_sigma) vracející((x, y, w, h), score, keypoints)s polem 17 kloubových klíčových bodů COCO; modelmovenet_singlepose_192.tflitea ukázka jsou přibaleny na AE3 a N6.ml.utils.draw_predictions()— nový volitelný argumentscores=připojuje spolehlivost u jednotlivých štítků, písmo a tloušťka rámečku se nyní automaticky přizpůsobují šířce obrazu a nový režimformat="point"kreslí značku středu pro detektory centerpoint/peak.Nová třída
display.TVDisplay(s obecnýmioctl()) nahrazuje samostatný modultv. Viz změny modulu display.Nový detektor
find_line_segments()(ED-Lines) — nyní dostupný ve všech sestaveních, s novým argumentemthreshold=. Viz změny modulu image.
Další změny a vylepšení¶
MicroPython aktualizován na 1.28.0 ze základu v4.8.1. Přidává vysokorychlostní režim SD karty na H5/H7/N6, hodinování AHB5 v nízkopříkonovém režimu a ovladatelné JTAG piny jako GPIO na OPENMV_AE3.
ulab aktualizován na 6.12.0 — nativní operátor
%na ndarrays (pomocná funkceml.utils.mod()byla odstraněna; viz změny knihovny ML).Nástroje ST Edge AI aktualizovány na 4.0 — ovlivňuje kompilaci a nasazení ST modelů na zařízení.
ml.Model— klíčový argumentload_to_fbbyl odstraněn; paměť modelu je řešena automaticky sjednoceným alokátorem.image.Image.scale()na místě — zvětšení obrazu na místě (napříkladimg.scale(x_scale=2.0, y_scale=2.0)) nyní zvětší snímkový buffer (frame buffer), aby se vešel, místo selhání.Větší stdio buffer — výchozí textový buffer do IDE vzrostl z 512 na 1024 bajtů na OpenMV 2/3/4, Nicla Vision, AE3 a N6, takže větší dávky
print()nejsou ořezány.Plynulejší tok událostí hostitele — události stdout NOTIFY pro hostitele jsou omezeny na nejvýše jednu na čtení hostitele namísto jedné na každý
print()překračující vodoznak kruhového bufferu.Přerušitelné dlouhé operace — dlouhé smyčky vykreslování obrazu, čekání GPU (Nema/Dave2D) a NPU nyní obsluhují události v deterministickém intervalu, takže skripty zůstávají responzivní vůči tlačítku Stop v IDE i během náročné práce.
Opravy chyb¶
Kamera a senzory:
find_apriltags()již nepoškozuje výsledky na deskách s D-cache/GPU (N6, AE3) a nyní funguje na AE3.Opraven výstup Bayer obrazu z ISP STM32 N6 po přepnutí formátů pixelů.
Opraveno přepálení zeleného automatického vyvážení bílé na jasných scénách a případ neinicializovaných AWB statistik prvního snímku; zvýšen práh ořezu gama ISP STM32 (z 32 na 63) pro širší rozsah gama/kontrastu/jasu.
Automatická expozice PS5520 již nekolísá v jasném světle; chování AEC/AGC PAG7936 bylo přepracováno (sloučené řízení, opraven strop zisku).
Obnoveno nahrávání firmwaru autofokusu OV5640 na Portenta/Nicla (oprava MIMXRT I2C SUSPEND).
Opraven deadlock při zachycení kamery, když je limit snímkové frekvence kombinován se zachycením JPEG (STM32).
Čtení GenX320
csi.IOCTL_GENX320_READ_EVENTS_RAWjiž nerozhází náhled v IDE.FLIR Lepton
csi.IOCTL_LEPTON_SET_MODEpřescsi.CSI.ioctl()nyní funguje při volání s jediným argumentem.
Zpracování obrazu:
Opraveno alfa míchání
draw_image()/blend(), když je dodána maska.Opraveno pořadí bitů kódování/dekódování 1bitového (BINARY) PNG a dekódování stupňů šedi z 1 bitu.
Opravena metadata délky/FPS nahrávky
mjpeg.Mjpeg.Opraveno přetečení zásobníku softwarového dekódování JPEG na deskách s malým zásobníkem (OpenMV M7).
Opravena automatická detekce formátu souborů JPEG/PNG na hostitelích bez ARM (simulátor).
Time-of-Flight:
tof.read_depth()již nevyvolává výjimku při přechodných chybách měření vzdálenosti a automaticky se zotavuje z chyb sběrnice; výchozí timeouttof.read_depth()/tof.snapshot()je nyní 100 ms (viz změny tof).Opraveno poškození vícezónových hloubkových dat VL53L5CX / VL53L8CX.
ML a systém:
NPU se na N6 korektně vyčistí, když je inference přerušena.
Obnoveno probuzení z hlubokého spánku / pohotovostního režimu na N6; opraveno zaseknutí AE3 při skoku do bootloaderu.
Opraveny úniky paměti při softwarovém resetu (STM32 Nema GPU) a předčasně uvolněný pomocný snímkový buffer (frame buffer).
Vlastní protokolové kanály v Pythonu nyní přežijí softwarový restart, USB přenos se zotaví z resetu sběrnice / zaseknutých endpointů a je opraveno zahlcení přerušeními USB SOF.
Hardware a podpora desek¶
OpenMV N6 — povolen Ethernet (drátové síťování); NPU AXI SRAM (1,75 MB) sloučena do sdíleného přechodného poolu pro více RAM mezi inferencemi; probuzení z hlubokého spánku/pohotovosti; přibalené modely TFLite a Haar kaskády v ROMFS.
OpenMV AE3 — přibalené modely a kaskády v ROMFS;
cbor2zmrazen do firmwaru.Alif (AE3, N6) — nízkopříkonové probuzení
machine.RTC.AprilTagy ve vysokém rozlišení —
find_apriltags()v plném rozlišení senzoru na AE3, Arduino Giga a Arduino Portenta H7.Cíle simulátoru — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), s emulací NPU, ROMFS a PSRAM.
Zpětně nekompatibilní změny API¶
Uživatelsky viditelné změny API mezi v4.8.1 a v5.0.0. Rozsah: Python C-moduly v modules/ a Python knihovny v scripts/libraries/.
Každá změna je označena svým dopadem:
major — většina skriptů vyžaduje úpravy.
minor — úzké API; ovlivňuje pouze skripty, které jej používaly.
behavior — stejné API, jiné výsledky; znovu zkontrolujte vyladěné skripty.
tooling — ovlivňuje pouze sestavení ze zdrojů / navazující forky.
Změny jsou seskupeny podle dopadu v tomto pořadí — nejprve major, pak minor, behavior a tooling. Pokud chcete jen portovat svůj kód, přejděte na kontrolní seznam migrace na konci pro zhuštěný seznam úkolů. Každý hash commitu odkazuje na svůj diff na GitHubu.
sensor nahrazen modulem csi (major)¶
Každá oficiální ukázka byla přepsána tak, aby vypustila import sensor ve prospěch import csi. Starší funkční API na úrovni modulu (sensor.reset(), sensor.set_pixformat(), …) je nahrazeno třídním API csi.CSI, které přirozeně škáluje na desky s více kamerami (csi0, csi1, …) a je vyžadováno pro všechny nové funkce (kwarg stream=, streamování z více senzorů, …).
Qstr sensor je stále zapojen v modules/py_csi.c pro zpětně kompatibilní sestavení firmwaru, ale nezíská nové funkce a všechny ukázky, dokumentace a knihovní kód nyní předpokládají csi.
Z modulu na třídu
Předtím (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
Potom (csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
Dvojice setter/getter sloučeny do kombinovaných přístupových metod
V novém API metoda volaná bez argumentů vrací aktuální hodnotu; volaná s hodnotou ji nastaví. Prefixy set_*/get_* zmizely. Názvy metod také ztratily příponu ing tam, kde byla nadbytečná (windowing → window). Sloupec nového API odkazuje na referenční dokumentaci.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Funkce bez přímého ekvivalentu
|
Co použít místo toho |
|---|---|
|
|
|
|
|
Přesunuto do konstruktoru |
|
|
|
Odstraněno. Obraz vrácený |
|
|
Novinky na csi.CSI
csi.CSI(stream=True|False)— selektor v době konstrukce, který volí, který CSI napájí náhledový snímkový buffer (frame buffer) (nahrazuje kwargupdate=u jednotlivých snímků, viz navazující změny csi).csi.CSI(cid=N)/csi.devices()— podpora více CSI pro desky s více než jedním obrazovým senzorem.
modul image — přepracování signatur (major)¶
Modul image zaznamenal nejširší změnu API hned po csi — změnily se signatury kreslení, výsledkové objekty a několik detektorů.
Souřadnicové argumenty musí být tuple
modules/py_image.c byl přepsán nad mp_arg_parse_all. Všechny metody kreslení / pixelů, které dříve braly samostatné poziční argumenty x, y, ..., nyní vyžadují tyto souřadnice zabalené do jediného tuple.
Commity: d18bbc472, 0c60c94b9 (PR #3061)
Předtím |
Potom |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Všechny jsou metodami image.Image.
Výsledkové objekty převedeny na attrtuple
Tyto typy jsou nyní MicroPython objekty attrtuple: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Přístup k atributům bez závorek je nyní kanonický.
Commit: 3399d302e
Předtím (metodový styl):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
Potom (atributový styl):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob a histogram jsou nezměněny — zachovávají si své stávající typy a přístupové metody () (attrtuple nedokáže vyjádřit líně počítané hodnoty blobu ani přístupové metody histogramu přijímající argumenty).
Přejmenování parametru haar u find_features
image.Image.find_features() — scale_factor= byl přejmenován na scale=.
Commit: be4c5cd73
get_regression — nyní vždy robustní, přidán target_size
image.Image.get_regression() nyní vždy používá robustní (Theil-Sen) regresi. Stará rychlá cesta nejmenších čtverců byla odstraněna, takže klíčové slovo robust= zmizelo — to, co dříve vyžadovalo robust=True, je nyní jediné chování. Nový kwarg target_size=(w, h) (výchozí (80, 60)) plošně zmenší ROI před proložením Theil-Sen s O(N^2), takže vždy běží na rozumné velikosti obrazu; koncové body proložené přímky jsou mapovány zpět na zdrojové souřadnice. Ukázka linear_regression_robust.py byla smazána a linear_regression_fast.py byla přejmenována na linear_regression.py.
find_line_segments — nový algoritmus
image.Image.find_line_segments() — starý detektor LSD byl nahrazen ED-Lines a získal nový kwarg threshold=50. Výstup dříve vyladěných skriptů se bude lišit.
Knihovna AprilTag nahrazena
image.Image.find_apriltags() — detektor AprilTag byl nahrazen novou implementací. Sada rodin se změnila:
Odstraněno |
Přidáno |
|---|---|
|
|
Commit: e813bada7
navazující změny modulu csi (minor)¶
Menší navazující změny csi nad rámec migrace na csi.
snapshot(update=…) odstraněno
Kwarg update u csi.CSI.snapshot() zmizel. Chcete-li zabránit CSI zařízení v napájení náhledového snímkového bufferu (frame buffer), zvolte odhlášení v době konstrukce:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
argument expand u framebuffers() odstraněn
csi.CSI.framebuffers() — třetí poziční argument (expand) zmizel; signatura je nyní framebuffers([count]).
Commit: 86cb3a5de
modul protocol (minor)¶
Ovlivňuje pouze skripty, které řídily hostitelské propojení přímo. Viz protocol.
timer_ms přejmenován na poll_ms
protocol.init() — argument timer_ms byl přejmenován na poll_ms.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() odstraněno
Úloha protokolu je nyní plánována interně. Volání protocol.poll() vyvolá AttributeError.
Commit: 8a0635e8c
konfigurační argument soft_reboot odstraněn
protocol.init() — argument soft_reboot zmizel. Všechny současné přenosy tolerují softwarové restarty, takže toto chování je nyní bezpodmínečné.
Commit: 0bf766aa2
moduly display (minor)¶
TV výstup nyní prochází přes objekt display.TVDisplay namísto samostatného modulu tv. display také získal obecný ioctl().
modul tof (behavior)¶
Stejné API jako dříve; změnily se výchozí hodnoty a zpracování chyb. Viz tof.
Změna výchozího timeoutu
tof.read_depth() a tof.snapshot() (volané s timeout=-1) nyní výchozí na 100 ms namísto neomezeného čekání. Pokud potřebujete staré chování, předejte explicitní vyšší hodnotu.
Commit: b6772b80d
Automatické zotavení
Ovladač nyní při chybách měření vzdálenosti/timeoutu tvrdě resetuje sběrnici I2C a senzor. Ukázky již nevolají tof.reset() ve svých obsluhách výjimek — uživatelský kód, který prováděl ruční zotavení, by jej měl odstranit (bude bojovat s novým automatickým zotavením).
knihovna ML (behavior)¶
Stejné API, jiná čísla — znovu zkontrolujte jakýkoli vyladěný ML pipeline.
Předzpracování nyní roztahuje místo letterboxingu
Normalization nyní používá image.SCALE_ASPECT_IGNORE (roztažení) namísto image.SCALE_ASPECT_EXPAND (letterbox). Post-processing NMS se také přepnul na nezávislé škálování x/y.
Poznámka
Dopad. Detektory typu YOLO a regresory klíčových bodů se obecně zlepšují. Ukázky BlazeFace, BlazePalm, FaceLandmarks a HandLandmarks nyní vyžadují ruční čtvercový ořez vstupní ROI — ukázkové skripty byly aktualizovány; vlastní uživatelský kód musí udělat totéž.
Commit: 68dc29a33
pomocná funkce ml.utils.mod() odstraněna
ulab 6.12.0 podporuje % na ndarrays nativně. Kód, který importoval mod z ml.utils, musí použít a % b.
Sestavení / nástroje (tooling)¶
Nic z toho neovlivňuje skripty MicroPython. Sestavení firmwaru ze zdrojů nyní vyžaduje externí OpenMV SDK (1.6.0, dříve v repozitáři). Několik vestavěných nástrojů pro sestavení bylo odstraněno a N6 přešel na zásobník TinyUSB; navazující forky by si měly projít historii repozitáře firmwaru — zejména signaturu file_open() vypouštějící svůj argument buffered.
Kontrolní seznam migrace¶
Pro čistý port na v5.0.0 typicky obnáší práce:
Nahraďte
import sensorzaimport csi; csi0 = csi.CSI()a přeložte každé voláníset_*/get_*na jeho přístupovou metoducsi.CSI(migrace na csi).Zabalte souřadnicové argumenty u
img.draw_*,get_pixel()aset_pixel()do tuple (změny modulu image).Vypusťte
()z přístupových metod výsledků typu attrtuple, pokud chcete novou idiomatickou formu, nebo ponechte starý styl beze změny, protože attrtuple stále podporují volatelné přístupové metody (změny modulu image).Prověřte
find_line_segments(),get_regression()a jakoukoli volbu rodinyfind_apriltags()(změny modulu image).Přejmenujte
timer_ms→poll_msve voláníchprotocol.init(); odstraňteprotocol.poll()asoft_reboot=(změny modulu protocol).Pro ML workflow: znovu zvažte jakýkoli model, který potřeboval letterboxovaný vstup (změny knihovny ML).