v4.7.0¶
v4.7.0 es una versión principal con nuevas funciones. Lo más destacado: la nueva placa OpenMV AE3 (Alif Ensemble, Cortex-M55 + NPU Ethos-U55) con un modelo de programación de doble núcleo openamp, un sistema de archivos ROMFS (/rom) de solo lectura con modelos y cascadas incluidos, compatibilidad con el time-of-flight VL53L8CX 8x8, nuevos post-procesadores YOLOv8 / YOLO-LC y MicroPython 1.25. También cambia la forma en que se cargan los modelos integrados y las cascadas Haar, así que lee los cambios incompatibles a continuación.
Aspectos destacados¶
Placa OpenMV AE3 — la placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55), con un port completo, gestor de arranque (bootloader) y ROMFS.
Módulo
openampde doble núcleo — descarga trabajo al segundo núcleo Alif a través de RPMsg (el decorador@async_remote,Endpoint/EndpointIO).ROMFS — un sistema de archivos
/romde solo lectura con modelos TFLite y cascadas Haar integrados, además de un nuevo generador de hosttools/mkromfs.py.Compatibilidad con el sensor de time-of-flight multizona VL53L8CX 8x8.
Nuevos post-procesadores de ML —
yolo_v8_postprocessyyolo_lc_postprocess.MicroPython actualizado a 1.25.0.
Incompatible: los modelos integrados y las cascadas Haar ahora se cargan desde
/rompor ruta (consulta el cambio de ml.Model y el cambio de la cascada Haar).
Nuevas funciones¶
OpenMV AE3 — nueva placa Alif Ensemble (núcleo de aplicación Cortex-M55 + NPU Ethos-U55), con port, gestor de arranque (bootloader), configuración de placa, LED RGB y compatibilidad con ROMFS.
openamp— un nuevo módulo para el modelo RPC de doble núcleo Alif (Open-AMP / RPMsg):Endpoint,EndpointIO,new_service_callbacky el decorador@async_remotepara descargar funciones serializadas al segundo núcleo. Los núcleos HE/HP incluyen un ejecutor de tareas_boot.pypredeterminado basado en asyncio.audio— el port de Alif añade el módulo de audio (micrófono PDM) con una API de transmisión basada en funciones de retorno (callbacks) (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) en la AE3.ROMFS — un sistema de archivos
/romde solo lectura con recursos integrados (modelos TFLite, cascadas Haar, …) empaquetados por placa, una nueva herramienta de hosttools/mkromfs.py(tflite, tflite+vela, cascada Haar, texto, binario) y un ayudantescripts/libraries/romfs.pyque exponels_romfs().Post-procesamiento de ML — nuevas clases
yolo_v8_postprocess(YOLOv8) yyolo_lc_postprocess(variante ligera de tiny-YOLOv2 con anchors predeterminados optimizados para embebidos), cada una tomandothreshold,nms_thresholdynms_sigma.Anti-parpadeo del GenX320 — un nuevo ioctl
IOCTL_GENX320_SET_AFKpara habilitar y configurar el filtro anti-parpadeo del sensor de eventos (frecuencia de parpadeo mín./máx. en Hz), con un ejemplogenx320_grayscale_set_afk.py.VL53L8CX — compatibilidad con el sensor de time-of-flight multizona 8x8 a través del módulo
tof(detectado automáticamente, 8x8 a 15 Hz).
Otros cambios y mejoras¶
MicroPython actualizado a 1.25.0 (ports STM32 e i.MX RT), con el port Alif de upstream añadido y los antiguos drivers BT-HCI eliminados de los ports STM32 / i.MX RT.
GenX320 — una nueva secuencia ISSD duplica el reloj de píxel interno (24 → 48 MHz) para tasas de fotogramas más altas.
STM32N6 / ST Edge AI — bases para el despliegue de modelos Neural-ART en STM32N6 (herramientas ST Edge AI y compatibilidad con ROMFS).
PAG7936 — ahora se establece la tasa de bits del CSI PHY, mejorando el funcionamiento de ese sensor.
Correcciones de errores¶
Cámara y sensores:
Se corrigió la IMU sobre I2C — las placas que conectan la IMU LSM6DSx por I2C ahora se inicializan y leen correctamente (la ruta I2C usaba antes una ruta de lectura defectuosa y constantes incorrectas).
La inicialización del FLIR Boson ahora reintenta hasta 10 veces para sensores más antiguos (< IDD 4.x) que tardan ~10 s en arrancar, y al reiniciar se restauran los ajustes de fábrica para que los ajustes cargados externamente no puedan romper la salida de vídeo.
Se corrigió que el
psee_ehc_activate_overridedel GenX320 escribía un tiempo de acumulación incorrecto (cero).En las placas STM32 sin hardware FastMode+, solicitar el modo rápido de I2C ahora se protege adecuadamente en lugar de configurar erróneamente el bus en silencio.
Aprendizaje automático:
Se corrigió la recopilación de cuadros delimitadores y el manejo de
np.nonzeroen los post-procesadores YOLOv2 / YOLOv5, mejorando la fiabilidad de la detección.
Hardware y compatibilidad de placas¶
OpenMV AE3 — nueva placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55).
VL53L8CX — sensor de time-of-flight multizona 8x8; el sensor ToF de la AE3 se cambió del VL53L5CX al VL53L8CX.
STM32N6 — bases para el despliegue de modelos ST Edge AI (Neural-ART).
Cambios incompatibles en la API¶
Rupturas de la API visibles para el usuario entre v4.6.20 y v4.7.0. Alcance: módulos C de Python en modules/ y bibliotecas de Python en scripts/libraries/.
Cada cambio está etiquetado según su impacto:
mayor — la mayoría de los scripts que lo usaban necesitan modificaciones.
menor — API limitada; solo afecta a los scripts que la usaban.
comportamiento — misma API, distintos resultados; vuelve a revisar los scripts ajustados.
Los cambios se agrupan por impacto en ese orden. Si solo quieres portar tu código, salta a la lista de verificación de migración al final para una lista de tareas condensada. Cada hash de commit enlaza a su diff en GitHub.
Los modelos integrados se cargan por ruta, no por nombre (mayor)¶
ml.Model ya no carga un modelo integrado a partir de una cadena de nombre simple. Los modelos ahora se cargan desde el sistema de archivos / ROMFS por ruta:
model = ml.Model("/rom/person_detect.tflite") # was: ml.Model("person_detect")
Se eliminó el atributo model.labels del lado de C; las etiquetas ahora las carga el wrapper de Python ml.Model desde un archivo complementario <model>.txt (None si está ausente). Todos los ejemplos incluidos y ml/apps.py se actualizaron a rutas /rom/*.tflite.
Las cascadas Haar se cargan desde ROMFS (menor)¶
image.HaarCascade() ahora carga las cascadas integradas a través del VFS / ROMFS. El archivo de cascada frontal de rostro predeterminado se renombró de haarcascade_frontalface_default.xml a haarcascade_frontalface.xml, y un fallo de carga ahora lanza RuntimeError («Failed to load Haar cascade») en lugar de OSError.
Commit: 9de1220d8
Semántica de tof.reset() / tof.deinit() (comportamiento)¶
En el módulo tof, reset() antes era un alias de init() y no había un deinit real. tof.reset() ahora realiza un reinicio real del sensor y tof.deinit() apaga correctamente el sensor (con soporte de apagado del VL53L5CX). El código que dependía de que reset() reinicializara el sensor debe revisarse de nuevo.
Restricciones de temporización y modo de eventos del GenX320 (comportamiento)¶
La nueva secuencia ISSD del GenX320 cambia la base de tiempo del sensor: los argumentos de tasa de fotogramas y exposición ahora se expresan en unidades de 1 MHz en lugar de escalarse por reloj, y el blanking de HSYNC se ajusta dinámicamente a la tasa de fotogramas solicitada. Los scripts que codificaban valores de temporización del GenX320 de forma fija deben reajustarlos. La captura en modo de eventos ahora lanza un error cuando se habilita la transposición de imagen (no está soportada en esa configuración).
Lista de verificación de migración¶
Para un porte limpio a v4.7.0, el trabajo típico es:
Cambia la carga de modelos integrados de una cadena de nombre a una ruta
/rom/<name>.tflite, y proporciona las etiquetas mediante un archivo complementario<name>.txt(el cambio de ml.Model).Actualiza
haarcascade_frontalface_default.xmlahaarcascade_frontalface.xmly capturaRuntimeError(noOSError) en caso de fallo de carga de la cascada (el cambio de la cascada Haar).Elimina el código que dependía de que
tof.reset()reinicializara el sensor (el cambio de tof).Reajusta cualquier valor de tasa de fotogramas / exposición del GenX320 codificado de forma fija a unidades de 1 MHz, y no habilites la transposición en modo de eventos (el cambio del GenX320).