v5.0.0#

v5.0.0 je glavno izdanje. Na čelu su: iznova izgrađena OpenMV Protocol V2 veza prema računalu, klasni csi API kamere koji se prilagođava pločama s više kamera, izvršni cilj simulatora, MoveNet procjena položaja jedne osobe, MicroPython 1.28 i velika serija ispravaka za kamere, ML i ToF. Uvodi i niz promjena API-ja koje narušavaju kompatibilnost — svaka korisniku vidljiva promjena od v4.8.1 navedena je u nastavku, zajedno s točnim uputama za migraciju.

Istaknuto#

  • OpenMV Protocol V2. Veza prema računalu/IDE-u izgrađena je iz temelja: uokvirena, sekvencirana, provjeravana CRC-om, s multipleksiranim kanalima za stdio, pregled toka i korisničke podatke. Novi modul protocol omogućuje skriptama da stvaraju vlastite prijenose i podatkovne kanale. Pogledajte promjene modula protocol.

  • Klasni csi API kamere. import sensor postaje import csi / csi.CSI, s nativnom podrškom za više kamera. Pogledajte migraciju na csi.

  • Cilj simulatora. Ugrađeni program (firmware) sada se gradi i izvodi pod Arm FVP / QEMU simulatorom (MPS2/MPS3), uključujući emulaciju NPU-a, ROMFS-a i PSRAM-a — skripte za vid i ML mogu se izvoditi bez priključenog sklopovlja.

  • MoveNet procjena položaja. Novi MoveNet naknadni obrađivač uz priloženi model movenet_singlepose_192.tflite na OpenMV AE3 i N6.

  • MicroPython 1.28 i ulab 6.12.0, alati ST Edge AI 4.0 te eksternalizirani OpenMV SDK (pogledajte promjene gradnje / alata).

Nove značajke#

Ostale promjene i poboljšanja#

  • MicroPython ažuriran na 1.28.0 s baze v4.8.1. Dodaje brzi način SD kartice na H5/H7/N6, AHB5 takt u načinu niske potrošnje i upravljive JTAG pinove kao GPIO-e na OPENMV_AE3.

  • ulab ažuriran na 6.12.0 — nativni operator % na ndarrayima (pomoćnik ml.utils.mod() je uklonjen; pogledajte promjene ML biblioteke).

  • ST Edge AI alati ažurirani na 4.0 — utječe na ST kompilaciju i implementaciju modela na uređaju.

  • ml.Model — uklonjen je ključni argument load_to_fb; memorijom modela sada automatski upravlja objedinjeni alokator.

  • image.Image.scale() na mjestu — povećavanje slike na mjestu (na primjer img.scale(x_scale=2.0, y_scale=2.0)) sada proširuje međuspremnik slike kako bi stalo umjesto da ne uspije.

  • Veći stdio međuspremnik — zadani tekstualni međuspremnik prema IDE-u narastao je s 512 na 1024 bajta na OpenMV 2/3/4, Nicla Vision, AE3 i N6, pa se veće serije print() ne odsijecaju.

  • Glađi tok događaja prema računalu — stdout NOTIFY događaji prema računalu ograničeni su na najviše jedan po čitanju računala umjesto jedan po svakom print() koji prijeđe vodenu oznaku kružnog međuspremnika.

  • Prekidive duge operacije — duge petlje crtanja slike, GPU (Nema/Dave2D) i NPU čekanja sada poslužuju događaje u determinističkom intervalu, pa skripte ostaju odazivne na IDE Stop gumb tijekom teškog rada.

Ispravci grešaka#

Kamera i senzori:

  • find_apriltags() više ne kvari rezultate na pločama s D-cacheom/GPU-om (N6, AE3) i sada radi na AE3.

  • Ispravljen Bayer izlaz slike iz STM32 N6 ISP-a nakon promjene formata piksela.

  • Ispravljeno zeleno preeksponiranje automatske ravnoteže bijele na svijetlim scenama te slučaj neinicijaliziranih AWB statistika prve sličice; podignut STM32 ISP gama clamp (32 na 63) za širi raspon game/kontrasta/svjetline.

  • PS5520 automatska ekspozicija više ne oscilira na jakom svjetlu; ponašanje PAG7936 AEC/AGC preuređeno je (objedinjena kontrola, ispravljen gornji prag pojačanja).

  • Obnovljeno učitavanje firmvera za OV5640 autofokus na Portenta/Nicla (ispravak MIMXRT I2C SUSPEND).

  • Ispravljen zastoj pri snimanju kamere kada se ograničenje brzine sličica kombinira sa JPEG snimanjem (STM32).

  • GenX320 csi.IOCTL_GENX320_READ_EVENTS_RAW čitanja više ne izobličuju IDE pregled.

  • FLIR Lepton csi.IOCTL_LEPTON_SET_MODE putem csi.CSI.ioctl() sada radi kada se pozove s jednim argumentom.

