v5.0.1#

v5.0.1 este o versiune de întreținere peste v5.0.0 — vechiul modul sensor devine un strat de compatibilitate Python peste csi, imaginile încărcate în tamponul de cadre se previzualizează acum ca și cadrele camerei, codificatoarele JPEG pierd limita de ieșire de 1 MB și gestionează corect depășirea, și există un lot de corecții pentru cameră, protocol, rețea și biblioteca ML. Nu introduce nicio modificare incompatibilă de API pentru scripturile scrise pentru csi; cele câteva modificări de comportament sunt listate la modificări incompatibile de API.

Puncte principale#

  • Modulul sensor este acum un modul Python înghețat construit peste csi. Afișează un avertisment de depreciere la import; câteva funcții pe care modulul csi nu le poate suporta ridică acum OSError. Vedeți modificările modulului sensor.

  • Imaginile încărcate se previzualizează ca și cadrele camerei. O imagine plasată în tamponul de cadre cu copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) este descărcată către IDE — împreună cu tot ce a fost desenat pe ea — atunci când următoarea imagine suprascrie tamponul de cadre, în loc de imediat. Vedeți modificările previzualizării.

  • Revizuirea codificatorului JPEG. Plafonul de 1 MB al tamponului de ieșire a dispărut (tamponul este dimensionat din memoria liberă), depășirea atât pe calea software cât și pe cea hardware este gestionată în loc să se scrie fișiere trunchiate, iar salvarea unei imagini comprimate sub cealaltă extensie comprimată ridică o excepție în loc să scrie date invalide.

  • Nou protocol.poll() și șase widget-uri CBOR noi (text, lineedit, pushbutton, spinbox, radio, waveform) pentru protocol.CBORChannel.

  • Post-procesor YOLO Pro, suport FLIR Lepton 3.1R / UW, citiri IMU în rafală, CAN pe OpenMV N6 și o țintă de simulator cu acces la rețea.

Caracteristici noi#

  • YoloPro — un nou post-procesor pentru modelele Edge Impulse YOLO Pro de detectare a obiectelor, plus un exemplu yolo_pro_detector.py. (f3f150ebd, ea7bbb398)

  • protocol.poll() — rulează la cerere o iterație a sarcinii de protocol, pentru transporturi personalizate care nu sunt acționate de întreruperea USB sau de temporizatorul poll_ms. protocol.init() poate fi de asemenea apelat din nou pentru a reinițializa stiva. (c00c215f9, f849ffb1b)

  • Mai multe widget-uri de canal CBOR — protocol.CBORChannel.add() primește text (șir static), lineedit (șir inscriptibil), pushbutton (acțiune momentană), spinbox (introducere numerică în pași), radio (grup de opțiuni) și waveform (serie temporală 1D cu argumentele sample_rate, series și typecode; atribuiți octeți de eșantioane intercalate pentru a o transmite în flux). (8016d29ba)

  • csi.CUSTOM — csi.CSI.framesize() returnează acum o constantă utilizabilă după ce a fost setată o rezoluție (w, h) personalizată, în loc de un întreg anonim. (af8841654)

  • Citire IMU în rafală — imu.__read_reg() acceptă un tampon inscriptibil opțional și îl umple din registre consecutive într-o singură tranzacție. (244ca480a)

  • FLIR Lepton 3.1R și Lepton UW sunt recunoscute de driverul Lepton, inclusiv modurile lor de câștig radiometric. (0fc356632)

  • Rețea în simulator — ținta QEMU MPS2_AN500 are acum lwIP și un NIC în mod utilizator, cu requests, mqtt și sensor înghețate, plus un test unitar de rețea. (23546dfb1, 61d187305, 15096c3a2)

  • Exemplu de API compatibil OpenAI — openai_compatible.py capturează un JPEG și îl trimite către un punct final de chat-completions pentru descrierea scenei. (79033c6aa)

  • Exemple LoRa SX126x — driverul lora-sx126x din micropython-lib (cu lora-sync / lora-async) este înghețat în firmware-ul OpenMV RT1062, cu exemple de emițător/receptor/ping-pong/flux de imagini pentru conectarea unui modul SX1261 sau SX1262 la magistrala SPI. Acesta este suport contribuit de comunitate; OpenMV nu vinde hardware LoRa. (19576e1b1)

