v5.0.1#

v5.0.1 je izdanje za održavanje povrh v5.0.0 — naslijeđeni modul sensor postaje Python sloj za kompatibilnost nad csi, slike učitane u međuspremnik slike sada se u pregledu prikazuju poput sličica kamere, JPEG koderi gube ograničenje izlaza od 1 MB i ispravno rukuju prekoračenjem, a tu je i niz ispravaka za kameru, protokol, mrežu i ML biblioteku. Ne uvodi nikakve promjene API-ja koje narušavaju kompatibilnost za skripte pisane za csi; nekoliko promjena ponašanja navedeno je pod promjene API-ja koje narušavaju kompatibilnost.

Istaknuto#

  • Modul sensor sada je zamrznuti Python modul izgrađen na csi. Pri uvozu ispisuje upozorenje o zastarjelosti; nekoliko funkcija koje modul csi ne može podržati sada podiže OSError. Vidi promjene modula sensor.

  • Učitane slike prikazuju se u pregledu poput sličica kamere. Slika smještena u međuspremnik slike s copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) šalje se u IDE — zajedno sa svime što je na njoj nacrtano — kada je sljedeća slika prebriše u međuspremniku slike, umjesto odmah. Vidi promjene pregleda.

  • Preinaka JPEG kodera. Ograničenje izlaznog međuspremnika od 1 MB je uklonjeno (međuspremnik se dimenzionira prema slobodnoj memoriji), prekoračenje na softverskom i hardverskom putu se obrađuje umjesto zapisivanja skraćenih datoteka, a spremanje komprimirane slike pod drugom komprimiranom ekstenzijom podiže iznimku umjesto da zapisuje smeće.

  • Novi protocol.poll() i šest novih CBOR widgeta (text, lineedit, pushbutton, spinbox, radio, waveform) za protocol.CBORChannel.

  • YOLO Pro naknadni obrađivač, podrška za FLIR Lepton 3.1R / UW, skupna (burst) čitanja IMU-a, CAN na OpenMV N6 i cilj simulatora s mrežnom podrškom.

Nove značajke#

  • YoloPro — novi naknadni obrađivač za Edge Impulse YOLO Pro modele za detekciju objekata, plus primjer yolo_pro_detector.py. (f3f150ebd, ea7bbb398)

  • protocol.poll() — izvodi jednu iteraciju protokolnog zadatka na zahtjev, za prilagođene transporte koje ne pokreće USB prekid ni poll_ms timer. protocol.init() također se može ponovno pozvati za ponovnu inicijalizaciju stoga. (c00c215f9, f849ffb1b)

  • Više widgeta CBOR kanala — protocol.CBORChannel.add() dobiva text (statični niz), lineedit (zapisivi niz), pushbutton (trenutna radnja), spinbox (numerički unos u koracima), radio (skupina opcija) i waveform (1D vremenski niz s argumentima sample_rate, series i typecode; za strujanje mu dodijelite bajtove isprepletenih uzoraka). (8016d29ba)

  • csi.CUSTOM — csi.CSI.framesize() sada vraća upotrebljivu konstantu nakon što je postavljena prilagođena (w, h) razlučivost, umjesto anonimnog cijelog broja. (af8841654)

  • Skupno (burst) čitanje IMU-a — imu.__read_reg() prihvaća neobavezni zapisivi međuspremnik i puni ga iz uzastopnih registara u jednoj transakciji. (244ca480a)

  • FLIR Lepton 3.1R i Lepton UW prepoznaje upravljački program Leptona, uključujući njihove radiometrijske načine pojačanja. (0fc356632)

  • Mrežna podrška u simulatoru — QEMU cilj MPS2_AN500 sada ima lwIP i NIC u korisničkom načinu, sa zamrznutim requests, mqtt i sensor te mrežnim jediničnim testom. (23546dfb1, 61d187305, 15096c3a2)

  • Primjer API-ja kompatibilnog s OpenAI-jem — openai_compatible.py snima JPEG i šalje ga na chat-completions krajnju točku radi opisa scene. (79033c6aa)

  • SX126x LoRa primjeri — upravljački program lora-sx126x iz micropython-lib (s lora-sync / lora-async) zamrznut je u ugrađeni program OpenMV RT1062, s primjerima pošiljatelja/primatelja/ping-ponga/strujanja slika za spajanje SX1261 ili SX1262 modula na SPI sabirnicu. Ovo je podrška koju je pridonijela zajednica; OpenMV ne prodaje LoRa sklopovlje. (19576e1b1)

