v4.8.0

v4.8.0 è una release importante ricca di nuove funzionalità. In primo piano: un nuovissimo modulo camera csi basato su classi con supporto multi-camera, la scheda OpenMV N6 (STM32N6) con NPU Neural-ART, un backend di inferenza NPU, la modalità evento RAW della event-camera GenX320, un nuovo modulo crc, una libreria di post-elaborazione ML riorganizzata e MicroPython 1.26. Rimuove inoltre alcune API legacy — il modulo buzzer e il controllo del FLIR Lepton del modulo fir — quindi leggi le modifiche con rottura di compatibilità qui sotto.

In evidenza

  • Nuovo modulo camera csi. Un’API csi.CSI basata su classi con supporto per più camere simultanee, introdotta accanto al modulo legacy sensor.

  • OpenMV N6. La scheda STM32N6, con NPU Neural-ART, triple buffering, Soft-CSI e un modulo ToF.

  • Inferenza NPU. Un backend ST Neural-ART (STAI) per l’inferenza dei modelli accelerata via hardware.

  • Modalità evento GenX320. Output di eventi RAW più draw_event_histogram() per il rendering della event-camera.

  • Post-elaborazione ML riorganizzata — sottopacchetti per fornitore (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) con nuovi rilevatori BlazeFace / BlazePalm e di landmark di mani e volti.

  • Nuovo modulo crc — CRC-16 / CRC-32 accelerati via hardware.

  • MicroPython aggiornato alla 1.26.0.

  • Rottura di compatibilità: il modulo buzzer e il controllo del Lepton del modulo fir sono stati rimossi (il Lepton è ora una camera normale). Vedi la modifica fir/Lepton e la rimozione del buzzer.

Nuove funzionalità

  • Il nuovo modulo camera csi — un oggetto csi.CSI basato su classi con più camere simultanee (fino a tre sull’N6), snapshot non bloccante, dimensioni del frame (w, h) personalizzate e un print() / repr informativo. È introdotto accanto al modulo legacy sensor (non è un sostituto immediato).

  • crccrc.crc16() e crc.crc32(), accelerati via hardware con un fallback software, su OpenMV N6 e AE3.

  • image.Image.draw_image() ha acquisito una parola chiave transform= (una matrice ndarray float bidimensionale per deformazioni affini/prospettiche, accelerata via GPU su STM32 e Alif); la stessa trasformazione è disponibile nella conversione delle immagini.

  • draw_event_histogram() — esegue il rendering degli istogrammi della event-camera.

  • Modalità evento RAW GenX320csi.IOCTL_GENX320_SET_MODE con csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, costanti per il tipo di evento e nuovi script di esempio.

  • ML — un backend di inferenza NPU ST Neural-ART (STAI); ml.Model ha acquisito una parola chiave postprocess= (il post-processore ora viene eseguito automaticamente all’interno di predict() anche senza una callback); ml.postprocessing è stato riorganizzato in sottopacchetti per fornitore — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo) e ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — i vecchi nomi in snake_case rimangono come alias; sono stati aggiunti ml.utils.draw_keypoints() e ml.utils.draw_skeleton(); i modelli ROMFS inclusi sono aumentati (BlazeFace, YOLO-LC, YOLOv8n, landmark di palmo/mano/volto).

  • audio — ingresso microfono digitale MDF su STM32N6.

  • Display — un driver e un esempio per OLED SSD1351; i controller SPIDisplay possono sovrascrivere i propri comandi di inizializzazione; il costruttore del display SPI ha acquisito le parole chiave hmirror / vflip.

  • Profiler su dispositivo — contatori di cicli/eventi SysTick + PMU Armv8.1-M con strumentazione a livello di funzione, leggibili tramite il debug link (pyopenmv ha acquisito il supporto al profiling e ai simboli ELF).

  • Supporto a nuovi sensori — PixArt PS5520; FLIR BOSON su OpenMV H7 Plus; rilevamento automatico del GenX320.

