v4.7.0

v4.7.0 este o lansare majoră de funcționalități. În prim-plan: noua placă OpenMV AE3 (Alif Ensemble, Cortex-M55 + NPU Ethos-U55) cu un model de programare dual-core openamp, un sistem de fișiere ROMFS (/rom) doar-citire cu modele și cascade incluse, suport time-of-flight VL53L8CX 8x8, noi post-procesoare YOLOv8 / YOLO-LC și MicroPython 1.25. De asemenea, modifică modul în care se încarcă modelele integrate și cascadele Haar, așa că citiți modificările incompatibile de mai jos.

Repere

  • Placa OpenMV AE3 — placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55), cu un port complet, bootloader și ROMFS.

  • Modul openamp dual-core — descarcă sarcini către al doilea nucleu Alif prin RPMsg (decoratorul @async_remote, Endpoint/ EndpointIO).

  • ROMFS — un sistem de fișiere /rom doar-citire cu modele TFLite integrate și cascade Haar, plus un nou constructor gazdă tools/mkromfs.py.

  • Suport senzor time-of-flight multi-zonă VL53L8CX 8x8.

  • Noi post-procesoare MLyolo_v8_postprocess și yolo_lc_postprocess.

  • MicroPython actualizat la 1.25.0.

  • Incompatibil: modelele integrate și cascadele Haar se încarcă acum din /rom după cale (vedeți modificarea ml.Model și modificarea cascadei Haar).

Funcționalități noi

  • OpenMV AE3 — nouă placă Alif Ensemble (nucleu de aplicație Cortex-M55 + NPU Ethos-U55), cu port, bootloader, configurație de placă, LED RGB și suport ROMFS.

  • openamp — un nou modul pentru modelul RPC dual-core Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback și decoratorul @async_remote pentru a descărca funcții serializate către al doilea nucleu. Nucleele HE/HP includ un task runner _boot.py implicit bazat pe asyncio.

  • audio — portul Alif adaugă modulul audio (microfon PDM) cu un API de streaming bazat pe funcții de retroapelare (callback) (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) pe AE3.

  • ROMFS — un sistem de fișiere /rom doar-citire cu resurse integrate (modele TFLite, cascade Haar, …) împachetate pentru fiecare placă, un nou instrument gazdă tools/mkromfs.py (tflite, tflite+vela, cascadă Haar, text, binar) și un ajutor scripts/libraries/romfs.py care expune ls_romfs().

  • Post-procesare ML — noile clase yolo_v8_postprocess (YOLOv8) și yolo_lc_postprocess (variantă ușoară tiny-YOLOv2 cu anchors implicite optimizate pentru sisteme embedded), fiecare acceptând threshold, nms_threshold și nms_sigma.

  • Anti-flicker GenX320 — un nou ioctl IOCTL_GENX320_SET_AFK pentru a activa și configura filtrul anti-flicker al senzorului de evenimente (frecvența minimă/maximă de pâlpâire în Hz), cu un exemplu genx320_grayscale_set_afk.py.

  • VL53L8CX — suport pentru senzorul time-of-flight multi-zonă 8x8 prin modulul tof (detectat automat, 8x8 la 15 Hz).

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

  • MicroPython actualizat la 1.25.0 (porturile STM32 și i.MX RT), cu portul Alif din upstream adăugat și vechile drivere BT-HCI eliminate din porturile STM32 / i.MX RT.

  • GenX320 — o nouă secvență ISSD dublează frecvența internă de ceas a pixelilor (24 → 48 MHz) pentru rate de cadre mai mari.

  • STM32N6 / ST Edge AI — bazele pentru implementarea modelelor Neural-ART pe STM32N6 (instrumente ST Edge AI și suport ROMFS).

  • PAG7936 — bitrate-ul CSI PHY este acum setat, îmbunătățind funcționarea acestui senzor.

Corectări de erori

Camera și senzorii:

  • S-a corectat IMU-ul prin I2C — plăcile care conectează IMU-ul LSM6DSx pe I2C se inițializează și citesc acum corect (calea I2C folosea anterior o cale de citire defectă și constante greșite).

  • Inițializarea FLIR Boson reîncearcă acum de până la 10 ori pentru senzorii mai vechi (< IDD 4.x) care au nevoie de ~10 s pentru a porni, iar setările implicite din fabrică sunt restaurate la resetare, astfel încât setările încărcate extern să nu poată întrerupe ieșirea video.

  • S-a corectat psee_ehc_activate_override din GenX320 care scria un timp de acumulare greșit (zero).

  • Pe plăcile STM32 fără hardware FastMode+, solicitarea modului rapid I2C este acum protejată corespunzător în loc să configureze greșit magistrala în mod silențios.

