v4.5.6

v4.5.6 é a grande versão de aprendizagem automática. O módulo C TensorFlow tf foi substituído por um novo pacote ml independente de motor, suportado pelo TensorFlow Lite Micro (TFLM), a conversão imagem→tensor foi movida para image.to_ndarray(), e as placas com dois núcleos passaram a usar Open-AMP. Existem várias alterações incompatíveis — leia-as abaixo antes de atualizar os scripts de ML.

Destaques

  • Novo pacote ml — o antigo módulo tf foi reescrito num pacote ml independente de motor (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf mantém-se como alias.

  • Backend TFLM — a obsoleta libtf foi substituída pelo TensorFlow Lite Micro baseado no upstream: inferência ~20% mais rápida e bibliotecas mais pequenas.

  • Dois núcleos com Open-AMP — GIGA e Portenta H7 utilizam agora Open-AMP/RPMsg para comunicação entre os núcleos M7/M4 (o mecanismo antigo CM4 foi removido).

  • Bluetooth integrado — firmware Bluetooth CYW43 ativado no Nicla Vision, Portenta H7 e GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (com suporte a ndarray de 4 dimensões).

  • Incompatível: a API de ML mudou substancialmente e as cascatas de Haar estão desativadas por omissão na maioria das placas — consulte as alterações incompatíveis.

Novas funcionalidades

  • Pacote mlml.Model com predict() (roi, callback, lista multi-entrada), atributos de forma/dtype/escala/zero-point por tensor, ml.preprocessing.Normalization, ml.utils (NMS) e ml.apps (um detetor de palavras-chave puramente Python MicroSpeech com listen() e streaming não bloqueante timeout=-1, mais draw_predictions()).

  • Sistema de modelos integrados — os modelos listados em models/index.txt são incorporados condicionalmente por placa (FOMO em todas as placas de ML, modelos de áudio em placas com microfones).

  • image.to_ndarray(dtype, buffer=...) — converte uma imagem num ndarray do ulab (opcionalmente no lugar).

  • Image() a partir de arrays brutos — novos argumentos de palavra-chave shape=, strides=, scale= constroem imagens em escala de cinzentos/RGB565 a partir de listas de pixels brutos.

  • draw_circle() com anti-aliasing.

  • Módulo ssl incorporado no firmware para GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 e Pico.

  • Áudioaudio.init() ganhou o argumento de palavra-chave samples= (amostras PDM por canal); gain_db aplica-se agora nos microfones DFSDM (p. ex. Nicla Vision).

  • Protocolo de depuração — um novo comando GET_STATE devolve flags de execução/texto/JPEG, geometria do fotograma e texto num único pacote, reduzindo as trocas com o host.

  • Exemplo de vuart Open-AMP para comunicação entre núcleos.

Outras alterações e melhorias

  • MicroPython atualizado para 1.23.0; ulab para 6.5.2 com suporte a ndarray de 4 dimensões.

  • Inferência mais rápida — o backend de ML mantém estado/memória persistentes entre invocações (~20% mais rápido, suporta modelos do tipo LSTM).

  • get_similarity() foi reimplementado no backend draw_image (suporte mais amplo de formatos/operações).

  • morph() e a família de filtros mean() passaram a usar análise de argumentos de palavra-chave; mask= aceita agora uma imagem mutável.

  • Disposição de memória reformulada — regiões DMA alinhadas a potência de 2, blocos GC reordenáveis, múltiplos heaps; menos fragmentação precoce do heap em placas com pouca RAM; RT1060 ganha heap GC extra.

  • O WiFi (CYW43) é agora desinicializado no soft-reset; o ecrã SPI-TV descarrega apenas a região do buffer de fotograma a partir da cache para atualizações mais suaves.

Correções de erros

Câmara e sensores:

  • Corrigida a invalidação acidental da cache da CPU no caminho framebuffer/sensor em STM32 e i.MX RT, que podia corromper dados de imagem.

  • Corrigidas as leituras I2C térmicas de MLX90640/MLX90641 em placas i.MX RT (transferências grandes são agora divididas em blocos).

Aprendizagem automática:

  • Corrigidos o tratamento de load_to_fb no ml.Model, o dimensionamento de bytearray de entrada, as verificações de ndim em ndarray e a validação de formato/forma de imagem em Normalization.

Imagem / sistema:

  • Adicionada a constante de sugestão de desenho image.BLACK_BACKGROUND em falta e uma verificação de sanidade do comprimento do buffer de imagem/tensor.

  • Corrigidos os ponteiros de raiz GC de FIR e áudio que podiam permitir ao coletor libertar buffers em uso.

  • O exemplo Servo Shield utiliza agora SoftI2C para funcionar nas placas OpenMV RT.

Hardware e suporte a placas

  • Arduino GIGA — suporte aos sensores HM01B0 / HM0360; dois núcleos com Open-AMP.

  • Bluetooth — firmware BT CYW43 no Nicla Vision, Portenta H7 e GIGA.

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

  • OpenMV RT1060 — blocos de heap GC adicionais (mais memória Python).

Alterações incompatíveis da API

Alterações da API visíveis para o utilizador entre v4.5.5 e v4.5.6. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada alteração está etiquetada com o seu impacto:

  • major — a maioria dos scripts que a usavam necessita de modificações.

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

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

  • tooling — afeta mecanismos de dois núcleos / placa, não a API Python.

As alterações estão agrupadas por impacto nessa ordem. Se quiser apenas portar o seu código, salte para a lista de verificação de migração no final. Cada hash de commit liga ao seu diff no GitHub.

Módulo tf substituído pelo pacote ml (major)

O módulo C TensorFlow tf foi reescrito num pacote ml independente de motor (tf é mantido como alias retrocompatível, mas o novo código deve usar ml). As funções ao nível do módulo tf.load, tf.load_builtin_model e os métodos detect()/segment()/de classificação foram removidos — construa um ml.Model e chame predict(). ml.Model(path) devolve agora apenas o modelo (sem o tuplo (labels, model)); as etiquetas são um atributo model.labels. predict() devolve agora ndarrays do ulab (não tuplos de float), suporta modelos multi-entrada (passe uma lista), e o NMS foi movido para ml.utils; a normalização de entrada foi movida para ml.preprocessing.Normalization. O antigo ml.py é agora ml.apps.

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

image.unpack() removido — use to_ndarray() (major)

O image.unpack() de curta duração foi removido; converta uma imagem num tensor com image.to_ndarray(dtype, buffer=...) e aplique normalização de escala/média/desvio padrão com ml.preprocessing.Normalization em vez do antigo caminho de escalamento de imagem integrado.

Commits: 9848eed12, de0d46fa6

Argumento scale de array bruto em Image() (minor)

Ao construir uma Image a partir de um array de pixels brutos, o argumento scale aceita agora um intervalo (min, max) em vez de (scale, add).

Commit: 7b79fb4c7

Cascatas de Haar desativadas por omissão na maioria das placas (behavior)

Para libertar espaço em flash, a deteção facial por cascata de Haar (find_features() / image.HaarCascade()) está agora desativada por omissão no Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO e OpenMV Pure Thermal. Os scripts que usam cascatas de Haar nessas placas têm de recompilar o firmware com a funcionalidade ativada.

Commit: 6ce27c910

Interrupção de script e escalamento de tensores (behavior)

O depurador USB interrompe agora um script em execução através da funcionalidade de aborto da VM do MicroPython em vez de um salto PendSV forçado (mais limpo, mas o ponto de interrupção difere). O escalamento de entrada SCALE_S128_127 foi corrigido para mapear 0–255 em −128–127 sem um ganho errático — os modelos que dependiam do escalamento antigo (incorreto) produzirão resultados diferentes.

Commits: e758a0f95, a4d97c572

Coprocessador CM4 substituído por Open-AMP (tooling)

O mecanismo de firmware do coprocessador CM4 descontinuado no GIGA / Nicla Vision / Portenta H7 foi removido e substituído por Open-AMP/RPMsg. O código de dois núcleos deve ser migrado para o modelo Open-AMP (é fornecido um exemplo de vuart).

Commits: 3cc57fea4, 93f2d4c41

Lista de verificação de migração

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

  1. Portar o código ML para ml: construir ml.Model(path), chamar predict(), ler model.labels, esperar saídas ndarray e mover a normalização para ml.preprocessing.Normalization e o NMS para ml.utils (a alteração do pacote ml).

  2. Substituir image.unpack() por image.to_ndarray() (a remoção do unpack).

  3. Atualizar qualquer argumento scale de array bruto em Image() para um intervalo (min, max) (a alteração de escala de Image).

  4. Se usar cascatas de Haar numa placa afetada, recompile com a funcionalidade ativada (a alteração das cascatas de Haar).

  5. Revalide os modelos que dependiam de SCALE_S128_127 (a alteração de escalamento).

  6. Migre o código de dois núcleos para Open-AMP (a alteração do CM4).