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 openamp de 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 /rom de solo lectura con modelos TFLite y cascadas Haar integrados, además de un nuevo generador de host tools/mkromfs.py.

  • Compatibilidad con el sensor de time-of-flight multizona VL53L8CX 8x8.

  • Nuevos post-procesadores de MLyolo_v8_postprocess y yolo_lc_postprocess.

  • MicroPython actualizado a 1.25.0.

  • Incompatible: los modelos integrados y las cascadas Haar ahora se cargan desde /rom por 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_callback y el decorador @async_remote para descargar funciones serializadas al segundo núcleo. Los núcleos HE/HP incluyen un ejecutor de tareas _boot.py predeterminado 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 /rom de solo lectura con recursos integrados (modelos TFLite, cascadas Haar, …) empaquetados por placa, una nueva herramienta de host tools/mkromfs.py (tflite, tflite+vela, cascada Haar, texto, binario) y un ayudante scripts/libraries/romfs.py que expone ls_romfs().

  • Post-procesamiento de ML — nuevas clases yolo_v8_postprocess (YOLOv8) y yolo_lc_postprocess (variante ligera de tiny-YOLOv2 con anchors predeterminados optimizados para embebidos), cada una tomando threshold, nms_threshold y nms_sigma.

  • Anti-parpadeo del GenX320 — un nuevo ioctl IOCTL_GENX320_SET_AFK para habilitar y configurar el filtro anti-parpadeo del sensor de eventos (frecuencia de parpadeo mín./máx. en Hz), con un ejemplo genx320_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_override del 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.nonzero en 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.

Commits: 978fa436c, 3f55d956c, 416bc4613

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.

Commits: 20d6b53f8, c743cab6a

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).

Commits: 660a783d6, 7a718c6af

Lista de verificación de migración

Para un porte limpio a v4.7.0, el trabajo típico es:

  1. 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).

  2. Actualiza haarcascade_frontalface_default.xml a haarcascade_frontalface.xml y captura RuntimeError (no OSError) en caso de fallo de carga de la cascada (el cambio de la cascada Haar).

  3. Elimina el código que dependía de que tof.reset() reinicializara el sensor (el cambio de tof).

  4. 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).