Obrada slike:

  • Ispravljeno alfa miješanje draw_image() / blend() kada je zadana maska.

  • Ispravljen redoslijed bitova 1-bitnog (BINARY) PNG kodiranja/dekodiranja i dekodiranje sivih tonova iz 1-bitnog.

  • Ispravljeni metapodaci o trajanju/FPS-u snimanja mjpeg.Mjpeg.

  • Ispravljeno prekoračenje stoga pri softverskom JPEG dekodiranju na pločama s malim stogom (OpenMV M7).

  • Ispravljeno automatsko prepoznavanje JPEG/PNG formata datoteke na ne-ARM računalima (simulator).

Time-of-Flight:

  • tof.read_depth() više ne izaziva iznimku pri prolaznim greškama mjerenja udaljenosti i automatski se oporavlja od kvarova sabirnice; zadana vremenska granica za tof.read_depth() / tof.snapshot() sada je 100 ms (pogledajte promjene za tof).

  • Ispravljeno kvarenje podataka o dubini iz više zona za VL53L5CX / VL53L8CX.

ML i sustav:

  • NPU se ispravno čisti kada se zaključivanje prekine na N6.

  • Obnovljeno buđenje iz dubokog sna / pripravnosti na N6; ispravljen zastoj skoka u pokretač (bootloader) na AE3.

  • Ispravljena curenja memorije pri mekom resetu (STM32 Nema GPU) i prerano sakupljeni pomoćni međuspremnik slike.

  • Prilagođeni Python protokolni kanali sada preživljavaju mekano ponovno pokretanje, USB prijenos se oporavlja od resetiranja sabirnice / zastalih krajnjih točaka, a ispravljeno je preplavljivanje USB SOF prekidima.

Sklopovlje i podrška za ploče#

  • OpenMV N6 — omogućen Ethernet (žično umrežavanje); NPU AXI SRAM (1,75 MB) spojen u zajednički prolazni skup za više RAM-a između zaključivanja; buđenje iz dubokog sna/pripravnosti; priloženi TFLite modeli i Haar kaskade u ROMFS-u.

  • OpenMV AE3 — priloženi modeli i kaskade u ROMFS-u; cbor2 zamrznut u firmver.

  • Alif (AE3, N6) — buđenje machine.RTC u niskoj potrošnji.

  • AprilTags visoke razlučivostifind_apriltags() u punoj razlučivosti senzora na AE3, Arduino Giga i Arduino Portenta H7.

  • Ciljevi simulatora — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), s emulacijom NPU-a, ROMFS-a i PSRAM-a.

Promjene API-ja koje narušavaju kompatibilnost#

Korisniku vidljivi prekidi API-ja između v4.8.1 i v5.0.0. Opseg: Python C-moduli u modules/ i Python biblioteke u scripts/libraries/.

Svaka promjena označena je svojim utjecajem:

  • major — većina skripti treba izmjene.

  • minor — uski API; utječe samo na skripte koje su ga koristile.

  • behavior — isti API, drugačiji rezultati; ponovno provjerite ugođene skripte.

  • tooling — utječe samo na gradnju iz izvora / nizvodne forkove.

Promjene su grupirane po utjecaju tim redoslijedom — prvo major, zatim minor, behavior i tooling. Ako samo želite prenijeti svoj kod, skočite na kontrolni popis za migraciju na kraju za sažeti popis zadataka. Svaki hash commita vodi na svoj diff na GitHubu.

sensor zamijenjen s csi (major)#

Svaki službeni primjer prepisan je tako da ispusti import sensor u korist import csi. Stari funkcionalni API na razini modula (sensor.reset(), sensor.set_pixformat(), …) zamijenjen je klasnim csi.CSI API-jem, koji se prirodno prilagođava pločama s više kamera (csi0, csi1, …) i nužan je za sve nove značajke (kwarg stream=, streaming s više senzora, …).

Qstr sensor i dalje je povezan u modules/py_csi.c radi unatrag kompatibilnih gradnji firmvera, ali neće dobivati nove značajke, a svi primjeri, dokumentacija i kod biblioteka sada pretpostavljaju csi.

Commitovi: 945c5853c, 61f835b7e

Iz modula u klasu

Prije (sensor):

import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()

Nakon (csi):