Ostale promjene i poboljšanja#

  • Prepisana biblioteka requests — odgovori s prijenosom u dijelovima se dekodiraju, izložen je argument timeout (zadano 5 s), JSON i tijela nizova znakova ispravno se serijaliziraju/kodiraju, zaglavlja se raščlanjuju bez obzira na velika i mala slova, a statusni redak po položaju, rječnik headers pozivatelja se kopira (pa auth više ne curi u kasnije zahtjeve), a tijelo se čita u blokovima u bytearray. (889f0b096)

  • mqtt uvozi ssl lijeno, pa modul i obične (ne-TLS) veze rade na inačicama bez podrške za SSL. (c2e0899e8)

  • JPEG izlazni međuspremnik dimenzioniran prema slobodnoj memoriji umjesto fiksnog ograničenja od 1 MB; koderi obrezuju međuspremnik na kodiranu veličinu prije zapisivanja slike, pa snimke velikih senzora pri visokoj kvaliteti više ne padaju. (aa1ca6776)

  • Čišćenje ML naknadne obrade — generiranje graničnih okvira standardizirano je u Darknet, Edge Impulse i Ultralytics naknadnim obrađivačima, a izlaz YOLOv8 transponira se nakon primjene praga tako da se pohranjuje jedan redak po detekciji kao kod ostalih modela. (b5c7853f2, c45f99cad)

  • Sigurno gašenje PAG7936 — nova zastavica zaustavljanja senzora uspavljuje PAG7936 prije prebacivanja RESET/PWDN, čime se ispravljaju zaglavljivanja kada se senzor koristi na produžnom kabelu. Upravljački program također odabire svoj skup registara za MIPI CSI-2 ili paralelno sučelje prema I2C adresi senzora u vrijeme izvođenja umjesto u vrijeme gradnje. (10026530c, f6acf14ec, 5f0251c74)

  • Tempiranje reprodukcije ImageIO sada opslužuje događaje na čekanju dok čeka interval između sličica umjesto da spava u WFI. (a54790193)

  • Ažuriranja MicroPython podmodula — puna mrežna podrška na QEMU portu, machine.mem_backup na STM32 putem backup SRAM/BKP registara, SDIO hardverska kontrola toka ostaje onemogućena na STM32F4 i ponovna upotreba MPU atributa za regije koje se ne predmemoriraju. (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py snima putem svojeg objekta csi.CSI umjesto zastarjelog modula sensor, a razmaci pri uvozu u primjerima su normalizirani. (68c866e7f, 9ceff4513)

Ispravci grešaka#

Kamera i senzori:

  • Postavljanje dviju prilagođenih (w, h) razlučivosti zaredom ostavljalo je senzor na prvoj veličini dok su csi.CSI.width() / height() prijavljivali drugu; brzi put „bez promjene” sada isključuje prilagođene veličine. (cfbb70156)

  • csi.CSI.lens_correction() raščlanjivao je radi i coef kao logičke vrijednosti, pa vrijednosti proslijeđene upravljačkom programu nisu bile one zadane. (ab44b3a77)

  • PAG7936: uzastopno postavljanje ekspozicije i pojačanja međusobno se prebrisavalo (oba dijele jedan ručni način, a registri za očitavanje kasne jednu sličicu); upravljački program sada popunjava ručne registre samo pri ulasku u ručni način i zapisuje samo kontrolu koja se postavlja. (e7a18c0a0)

  • PAG7936 i PS5520 BAYER snimanje na OpenMV N6 padalo je s „Failed to initialize the CSI interface” pri bilo kojoj veličini osim pune razlučivosti, jer N6 ISP ne može skalirati sirovi Bayer. Senzori sada za BAYER rade u izvornom načinu koji odgovara traženoj veličini (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA nema izvorni način i nije podržan). (fe6790055, b7622b245)

Kodiranje i spremanje slika:

  • Softverski JPEG koder: prekoračenje izlaznog međuspremnika uvijek je bilo fatalno jer je put za realloc bio onemogućen; sada povećava međuspremnik (za polovicu njegove veličine odjednom) kada ga posjeduje, uredno odustaje kada ponestane memorije i obrezuje rezultat. jpeg_write / mjpeg_write više ne zapisuju međuspremnik nakon neuspjelog kodiranja. (28e1110be)

  • Hardverski JPEG koderi (STM32): prekoračenje je vraćalo djelomično kodiranu sliku s veličinom alokacije, stvarajući skraćene datoteke bez EOI oznake (npr. snimka od 5 MP pri kvaliteti 100 s praznom donjom polovicom). Sada prijavljuju prekoračenje, oslobađaju međuspremnik pri neuspjehu i obrezuju ga pri uspjehu. (22ce9619c)

  • Koder VC8000 tiho je proizvodio 4:2:0 kromu za svaki zahtjev; poduzorkovanje koje nije 4:2:0 sada se vraća na HW kodek koji ga podržava. (71f2be7f2)

  • image.Image.save() PNG slike kao .jpg zapisivao je do 1 MB neinicijalizirane hrpe, a JPEG slike kao .png zapisivao je praznu datoteku. Oboje sada podiže iznimku; slika koja je već u ciljnom formatu i dalje se kopira kakva jest. (6c1fdf822)

  • png_write sada provjerava povratnu vrijednost kompresora i komprimira prije stvaranja datoteke, pa neuspjeh više ne ostavlja praznu datoteku. (557f52d66)

Modul image:

  • image.Image.get_pixel() s rgbtuple=True na BAYER i YUV slikama zapisivao je pretvoreni piksel izvan lokalne varijable na stogu, na pomaku koji kontrolira pozivatelj. (13f2a17b6)

  • gif.Gif.add_frame() izbacio je nedostižnu granu pretvorbe Bayer/YUV; prihvaćaju se samo GRAYSCALE i RGB565 slike, kako je Python API već nametao. (f20d99d96)

Protokol:

  • Registriranje dinamičkog kanala kada su svi utori već zauzeti uzrokovalo je zapisivanje izvan granica; ID kanala sada se prvo provjerava, a za rezervirane ID-ove kanala statički se provjerava da stanu u tablicu kanala. (68f635d1f)

  • Objekti dinamičkih kanala preživljavali su meki reset u korijenskim pokazivačima, pa je GC nastavljao pretraživati zastarjele blokove hrpe iz prethodnog izvođenja; tablica se sada briše pri inicijalizaciji. (ef0ebb03b, e23641145)

Portovi:

  • i.MX RT: dodana nedostajuća deinicijalizacija CAN-a i enkodera pri mekom resetu. (7cb9d3dc2)

Sklopovlje i podrška za ploče#

  • OpenMV N6 — CAN je sada omogućen (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — SPI upravljački program sdcard zamrznut je za microSD utor na AE3 Battery Shieldu. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async zamrznuti u ugrađeni program (vidi Nove značajke).

  • FLIR Lepton 3.1R / UW — prepoznaje ih upravljački program Leptona na svim pločama s podrškom za Lepton.

  • PAG7936 — sigurno zaustavljanje pri gašenju, odabir sučelja u vrijeme izvođenja, ispravak ekspozicije/pojačanja i BAYER snimanje na N6.

  • PS5520 — BAYER snimanje na N6 u izvornim veličinama.

  • Simulator (MPS2_AN500) — mrežna podrška.

  • Sve ploče — modul za kompatibilnost sensor zamrznut je u manifest svake ploče.

Promjene API-ja koje narušavaju kompatibilnost#

v5.0.1 ne uvodi nikakve promjene koje narušavaju kompatibilnost API-ja csi ili image. Skripte koje su radile na v5.0.0 rade nepromijenjene, uz sljedeće promjene ponašanja.

modul sensor (behavior)#

Izvorni modul sensor (modules/py_csi.c) uklonjen je i zamijenjen zamrznutim Python modulom koji implementira isti API povrh csi. Vidi sensor.

Commit: 5e3d40631

  • import sensor ispisuje WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead. na terminal.

  • Skriveni objekt csi.CSI stvara se pri uvozu, pa nedostajuća kamera sada podiže grešku pri import sensor, a ne pri sensor.reset().

  • Ove funkcije sada podižu OSError jer csi nema ekvivalent: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (Dvije funkcije *_extra_fb podizale su iznimku već u v5.0.0.) Za posljednje dvije koristite csi.CSI(delays=False) / csi.CSI(fflush=False).

  • Veličine sličica koje csi ne izvozi (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) sada su (w, h) tuple-ovi koji se prosljeđuju kao prilagođene razlučivosti. get_framesize() vraća postavljeni tuple dok je kamera još na toj veličini, pa provjere jednakosti s konstantama i dalje rade.

  • ioctl() prosljeđuje najviše četiri argumenta nakon zahtjeva.

  • sleep() / shutdown() podižu OSError pri neuspjehu kao i prije (csi RuntimeError se prevodi).

Prijeđite na csi — vidi tablicu migracije na v5.0.0.

Učitavanje slika u međuspremnik slike (behavior)#

Funkcije koje učitavaju sliku u međuspremnik slike — image.Image s copy_to_fb=True, image.Image.copy() / image.Image.scale() i pretvorbe to_* s copy_to_fb=True, image.ImageIO.read(), fir.snapshot() i tof.snapshot() s copy_to_fb=True — prije su novu sliku odmah slale u IDE pregled, pa se ništa nacrtano na vraćenoj slici nikada nije vidjelo. Sada označavaju međuspremnik slike kao na čekanju i šalju ga, sa svime što je na njemu nacrtano, neposredno prije nego što ga sljedeća slika prebriše — isto ponašanje kao csi.CSI.snapshot().

Commitovi: 87b6db5ee, 7b1a35c2f, f773c740d

Petlje koje čitaju tok slika ne trebaju promjene i sada prikazuju svoj crtež. Skripta koja učita jednu sliku i stane mora je izričito poslati:

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

ML biblioteka (behavior)#

Utječe samo na kod koji nasljeđuje ili kopira isporučene naknadne obrađivače. YoloV8 sada transponira izlaz modela nakon primjene praga tako da se preživjele detekcije pohranjuju kao jedan redak po okviru (bb[:, 4:]), u skladu s Darknet i Edge Impulse naknadnim obrađivačima, umjesto jednog stupca po okviru (bb[4:, :]). Javni rezultati ((x, y, w, h), score) su nepromijenjeni.

Commitovi: c45f99cad, b5c7853f2

modul protocol (minor)#

protocol.poll() se vratio. v5.0.0 ga je uklonio kada je protokolni zadatak prešao na timer; vraća se kao izričit način pokretanja zadatka za prilagođene transporte. Ništa se drugo nije promijenilo — skripte koje ga nikada nisu pozivale nisu pogođene.

Commit: c00c215f9

Gradnja / alati (tooling)#

Ništa od ovoga ne utječe na MicroPython skripte. py_image.c je podijeljen, pri čemu su objekti deskriptora (cascade, keypoints, LBP, keypoint match) premješteni u py_image_descriptor.c, a statistički objekti (similarity, statistics, percentile, threshold, histogram) u py_image_stats.c. API imlib kodera usklađen je s ostatkom imliba: jpeg_compress / png_compress vraćaju 0 pri uspjehu i -1 pri grešci, a jpeg_compress je izgubio svoj argument realloc (promjena veličine ovisi o vlasništvu nad međuspremnikom). OMV_PROTOCOL_MAX_CHANNELS postao je OMV_PROTOCOL_CHANNEL_MAX u omv_protocol_channel.h, a portovi sada pri inicijalizaciji pozivaju py_protocol_init0(). Definicija ploče OMV_PAG7936_MIPI_CSI2 je uklonjena (sučelje se odabire u vrijeme izvođenja). Sve zaokružuju nadogradnje CI ovisnosti i ispravak praznog changeloga izdanja. Za detalje relevantne za forkove pogledajte povijest repozitorija ugrađenog programa.

Kontrolni popis za migraciju#

  • Još uvijek na import sensor? Radi, uz upozorenje. Prijeđite na csi (migracija na v5.0.0); zamijenite disable_delays / disable_full_flush argumentima konstruktora csi.CSI() i izbacite pozive get_fb / automatskog zakretanja.

  • Učitavate jednu sliku s copy_to_fb=True i očekujete da je vidite? Nakon učitavanja dodajte img.flush().

  • Kopirali ste YOLOv8 naknadni obrađivač? Indeksirajte izlaz nakon praga po retku (bb[:, 4:]), a ne po stupcu.

  • Uspoređujete csi0.framesize() nakon postavljanja tuplea? Sada vraća csi.CUSTOM.

  • Sve ostalo: ponovno flashajte i pokrenite.