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 sensor je nyní zmrazený modul Pythonu postavený na csi. Při importu vypíše varování o zastarání; několik funkcí, které modul csi nedokáž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) pro protocol.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říklad yolo_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čem poll_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) a waveform (1D časová řada s argumenty sample_rate, series a typecode; 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_AN500 má nyní lwIP a NIC v uživatelském režimu, se zmrazenými requests, mqtt a sensor a síťovým jednotkovým testem. (23546dfb1, 61d187305, 15096c3a2)

  • Příklad API kompatibilního s OpenAI — openai_compatible.py pořídí JPEG snímek a odešle jej na koncový bod chat-completions pro popis scény. (79033c6aa)

  • Příklady SX126x LoRa — ovladač lora-sx126x z micropython-lib (s lora-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 argument timeout (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ík headers volajícího se kopíruje (takže auth již neprosakuje do pozdějších požadavků) a tělo se čte po blocích do bytearray. (889f0b096)

  • mqtt importuje ssl lí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í ImageIO nyní během čekání na interval mezi snímky obsluhuje čekající události místo spánku ve WFI. (a54790193)

  • Aktualizace submodulu MicroPython — plná podpora sítě na portu QEMU, machine.mem_backup na 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.py snímá přes svůj objekt csi.CSI místo zastaralého modulu sensor a 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ímco csi.CSI.width() / height() hlásily druhou; rychlá cesta „beze změny“ nyní vlastní velikosti vylučuje. (cfbb70156)

  • csi.CSI.lens_correction() parsovala radi a coef jako 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_write již 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 .jpg zapisovala až 1 MB neinicializované haldy a obrazu JPEG jako .png zapisovala 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_write nyní 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() s rgbtuple=True na 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č sdcard je 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 sensor je 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 sensor vypíše do terminálu WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..

  • Skrytý objekt csi.CSI se vytváří při importu, takže chybějící kamera nyní vyvolá chybu už při import sensor, nikoli až při sensor.reset().

  • Tyto funkce nyní vyvolávají OSError, protože csi nemá ekvivalent: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (Obě funkce *_extra_fb vyvolávaly výjimku už ve v5.0.0.) Pro poslední dvě použijte csi.CSI(delays=False) / csi.CSI(fflush=False).

  • Velikosti snímku, které csi neexportuje (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í OSError jako dříve (RuntimeError z csi se 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í.

Commity: c45f99cad, b5c7853f2

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 na csi (migrace v5.0.0); nahraďte disable_delays / disable_full_flush argumenty konstruktoru csi.CSI() a odstraňte volání get_fb / automatického otáčení.

  • Načítáte jediný obraz s copy_to_fb=True a čekáte, že ho uvidíte? Po načtení přidejte img.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.