Învățare automată:

  • S-au corectat colectarea casetelor de încadrare și gestionarea np.nonzero în post-procesoarele YOLOv2 / YOLOv5, îmbunătățind fiabilitatea detectării.

Suport hardware și plăci

  • OpenMV AE3 — nouă placă Alif Ensemble (Cortex-M55 + NPU Ethos-U55).

  • VL53L8CX — senzor time-of-flight multi-zonă 8x8; senzorul ToF al AE3 a fost comutat de la VL53L5CX la VL53L8CX.

  • STM32N6 — bazele pentru implementarea modelelor ST Edge AI (Neural-ART).

Modificări incompatibile de API

Incompatibilități de API vizibile pentru utilizator între v4.6.20 și v4.7.0. Domeniu: module C Python din modules/ și biblioteci Python din scripts/libraries/.

Fiecare modificare este etichetată cu impactul său:

  • major — majoritatea scripturilor care îl utilizau necesită modificări.

  • minor — API restrâns; afectează doar scripturile care îl utilizau.

  • comportament — același API, rezultate diferite; reverificați scripturile reglate.

Modificările sunt grupate după impact în această ordine. Dacă doriți doar să vă portați codul, săriți la lista de verificare pentru migrare de la final pentru o listă de sarcini condensată. Fiecare hash de commit duce la diff-ul său de pe GitHub.

Modelele integrate se încarcă după cale, nu după nume (major)

ml.Model nu mai încarcă un model integrat dintr-un șir simplu cu numele. Modelele se încarcă acum din sistemul de fișiere / ROMFS după cale:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

Atributul model.labels din partea C a fost eliminat; etichetele se încarcă acum de către wrapper-ul Python ml.Model dintr-un fișier auxiliar <model>.txt (None dacă lipsește). Toate exemplele incluse și ml/apps.py au fost actualizate la căi /rom/*.tflite.

Commits: 978fa436c, 3f55d956c, 416bc4613

Cascadele Haar se încarcă din ROMFS (minor)

image.HaarCascade() încarcă acum cascadele integrate prin VFS / ROMFS. Fișierul cascadei frontale de față implicit a fost redenumit din haarcascade_frontalface_default.xml în haarcascade_frontalface.xml, iar un eșec de încărcare generează acum RuntimeError („Failed to load Haar cascade”) în loc de OSError.

Commit: 9de1220d8

Semantica tof.reset() / tof.deinit() (comportament)

În modulul tof, reset() era anterior un alias pentru init() și nu exista un deinit real. tof.reset() efectuează acum o resetare reală a senzorului, iar tof.deinit() oprește corect senzorul (cu suport de oprire VL53L5CX). Codul care se baza pe reset() pentru reinițializarea senzorului trebuie reverificat.

Commits: 20d6b53f8, c743cab6a

Constrângeri de temporizare și mod-eveniment GenX320 (comportament)

Noua secvență ISSD GenX320 modifică baza de timp a senzorului: argumentele de rată de cadre și de expunere sunt acum exprimate în unități de 1 MHz în loc să fie scalate după ceas, iar blanking-ul HSYNC este ajustat dinamic la rata de cadre solicitată. Scripturile care au valori de temporizare GenX320 codate fix trebuie reglate din nou. Capturarea în mod-eveniment generează acum o eroare atunci când transpunerea imaginii este activată (nu este acceptată în această configurație).

Commits: 660a783d6, 7a718c6af

Lista de verificare pentru migrare

Pentru o portare curată la v4.7.0, lucrul tipic este:

  1. Schimbați încărcarea modelelor integrate dintr-un șir cu numele într-o cale /rom/<name>.tflite și furnizați etichetele printr-un fișier auxiliar <name>.txt (modificarea ml.Model).

  2. Actualizați haarcascade_frontalface_default.xml la haarcascade_frontalface.xml și prindeți RuntimeError (nu OSError) la eșecul de încărcare a cascadei (modificarea cascadei Haar).

  3. Eliminați codul care se baza pe tof.reset() pentru reinițializarea senzorului (modificarea tof).

  4. Reglați din nou orice valoare de rată de cadre / expunere GenX320 codată fix la unități de 1 MHz și nu activați transpunerea în modul eveniment (modificarea GenX320).