v4.7.0#

v4.7.0 é um grande lançamento de recursos. Em destaque: a nova placa OpenMV AE3 (Alif Ensemble, Cortex-M55 + NPU Ethos-U55) com um modelo de programação dual-core openamp, um sistema de arquivos somente leitura ROMFS (/rom) com modelos e cascatas incluídos, suporte ao time-of-flight 8x8 VL53L8CX, novos pós-processadores YOLOv8 / YOLO-LC e MicroPython 1.25. Ele também altera como modelos integrados e cascatas Haar são carregados, então leia as mudanças incompatíveis abaixo.

Destaques#

  • Placa OpenMV AE3 — a placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55), com port completo, bootloader e ROMFS.

  • Módulo openamp dual-core — descarregue trabalho para o segundo núcleo Alif via RPMsg (o decorador @async_remote, Endpoint/ EndpointIO).

  • ROMFS — um sistema de arquivos somente leitura /rom com modelos TFLite e cascatas Haar integrados, além de um novo construtor de host tools/mkromfs.py.

  • Suporte ao sensor time-of-flight multizona 8x8 VL53L8CX.

  • Novos pós-processadores de MLyolo_v8_postprocess e yolo_lc_postprocess.

  • MicroPython atualizado para 1.25.0.

  • Incompatível: modelos integrados e cascatas Haar agora carregam de /rom por caminho (veja a mudança em ml.Model e a mudança nas cascatas Haar).

Novos recursos#

  • OpenMV AE3 — nova placa Alif Ensemble (núcleo de aplicação Cortex-M55 + NPU Ethos-U55), com port, bootloader, configuração de placa, LED RGB e suporte a ROMFS.

  • openamp — um novo módulo para o modelo RPC dual-core do Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback e o decorador @async_remote para descarregar funções empacotadas para o segundo núcleo. Os núcleos HE/HP vêm com um executor de tarefas _boot.py padrão baseado em asyncio.

  • audio — o port Alif adiciona o módulo de áudio (microfone PDM) com uma API de streaming baseada em callback (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) no AE3.

  • ROMFS — um sistema de arquivos somente leitura /rom com ativos integrados (modelos TFLite, cascatas Haar, …) empacotados por placa, uma nova ferramenta de host tools/mkromfs.py (tflite, tflite+vela, cascata Haar, texto, binário) e um auxiliar scripts/libraries/romfs.py que expõe ls_romfs().

  • Pós-processamento de ML — novas classes yolo_v8_postprocess (YOLOv8) e yolo_lc_postprocess (variante leve do tiny-YOLOv2 com anchors padrão otimizados para sistemas embarcados), cada uma recebendo threshold, nms_threshold e nms_sigma.

  • Anti-flicker do GenX320 — um novo ioctl IOCTL_GENX320_SET_AFK para habilitar e configurar o filtro anti-flicker do sensor de eventos (frequência mínima/máxima de flicker em Hz), com um exemplo genx320_grayscale_set_afk.py.

  • VL53L8CX — suporte ao sensor time-of-flight multizona 8x8 através do módulo tof (autodetectado, 8x8 a 15 Hz).

Outras mudanças e melhorias#

  • MicroPython atualizado para 1.25.0 (ports STM32 e i.MX RT), com a adição do port Alif upstream e a remoção dos drivers BT-HCI legados dos ports STM32 / i.MX RT.

  • GenX320 — uma nova sequência ISSD dobra o clock interno de pixel (24 → 48 MHz) para taxas de quadros mais altas.

  • STM32N6 / ST Edge AI — base para a implantação de modelos Neural-ART no STM32N6 (ferramentas ST Edge AI e suporte a ROMFS).

  • PAG7936 — o bitrate da CSI PHY agora é definido, melhorando a operação desse sensor.

Correções de bugs#

Câmera e sensores:

  • Corrigida a IMU sobre I2C — placas que conectam a IMU LSM6DSx no I2C agora inicializam e leem corretamente (o caminho I2C usava anteriormente um caminho de leitura quebrado e constantes erradas).

  • A inicialização da FLIR Boson agora tenta novamente até 10 vezes para sensores mais antigos (< IDD 4.x) que levam ~10 s para inicializar, e as configurações padrão de fábrica são restauradas no reset para que configurações carregadas externamente não possam quebrar a saída de vídeo.

  • Corrigido o psee_ehc_activate_override do GenX320 que escrevia o tempo de acumulação errado (zero).

  • Em placas STM32 sem hardware FastMode+, solicitar o modo rápido I2C agora é devidamente protegido em vez de configurar o barramento de forma silenciosamente incorreta.

