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 protocol umožňuje skriptům vytvářet vlastní přenosy a datové kanály. Viz změny modulu protocol.

  • Třídní csi API kamery. import sensor se mění na import 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 MoveNet plus přibalený model movenet_singlepose_192.tflite na 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řída protocol.ProtocolChannel s send_event(), plus konstanty CHANNEL_FLAG_* a CHANNEL_ID_*. Konečná signatura protocol.init() je zdokumentována v změnách modulu protocol.

  • protocol.CBORChannel — zmrazený rozšiřující balíček protocol, 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_MEMORY zpřístupňuje IDE statistiky běhové paměti po jednotlivých poolech a nový stream ioctl STREAM_SOURCE umožň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 kamercsi.CSI přijímá argument stream=, 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ódu clock.fps(). Viz migrace na csi a navazující změny csi.

  • Událostní senzor GenX320 — nový filtr Spatio-Temporal Contrast (csi.IOCTL_GENX320_SET_STC s režimy csi.GENX320_STC_DISABLE, csi.GENX320_STC_ONLY, csi.GENX320_STC_TRAIL_ONLY a csi.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 (kwargs threshold, nms_threshold, nms_sigma) vracející ((x, y, w, h), score, keypoints) s polem 17 kloubových klíčových bodů COCO; model movenet_singlepose_192.tflite a ukázka jsou přibaleny na AE3 a N6.

  • ml.utils.draw_predictions() — nový volitelný argument scores= 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žim format="point" kreslí značku středu pro detektory centerpoint/peak.

  • Nová třída display.TVDisplay (s obecným ioctl()) nahrazuje samostatný modul tv. Viz změny modulu display.

  • Nový detektor find_line_segments() (ED-Lines) — nyní dostupný ve všech sestaveních, s novým argumentem threshold=. 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á funkce ml.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ý argument load_to_fb byl 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říklad img.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_RAW již nerozhází náhled v IDE.

  • FLIR Lepton csi.IOCTL_LEPTON_SET_MODE přes csi.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í timeout tof.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; cbor2 zmrazen 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.

Commity: 945c5853c, 61f835b7e

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á (windowingwindow). Sloupec nového API odkazuje na referenční dokumentaci.

sensor (staré)

csi.CSI (nové)

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

Funkce bez přímého ekvivalentu

sensor (odstraněno)

Co použít místo toho

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

image.Image (w, h, pixfmt) — běžný obraz alokovaný na haldě. Snímkový buffer (frame buffer) se již nerozkrajuje na uživatelské buffery.

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

csi.CSI.snapshot() — přeskakování snímků zahrnuto do snapshot přes jeho argumenty time= / frames=.

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

Přesunuto do konstruktoru csi.CSI: csi.CSI(delays=False) / csi.CSI(fflush=False).

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

Odstraněno. Obraz vrácený csi.CSI.snapshot() je kanonickým handlem.

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — argument expand byl odstraněn (viz navazující změny csi).

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 kwarg update= 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

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)

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.

Commity: c7c2e69a0, 0ff2afa72

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.

Commity: 87da2a7b7, 2c47b5735

Knihovna AprilTag nahrazena

image.Image.find_apriltags() — detektor AprilTag byl nahrazen novou implementací. Sada rodin se změnila:

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

Commity: 9a8077827, 26b79a2c5

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

Commity: 8a0635e8c, 95a290607

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

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

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

Commity: b6772b80d, 80ffaa5c3

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.

Commity: 35ece5728, 82fbd858c

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:

  1. Nahraďte import sensor za import csi; csi0 = csi.CSI() a přeložte každé volání set_*/get_* na jeho přístupovou metodu csi.CSI (migrace na csi).

  2. Zabalte souřadnicové argumenty u img.draw_*, get_pixel() a set_pixel() do tuple (změny modulu image).

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

  4. Prověřte find_line_segments(), get_regression() a jakoukoli volbu rodiny find_apriltags() (změny modulu image).

  5. Přejmenujte timer_mspoll_ms ve voláních protocol.init(); odstraňte protocol.poll() a soft_reboot= (změny modulu protocol).

  6. Pro ML workflow: znovu zvažte jakýkoli model, který potřeboval letterboxovaný vstup (změny knihovny ML).