v5.0.1#
v5.0.1 je údržbové vydání navazující na v5.0.0 — starší modul sensor se stává kompatibilní vrstvou v Pythonu nad csi, obrazy načtené do snímkového bufferu (frame buffer) se nyní v náhledu zobrazují jako snímky z kamery, JPEG enkodéry přicházejí o limit výstupu 1 MB a správně řeší přetečení a přibývá dávka oprav kamer, protokolu, sítě a knihovny ML. Pro skripty napsané proti csi nepřináší žádné zpětně nekompatibilní změny API; několik změn chování je uvedeno v části zpětně nekompatibilní změny API.
Hlavní novinky#
Modul
sensorje nyní zmrazený modul Pythonu postavený nacsi. Při importu vypíše varování o zastarání; několik funkcí, které modulcsinedokáže podporovat, nyní vyvoláváOSError. Viz změny modulu sensor.Načtené obrazy se v náhledu zobrazují jako snímky z kamery. Obraz umístěný do snímkového bufferu s
copy_to_fb=True(image.Image,image.ImageIO.read(),fir.snapshot(),tof.snapshot()) se do IDE odešle — spolu se vším, co se na něj nakreslilo — až když snímkový buffer přepíše další obraz, nikoli okamžitě. Viz změny náhledu.Přepracování JPEG enkodéru. Strop výstupního bufferu 1 MB je pryč (buffer se dimenzuje podle volné paměti), přetečení na softwarové i hardwarové cestě se ošetřuje místo zápisu oříznutých souborů a uložení komprimovaného obrazu pod druhou komprimovanou příponou vyvolá výjimku místo zápisu nesmyslných dat.
Nová
protocol.poll()a šest nových CBOR widgetů (text,lineedit,pushbutton,spinbox,radio,waveform) proprotocol.CBORChannel.Následný procesor YOLO Pro, podpora FLIR Lepton 3.1R / UW, dávkové čtení IMU, CAN na OpenMV N6 a cíl simulátoru s podporou sítě.
Nové funkce#
YoloPro— nový následný procesor pro modely detekce objektů Edge Impulse YOLO Pro, plus příkladyolo_pro_detector.py. (f3f150ebd, ea7bbb398)protocol.poll()— provede na vyžádání jednu iteraci úlohy protokolu, pro vlastní přenosy, které nejsou řízeny přerušením USB ani časovačempoll_ms.protocol.init()lze také zavolat znovu pro opětovnou inicializaci zásobníku. (c00c215f9, f849ffb1b)Další widgety kanálu CBOR —
protocol.CBORChannel.add()získávátext(statický řetězec),lineedit(zapisovatelný řetězec),pushbutton(okamžitá akce),spinbox(krokované zadávání čísel),radio(skupina voleb) awaveform(1D časová řada s argumentysample_rate,seriesatypecode; pro streamování mu přiřaďte bajty prokládaných vzorků). (8016d29ba)csi.CUSTOM—csi.CSI.framesize()nyní po nastavení vlastního rozlišení(w, h)vrací použitelnou konstantu místo anonymního celého čísla. (af8841654)Dávkové čtení IMU —
imu.__read_reg()přijímá volitelný zapisovatelný buffer a naplní jej z po sobě jdoucích registrů v jediné transakci. (244ca480a)FLIR Lepton 3.1R a Lepton UW jsou rozpoznávány ovladačem Leptonu, včetně jejich radiometrických režimů zisku. (0fc356632)
Síť v simulátoru — cíl QEMU
MPS2_AN500má nyní lwIP a NIC v uživatelském režimu, se zmrazenýmirequests,mqttasensora síťovým jednotkovým testem. (23546dfb1, 61d187305, 15096c3a2)Příklad API kompatibilního s OpenAI —
openai_compatible.pypořídí JPEG snímek a odešle jej na koncový bod chat-completions pro popis scény. (79033c6aa)Příklady SX126x LoRa — ovladač
lora-sx126xz micropython-lib (slora-sync/lora-async) je zmrazen do firmwaru OpenMV RT1062, s příklady vysílače/přijímače/ping-pongu/streamování obrazu pro připojení modulu SX1261 nebo SX1262 ke sběrnici SPI. Jde o podporu přispěnou komunitou; OpenMV hardware LoRa neprodává. (19576e1b1)
Další změny a vylepšení#
Přepis knihovny
requests— chunkované odpovědi se dekódují, je zpřístupněn argumenttimeout(výchozí 5 s), těla JSON a řetězců se správně serializují/kódují, hlavičky se parsují bez ohledu na velikost písmen a stavový řádek podle pozice, slovníkheadersvolajícího se kopíruje (takžeauthjiž neprosakuje do pozdějších požadavků) a tělo se čte po blocích dobytearray. (889f0b096)mqttimportujessllíně, takže modul i nešifrovaná (ne-TLS) připojení fungují na sestaveních bez podpory SSL. (c2e0899e8)Výstupní buffer JPEG dimenzovaný podle volné paměti místo pevného stropu 1 MB; enkodéry před zápisem obrazu ořežou buffer na zakódovanou velikost, takže snímky z velkých senzorů ve vysoké kvalitě již neselhávají. (aa1ca6776)
Úklid následného zpracování ML — generování ohraničujících rámečků (bounding box) je sjednoceno napříč následnými procesory Darknet, Edge Impulse a Ultralytics a výstup YOLOv8 se po prahování transponuje, takže je uložen po jednom řádku na detekci jako u ostatních modelů. (b5c7853f2, c45f99cad)
Bezpečné vypnutí PAG7936 — nový příznak zastavení senzoru uspí PAG7936 před přepnutím RESET/PWDN, což opravuje zatuhnutí při použití senzoru na prodlužovacím kabelu. Ovladač také vybírá svou sadu registrů pro MIPI CSI-2 nebo paralelní rozhraní za běhu podle I2C adresy senzoru místo při sestavení. (10026530c, f6acf14ec, 5f0251c74)
Časování přehrávání
ImageIOnyní během čekání na interval mezi snímky obsluhuje čekající události místo spánku veWFI. (a54790193)Aktualizace submodulu MicroPython — plná podpora sítě na portu QEMU,
machine.mem_backupna STM32 přes záložní SRAM/registry BKP, hardwarové řízení toku SDIO ponecháno vypnuté na STM32F4 a opětovné využití atributů MPU pro oblasti bez cache. (31ada5626, ab61d27a6, 06bddf13a)differential-translation.pysnímá přes svůj objektcsi.CSImísto zastaralého modulusensora rozestupy importů v příkladech byly sjednoceny. (68c866e7f, 9ceff4513)
Opravy chyb#
Kamera a senzory:
Nastavení dvou vlastních rozlišení
(w, h)po sobě ponechalo senzor v první velikosti, zatímcocsi.CSI.width()/height()hlásily druhou; rychlá cesta „beze změny“ nyní vlastní velikosti vylučuje. (cfbb70156)csi.CSI.lens_correction()parsovalaradiacoefjako logické hodnoty, takže hodnoty předané ovladači nebyly ty zadané. (ab44b3a77)PAG7936: nastavení expozice a zisku těsně po sobě se navzájem přepisovalo (obojí sdílí jeden manuální režim a zpětně čtené registry se zpožďují o snímek); ovladač nyní inicializuje manuální registry pouze při vstupu do manuálního režimu a zapisuje jen právě nastavovaný parametr. (e7a18c0a0)
Snímání BAYER z PAG7936 a PS5520 na OpenMV N6 selhávalo s hlášením „Failed to initialize the CSI interface“ při jakékoli jiné než plné velikosti, protože ISP na N6 nedokáže surová Bayer data přeškálovat. Senzory nyní pro BAYER běží v nativním režimu odpovídajícím požadované velikosti (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA nativní režim nemá a není podporováno). (fe6790055, b7622b245)
Kódování a ukládání obrazu:
Softwarový JPEG enkodér: přetečení výstupního bufferu bylo vždy fatální, protože cesta realloc byla vypnuta; nyní buffer zvětšuje (vždy o polovinu jeho velikosti), pokud jej vlastní, při vyčerpání paměti se čistě vrátí a výsledek ořeže.
jpeg_write/mjpeg_writejiž po neúspěšném kódování buffer nezapisují. (28e1110be)Hardwarové JPEG enkodéry (STM32): přetečení vracelo částečně zakódovaný obraz s velikostí alokace, což vytvářelo oříznuté soubory bez značky EOI (např. 5MP snímek v kvalitě 100 s prázdnou dolní polovinou). Nyní přetečení hlásí, při selhání buffer uvolní a při úspěchu jej ořežou. (22ce9619c)
Enkodér VC8000 tiše produkoval chrominanci 4:2:0 pro každý požadavek; jiné než 4:2:0 podvzorkování nyní přechází na HW kodek, který je podporuje. (71f2be7f2)
image.Image.save()obrazu PNG jako.jpgzapisovala až 1 MB neinicializované haldy a obrazu JPEG jako.pngzapisovala prázdný soubor. Obojí nyní vyvolá výjimku; obraz, který je již v cílovém formátu, se stále kopíruje beze změny. (6c1fdf822)png_writenyní kontroluje návratovou hodnotu kompresoru a komprimuje před vytvořením souboru, takže selhání již nezanechá prázdný soubor. (557f52d66)
Modul image:
image.Image.get_pixel()srgbtuple=Truena obrazech BAYER a YUV zapisovala převedený pixel za lokální proměnnou na zásobníku na offset řízený volajícím. (13f2a17b6)gif.Gif.add_frame()odstranila nedosažitelnou větev převodu Bayer/YUV; přijímány jsou pouze obrazy GRAYSCALE a RGB565, jak už vynucovalo Python API. (f20d99d96)
Protokol:
Registrace dynamického kanálu, když už byly všechny sloty obsazeny, způsobila zápis mimo meze; ID kanálu se nyní kontroluje nejdříve a u rezervovaných ID kanálů je staticky ověřeno, že se vejdou do tabulky kanálů. (68f635d1f)
Objekty dynamických kanálů přežívaly softwarový reset v kořenových ukazatelích, takže GC dál procházel zastaralé bloky haldy z předchozího běhu; tabulka se nyní při inicializaci vymaže. (ef0ebb03b, e23641145)
Porty:
i.MX RT: doplněna chybějící deinicializace CAN a Encoder při softwarovém resetu. (7cb9d3dc2)
Hardware a podpora desek#
OpenMV N6 — CAN je nyní povolen (
machine.CAN). (294f0febd, 91e1c9573)OpenMV AE3 — SPI ovladač
sdcardje zmrazen pro slot microSD na AE3 Battery Shield. (a258f4814)OpenMV RT1062 — zmrazeny
lora-sx126x/lora-sync/lora-async(viz Nové funkce).FLIR Lepton 3.1R / UW — rozpoznávány ovladačem Leptonu na všech deskách s podporou Leptonu.
PAG7936 — zastavení pro bezpečné vypnutí, výběr rozhraní za běhu, oprava expozice/zisku a snímání BAYER na N6.
PS5520 — snímání BAYER na N6 v nativních velikostech.
Simulátor (MPS2_AN500) — síť.
Všechny desky — kompatibilní modul
sensorje zmrazen do manifestu každé desky.
Zpětně nekompatibilní změny API#
v5.0.1 nepřináší žádné zpětně nekompatibilní změny API csi ani image. Skripty, které běžely na v5.0.0, běží beze změny, s následujícími změnami chování.
modul sensor (behavior)#
Nativní modul sensor (modules/py_csi.c) byl odstraněn a nahrazen zmrazeným modulem Pythonu, který implementuje stejné API nad csi. Viz sensor.
Commit: 5e3d40631
import sensorvypíše do termináluWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..Skrytý objekt
csi.CSIse vytváří při importu, takže chybějící kamera nyní vyvolá chybu už přiimport sensor, nikoli až přisensor.reset().Tyto funkce nyní vyvolávají
OSError, protožecsinemá ekvivalent:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (Obě funkce*_extra_fbvyvolávaly výjimku už ve v5.0.0.) Pro poslední dvě použijtecsi.CSI(delays=False)/csi.CSI(fflush=False).Velikosti snímku, které
csineexportuje (QQCIF,QQSIF,QQQQVGA,HQQQQVGA,HQQQVGA,HQQVGA,B64X32,B64X64,B128X64,B128X128,B160X160,B320X320,LCD,QQVGA2), jsou nyní n-tice(w, h)předávané dál jako vlastní rozlišení.get_framesize()vrací nastavenou n-tici, dokud je kamera stále v této velikosti, takže kontroly rovnosti s konstantami dále fungují.ioctl()předává dál nejvýše čtyři argumenty za požadavkem.sleep()/shutdown()při selhání vyvolávajíOSErrorjako dříve (RuntimeErrorzcsise překládá).
Migrujte na csi — viz tabulka migrace v5.0.0.
Načítání obrazů do snímkového bufferu (behavior)#
Funkce, které načítají obraz do snímkového bufferu (frame buffer) — image.Image s copy_to_fb=True, image.Image.copy() / image.Image.scale() a převody to_* s copy_to_fb=True, image.ImageIO.read(), fir.snapshot() a tof.snapshot() s copy_to_fb=True — dříve odesílaly nový obraz do náhledu v IDE okamžitě, takže cokoli nakresleného na vrácený obraz nebylo nikdy vidět. Nyní označí snímkový buffer jako čekající a odešlou jej, se vším, co se na něj nakreslilo, těsně předtím, než jej přepíše další obraz — stejné chování jako csi.CSI.snapshot().
Commity: 87b6db5ee, 7b1a35c2f, f773c740d
Smyčky, které čtou proud obrazů, nepotřebují žádnou změnu a nyní svou kresbu zobrazují. Skript, který načte jediný obraz a skončí, jej musí explicitně odeslat:
img = image.Image("example.bmp", copy_to_fb=True)
img.flush() # new: send it to the IDE preview now
time.sleep_ms(1000)
knihovna ML (behavior)#
Týká se pouze kódu, který dodávané následné procesory dědí nebo kopíruje. YoloV8 nyní po prahování transponuje výstup modelu, takže zachované detekce jsou uloženy po jednom řádku na rámeček (bb[:, 4:]), shodně s následnými procesory Darknet a Edge Impulse, místo po jednom sloupci na rámeček (bb[4:, :]). Veřejné výsledky ((x, y, w, h), score) se nemění.
modul protocol (minor)#
protocol.poll() je zpět. v5.0.0 ji odstranila, když se úloha protokolu přesunula na časovač; vrací se jako explicitní způsob řízení úlohy pro vlastní přenosy. Nic jiného se nezměnilo — skriptů, které ji nikdy nevolaly, se to netýká.
Commit: c00c215f9
Sestavení / nástroje (tooling)#
Nic z toho se netýká skriptů MicroPythonu. py_image.c byl rozdělen: objekty deskriptorů (cascade, keypoints, LBP, keypoint match) se přesunuly do py_image_descriptor.c a statistické objekty (similarity, statistics, percentile, threshold, histogram) do py_image_stats.c. API enkodérů imlib bylo sladěno se zbytkem imlib: jpeg_compress / png_compress vracejí 0 při úspěchu a -1 při chybě a jpeg_compress přišla o argument realloc (změna velikosti je podmíněna vlastnictvím bufferu). OMV_PROTOCOL_MAX_CHANNELS se v omv_protocol_channel.h změnilo na OMV_PROTOCOL_CHANNEL_MAX a porty nyní při inicializaci volají py_protocol_init0(). Definice desky OMV_PAG7936_MIPI_CSI2 je pryč (rozhraní se vybírá za běhu). Doplňují to aktualizace závislostí CI a oprava prázdného changelogu vydání. Podrobnosti relevantní pro forky najdete v historii repozitáře firmwaru.
Kontrolní seznam migrace#
Stále používáte
import sensor? Funguje, s varováním. Přejděte nacsi(migrace v5.0.0); nahraďtedisable_delays/disable_full_flushargumenty konstruktorucsi.CSI()a odstraňte voláníget_fb/ automatického otáčení.Načítáte jediný obraz s
copy_to_fb=Truea čekáte, že ho uvidíte? Po načtení přidejteimg.flush().Zkopírovali jste si následný procesor YOLOv8? Indexujte prahovaný výstup po řádcích (
bb[:, 4:]), nikoli po sloupcích.Porovnáváte
csi0.framesize()po nastavení n-tice? Nyní vracícsi.CUSTOM.Vše ostatní: přeflashujte a spusťte.