v4.5.6

v4.5.6 é a grande versão de aprendizado de máquina. O módulo C tf do TensorFlow foi substituído por um novo pacote ml independente de engine, baseado no TensorFlow Lite Micro (TFLM); a conversão de imagem→tensor foi movida para image.to_ndarray() e as placas dual-core migraram para o Open-AMP. Há várias mudanças incompatíveis — leia-as abaixo antes de atualizar seus scripts de ML.

Destaques

  • Novo pacote ml — o antigo módulo tf foi reescrito em um pacote ml independente de engine (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf permanece como um alias.

  • Backend TFLM — o obsoleto libtf foi substituído pelo TensorFlow Lite Micro baseado no upstream: inferência ~20% mais rápida e bibliotecas menores.

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

  • Bluetooth embarcado — firmware Bluetooth CYW43 habilitado na Nicla Vision, Portenta H7 e GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (com suporte a ndarray 4-D).

  • Incompatível: a API de ML mudou substancialmente e as cascatas de Haar estão desabilitadas por padrão na maioria das placas — veja as mudanças incompatíveis.

Novos recursos

  • Pacote mlml.Model com predict() (roi, callback, lista de múltiplas entradas), atributos de shape/dtype/scale/zero-point por tensor, ml.preprocessing.Normalization, ml.utils (NMS) e ml.apps (um detector de palavras-chave MicroSpeech em Python puro com listen() e streaming não bloqueante via timeout=-1, além de draw_predictions()).

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

  • image.to_ndarray(dtype, buffer=...) — converte uma imagem em um ndarray do ulab (opcionalmente in-place).

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

  • draw_circle() com anti-aliasing.

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

  • Áudioaudio.init() ganhou um argumento de palavra-chave samples= (amostras PDM por canal); gain_db agora se aplica a microfones DFSDM (por exemplo, na Nicla Vision).

  • Protocolo de depuração — um novo comando GET_STATE retorna as flags de run/text/JPEG, a geometria do quadro e o texto em um único pacote, reduzindo os round-trips com o host.

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

Outras mudanças e melhorias

  • MicroPython atualizado para 1.23.0; ulab para 6.5.2 com suporte a ndarray 4-D.

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

  • get_similarity() foi reimplementado sobre o backend draw_image (suporte mais amplo a formatos/operações).

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

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

  • O WiFi (CYW43) agora é desinicializado no soft-reset; o display SPI-TV faz flush apenas da região do framebuffer a partir do cache, para atualizações mais suaves.

Correções de bugs

Câmera e sensores:

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

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

Aprendizado de máquina:

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

Imagem / sistema:

  • Adicionada a constante de dica de desenho image.BLACK_BACKGROUND, que estava faltando, e uma verificação de sanidade do comprimento do buffer de imagem/tensor.

  • Corrigidos os ponteiros raiz de GC de FIR e áudio que podiam levar o coletor a liberar buffers em uso.

  • O exemplo do Servo Shield agora usa SoftI2C, de modo que funciona nas placas OpenMV RT.

Hardware e suporte a placas

  • Arduino GIGA — suporte aos sensores HM01B0 / HM0360; Open-AMP dual-core.

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

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

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

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v4.5.5 e a v4.5.6. 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 edições.

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

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

  • tooling — afeta os mecanismos de dual-core / placa, não a API Python.

As mudanças estão agrupadas por impacto nessa ordem. Se você só quer portar seu código, vá direto para a lista de verificação de migração no final. Cada hash de commit aponta para o seu diff no GitHub.

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

O módulo C tf do TensorFlow foi reescrito em um pacote ml independente de engine (tf é mantido como um alias retrocompatível, mas o código novo deve usar ml). As funções de nível de módulo tf.load e 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) agora retorna apenas o modelo (não mais a tupla (labels, model)); os rótulos passam a ser o atributo model.labels. predict() agora retorna ndarrays do ulab (não tuplas de float), oferece suporte a modelos de múltiplas entradas (passe uma lista) e o NMS foi movido para ml.utils; a normalização da 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 efêmero image.unpack() foi removido; em vez dele, converta uma imagem em tensor com image.to_ndarray(dtype, buffer=...) e aplique a normalização de scale/mean/stdev com ml.preprocessing.Normalization, em vez do antigo caminho embutido de escalonamento de imagem.

Commits: 9848eed12, de0d46fa6

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

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

Commit: 7b79fb4c7

Cascatas de Haar desabilitadas por padrão na maioria das placas (behavior)

Para liberar espaço na flash, a detecção de faces por cascatas de Haar (find_features() / image.HaarCascade()) agora está desabilitada por padrão na 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 precisam recompilar o firmware com o recurso habilitado.

Commit: 6ce27c910

Interrupção de script e escalonamento de tensor (behavior)

O depurador USB agora interrompe um script em execução por meio do recurso de aborto da VM do MicroPython, em vez de um salto PendSV forçado (mais limpo, mas o ponto de interrupção é diferente). O escalonamento de entrada SCALE_S128_127 foi corrigido para mapear 0–255 para −128–127 sem um ganho indevido — modelos que dependiam do escalonamento antigo (incorreto) produzirão resultados diferentes.

Commits: e758a0f95, a4d97c572

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

O mecanismo obsoleto de firmware do coprocessador CM4 na GIGA / Nicla Vision / Portenta H7 foi removido e substituído pelo Open-AMP/RPMsg. O código dual-core precisa migrar para o modelo Open-AMP (um exemplo de vuart é fornecido).

Commits: 3cc57fea4, 93f2d4c41

Lista de verificação de migração

Para uma portabilidade limpa para a v4.5.6, o trabalho típico é:

  1. Porte o código de ML para ml: construa ml.Model(path), chame predict(), leia model.labels, espere saídas em ndarray e mova a normalização para ml.preprocessing.Normalization e o NMS para ml.utils (a mudança do pacote ml).

  2. Substitua image.unpack() por image.to_ndarray() (a remoção de unpack).

  3. Atualize qualquer argumento scale de array bruto de Image() para um intervalo (min, max) (a mudança de scale de Image).

  4. Se você usa cascatas de Haar em uma placa afetada, recompile com o recurso habilitado (a mudança das cascatas de Haar).

  5. Revalide os modelos que dependiam de SCALE_S128_127 (a mudança de escalonamento).

  6. Mova o código dual-core para o Open-AMP (a mudança do CM4).