Altre modifiche e miglioramenti

  • MicroPython aggiornato alla 1.26.0.

  • Avvio della camera — il clock del sensore è stato disaccoppiato dallo stato CSI, il rilevamento della camera all’avvio è più veloce (viene provata per prima la configurazione più comune) ed è stato corretto il clock predefinito dell’OV7725 di OpenMV 3.

  • Qualità dell’immagine — la correzione gamma dell’ISP software (Alif e STM32) e la correzione dei pixel difettosi (STM32) sono attive per impostazione predefinita; i sensori PAG7936 e PS5520 hanno acquisito controlli di bilanciamento automatico del bianco.

  • Prestazioniimage.Image.to_ndarray() è accelerato con Helium SIMD e il post-processore FOMO è stato vettorizzato con ulab.

  • Driver del FLIR Lepton riscritto per ricevere i frame in modo asincrono in background — la rotazione/transpose ora funziona, il disegno esegue l’upscaling in modo bilineare e il reset è più veloce.

  • Throughput di acquisizione — il CSI dell’i.MX RT1062 ora usa l’offload DMA completo e lo STM32 N6 dispone di un draw_image() con GPU hardware.

Correzioni di bug

Camera e sensori:

  • Corrette le modalità RGB565 / GRAYSCALE / BAYER / YUV422 sui sensori STM32, il PAJ6100 su OpenMV H7 / H7 Plus, l’RGB565 QVGA di OpenMV 2 e la configurazione mono / RGB-YUV del CSI dell’N6; la camera di test software ora si resetta in modo deterministico.

  • Il bilanciamento automatico del bianco non rende più l’immagine verde a frame rate bassi o variabili (una media mobile di 250 ms sostituisce il campionamento ogni 100 frame) ed è stato corretto lo sfarfallio della luminanza del PS5520.

Elaborazione delle immagini:

  • Corretto un difetto di rendering nel disegno delle linee; image.Image.flush() ora svuota il buffer JPEG dell’immagine su cui è stato chiamato; Normalization ora applica media/deviazione standard agli input float; corretta l’allocazione dell’immagine da file.

Acquisizione della camera:

  • Corretta una grave corruzione dell’immagine nei trasferimenti non JPEG (l’interrupt di frame ora è abilitato solo in modalità JPEG), il supporto alla modalità JPEG 3 e i blocchi su STM32 dovuti alla dimensione delle linee DMA e ai buffer piccoli; la sincronizzazione VOSPI / Lepton è più affidabile, in particolare sull’N6.

Varie:

  • omv.board_id() restituisce l’UID corretto su RT1060; YoloV2 non va più in crash quando viene costruito senza anchor esplicite.

Hardware e supporto schede

  • OpenMV N6 — STM32N6 con NPU Neural-ART, triple buffering, uscita LCD/TV SPI, Soft-CSI, il modulo tof e modelli ROMFS inclusi.

  • Arduino GIGA — uscita display MIPI DSI.

  • Nuovi sensori — PixArt PS5520; FLIR BOSON su OpenMV H7 Plus; rilevamento automatico del GenX320.

  • OpenMV Pure Thermal — il FLIR Lepton è ora un sensore camera normale (secondario).

  • Alif AE3 — correzione gamma dell’ISP software, il modulo crc e correzioni SPI.

Modifiche API con rottura di compatibilità

Rotture di compatibilità delle API visibili all’utente tra la v4.7.0 e la v4.8.0. Ambito: moduli C Python in modules/ e librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata dal 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.

  • tooling — interessa solo gli strumenti host / la compilazione dai sorgenti.

Le modifiche sono raggruppate per impatto in quest’ordine — prima major, poi minor, behavior e tooling. Se vuoi solo portare il tuo codice, vai alla checklist di migrazione in fondo per un elenco di cose da fare condensato. Ogni hash di commit rimanda al suo diff su GitHub.

Il FLIR Lepton è stato spostato fuori dal modulo fir (major)

Il FLIR Lepton ora è gestito come un normale sensore camera invece che tramite il modulo fir. Il controllo del Lepton è stato rimosso da fir: il tipo FIR_LEPTON e i metodi radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() e trigger_ffc() non esistono più. Acquisisci il Lepton come qualsiasi altra camera (appare come sensore secondario su OpenMV Pure Thermal); l’esempio Pure Thermal è stato riscritto con la nuova API. I sensori fir non Lepton (Grid-EYE, MLX, AMG8833) restano invariati.

Commit: bacfb7aeb, 117710566, 592a22902, 1a614202e

Modulo buzzer rimosso (minor)

