v4.5.6

v4.5.6 es la gran versión de aprendizaje automático. El módulo C tf de TensorFlow fue reemplazado por un nuevo paquete ml agnóstico al motor y respaldado por TensorFlow Lite Micro (TFLM), la conversión de imagen→tensor se trasladó a image.to_ndarray() y las placas de doble núcleo pasaron a Open-AMP. Hay varios cambios incompatibles — léelos a continuación antes de actualizar tus scripts de ML.

Aspectos destacados

  • Nuevo paquete ml — el antiguo módulo tf se reescribió como un paquete ml agnóstico al motor (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf se mantiene como alias.

  • Backend TFLM — el obsoleto libtf fue reemplazado por TensorFlow Lite Micro basado en upstream: inferencia ~20% más rápida y bibliotecas más pequeñas.

  • Open-AMP de doble núcleo — GIGA y Portenta H7 ahora usan Open-AMP/RPMsg para la comunicación entre núcleos M7/M4 (se eliminó el antiguo mecanismo CM4).

  • Bluetooth integrado — firmware Bluetooth CYW43 habilitado en Nicla Vision, Portenta H7 y GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (con soporte de ndarray de 4 dimensiones).

  • Incompatible: la API de ML cambió sustancialmente y las cascadas de Haar están deshabilitadas por defecto en la mayoría de las placas — consulta los cambios incompatibles.

Nuevas características

  • Paquete mlml.Model con predict() (roi, callback, lista de múltiples entradas), atributos de forma/dtype/escala/punto-cero por tensor, ml.preprocessing.Normalization, ml.utils (NMS) y ml.apps (un detector de palabras clave MicroSpeech en Python puro con listen() y transmisión no bloqueante timeout=-1, además de draw_predictions()).

  • Sistema de modelos integrados — los modelos listados en models/index.txt se incrustan condicionalmente según la placa (FOMO en todas las placas de ML, modelos de audio en placas con micrófonos).

  • image.to_ndarray(dtype, buffer=...) — convierte una imagen en un ndarray de ulab (opcionalmente in situ).

  • Image() a partir de arrays sin procesar — los nuevos argumentos por palabra clave shape=, strides=, scale= construyen imágenes en escala de grises/RGB565 a partir de listas de píxeles sin procesar.

  • draw_circle() con suavizado de bordes.

  • Módulo ssl congelado en el firmware de GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 y Pico.

  • Audioaudio.init() ganó un argumento samples= (muestras PDM por canal); gain_db ahora se aplica en micrófonos DFSDM (p. ej. Nicla Vision).

  • Protocolo de depuración — un nuevo comando GET_STATE devuelve las banderas de ejecución/texto/JPEG, la geometría del fotograma y el texto en un único paquete, reduciendo los viajes de ida y vuelta al host.

  • Ejemplo vuart de Open-AMP para la comunicación entre núcleos.

Otros cambios y mejoras

  • MicroPython actualizado a 1.23.0; ulab a 6.5.2 con soporte de ndarray de 4 dimensiones.

  • Inferencia más rápida — el backend de ML mantiene estado/memoria persistente entre invocaciones (~20% más rápido, admite modelos de tipo LSTM).

  • get_similarity() se reimplementó sobre el backend draw_image (mayor soporte de formatos/operaciones).

  • morph() y la familia de filtros mean() pasaron al análisis de argumentos por palabra clave; mask= ahora acepta una imagen mutable.

  • Distribución de memoria rediseñada — regiones DMA alineadas a potencias de 2, bloques de GC reordenables, múltiples montículos; menos fragmentación temprana del montículo en placas con poca RAM; RT1060 gana montículo de GC adicional.

  • El WiFi (CYW43) ahora se desinicializa en el reinicio por software; la pantalla SPI-TV vuelca de la caché solo la región del framebuffer para actualizaciones más fluidas.

Correcciones de errores

Cámara y sensores:

  • Se corrigió una invalidación accidental de la caché de la CPU en la ruta del framebuffer/sensor en STM32 e i.MX RT, que podía corromper los datos de la imagen.

  • Se corrigieron las lecturas térmicas I2C de MLX90640/MLX90641 en placas i.MX RT (las transferencias grandes ahora se fragmentan).

Aprendizaje automático:

  • Se corrigió el manejo de load_to_fb de ml.Model, el dimensionamiento del bytearray de entrada, las comprobaciones de ndim del ndarray y la validación de formato/forma de imagen de Normalization.

Imagen / sistema:

  • Se añadió la constante de pista de dibujo image.BLACK_BACKGROUND que faltaba y una comprobación de cordura de la longitud del búfer de imagen/tensor.

  • Se corrigieron los punteros raíz del GC de FIR y audio que podían permitir que el recolector liberara búferes en uso.

  • El ejemplo de Servo Shield ahora usa SoftI2C para que funcione en las placas OpenMV RT.

Hardware y soporte de placas

  • Arduino GIGA — soporte de sensores HM01B0 / HM0360; doble núcleo Open-AMP.

  • Bluetooth — firmware BT CYW43 en Nicla Vision, Portenta H7 y GIGA.

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

  • OpenMV RT1060 — bloques adicionales de montículo de GC (más memoria para Python).

Cambios incompatibles en la API

Cambios incompatibles en la API visibles para el usuario entre v4.5.5 y v4.5.6. Alcance: módulos C de Python en modules/ y bibliotecas de Python en scripts/libraries/.

Cada cambio está etiquetado con su impacto:

  • mayor — la mayoría de los scripts que lo usaban necesitan modificaciones.

  • menor — API reducida; solo afecta a los scripts que la usaban.

  • comportamiento — misma API, resultados diferentes; vuelve a comprobar los scripts ajustados.

  • herramientas — afecta a los mecanismos de doble núcleo / placa, no a la API de Python.

Los cambios se agrupan por impacto en ese orden. Si solo quieres portar tu código, salta a la lista de comprobación de migración al final. Cada hash de commit enlaza a su diff en GitHub.

Módulo tf reemplazado por el paquete ml (mayor)

El módulo C tf de TensorFlow se reescribió como un paquete ml agnóstico al motor (tf se mantiene como alias retrocompatible, pero el código nuevo debería usar ml). Se eliminaron las funciones a nivel de módulo tf.load, tf.load_builtin_model y los métodos detect()/segment()/de clasificación — construye un ml.Model y llama a predict(). ml.Model(path) ahora devuelve solo el modelo (no una tupla (labels, model)); las etiquetas son un atributo model.labels. predict() ahora devuelve ndarrays de ulab (no tuplas de float), admite modelos de múltiples entradas (pasa una lista) y NMS se trasladó a ml.utils; la normalización de entrada se trasladó a ml.preprocessing.Normalization. El antiguo ml.py es ahora ml.apps.

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

image.unpack() eliminado — usa to_ndarray() (mayor)

El efímero image.unpack() fue eliminado; convierte una imagen en un tensor con image.to_ndarray(dtype, buffer=...) en su lugar, y aplica la normalización de escala/media/desviación estándar con ml.preprocessing.Normalization en vez de la antigua ruta integrada de escalado de imagen.

Commits: 9848eed12, de0d46fa6

Argumento scale de array sin procesar de Image() (menor)

Al construir una Image a partir de un array de píxeles sin procesar, el argumento scale ahora toma un rango (min, max) en lugar de (scale, add).

Commit: 7b79fb4c7

Cascadas de Haar deshabilitadas por defecto en la mayoría de las placas (comportamiento)

Para liberar espacio en la memoria flash, la detección de rostros mediante cascadas de Haar (find_features() / image.HaarCascade()) ahora está deshabilitada por defecto en Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO y OpenMV Pure Thermal. Los scripts que usan cascadas de Haar en esas placas deben recompilar el firmware con la característica habilitada.

Commit: 6ce27c910

Interrupción de scripts y escalado de tensores (comportamiento)

El depurador USB ahora interrumpe un script en ejecución mediante la función de aborto de la VM de MicroPython en lugar de un salto PendSV forzado (más limpio, pero el punto de interrupción difiere). El escalado de entrada SCALE_S128_127 se corrigió para mapear 0–255 a −128–127 sin una ganancia errónea — los modelos que dependen del antiguo escalado (incorrecto) producirán resultados diferentes.

Commits: e758a0f95, a4d97c572

Coprocesador CM4 reemplazado por Open-AMP (herramientas)

El mecanismo obsoleto de firmware del coprocesador CM4 en GIGA / Nicla Vision / Portenta H7 fue eliminado y reemplazado por Open-AMP/RPMsg. El código de doble núcleo debe migrarse al modelo de Open-AMP (se proporciona un ejemplo vuart).

Commits: 3cc57fea4, 93f2d4c41

Lista de comprobación de migración

Para una migración limpia a v4.5.6 el trabajo habitual es:

  1. Portar el código de ML a ml: construye ml.Model(path), llama a predict(), lee model.labels, espera salidas ndarray y mueve la normalización a ml.preprocessing.Normalization y NMS a ml.utils (el cambio del paquete ml).

  2. Reemplaza image.unpack() por image.to_ndarray() (la eliminación de unpack).

  3. Actualiza cualquier argumento scale de array sin procesar de Image() a un rango (min, max) (el cambio de escala de Image).

  4. Si usas cascadas de Haar en una placa afectada, recompila con la característica habilitada (el cambio de las cascadas de Haar).

  5. Vuelve a validar los modelos que dependían de SCALE_S128_127 (el cambio de escalado).

  6. Mueve el código de doble núcleo a Open-AMP (el cambio de CM4).