Alte modificări și îmbunătățiri#

  • Rescrierea bibliotecii requests — răspunsurile cu transfer pe fragmente sunt decodate, este expus un argument timeout (implicit 5 s), corpurile JSON și șir sunt serializate/codificate corect, antetele sunt analizate fără a ține cont de majuscule/minuscule iar linia de stare după poziție, dicționarul headers al apelantului este copiat (astfel încât auth nu se mai scurge în cererile ulterioare), iar corpul este citit pe blocuri într-un bytearray. (889f0b096)

  • mqtt importă ssl leneș, astfel încât modulul și conexiunile simple (fără TLS) funcționează pe versiunile fără suport SSL. (c2e0899e8)

  • Tamponul de ieșire JPEG dimensionat din memoria liberă în loc de un plafon fix de 1 MB; codificatoarele ajustează tamponul la dimensiunea codificată înainte ca imaginea să fie scrisă, astfel încât capturile de la senzori mari la calitate ridicată nu mai eșuează. (aa1ca6776)

  • Curățarea post-procesării ML — generarea casetelor de încadrare este standardizată între post-procesoarele Darknet, Edge Impulse și Ultralytics, iar ieșirea YOLOv8 este transpusă după aplicarea pragului, astfel încât să fie stocată câte un rând per detectare, ca la celelalte modele. (b5c7853f2, c45f99cad)

  • Oprire sigură PAG7936 — un nou indicator de oprire a senzorului pune PAG7936 în repaus înainte de comutarea RESET/PWDN, corectând blocajele când senzorul este folosit pe un cablu de extensie. Driverul își selectează de asemenea setul de registre MIPI CSI-2 sau paralel din adresa I2C a senzorului la rulare, în loc de la compilare. (10026530c, f6acf14ec, 5f0251c74)

  • Ritmul de redare ImageIO deservește acum evenimentele în așteptare în timp ce așteaptă intervalul dintre cadre, în loc să doarmă în WFI. (a54790193)

  • Actualizări ale submodulului MicroPython — suport complet de rețea pe portul QEMU, machine.mem_backup pe STM32 prin SRAM de rezervă/registrele BKP, controlul hardware al fluxului SDIO menținut dezactivat pe STM32F4 și reutilizarea atributelor MPU pentru regiunile care nu pot fi puse în cache. (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py capturează prin obiectul său csi.CSI în loc de modulul depreciat sensor, iar spațierea importurilor din exemple a fost normalizată. (68c866e7f, 9ceff4513)

Corecții de erori#

Cameră și senzori:

  • Setarea a două rezoluții (w, h) personalizate una după alta lăsa senzorul la prima dimensiune în timp ce csi.CSI.width() / height() raportau a doua; calea rapidă „fără schimbare” exclude acum dimensiunile personalizate. (cfbb70156)

  • csi.CSI.lens_correction() interpreta radi și coef ca valori booleene, astfel încât valorile transmise driverului nu erau cele date. (ab44b3a77)

  • PAG7936: setarea expunerii și a câștigului una după alta făcea ca acestea să se suprascrie reciproc (ambele partajează un singur mod manual, iar registrele citite înapoi sunt în urmă cu un cadru); driverul inițializează acum registrele manuale doar la intrarea în modul manual și scrie doar controlul care este setat. (e7a18c0a0)

  • Captura BAYER cu PAG7936 și PS5520 pe OpenMV N6 eșua cu „Failed to initialize the CSI interface” la orice dimensiune diferită de rezoluția completă, deoarece ISP-ul N6 nu poate redimensiona Bayer brut. Senzorii rulează acum într-un mod nativ corespunzător dimensiunii cerute pentru BAYER (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA nu are mod nativ și nu este suportat). (fe6790055, b7622b245)

Codificarea și salvarea imaginilor:

  • Codificatorul JPEG software: depășirea tamponului de ieșire era întotdeauna fatală deoarece calea de realloc era dezactivată; acum mărește tamponul (cu jumătate din dimensiunea sa la fiecare pas) când îl deține, revine curat când memoria se epuizează și ajustează rezultatul. jpeg_write / mjpeg_write nu mai scriu tamponul după o codificare eșuată. (28e1110be)

  • Codificatoarele JPEG hardware (STM32): depășirea returna o imagine parțial codificată cu dimensiunea alocării, producând fișiere trunchiate fără marcator EOI (de ex. o captură de 5 MP la calitatea 100 cu jumătatea inferioară goală). Acum raportează depășirea, eliberează tamponul la eșec și îl ajustează la succes. (22ce9619c)

  • Codificatorul VC8000 producea în tăcere crominanță 4:2:0 pentru fiecare cerere; subeșantionarea diferită de 4:2:0 revine acum la codecul HW care o suportă. (71f2be7f2)

  • image.Image.save() al unei imagini PNG ca .jpg scria până la 1 MB de heap neinițializat, iar al unei imagini JPEG ca .png scria un fișier gol. Ambele ridică acum o excepție; o imagine aflată deja în formatul țintă este în continuare copiată ca atare. (6c1fdf822)

  • png_write verifică acum valoarea returnată de compresor și comprimă înainte de a crea fișierul, astfel încât un eșec nu mai lasă în urmă un fișier gol. (557f52d66)

Modulul image:

  • image.Image.get_pixel() cu rgbtuple=True pe imagini BAYER și YUV scria pixelul convertit dincolo de o variabilă locală de pe stivă, la un decalaj controlat de apelant. (13f2a17b6)

  • gif.Gif.add_frame() a renunțat la o ramură inaccesibilă de conversie Bayer/YUV; sunt acceptate doar imaginile GRAYSCALE și RGB565, așa cum API-ul Python impunea deja. (f20d99d96)

Protocol:

  • Înregistrarea unui canal dinamic cu toate sloturile deja în uz provoca o scriere în afara limitelor; ID-ul canalului este acum verificat mai întâi, iar ID-urile de canal rezervate sunt verificate static pentru a încăpea în tabela de canale. (68f635d1f)

  • Obiectele canalelor dinamice supraviețuiau unei reporniri soft în pointerii rădăcină, astfel încât GC-ul continua să scaneze blocuri de heap învechite din rularea anterioară; tabela este acum golită la inițializare. (ef0ebb03b, e23641145)

Porturi:

  • i.MX RT: adăugată dezinițializarea lipsă a CAN și Encoder la repornirea soft. (7cb9d3dc2)

Suport hardware și plăci#

  • OpenMV N6 — CAN este acum activat (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — driverul SPI sdcard este înghețat pentru soclul microSD de pe AE3 Battery Shield. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async înghețate (vedeți Caracteristici noi).

  • FLIR Lepton 3.1R / UW — recunoscute de driverul Lepton pe toate plăcile compatibile cu Lepton.

  • PAG7936 — oprire sigură, selecția interfeței la rulare, corecția expunerii/câștigului și captură BAYER pe N6.

  • PS5520 — captură BAYER pe N6 la dimensiuni native.

  • Simulator (MPS2_AN500) — rețea.

  • Toate plăcile — modulul de compatibilitate sensor este înghețat în manifestul fiecărei plăci.

Modificări incompatibile de API#

v5.0.1 nu introduce nicio modificare incompatibilă în API-urile csi sau image. Scripturile care rulau pe v5.0.0 rulează neschimbate, cu următoarele modificări de comportament.

modulul sensor (comportament)#

Modulul nativ sensor (modules/py_csi.c) a fost eliminat și înlocuit cu un modul Python înghețat care implementează același API peste csi. Vedeți sensor.

Commit: 5e3d40631

  • import sensor afișează în terminal WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..

  • Obiectul ascuns csi.CSI este creat la import, astfel încât o cameră lipsă ridică acum o eroare la import sensor și nu la sensor.reset().

  • Aceste funcții ridică acum OSError deoarece csi nu are un echivalent: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (Cele două funcții *_extra_fb ridicau deja excepții în v5.0.0.) Folosiți csi.CSI(delays=False) / csi.CSI(fflush=False) pentru ultimele două.

  • Dimensiunile de cadru pe care csi nu le exportă (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) sunt acum tupluri (w, h) transmise ca rezoluții personalizate. get_framesize() returnează tuplul care a fost setat cât timp camera este încă la acea dimensiune, astfel încât verificările de egalitate cu constantele să funcționeze în continuare.

  • ioctl() transmite cel mult patru argumente după cerere.

  • sleep() / shutdown() ridică OSError la eșec ca înainte (excepția RuntimeError din csi este convertită).

Migrați la csi — vedeți tabelul de migrare v5.0.0.

Încărcarea imaginilor în tamponul de cadre (comportament)#

Funcțiile care încarcă o imagine în tamponul de cadre — image.Image cu copy_to_fb=True, image.Image.copy() / image.Image.scale() și conversiile to_* cu copy_to_fb=True, image.ImageIO.read(), fir.snapshot() și tof.snapshot() cu copy_to_fb=True — obișnuiau să împingă noua imagine imediat către previzualizarea IDE, astfel încât tot ce era desenat pe imaginea returnată nu era văzut niciodată. Acum marchează tamponul de cadre ca fiind în așteptare și îl descarcă, cu tot ce a fost desenat pe el, chiar înainte ca următoarea imagine să îl suprascrie — același comportament ca csi.CSI.snapshot().

Commit-uri: 87b6db5ee, 7b1a35c2f, f773c740d

Buclele care citesc un flux de imagini nu necesită nicio modificare și afișează acum desenele lor. Un script care încarcă o singură imagine și se oprește trebuie să o descarce explicit:

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

biblioteca ML (comportament)#

Afectează doar codul care derivă din sau copiază post-procesoarele livrate. YoloV8 transpune acum ieșirea modelului după aplicarea pragului, astfel încât detectările rămase sunt stocate câte un rând per casetă (bb[:, 4:]), la fel ca post-procesoarele Darknet și Edge Impulse, în loc de câte o coloană per casetă (bb[4:, :]). Rezultatele publice ((x, y, w, h), score) sunt neschimbate.

Commit-uri: c45f99cad, b5c7853f2

modulul protocol (minor)#

protocol.poll() a revenit. v5.0.0 l-a eliminat când sarcina de protocol a trecut pe temporizator; revine ca o modalitate explicită de a acționa sarcina pentru transporturi personalizate. Nimic altceva nu s-a schimbat — scripturile care nu l-au apelat niciodată nu sunt afectate.

Commit: c00c215f9

Compilare / instrumentar (instrumentar)#

Nimic din toate acestea nu afectează scripturile MicroPython. py_image.c a fost împărțit, obiectele descriptor (cascade, keypoints, LBP, keypoint match) mutându-se în py_image_descriptor.c iar obiectele de statistici (similarity, statistics, percentile, threshold, histogram) în py_image_stats.c. API-ul de codificare imlib a fost aliniat cu restul imlib: jpeg_compress / png_compress returnează 0 la succes și -1 la eroare, iar jpeg_compress și-a pierdut argumentul realloc (redimensionarea este condiționată de deținerea tamponului). OMV_PROTOCOL_MAX_CHANNELS a devenit OMV_PROTOCOL_CHANNEL_MAX în omv_protocol_channel.h, iar porturile apelează acum py_protocol_init0() la inițializare. Definiția de placă OMV_PAG7936_MIPI_CSI2 a dispărut (interfața este selectată la rulare). Actualizări ale dependențelor CI și o corecție pentru changelog-ul gol al versiunilor completează lista. Consultați istoricul depozitului de firmware pentru detalii relevante pentru fork-uri.

Lista de verificare a migrării#

  • Încă folosiți import sensor? Funcționează, cu un avertisment. Treceți la csi (migrarea v5.0.0); înlocuiți disable_delays / disable_full_flush cu argumentele constructorului csi.CSI() și renunțați la apelurile get_fb / de rotire automată.

  • Încărcați o singură imagine cu copy_to_fb=True și vă așteptați să o vedeți? Adăugați img.flush() după încărcare.

  • Ați copiat post-procesorul YOLOv8? Indexați ieșirea după aplicarea pragului pe rânduri (bb[:, 4:]) și nu pe coloane.

  • Comparați csi0.framesize() după setarea unui tuplu? Returnează acum csi.CUSTOM.

  • Tot restul: reprogramați firmware-ul și rulați.