v5.0.1#

A v5.0.1 egy karbantartó kiadás a v5.0.0-ra épülve — a régi sensor modul a csi fölötti Python kompatibilitási réteggé válik, a képkocka-pufferbe töltött képek mostantól úgy jelennek meg az előnézetben, mint a kamera képkockái, a JPEG-kódolók megszabadulnak az 1 MB-os kimeneti korláttól és helyesen kezelik a túlcsordulást, továbbá egy sor kamera-, protokoll-, hálózati és ML-könyvtárbeli javítás érkezett. A csi modulra írt szkriptek számára nem vezet be visszafelé nem kompatibilis API-változásokat; a néhány viselkedésbeli változás a visszafelé nem kompatibilis API-változások alatt található.

Kiemelt újdonságok#

  • A sensor modul mostantól befagyasztott Python modul, amely a csi modulra épül. Importáláskor elavulási figyelmeztetést ír ki; néhány függvény, amelyet a csi modul nem tud támogatni, mostantól OSError hibát vált ki. Lásd a sensor modul változásai.

  • A betöltött képek úgy jelennek meg az előnézetben, mint a kamera képkockái. A copy_to_fb=True beállítással a képkocka-pufferbe helyezett kép (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) — mindazzal együtt, amit rárajzoltak — akkor kerül kiürítésre az IDE felé, amikor a következő kép felülírja a képkocka-puffert, nem pedig azonnal. Lásd az előnézet változásai.

  • A JPEG-kódoló átdolgozása. Megszűnt az 1 MB-os kimenetipuffer-korlát (a puffer mérete a szabad memóriából származik), a túlcsordulást mind a szoftveres, mind a hardveres úton kezeli a csonka fájlok írása helyett, és egy tömörített kép másik tömörített kiterjesztéssel való mentése szemét kiírása helyett kivételt vált ki.

  • Új protocol.poll() és hat új CBOR widget (text, lineedit, pushbutton, spinbox, radio, waveform) a protocol.CBORChannel osztályhoz.

  • YOLO Pro utófeldolgozó, FLIR Lepton 3.1R / UW támogatás, IMU burst olvasás, CAN az OpenMV N6-on és egy hálózatképes szimulátor célplatform.

Új funkciók#

  • YoloPro — új utófeldolgozó az Edge Impulse YOLO Pro objektumészlelő modellekhez, valamint egy yolo_pro_detector.py példa. (f3f150ebd, ea7bbb398)

  • protocol.poll() — igény szerint lefuttatja a protokollfeladat egy iterációját olyan egyéni transzportokhoz, amelyeket sem az USB-megszakítás, sem a poll_ms időzítő nem hajt meg. A protocol.init() is újra meghívható a verem újrainicializálásához. (c00c215f9, f849ffb1b)

  • További CBOR csatorna-widgetek — a protocol.CBORChannel.add() új típusokat kap: text (statikus karakterlánc), lineedit (írható karakterlánc), pushbutton (pillanatnyi művelet), spinbox (lépésköz szerinti numerikus bevitel), radio (opciócsoport) és waveform (1D idősor sample_rate, series és typecode argumentumokkal; a streameléshez rendelj hozzá átlapolt mintabájtokat). (8016d29ba)

  • csi.CUSTOM — a csi.CSI.framesize() mostantól egy használható konstanst ad vissza egy egyéni (w, h) felbontás beállítása után, névtelen egész szám helyett. (af8841654)

  • IMU burst olvasás — az imu.__read_reg() opcionális írható puffert fogad el, és egyetlen tranzakcióban egymást követő regiszterekből tölti fel. (244ca480a)

  • A FLIR Lepton 3.1R és Lepton UW modulokat felismeri a Lepton illesztőprogram, beleértve a radiometrikus erősítési módjaikat is. (0fc356632)

  • Szimulátor-hálózatkezelés — az MPS2_AN500 QEMU célplatform mostantól lwIP-vel és felhasználói módú hálózati kártyával rendelkezik, befagyasztott requests, mqtt és sensor modulokkal, valamint egy hálózati egységteszttel. (23546dfb1, 61d187305, 15096c3a2)

  • OpenAI-kompatibilis API példa — az openai_compatible.py készít egy JPEG pillanatképet, és elküldi egy chat-completions végpontra a jelenet leírásához. (79033c6aa)

  • SX126x LoRa példák — a micropython-lib lora-sx126x illesztőprogramja (a lora-sync / lora-async csomagokkal együtt) be van fagyasztva az OpenMV RT1062 firmware-be, küldő/fogadó/ping-pong/képfolyam példákkal egy SX1261 vagy SX1262 modul SPI-buszra kötéséhez. Ez közösségi hozzájárulásként érkezett támogatás; az OpenMV nem árul LoRa hardvert. (19576e1b1)

