v4.7.0

v4.7.0 è una release importante con nuove funzionalità. Le novità principali: la nuova scheda OpenMV AE3 (Alif Ensemble, Cortex-M55 + NPU Ethos-U55) con un modello di programmazione dual-core openamp, un filesystem ROMFS (/rom) di sola lettura con modelli e cascate inclusi, il supporto per il time-of-flight VL53L8CX 8x8, nuovi post-processor YOLOv8 / YOLO-LC e MicroPython 1.25. Cambia inoltre il modo in cui vengono caricati i modelli integrati e le cascate Haar, quindi leggi le modifiche incompatibili di seguito.

In evidenza

  • Scheda OpenMV AE3 — la scheda Alif Ensemble (Cortex-M55 + NPU Ethos-U55), con port completo, bootloader e ROMFS.

  • Modulo openamp dual-core — delega il lavoro al secondo core Alif tramite RPMsg (il decoratore @async_remote, Endpoint/ EndpointIO).

  • ROMFS — un filesystem /rom di sola lettura con modelli TFLite e cascate Haar integrati, più un nuovo builder host tools/mkromfs.py.

  • Supporto per il sensore time-of-flight multi-zona VL53L8CX 8x8.

  • Nuovi post-processor MLyolo_v8_postprocess e yolo_lc_postprocess.

  • MicroPython aggiornato alla versione 1.25.0.

  • Incompatibilità: i modelli integrati e le cascate Haar ora vengono caricati da /rom tramite percorso (vedi la modifica di ml.Model e la modifica delle cascate Haar).

Nuove funzionalità

  • OpenMV AE3 — nuova scheda Alif Ensemble (core applicativo Cortex-M55 + NPU Ethos-U55), con port, bootloader, configurazione della scheda, LED RGB e supporto ROMFS.

  • openamp — un nuovo modulo per il modello RPC dual-core Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback e il decoratore @async_remote per delegare al secondo core funzioni serializzate. I core HE/HP includono un task runner _boot.py basato su asyncio di default.

  • audio — il port Alif aggiunge il modulo audio (microfono PDM) con un’API di streaming basata su callback (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) sull’AE3.

  • ROMFS — un filesystem /rom di sola lettura con asset integrati (modelli TFLite, cascate Haar, …) impacchettati per scheda, un nuovo strumento host tools/mkromfs.py (tflite, tflite+vela, cascata Haar, testo, binario) e un helper scripts/libraries/romfs.py che espone ls_romfs().

  • Post-processing ML — nuove classi yolo_v8_postprocess (YOLOv8) e yolo_lc_postprocess (variante leggera di tiny-YOLOv2 con anchor di default ottimizzate per l’embedded), ciascuna con threshold, nms_threshold e nms_sigma.

  • Anti-flicker del GenX320 — un nuovo ioctl IOCTL_GENX320_SET_AFK per abilitare e configurare il filtro anti-flicker del sensore a eventi (frequenza di flicker min/max in Hz), con un esempio genx320_grayscale_set_afk.py.

  • VL53L8CX — supporto per il sensore time-of-flight multi-zona 8x8 tramite il modulo tof (rilevamento automatico, 8x8 a 15 Hz).

Altre modifiche e miglioramenti

  • MicroPython aggiornato alla versione 1.25.0 (port STM32 e i.MX RT), con l’aggiunta del port Alif upstream e la rimozione dei vecchi driver BT-HCI dai port STM32 / i.MX RT.

  • GenX320 — una nuova sequenza ISSD raddoppia il clock interno dei pixel (24 → 48 MHz) per frame rate più elevati.

  • STM32N6 / ST Edge AI — fondamenta per il deployment di modelli Neural-ART su STM32N6 (strumenti ST Edge AI e supporto ROMFS).

  • PAG7936 — il bitrate della PHY CSI ora viene impostato, migliorando il funzionamento di quel sensore.

Correzioni di bug

Camera e sensori:

  • Corretta l’IMU su I2C — le schede che collegano l’IMU LSM6DSx su I2C ora si inizializzano e leggono correttamente (il percorso I2C usava in precedenza un percorso di lettura difettoso e costanti errate).

  • L’init del FLIR Boson ora riprova fino a 10 volte per i sensori più vecchi (< IDD 4.x) che impiegano ~10 s ad avviarsi, e le impostazioni di default di fabbrica vengono ripristinate al reset così che impostazioni caricate dall’esterno non possano compromettere l’output video.

  • Corretto il psee_ehc_activate_override del GenX320 che scriveva un tempo di accumulo errato (zero).

  • Sulle schede STM32 senza hardware FastMode+, la richiesta della modalità I2C fast ora è correttamente protetta invece di configurare in modo errato e silenzioso il bus.