import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()

Parovi setter/getter sažeti u objedinjene pristupnike

U novom API-ju metoda pozvana bez argumenata vraća trenutnu vrijednost; pozvana s vrijednošću postavlja je. Prefiksi set_*/get_* nestali su. Imena metoda također su izgubila sufiks ing gdje je bio suvišan (windowingwindow). Stupac novog API-ja vodi na referentnu dokumentaciju.

sensor (staro)

csi.CSI (novo)

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

Funkcije bez izravnog ekvivalenta

sensor (uklonjeno)

Što koristiti umjesto toga

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

image.Image (w, h, pixfmt) — obična slika alocirana na hrpi. Međuspremnik slike više se ne reže za korisničke međuspremnike.

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

csi.CSI.snapshot() — preskakanje sličica uklopljeno u snapshot putem njegovih argumenata time= / frames=.

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

Premješteno u konstruktor csi.CSI: csi.CSI(delays=False) / csi.CSI(fflush=False).

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

Uklonjeno. Slika koju vraća csi.CSI.snapshot() kanonski je rukohvat.

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — argument expand je uklonjen (pogledajte nastavke za csi).

Novo na csi.CSI

  • csi.CSI(stream=True|False) — birač u trenutku gradnje koji odabire koji CSI napaja međuspremnik slike za pregled (zamjenjuje kwarg update= po snimci, pogledajte nastavke za csi).

  • csi.CSI(cid=N) / csi.devices() — podrška za više CSI-jeva na pločama s više od jednog senzora slike.

modul image — preustroj potpisa (major)#

Modul image doživio je najširu promjenu API-ja nakon csi — promijenili su se potpisi crtanja, objekti rezultata i nekoliko detektora.

Argumenti koordinata moraju biti tuple-ovi

modules/py_image.c prepisan je na temelju mp_arg_parse_all. Sve metode crtanja / piksela koje su prije primale zasebne pozicijske argumente x, y, ... sada zahtijevaju te koordinate spakirane u jedan tuple.

Commitovi: d18bbc472, 0c60c94b9 (PR #3061)

Prije

Nakon

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)

Sve su metode klase image.Image.

Objekti rezultata pretvoreni u attrtuple

Ovi su tipovi sada MicroPython attrtuple objekti: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Pristup atributima bez zagrada sada je kanonski.

Commit: 3399d302e

Prije (stil metode):

img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())

Nakon (stil atributa):

img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)

blob i histogram nepromijenjeni su — zadržavaju svoje postojeće tipove i () pristupnike (attrtuple ne može izraziti lijeno izračunate vrijednosti mrlje niti histogramske pristupnike koji primaju argumente).

Preimenovanje haar parametra find_features

image.Image.find_features()scale_factor= preimenovan je u scale=.

Commit: be4c5cd73

get_regression — sada uvijek robustan, dodan target_size

image.Image.get_regression() sada uvijek koristi robusnu (Theil-Sen) regresiju. Stara brza staza najmanjih kvadrata je uklonjena, pa je ključna riječ robust= nestala — ono što je nekad zahtijevalo robust=True sada je jedino ponašanje. Novi kwarg target_size=(w, h) (zadano (80, 60)) skalira ROI po površini prije O(N^2) Theil-Sen prilagodbe kako bi se uvijek izvodila na razumnoj veličini slike; krajnje točke prilagođene linije preslikavaju se natrag u izvorne koordinate. Primjer linear_regression_robust.py je obrisan, a linear_regression_fast.py preimenovan u linear_regression.py.

Commitovi: c7c2e69a0, 0ff2afa72

find_line_segments — novi algoritam

image.Image.find_line_segments() — stari LSD detektor zamijenjen je ED-Linesom i dobio je novi kwarg threshold=50. Izlaz prethodno ugođenih skripti razlikovat će se.

Commitovi: 87da2a7b7, 2c47b5735

Zamijenjena AprilTag biblioteka

image.Image.find_apriltags() — AprilTag detektor zamijenjen je novom implementacijom. Skup obitelji se promijenio:

Commit: e813bada7

nastavak modula csi (minor)#

Manji nastavci za csi povrh migracije na csi.

snapshot(update=…) uklonjen

Kwarg update na csi.CSI.snapshot() je nestao. Da spriječite CSI uređaj da napaja međuspremnik slike za pregled, isključite ga u trenutku gradnje:

csi0 = csi.CSI(stream=False)                  # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img)  # was: ...(update=False, ...)

Commitovi: 9a8077827, 26b79a2c5

uklonjen argument expand u framebuffers()