Egyéb változások és fejlesztések#

  • A requests könyvtár újraírása — a darabolt átvitelű válaszok dekódolásra kerülnek, elérhetővé vált egy timeout argumentum (alapértelmezés: 5 s), a JSON és karakterlánc törzsek helyesen kerülnek sorosításra/kódolásra, a fejlécek feldolgozása nem különbözteti meg a kis- és nagybetűket, az állapotsor pedig pozíció szerint kerül feldolgozásra, a hívó headers szótára lemásolásra kerül (így az auth többé nem szivárog át a későbbi kérelmekbe), a törzs pedig blokkonként kerül beolvasásra egy bytearray-be. (889f0b096)

  • Az mqtt lustán importálja az ssl modult, így a modul és az egyszerű (nem TLS) kapcsolatok működnek az SSL-támogatás nélküli buildeken is. (c2e0899e8)

  • A JPEG kimeneti puffer mérete a szabad memóriából származik a rögzített 1 MB-os korlát helyett; a kódolók a kép kiírása előtt a kódolt méretre vágják a puffert, így a nagy érzékelőkkel, magas minőségben készített felvételek többé nem hiúsulnak meg. (aa1ca6776)

  • ML utófeldolgozás tisztítása — a határoló dobozok generálása egységesítve lett a Darknet, Edge Impulse és Ultralytics utófeldolgozók között, a YOLOv8 kimenete pedig a küszöbölés után transzponálásra kerül, így a többi modellhez hasonlóan észlelésenként egy sorban tárolódik. (b5c7853f2, c45f99cad)

  • PAG7936 biztonságos leállítás — egy új érzékelő-leállítási jelző altatja el a PAG7936-ot a RESET/PWDN váltás előtt, ami megszünteti a lefagyásokat, amikor az érzékelőt hosszabbítókábelen használják. Az illesztőprogram továbbá a MIPI CSI-2 vagy a párhuzamos regiszterkészletét futásidőben, az érzékelő I2C-címe alapján választja ki, nem pedig fordítási időben. (10026530c, f6acf14ec, 5f0251c74)

  • Az ImageIO lejátszási ütemezése mostantól a képkockák közötti intervallum kivárása alatt kiszolgálja a függőben lévő eseményeket, ahelyett hogy WFI állapotban aludna. (a54790193)

  • MicroPython almodul-frissítések — teljes hálózati támogatás a QEMU porton, machine.mem_backup STM32-n a tartalék SRAM/BKP regisztereken keresztül, az SDIO hardveres folyamvezérlés letiltva marad STM32F4-en, valamint az MPU-attribútumok újrafelhasználása a nem gyorsítótárazható régiókhoz. (31ada5626, ab61d27a6, 06bddf13a)

  • A differential-translation.py az elavult sensor modul helyett a saját csi.CSI objektumán keresztül rögzít, és a példák importálási sortávolsága egységesítve lett. (68c866e7f, 9ceff4513)

Hibajavítások#

Kamera és érzékelők:

  • Két egyéni (w, h) felbontás egymás utáni beállítása az érzékelőt az első méreten hagyta, miközben a csi.CSI.width() / height() a másodikat jelentette; a „nincs változás” gyors útvonal mostantól kizárja az egyéni méreteket. (cfbb70156)

  • A csi.CSI.lens_correction() a radi és coef értékeket logikai értékként dolgozta fel, így az illesztőprogramnak átadott értékek nem a megadottak voltak. (ab44b3a77)

  • PAG7936: az expozíció és az erősítés közvetlenül egymás utáni beállítása felülírta egymást (mindkettő ugyanazt a manuális módot használja, és a visszaolvasott regiszterek egy képkockával késnek); az illesztőprogram mostantól csak a manuális módba lépéskor tölti fel a manuális regisztereket, és csak az éppen beállított vezérlőt írja. (e7a18c0a0)

  • A PAG7936 és PS5520 BAYER rögzítés az OpenMV N6-on „Failed to initialize the CSI interface” hibával meghiúsult a teljes felbontástól eltérő bármely méretnél, mert az N6 ISP nem tudja átméretezni a nyers Bayer képet. Az érzékelők mostantól BAYER esetén a kért méretnek megfelelő natív módban futnak (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; a QVGA-nak nincs natív módja, és nem támogatott). (fe6790055, b7622b245)

