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
sensoreste acum un modul Python înghețat construit pestecsi. Afișează un avertisment de depreciere la import; câteva funcții pe care modululcsinu le poate suporta ridică acumOSError. 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) pentruprotocol.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 exempluyolo_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 temporizatorulpoll_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ștetext(șir static),lineedit(șir inscriptibil),pushbutton(acțiune momentană),spinbox(introducere numerică în pași),radio(grup de opțiuni) șiwaveform(serie temporală 1D cu argumentelesample_rate,seriesșitypecode; 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_AN500are acum lwIP și un NIC în mod utilizator, curequests,mqttșisensorînghețate, plus un test unitar de rețea. (23546dfb1, 61d187305, 15096c3a2)Exemplu de API compatibil OpenAI —
openai_compatible.pycapturează un JPEG și îl trimite către un punct final de chat-completions pentru descrierea scenei. (79033c6aa)Exemple LoRa SX126x — driverul
lora-sx126xdin micropython-lib (culora-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 argumenttimeout(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ționarulheadersal apelantului este copiat (astfel încâtauthnu se mai scurge în cererile ulterioare), iar corpul este citit pe blocuri într-unbytearray. (889f0b096)mqttimportăsslleneș, 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
ImageIOdeservește acum evenimentele în așteptare în timp ce așteaptă intervalul dintre cadre, în loc să doarmă înWFI. (a54790193)Actualizări ale submodulului MicroPython — suport complet de rețea pe portul QEMU,
machine.mem_backuppe 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.pycapturează prin obiectul săucsi.CSIîn loc de modulul depreciatsensor, 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 cecsi.CSI.width()/height()raportau a doua; calea rapidă „fără schimbare” exclude acum dimensiunile personalizate. (cfbb70156)csi.CSI.lens_correction()interpretaradișicoefca 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_writenu 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.jpgscria până la 1 MB de heap neinițializat, iar al unei imagini JPEG ca.pngscria 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_writeverifică 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()curgbtuple=Truepe 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
sdcardeste î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
sensoreste î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 sensorafișează în terminalWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..Obiectul ascuns
csi.CSIeste creat la import, astfel încât o cameră lipsă ridică acum o eroare laimport sensorși nu lasensor.reset().Aceste funcții ridică acum
OSErrordeoarececsinu 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_fbridicau deja excepții în v5.0.0.) Folosițicsi.CSI(delays=False)/csi.CSI(fflush=False)pentru ultimele două.Dimensiunile de cadru pe care
csinu 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ăOSErrorla eșec ca înainte (excepțiaRuntimeErrordincsieste 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.
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 lacsi(migrarea v5.0.0); înlocuițidisable_delays/disable_full_flushcu argumentele constructoruluicsi.CSI()și renunțați la apelurileget_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țiimg.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ă acumcsi.CUSTOM.Tot restul: reprogramați firmware-ul și rulați.