Aprendizado de máquina:

  • Corrigida a coleta de caixas delimitadoras e o tratamento de np.nonzero nos pós-processadores YOLOv2 / YOLOv5, melhorando a confiabilidade da detecção.

Suporte a hardware e placas#

  • OpenMV AE3 — nova placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55).

  • VL53L8CX — sensor time-of-flight multizona 8x8; o sensor ToF do AE3 foi trocado do VL53L5CX para o VL53L8CX.

  • STM32N6 — base para a implantação de modelos ST Edge AI (Neural-ART).

Mudanças incompatíveis na API#

Incompatibilidades de API visíveis ao usuário entre v4.6.20 e v4.7.0. Escopo: módulos C de Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada mudança é marcada com seu impacto:

  • major — a maioria dos scripts que a usavam precisa de ajustes.

  • minor — API restrita; afeta apenas scripts que a usavam.

  • behavior — mesma API, resultados diferentes; reverifique scripts ajustados.

As mudanças são agrupadas por impacto nessa ordem. Se você quer apenas portar seu código, vá direto para a checklist de migração no final para uma lista de tarefas condensada. Cada hash de commit liga ao seu diff no GitHub.

Modelos integrados carregam por caminho, não por nome (major)#

ml.Model não carrega mais um modelo integrado a partir de uma string de nome simples. Os modelos agora são carregados do sistema de arquivos / ROMFS por caminho:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

O atributo model.labels do lado C foi removido; os rótulos agora são carregados pelo wrapper Python ml.Model a partir de um arquivo complementar <model>.txt (None se ausente). Todos os exemplos incluídos e ml/apps.py foram atualizados para caminhos /rom/*.tflite.

Commits: 978fa436c, 3f55d956c, 416bc4613

Cascatas Haar carregam do ROMFS (minor)#

image.HaarCascade() agora carrega cascatas integradas através do VFS / ROMFS. O arquivo padrão de cascata de face frontal foi renomeado de haarcascade_frontalface_default.xml para haarcascade_frontalface.xml, e uma falha de carregamento agora gera RuntimeError (“Failed to load Haar cascade”) em vez de OSError.

Commit: 9de1220d8

Semântica de tof.reset() / tof.deinit() (behavior)#

No módulo tof, reset() antes era um alias de init() e não havia um deinit real. tof.reset() agora realiza um reset real do sensor e tof.deinit() desliga o sensor adequadamente (com suporte ao desligamento do VL53L5CX). Código que dependia de reset() para reinicializar o sensor deve ser reverificado.

Commits: 20d6b53f8, c743cab6a

Restrições de temporização e modo de eventos do GenX320 (behavior)#

A nova sequência ISSD do GenX320 altera a base de tempo do sensor: os argumentos de taxa de quadros e exposição agora são expressos em unidades de 1 MHz em vez de serem escalonados pelo clock, e o blanking de HSYNC é ajustado dinamicamente à taxa de quadros solicitada. Scripts que fixavam valores de temporização do GenX320 devem reajustá-los. A captura em modo de eventos agora gera um erro quando o transpose de imagem está habilitado (não há suporte nessa configuração).

Commits: 660a783d6, 7a718c6af

Checklist de migração#

Para uma migração limpa para v4.7.0, o trabalho típico é:

  1. Mudar o carregamento de modelos integrados de uma string de nome para um caminho /rom/<name>.tflite e fornecer rótulos via um arquivo complementar <name>.txt (a mudança em ml.Model).

  2. Atualizar haarcascade_frontalface_default.xml para haarcascade_frontalface.xml e capturar RuntimeError (não OSError) em falha de carregamento de cascata (a mudança nas cascatas Haar).

  3. Remover código que dependia de tof.reset() para reinicializar o sensor (a mudança de tof).

  4. Reajustar quaisquer valores fixos de taxa de quadros / exposição do GenX320 para unidades de 1 MHz e não habilitar transpose em modo de eventos (a mudança do GenX320).