Il modulo buzzer è stato rimosso dai port STM32 e i.MX RT. Pilota il buzzer con machine.PWM; è stato aggiunto un esempio di buzzer Pure Thermal che usa il PWM.

Commit: ccb947924, 444120f2d

omv.disable_fb() rimosso (minor)

La funzione omv.disable_fb() è stata rimossa; lo streaming del frame buffer ora è controllato tramite l’API della camera. Sono stati rimossi anche i vecchi script RPC desktop che vi facevano affidamento.

Commit: 84c3db58a, 6fe99051c

csi è nuovo — la sua API non è ancora congelata (minor)

Il modulo csi è introdotto nella v4.8.0 e la sua API si è evoluta durante la release: csi.fb() è stato rimosso e csi.CSI.snapshot() (image=...) ora richiede un’immagine mutabile e disegna/scala il frame acquisito al suo interno invece di eseguire una copia profonda grezza. Chi adotta in anticipo il nuovo modulo dovrebbe rifare i test; l’API legacy sensor non è interessata.

Commit: 0bc0385eb, 8cd7a309f

Modalità stream di image.ImageIO e close() (minor)

image.ImageIO — l’argomento mode ora accetta solo le minuscole 'r' / 'w' (le maiuscole vengono rifiutate con un messaggio di errore aggiornato) e l’apertura con 'w' tronca/ricrea sempre il file invece di preservare uno stream esistente. ImageIO.close() ora è idempotente (chiudere uno stream già chiuso non solleva più un’eccezione) e restituisce None invece dell’oggetto stream.

Commit: 715c4cbba, 21ceec422

Valore di ritorno di BlazeFace / BlazePalm (minor)

I post-processori BlazeFace e BlazePalm (nuovi in questa release) ora restituiscono una singola lista di bounding box invece dell’intera lista per classe — chi li chiama indicizza il risultato direttamente anziché con [0].

Commit: 75e16b573

La callback del post-processore ML riceve i tensori grezzi (behavior)

Una callback di post-elaborazione di predict() di ml.Model ora riceve i riferimenti al tensore di output grezzo (quantizzato) invece di ndarray float pre-convertiti — questo evita l’esaurimento della memoria sui modelli grandi. Se non viene fornita alcuna callback, l”ndarray float viene comunque restituito. Le callback personalizzate devono dequantizzare i tensori da sole (i post-processori integrati lo fanno già).

Commit: 84e6ee650

Clock della camera disaccoppiato dallo stato CSI (behavior)

Il clock del sensore ora è indipendente dallo stato CSI. set_clock / set_frequency riconfigura il clock solo quando la frequenza richiesta differisce di più di una tolleranza, e get_clk_frequency accetta un booleano per restituire la frequenza esatta (anziché nominale). Il clock predefinito è 24 MHz su OpenMV N6 e AE3, quindi all’avvio non è necessario alcun set_clock() esplicito. Gli script che commutavano il clock per acquisizioni sensibili al tempo dovrebbero ricontrollare le proprie assunzioni.

Commit: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

Protocollo di debug USB e target del firmware (tooling)

Nulla di tutto questo interessa gli script MicroPython. I comandi USBDBG obsoleti (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) sono stati rimossi e i comandi non supportati provenienti da IDE più vecchi ora vengono scartati invece di mandare in crash le schede TinyUSB alla connessione; il vecchio target del firmware UVC STM32 è stato rimosso. I vecchi strumenti host dovrebbero aggiornarsi; vedi la cronologia del repository del firmware per i dettagli.

Commit: 90bd11e93, 657c9a632, 35182f035

Checklist di migrazione

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

  1. Se usavi il FLIR Lepton tramite fir, passa ad acquisirlo come sensore camera (la modifica fir/Lepton).

  2. Sostituisci qualsiasi uso del buzzer con machine.PWM (la rimozione del buzzer).

  3. Rimuovi le chiamate a omv.disable_fb() (la rimozione di omv.disable_fb()).

  4. Per image.ImageIO: usa le minuscole 'r'/'w' e aspettati che 'w' tronchi (la modifica di ImageIO).

  5. Per le callback di post-elaborazione ML personalizzate: dequantizza tu stesso i riferimenti al tensore grezzo, oppure affidati al percorso float predefinito (la modifica della callback).

  6. Ricontrolla qualsiasi script che pilotava il clock del sensore per acquisizioni sensibili al tempo (la modifica del clock).