v4.7.0

A v4.7.0 é uma versão com funcionalidades principais. Os destaques são: a nova placa OpenMV AE3 (Alif Ensemble, Cortex-M55 + NPU Ethos-U55) com um modelo de programação de núcleo duplo openamp, um sistema de ficheiros ROMFS de leitura apenas (/rom) com modelos e cascatas incluídos, suporte para ToF de 8x8 VL53L8CX, novos pós-processadores YOLOv8 / YOLO-LC e MicroPython 1.25. Esta versão altera também a forma como os modelos integrados e as cascatas Haar são carregados, pelo que é necessário ler as alterações incompatíveis abaixo.

Destaques

  • Placa OpenMV AE3 — a placa Alif Ensemble (Cortex-M55 + NPU Ethos-U55), com uma portabilização completa, bootloader e ROMFS.

  • Módulo openamp de núcleo duplo — descarregar trabalho para o segundo núcleo Alif via RPMsg (o decorador @async_remote, Endpoint/ EndpointIO).

  • ROMFS — um sistema de ficheiros de leitura apenas /rom com modelos TFLite e cascatas Haar integrados, mais um novo construtor de host tools/mkromfs.py.

  • Suporte para sensor de tempo-de-voo VL53L8CX de 8x8 multi-zona.

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

  • MicroPython atualizado para 1.25.0.

  • Incompatível: os modelos integrados e as cascatas Haar são agora carregados a partir de /rom por caminho (consulte a alteração do ml.Model e a alteração das cascatas Haar).

Novas funcionalidades

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

  • openamp — novo módulo para o RPC de núcleo duplo Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback, e o decorador @async_remote para descarregar funções marshalled para o segundo núcleo. Os núcleos HE/HP incluem um executor de tarefas _boot.py baseado em asyncio por predefinição.

  • audio — a portabilização Alif adiciona o módulo de áudio (microfone PDM) com uma API de transmissão por callback (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) no AE3.

  • ROMFS — um sistema de ficheiros de leitura apenas /rom com recursos 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 tiny-YOLOv2 leve com âncoras predefinidas otimizadas para sistemas embebidos), cada uma aceitando threshold, nms_threshold e nms_sigma.

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

  • VL53L8CX — suporte para o sensor de tempo-de-voo multi-zona de 8x8 através do módulo tof (deteção automática, 8x8 a 15 Hz).

Outras alterações e melhorias

  • MicroPython atualizado para 1.25.0 (portabilizações STM32 e i.MX RT), com a portabilização upstream Alif adicionada e os drivers BT-HCI legados removidos das portabilizações STM32 / i.MX RT.

  • GenX320 — uma nova sequência ISSD duplica o relógio de pixel interno (24 → 48 MHz) para taxas de fotogramas mais elevadas.

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

  • PAG7936 — o bitrate CSI PHY é agora definido, melhorando o funcionamento desse sensor.

Correções de erros

Câmara e sensores:

  • Corrigido o IMU via I2C — as placas que ligam o IMU LSM6DSx em I2C inicializam e leem agora corretamente (o caminho I2C utilizava anteriormente um caminho de leitura incorreto e constantes erradas).

  • O init do FLIR Boson agora tenta até 10 vezes para sensores mais antigos (< IDD 4.x) que demoram ~10 s a arrancar, e as definições de fábrica são restauradas no reset para que as definições carregadas externamente não possam interromper a saída de vídeo.

  • Corrigida a escrita de tempo de acumulação errado (zero) em psee_ehc_activate_override do GenX320.

  • Em placas STM32 sem hardware FastMode+, a solicitação de modo rápido I2C é agora devidamente verificada em vez de configurar o barramento de forma silenciosa e incorreta.

Aprendizagem automática:

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

Hardware e suporte de placas

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

  • VL53L8CX — sensor de tempo-de-voo multi-zona de 8x8; o sensor ToF do AE3 foi substituído do VL53L5CX para o VL53L8CX.

  • STM32N6 — fundamentos de implementação de modelos ST Edge AI (Neural-ART).

Alterações incompatíveis na API

Alterações na API visíveis pelo utilizador entre v4.6.20 e v4.7.0. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada alteração está marcada com o respetivo impacto:

  • major — a maioria dos scripts que a utilizavam necessita de edições.

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

  • behavior — mesma API, resultados diferentes; re-verificar scripts ajustados.

As alterações estão agrupadas por impacto nessa ordem. Se pretender apenas migrar o código, consulte a lista de verificação de migração no final para obter uma lista de tarefas condensada. Cada hash de commit tem uma ligação para o diff no GitHub.

Os modelos integrados são carregados por caminho, não por nome (major)

ml.Model já não carrega um modelo integrado a partir de uma cadeia de caracteres de nome simples. Os modelos são agora carregados a partir do sistema de ficheiros / ROMFS por caminho:

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

O atributo C-side model.labels foi removido; as etiquetas são agora carregadas pelo wrapper Python ml.Model a partir de um ficheiro sidecar <model>.txt (None se ausente). Todos os exemplos incluídos e ml/apps.py foram atualizados para caminhos /rom/*.tflite.

Commits: 978fa436c, 3f55d956c, 416bc4613

As cascatas Haar são carregadas a partir do ROMFS (minor)

image.HaarCascade() carrega agora as cascatas integradas através do VFS / ROMFS. O ficheiro de cascata de face frontal predefinido foi renomeado de haarcascade_frontalface_default.xml para haarcascade_frontalface.xml, e uma falha de carregamento levanta agora 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() era anteriormente um alias de init() e não havia um deinit real. tof.reset() realiza agora um reset real do sensor e tof.deinit() encerra corretamente o sensor (com suporte de encerramento do VL53L5CX). O código que dependia de reset() para reinicializar o sensor deve ser verificado de novo.

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 fotogramas e exposição são agora expressos em unidades de 1 MHz em vez de serem escalados pelo relógio, e o blanking HSYNC é ajustado dinamicamente à taxa de fotogramas solicitada. Os scripts que codificaram diretamente os valores de temporização do GenX320 devem ser reajustados. A captura em modo de eventos levanta agora um erro quando a transposição de imagem está ativada (não é suportada nessa configuração).

Commits: 660a783d6, 7a718c6af

Lista de verificação de migração

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

  1. Alterar o carregamento de modelos integrados de uma cadeia de caracteres de nome para um caminho /rom/<name>.tflite, e fornecer as etiquetas via um ficheiro sidecar <name>.txt (a alteração do ml.Model).

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

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

  4. Reajustar quaisquer valores de taxa de fotogramas / exposição do GenX320 codificados diretamente para unidades de 1 MHz, e não ativar a transposição em modo de eventos (a alteração do GenX320).