Képkódolás és mentés:

  • Szoftveres JPEG-kódoló: a kimeneti puffer túlcsordulása mindig végzetes volt, mert a realloc útvonal le volt tiltva; mostantól növeli a puffert (egyszerre a méretének felével), ha az a sajátja, tisztán visszalép, ha elfogy a memória, és megvágja az eredményt. A jpeg_write / mjpeg_write sikertelen kódolás után többé nem írja ki a puffert. (28e1110be)

  • Hardveres JPEG-kódolók (STM32): túlcsorduláskor részlegesen kódolt képet adtak vissza a lefoglalt mérettel, ami EOI jelölő nélküli csonka fájlokat eredményezett (pl. egy 5 MP-es felvétel 100-as minőségben, üres alsó féllel). Mostantól jelentik a túlcsordulást, hiba esetén felszabadítják a puffert, siker esetén pedig megvágják. (22ce9619c)

  • A VC8000 kódoló minden kérésre csendben 4:2:0 krominanciát állított elő; a nem 4:2:0 almintavételezés mostantól az azt támogató HW kodekre vált vissza. (71f2be7f2)

  • Az image.Image.save() egy PNG kép .jpg-ként való mentésekor akár 1 MB inicializálatlan heap-tartalmat írt ki, egy JPEG kép .png-ként való mentésekor pedig üres fájlt. Mindkettő mostantól kivételt vált ki; a már a célformátumban lévő kép továbbra is változatlanul kerül másolásra. (6c1fdf822)

  • A png_write mostantól ellenőrzi a tömörítő visszatérési értékét, és a fájl létrehozása előtt tömörít, így egy hiba többé nem hagy maga után üres fájlt. (557f52d66)

Image modul:

  • Az image.Image.get_pixel() rgbtuple=True beállítással BAYER és YUV képeken a konvertált pixelt egy veremváltozón túlra, a hívó által vezérelt eltolásra írta. (13f2a17b6)

  • A gif.Gif.add_frame() egy elérhetetlen Bayer/YUV konverziós ágtól szabadult meg; csak GRAYSCALE és RGB565 képek fogadhatók el, ahogyan azt a Python API már eddig is kikényszerítette. (f20d99d96)

Protokoll:

  • Dinamikus csatorna regisztrálása, amikor már minden hely foglalt volt, tartományon kívüli írást okozott; a csatornaazonosító mostantól előbb ellenőrzésre kerül, és a fenntartott csatornaazonosítókról statikus ellenőrzés biztosítja, hogy beleférnek a csatornatáblába. (68f635d1f)

  • A dinamikus csatornaobjektumok a gyökérmutatókban túlélték a szoftveres újraindítást, így a GC továbbra is az előző futás elavult heap-blokkjait pásztázta; a tábla mostantól inicializáláskor törlésre kerül. (ef0ebb03b, e23641145)

Portok:

  • i.MX RT: pótolva a hiányzó CAN és Encoder deinicializálás szoftveres újraindításkor. (7cb9d3dc2)