Machine learning:

  • Corretta la raccolta dei bounding box e la gestione di np.nonzero nei post-processor YOLOv2 / YOLOv5, migliorando l’affidabilità del rilevamento.

Hardware e supporto schede

  • OpenMV AE3 — nuova scheda Alif Ensemble (Cortex-M55 + NPU Ethos-U55).

  • VL53L8CX — sensore time-of-flight multi-zona 8x8; il sensore ToF dell’AE3 è stato cambiato dal VL53L5CX al VL53L8CX.

  • STM32N6 — fondamenta per il deployment di modelli ST Edge AI (Neural-ART).

Modifiche incompatibili all’API

Modifiche incompatibili all’API visibili all’utente tra la v4.6.20 e la v4.7.0. Ambito: moduli C Python in modules/ e librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata in base al suo impatto:

  • major — la maggior parte degli script che la usavano necessita di modifiche.

  • minor — API ristretta; interessa solo gli script che la usavano.

  • behavior — stessa API, risultati diversi; ricontrolla gli script ottimizzati.

Le modifiche sono raggruppate per impatto in quell’ordine. Se vuoi semplicemente portare il tuo codice, vai direttamente alla checklist di migrazione in fondo per un elenco condensato di cose da fare. Ogni hash di commit rimanda al relativo diff su GitHub.

I modelli integrati si caricano per percorso, non per nome (major)

ml.Model non carica più un modello integrato da una semplice stringa con il nome. I modelli ora vengono caricati dal filesystem / ROMFS tramite percorso:

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

L’attributo model.labels lato C è stato rimosso; le etichette ora vengono caricate dal wrapper Python ml.Model da un file sidecar <model>.txt (None se assente). Tutti gli esempi inclusi e ml/apps.py sono stati aggiornati ai percorsi /rom/*.tflite.

Commit: 978fa436c, 3f55d956c, 416bc4613

Le cascate Haar si caricano da ROMFS (minor)

image.HaarCascade() ora carica le cascate integrate tramite VFS / ROMFS. Il file della cascata frontale predefinita è stato rinominato da haarcascade_frontalface_default.xml a haarcascade_frontalface.xml e un fallimento del caricamento ora solleva RuntimeError («Failed to load Haar cascade») invece di OSError.

Commit: 9de1220d8

Semantica di tof.reset() / tof.deinit() (behavior)

Nel modulo tof, reset() in precedenza era un alias di init() e non esisteva un vero deinit. tof.reset() ora esegue un reset effettivo del sensore e tof.deinit() spegne correttamente il sensore (con supporto allo shutdown del VL53L5CX). Il codice che faceva affidamento sul fatto che reset() reinizializzasse il sensore dovrebbe essere ricontrollato.

Commit: 20d6b53f8, c743cab6a

Vincoli di timing e modalità eventi del GenX320 (behavior)

La nuova sequenza ISSD del GenX320 cambia la base dei tempi del sensore: gli argomenti di frame rate ed esposizione ora sono espressi in unità da 1 MHz invece di essere scalati in base al clock, e il blanking HSYNC viene regolato dinamicamente in base al frame rate richiesto. Gli script che codificavano valori di timing del GenX320 in modo fisso devono essere riottimizzati. L’acquisizione in modalità eventi ora solleva un errore quando è abilitato il transpose dell’immagine (non è supportato in quella configurazione).

Commit: 660a783d6, 7a718c6af

Checklist di migrazione

Per un porting pulito alla v4.7.0 il lavoro tipico è:

  1. Cambiare il caricamento dei modelli integrati da una stringa con il nome a un percorso /rom/<name>.tflite e fornire le etichette tramite un file sidecar <name>.txt (la modifica di ml.Model).

  2. Aggiornare haarcascade_frontalface_default.xml in haarcascade_frontalface.xml e catturare RuntimeError (non OSError) in caso di fallimento del caricamento della cascata (la modifica delle cascate Haar).

  3. Rimuovere il codice che faceva affidamento sul fatto che tof.reset() reinizializzasse il sensore (la modifica di tof).

  4. Riottimizzare eventuali valori di frame rate / esposizione del GenX320 codificati in modo fisso in unità da 1 MHz, e non abilitare il transpose in modalità eventi (la modifica del GenX320).