v4.5.6

v4.5.6 è la grande release dedicata al machine learning. Il modulo C TensorFlow tf è stato sostituito da un nuovo pacchetto ml indipendente dal motore e basato su TensorFlow Lite Micro (TFLM), la conversione immagine→tensore è stata spostata in image.to_ndarray() e le schede dual-core sono passate a Open-AMP. Sono presenti diverse modifiche che rompono la compatibilità — leggile qui sotto prima di aggiornare gli script ML.

In evidenza

  • Nuovo pacchetto ml — il vecchio modulo tf è stato riscritto in un pacchetto ml indipendente dal motore (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf rimane come alias.

  • Backend TFLM — l’obsoleto libtf è stato sostituito da TensorFlow Lite Micro basato sull’upstream: inferenza più veloce di circa il 20% e librerie più piccole.

  • Dual-core Open-AMP — GIGA e Portenta H7 ora usano Open-AMP/RPMsg per la comunicazione inter-core M7/M4 (il vecchio meccanismo CM4 è stato rimosso).

  • Bluetooth integrato — firmware Bluetooth CYW43 abilitato su Nicla Vision, Portenta H7 e GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (con supporto per ndarray a 4 dimensioni).

  • Compatibilità: l’API ML è cambiata in modo sostanziale e le cascate Haar sono disabilitate per impostazione predefinita sulla maggior parte delle schede — vedi le modifiche che rompono la compatibilità.

Nuove funzionalità

  • Pacchetto mlml.Model con predict() (roi, callback, lista multi-input), attributi shape/dtype/scale/zero-point per tensore, ml.preprocessing.Normalization, ml.utils (NMS) e ml.apps (un keyword spotter MicroSpeech in puro Python con listen() e streaming non bloccante timeout=-1, oltre a draw_predictions()).

  • Sistema di modelli integrati — i modelli elencati in models/index.txt vengono incorporati condizionalmente per ciascuna scheda (FOMO su tutte le schede ML, modelli audio sulle schede con microfono).

  • image.to_ndarray(dtype, buffer=...) — converte un’immagine in un ndarray ulab (opzionalmente in place).

  • Image() da array grezzi — i nuovi argomenti keyword shape=, strides=, scale= costruiscono immagini in scala di grigi/RGB565 a partire da liste di pixel grezzi.

  • draw_circle() con anti-aliasing.

  • Modulo ssl congelato nel firmware su GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 e Pico.

  • Audioaudio.init() ha acquisito un keyword samples= (campioni PDM per canale); gain_db ora si applica ai microfoni DFSDM (ad es. Nicla Vision).

  • Protocollo di debug — un nuovo comando GET_STATE restituisce i flag run/text/JPEG, la geometria del frame e il testo in un singolo pacchetto, riducendo i round-trip verso l’host.

  • Esempio vuart Open-AMP per la comunicazione inter-core.

Altre modifiche e miglioramenti

  • MicroPython aggiornato a 1.23.0; ulab a 6.5.2 con supporto per ndarray a 4 dimensioni.

  • Inferenza più veloce — il backend ML mantiene stato/memoria persistenti tra le invocazioni (circa il 20% più veloce, supporta modelli in stile LSTM).

  • get_similarity() è stata reimplementata sul backend draw_image (supporto più ampio di formati/operazioni).

  • morph() e la famiglia di filtri mean() sono passate al parsing con argomenti keyword; mask= ora accetta un’immagine mutabile.

  • Layout della memoria rielaborato — regioni DMA allineate a potenze di 2, blocchi GC riordinabili, heap multipli; minore frammentazione precoce dell’heap sulle schede con poca RAM; RT1060 ottiene un heap GC aggiuntivo.

  • Il WiFi (CYW43) viene ora deinizializzato al soft-reset; il display SPI-TV svuota dalla cache solo la regione del framebuffer per aggiornamenti più fluidi.

Correzioni di bug

Camera e sensori:

  • Corretta un’accidentale invalidazione della cache della CPU nel percorso framebuffer/sensore su STM32 e i.MX RT, che poteva corrompere i dati dell’immagine.

  • Corrette le letture termiche I2C MLX90640/MLX90641 sulle schede i.MX RT (i trasferimenti grandi vengono ora suddivisi in blocchi).

Machine learning:

  • Corretta la gestione di load_to_fb in ml.Model, il dimensionamento del bytearray di input, i controlli ndim dell’ndarray e la validazione di formato/forma dell’immagine in Normalization.

Immagine / sistema:

  • Aggiunta la costante draw-hint image.BLACK_BACKGROUND mancante e un controllo di coerenza sulla lunghezza del buffer immagine/tensore.

  • Corretti i puntatori GC root di FIR e audio che potevano permettere al collector di liberare buffer in uso.

  • L’esempio Servo Shield ora usa SoftI2C in modo da funzionare sulle schede OpenMV RT.

Hardware e supporto schede

  • Arduino GIGA — supporto per i sensori HM01B0 / HM0360; dual-core Open-AMP.

  • Bluetooth — firmware BT CYW43 su Nicla Vision, Portenta H7 e GIGA.

  • Portenta H7 — RPMsg M7/M4 Open-AMP.

  • OpenMV RT1060 — blocchi heap GC aggiuntivi (più memoria Python).

Modifiche all’API che rompono la compatibilità

Modifiche all’API visibili all’utente tra la v4.5.5 e la v4.5.6. Ambito: i moduli C Python in modules/ e le librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata con il suo impatto:

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

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

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

  • tooling — riguarda i meccanismi dual-core / di scheda, non l’API Python.

Le modifiche sono raggruppate per impatto in quest’ordine. Se vuoi solo portare il tuo codice, salta alla checklist di migrazione in fondo. Ogni hash di commit rimanda al relativo diff su GitHub.

Modulo tf sostituito dal pacchetto ml (major)

Il modulo C TensorFlow tf è stato riscritto in un pacchetto ml indipendente dal motore (tf viene mantenuto come alias retrocompatibile, ma il nuovo codice dovrebbe usare ml). Le funzioni a livello di modulo tf.load, tf.load_builtin_model e i metodi detect()/segment()/di classificazione sono stati rimossi — costruisci un ml.Model e chiama predict(). ml.Model(path) ora restituisce solo il modello (nessuna tupla (labels, model)); le etichette sono un attributo model.labels. predict() ora restituisce ndarray ulab (non tuple di float), supporta modelli multi-input (passa una lista) e l’NMS è stato spostato in ml.utils; la normalizzazione dell’input è stata spostata in ml.preprocessing.Normalization. Il vecchio ml.py è ora ml.apps.

Commit: c7228cbb4, 6c212409c, 3e37f46db, 9a186f4e2, 70b89f474, 3f8491cb0, 4506682c2, 8b38f3837

image.unpack() rimossa — usa to_ndarray() (major)

L’effimera image.unpack() è stata rimossa; converti invece un’immagine in un tensore con image.to_ndarray(dtype, buffer=...) e applica la normalizzazione scale/mean/stdev con ml.preprocessing.Normalization anziché il vecchio percorso integrato di scaling dell’immagine.

Commit: 9848eed12, de0d46fa6

Argomento scale di Image() da array grezzo (minor)

Quando si costruisce un Image da un array di pixel grezzi, l’argomento scale ora accetta un intervallo (min, max) invece di (scale, add).

Commit: 7b79fb4c7

Cascate Haar disabilitate per impostazione predefinita sulla maggior parte delle schede (behavior)

Per liberare spazio in flash, il rilevamento di volti tramite cascate Haar (find_features() / image.HaarCascade()) è ora disabilitato per impostazione predefinita su Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO e OpenMV Pure Thermal. Gli script che usano cascate Haar su quelle schede devono ricompilare il firmware con la funzionalità abilitata.

Commit: 6ce27c910

Interruzione dello script e scaling dei tensori (behavior)

Il debugger USB ora interrompe uno script in esecuzione tramite la funzione di VM-abort di MicroPython anziché un salto PendSV forzato (più pulito, ma il punto di interruzione è diverso). Lo scaling di input SCALE_S128_127 è stato corretto in modo da mappare 0–255 su −128–127 senza un guadagno erroneo — i modelli che si basavano sul vecchio scaling (errato) produrranno risultati diversi.

Commit: e758a0f95, a4d97c572

Coprocessore CM4 sostituito da Open-AMP (tooling)

Il meccanismo deprecato del firmware del coprocessore CM4 su GIGA / Nicla Vision / Portenta H7 è stato rimosso e sostituito da Open-AMP/RPMsg. Il codice dual-core deve passare al modello Open-AMP (viene fornito un esempio vuart).

Commit: 3cc57fea4, 93f2d4c41

Checklist di migrazione

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

  1. Porta il codice ML a ml: costruisci ml.Model(path), chiama predict(), leggi model.labels, aspettati output ndarray e sposta la normalizzazione in ml.preprocessing.Normalization e l’NMS in ml.utils (la modifica del pacchetto ml).

  2. Sostituisci image.unpack() con image.to_ndarray() (la rimozione di unpack).

  3. Aggiorna ogni argomento scale di Image() da array grezzo a un intervallo (min, max) (la modifica dello scale di Image).

  4. Se usi cascate Haar su una scheda interessata, ricompila con la funzionalità abilitata (la modifica delle cascate Haar).

  5. Rivalida i modelli che dipendevano da SCALE_S128_127 (la modifica dello scaling).

  6. Sposta il codice dual-core su Open-AMP (la modifica CM4).