Hardver- és kártyatámogatás#

  • OpenMV N6 — a CAN mostantól engedélyezve van (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — az sdcard SPI illesztőprogram be van fagyasztva az AE3 akkumulátoros bővítőlap microSD foglalatához. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async befagyasztva (lásd Új funkciók).

  • FLIR Lepton 3.1R / UW — a Lepton illesztőprogram felismeri minden Lepton-képes kártyán.

  • PAG7936 — biztonságos leállítás, futásidejű interfészválasztás, expozíció/erősítés javítás és BAYER rögzítés az N6-on.

  • PS5520 — BAYER rögzítés az N6-on natív méreteken.

  • Szimulátor (MPS2_AN500) — hálózatkezelés.

  • Minden kártya — a sensor kompatibilitási modul be van fagyasztva minden kártya manifesztjébe.

Visszafelé nem kompatibilis API-változások#

A v5.0.1 nem vezet be visszafelé nem kompatibilis változásokat a csi és az image API-kban. A v5.0.0-n futó szkriptek változatlanul futnak, a következő viselkedésbeli változásokkal.

A sensor modul (behavior)#

A natív sensor modul (modules/py_csi.c) eltávolításra került, és egy befagyasztott Python modul váltotta fel, amely ugyanazt az API-t valósítja meg a csi modulra építve. Lásd sensor.

Commit: 5e3d40631

  • Az import sensor a WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead. üzenetet írja ki a terminálra.

  • A rejtett csi.CSI objektum importáláskor jön létre, így a hiányzó kamera mostantól az import sensor sornál vált ki hibát, nem pedig a sensor.reset() hívásnál.

  • Ezek a függvények mostantól OSError hibát váltanak ki, mert a csi modulban nincs megfelelőjük: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (A két *_extra_fb függvény már a v5.0.0-ban is hibát váltott ki.) Az utolsó kettőhöz használd a csi.CSI(delays=False) / csi.CSI(fflush=False) formát.

  • A csi által nem exportált képkockaméretek (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) mostantól (w, h) tuple-ök, amelyek egyéni felbontásként kerülnek továbbításra. A get_framesize() a beállított tuple-t adja vissza, amíg a kamera még ezen a méreten van, így a konstansokkal való egyenlőségvizsgálatok továbbra is működnek.

  • Az ioctl() a kérés után legfeljebb négy argumentumot továbbít.

  • A sleep() / shutdown() hiba esetén továbbra is OSError hibát vált ki (a csi RuntimeError kivétele átfordításra kerül).

Migrálj a csi modulra — lásd a v5.0.0 migrációs táblázatot.

Képbetöltés a képkocka-pufferbe (behavior)#

A képet a képkocka-pufferbe töltő függvények — az image.Image copy_to_fb=True beállítással, az image.Image.copy() / image.Image.scale() és a to_* konverziók copy_to_fb=True beállítással, az image.ImageIO.read(), valamint az fir.snapshot() és tof.snapshot() copy_to_fb=True beállítással — korábban azonnal az IDE-előnézetbe küldték az új képet, így a visszaadott képre rajzolt tartalom soha nem látszott. Mostantól függőben lévőként jelölik meg a képkocka-puffert, és közvetlenül azelőtt ürítik ki — mindazzal együtt, amit rárajzoltak —, hogy a következő kép felülírná; ez ugyanaz a viselkedés, mint a csi.CSI.snapshot() esetén.

Commitok: 87b6db5ee, 7b1a35c2f, f773c740d

A képek folyamát olvasó ciklusokon nem kell változtatni, és mostantól megjelenítik a rajzolásukat. Egy egyetlen képet betöltő és leálló szkriptnek explicit módon kell kiürítenie azt:

img = image.Image("example.bmp", copy_to_fb=True)
img.flush()          # new: send it to the IDE preview now
time.sleep_ms(1000)

ML könyvtár (behavior)#

Csak azt a kódot érinti, amely a mellékelt utófeldolgozókból származtat vagy lemásolja azokat. A YoloV8 mostantól a küszöbölés után transzponálja a modell kimenetét, így a megmaradt észlelések dobozonként egy sorban tárolódnak (bb[:, 4:]), a Darknet és Edge Impulse utófeldolgozókhoz igazodva, dobozonként egy oszlop (bb[4:, :]) helyett. A nyilvános ((x, y, w, h), score) eredmények változatlanok.

Commitok: c45f99cad, b5c7853f2

A protocol modul (minor)#

A protocol.poll() visszatért. A v5.0.0 eltávolította, amikor a protokollfeladat az időzítőre került; most explicit módként tér vissza a feladat meghajtására egyéni transzportok esetén. Semmi más nem változott — az azt soha nem hívó szkripteket nem érinti.

Commit: c00c215f9

Build / eszközkészlet (tooling)#

Ez semmilyen MicroPython szkriptet nem érint. A py_image.c fel lett osztva: a leíróobjektumok (cascade, keypoints, LBP, keypoint match) a py_image_descriptor.c, a statisztikai objektumok (similarity, statistics, percentile, threshold, histogram) pedig a py_image_stats.c fájlba kerültek. Az imlib kódoló API-ja az imlib többi részéhez lett igazítva: a jpeg_compress / png_compress siker esetén 0-t, hiba esetén -1-et ad vissza, a jpeg_compress pedig elvesztette a realloc argumentumát (az átméretezés a puffer tulajdonjogától függ). Az OMV_PROTOCOL_MAX_CHANNELS az omv_protocol_channel.h fájlban OMV_PROTOCOL_CHANNEL_MAX lett, a portok pedig mostantól inicializáláskor meghívják a py_protocol_init0() függvényt. Az OMV_PAG7936_MIPI_CSI2 kártyadefiníció megszűnt (az interfész futásidőben kerül kiválasztásra). CI-függőségfrissítések és egy üres kiadási changelogot érintő javítás teszik teljessé. A forkok számára releváns részletekért lásd a firmware-tároló előzményeit.

Migrációs ellenőrzőlista#

  • Még mindig az import sensor sort használod? Működik, figyelmeztetéssel. Térj át a csi modulra (v5.0.0 migráció); cseréld le a disable_delays / disable_full_flush hívásokat a csi.CSI() konstruktor argumentumaira, és hagyd el a get_fb / automatikus forgatás hívásokat.

  • Egyetlen képet töltesz be copy_to_fb=True beállítással, és látni szeretnéd? Betöltés után add hozzá az img.flush() hívást.

  • Lemásoltad a YOLOv8 utófeldolgozót? A küszöbölt kimenetet sor szerint (bb[:, 4:]) indexeld, ne oszlop szerint.

  • Összehasonlítod a csi0.framesize() értékét tuple beállítása után? Mostantól csi.CUSTOM értéket ad vissza.

  • Minden más: flashelj újra, és futtasd.