csi.CSI.framebuffers() — treći pozicijski argument (expand) je nestao; potpis je sada framebuffers([count]).

Commit: 86cb3a5de

modul protocol (minor)#

Utječe samo na skripte koje su izravno upravljale vezom prema računalu. Pogledajte protocol.

timer_ms preimenovan u poll_ms

protocol.init() — argument timer_ms preimenovan je u poll_ms.

protocol.init(..., poll_ms=10)   # was: timer_ms=10

Commitovi: 8a0635e8c, 95a290607

protocol.poll() uklonjen

Protokolni zadatak sada se raspoređuje interno. Pozivi protocol.poll() izazvat će AttributeError.

Commit: 8a0635e8c

uklonjen konfiguracijski argument soft_reboot

protocol.init() — argument soft_reboot je nestao. Svi trenutni prijenosi podnose mekana ponovna pokretanja, pa je ponašanje sada bezuvjetno.

Commit: 0bf766aa2

moduli display (minor)#

TV izlaz sada ide kroz objekt display.TVDisplay umjesto kroz samostalni modul tv. display također je dobio generički ioctl().

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

modul tof (behavior)#

Isti API kao prije; promijenile su se zadane vrijednosti i obrada grešaka. Pogledajte tof.

Promijenjena zadana vremenska granica

tof.read_depth() i tof.snapshot() (pozvani s timeout=-1) sada se kao zadano postavljaju na 100 ms umjesto neograničenog čekanja. Proslijedite eksplicitnu veću vrijednost ako trebate staro ponašanje.

Commit: b6772b80d

Automatski oporavak

Upravljački program sada tvrdo resetira I2C sabirnicu i senzor pri greškama mjerenja udaljenosti/vremenske granice. Primjeri više ne pozivaju tof.reset() u svojim rukovateljima iznimaka — korisnički kod koji je radio ručni oporavak trebao bi ga ukloniti (sukobit će se s novim automatskim oporavkom).

Commitovi: b6772b80d, 80ffaa5c3

ML biblioteka (behavior)#

Isti API, drugačiji brojevi — ponovno provjerite svaki ugođeni ML proces.

Predobrada sada rasteže umjesto letterboxa

Normalization sada koristi image.SCALE_ASPECT_IGNORE (rastezanje) umjesto image.SCALE_ASPECT_EXPAND (letterbox). NMS naknadna obrada također je prešla na neovisno x/y skaliranje.

Napomena

Utjecaj. Detektori u stilu YOLO-a i regresori ključnih točaka općenito se poboljšavaju. Primjeri BlazeFace, BlazePalm, FaceLandmarks i HandLandmarks sada zahtijevaju ručno kvadratno izrezivanje ulaznog ROI-ja — primjeri skripti su ažurirani; prilagođeni korisnički kod mora učiniti isto.

Commit: 68dc29a33

uklonjen pomoćnik ml.utils.mod()

ulab 6.12.0 nativno podržava % na ndarrayima. Kod koji je uvozio mod iz ml.utils mora koristiti a % b.

Commitovi: 35ece5728, 82fbd858c

Gradnja / alati (tooling)#

Ništa od ovoga ne utječe na MicroPython skripte. Gradnja firmvera iz izvora sada zahtijeva vanjski OpenMV SDK (1.6.0, prije unutar stabla). Nekoliko alata za gradnju unutar stabla je uklonjeno, a N6 je prešao na TinyUSB stog; nizvodni forkovi trebali bi pregledati povijest repozitorija firmvera — posebno potpis file_open() koji ispušta svoj argument buffered.

Kontrolni popis za migraciju#

Za čistu migraciju na v5.0.0 tipičan posao je:

  1. Zamijenite import sensor s import csi; csi0 = csi.CSI() i prevedite svaki set_*/get_* poziv u njegov csi.CSI pristupnik (migracija na csi).

  2. Omotajte argumente koordinata za img.draw_*, get_pixel() i set_pixel() u tuple-ove (promjene modula image).

  3. Ispustite () iz attrtuple pristupnika rezultata ako želite novi idiomatski oblik, ili ostavite stari stil na miru jer attrtuple-ovi i dalje podržavaju pozivne pristupnike (promjene modula image).

  4. Pregledajte find_line_segments(), get_regression() i svaki odabir obitelji find_apriltags() (promjene modula image).

  5. Preimenujte timer_mspoll_ms u pozivima protocol.init(); uklonite protocol.poll() i soft_reboot= (promjene modula protocol).

  6. Za ML radne tokove: ponovno razmotrite svaki model koji je trebao letterbox ulaz (promjene ML biblioteke).