v4.8.0

A v4.8.0 é uma versão com novas funcionalidades de grande destaque: um novo módulo csi de câmara baseado em classes com suporte para múltiplas câmaras, a placa OpenMV N6 (STM32N6) com uma NPU Neural-ART, um backend de inferência NPU, modo de eventos RAW GenX320 para câmara de eventos, um novo módulo crc, uma biblioteca de pós-processamento ML reorganizada e MicroPython 1.26. Remove também algumas APIs legadas — o módulo buzzer e o controlo FLIR Lepton do módulo fir — por isso leia as alterações com impacto abaixo.

Destaques

  • Novo módulo csi de câmara. Uma API csi.CSI baseada em classes com suporte para múltiplas câmaras simultâneas, introduzida a par do módulo legado sensor.

  • OpenMV N6. A placa STM32N6, com uma NPU Neural-ART, triplo buffering, Soft-CSI e um módulo ToF.

  • Inferência NPU. Um backend ST Neural-ART (STAI) para inferência de modelos com aceleração por hardware.

  • Modo de eventos GenX320. Saída de eventos RAW e draw_event_histogram() para renderização de câmara de eventos.

  • Pós-processamento ML reorganizado — subpacotes por fabricante (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) com novos detetores BlazeFace / BlazePalm / marcos de mão e face.

  • Novo módulo crc — CRC-16 / CRC-32 com aceleração por hardware.

  • MicroPython atualizado para 1.26.0.

  • Alteração com impacto: o módulo buzzer e o controlo Lepton do módulo fir foram removidos (o Lepton é agora uma câmara regular). Consulte a alteração fir/Lepton e a remoção do buzzer.

Novas funcionalidades

  • O novo módulo csi de câmara — um objeto csi.CSI baseado em classes com múltiplas câmaras simultâneas (até três no N6), captura de imagem não bloqueante, tamanhos de fotograma personalizados (w, h) e um print() / repr informativo. É introduzido a par do módulo legado sensor (não é um substituto direto).

  • crccrc.crc16() e crc.crc32(), com aceleração por hardware e fallback em software, no OpenMV N6 e AE3.

  • image.Image.draw_image() ganhou a palavra-chave transform= (uma matriz ndarray de floats 2-D para deformações afins/de perspetiva, com aceleração por GPU em STM32 e Alif); a mesma transformação está disponível na conversão de imagens.

  • draw_event_histogram() — renderiza histogramas de câmara de eventos.

  • Modo de eventos RAW GenX320csi.IOCTL_GENX320_SET_MODE com csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, constantes de tipo de evento e novos scripts de exemplo.

  • ML — um backend de inferência NPU ST Neural-ART (STAI); ml.Model ganhou a palavra-chave postprocess= (o pós-processador executa agora automaticamente dentro de predict() mesmo sem callback); ml.postprocessing foi reorganizado em subpacotes por fabricante — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo) e ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — os nomes antigos em snake_case mantêm-se como aliases; foram adicionados ml.utils.draw_keypoints() e ml.utils.draw_skeleton(); os modelos ROMFS integrados cresceram (BlazeFace, YOLO-LC, YOLOv8n, marcos de palma/mão/face).

  • audio — entrada de microfone digital MDF no STM32N6.

  • Display — um controlador SSD1351 OLED com exemplo; os controladores SPIDisplay podem substituir os seus comandos de inicialização; o construtor do display SPI ganhou as palavras-chave hmirror / vflip.

  • Profiler no dispositivo — contadores de ciclos/eventos PMU SysTick + Armv8.1-M com instrumentação ao nível das funções, legíveis pela ligação de depuração (pyopenmv ganhou suporte a perfilamento e símbolos ELF).

  • Novo suporte de sensores — PixArt PS5520; FLIR BOSON no OpenMV H7 Plus; deteção automática GenX320.

Outras alterações e melhorias

  • MicroPython atualizado para 1.26.0.

  • Arranque da câmara — o relógio do sensor foi desacoplado do estado CSI, a deteção de câmara no arranque é mais rápida (a configuração mais comum é tentada primeiro) e o relógio padrão do OpenMV 3 OV7725 foi corrigido.

  • Qualidade de imagem — a correção gama ISP por software (Alif e STM32) e a correção de pixel morto (STM32) estão ativas por defeito; os sensores PAG7936 e PS5520 ganharam controlos de balanço de branco automático.

  • Desempenhoimage.Image.to_ndarray() é acelerado com Helium SIMD e o pós-processador FOMO foi vetorizado com ulab.

  • Driver FLIR Lepton reescrito para receber fotogramas de forma assíncrona em segundo plano — rotação/transpose funciona agora, o desenho é feito com escalonamento bilinear e o reinício é mais rápido.

  • Débito de captura — o CSI i.MX RT1062 usa agora DMA completo, e o STM32 N6 tem draw_image() com GPU por hardware.

Correções de erros

Câmara e sensores:

  • Corrigidos os modos RGB565 / GRAYSCALE / BAYER / YUV422 nos sensores STM32, PAJ6100 no OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565, e a configuração mono / RGB-YUV do CSI N6; a câmara de teste por software reinicia agora de forma determinística.

  • O balanço de branco automático já não torna a imagem verde a taxas de fotogramas baixas ou variáveis (uma média móvel de 250 ms substitui a amostragem a cada 100 fotogramas), e a cintilação de luminância do PS5520 está corrigida.

Processamento de imagem:

  • Corrigida uma falha de renderização no desenho de linhas; image.Image.flush() liberta agora o buffer JPEG da imagem em que foi chamado; Normalization aplica agora média/desvio padrão a entradas em float; a alocação de imagens a partir de ficheiro está corrigida.

Captura de câmara:

  • Corrigida uma grave corrupção de imagem em transferências não-JPEG (a interrupção de fotograma só é ativada no modo JPEG), suporte ao modo JPEG 3, e bloqueios de tamanho de linha DMA e buffer pequeno em STM32; a sincronização VOSPI / Lepton é mais fiável, sobretudo no N6.

Outros:

  • omv.board_id() devolve o UID correto no RT1060; YoloV2 já não falha quando construído sem âncoras explícitas.

Suporte de hardware e placas

  • OpenMV N6 — STM32N6 com uma NPU Neural-ART, triplo buffering, saída SPI LCD/TV, Soft-CSI, o módulo tof e modelos ROMFS integrados.

  • Arduino GIGA — saída de display MIPI DSI.

  • Novos sensores — PixArt PS5520; FLIR BOSON no OpenMV H7 Plus; deteção automática GenX320.

  • OpenMV Pure Thermal — o FLIR Lepton é agora um sensor de câmara regular (secundário).

  • Alif AE3 — correção gama ISP por software, o módulo crc e correções SPI.

Alterações com impacto na API

Quebras de API visíveis para o utilizador entre a v4.7.0 e a v4.8.0. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.

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

  • major — a maioria dos scripts que a utilizavam precisa de alterações.

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

  • behavior — mesma API, resultados diferentes; verificar scripts com valores ajustados.

  • tooling — afeta apenas ferramentas do lado do anfitrião / compilação a partir do código-fonte.

As alterações estão agrupadas por impacto nessa ordem — major primeiro, depois minor, behavior e tooling. Se apenas pretende migrar o seu código, salte para a lista de verificação de migração no final para uma lista de tarefas resumida. Cada hash de commit tem uma ligação para o respetivo diff no GitHub.

FLIR Lepton movido do módulo fir (major)

O FLIR Lepton é agora controlado como um sensor de câmara regular em vez de através do módulo fir. O controlo do Lepton foi removido do fir: o tipo FIR_LEPTON e os métodos radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() e trigger_ffc() foram eliminados. Capture o Lepton como qualquer outra câmara (aparece como sensor secundário no OpenMV Pure Thermal); o exemplo do Pure Thermal foi reescrito para a nova API. Os sensores fir não-Lepton (Grid-EYE, MLX, AMG8833) não são afetados.

Commits: bacfb7aeb, 117710566, 592a22902, 1a614202e

Módulo buzzer removido (minor)

O módulo buzzer foi removido dos ports STM32 e i.MX RT. Controle o buzzer com machine.PWM em alternativa; foi adicionado um exemplo de buzzer para o Pure Thermal usando PWM.

Commits: ccb947924, 444120f2d

omv.disable_fb() removido (minor)

A função omv.disable_fb() foi removida; o streaming do buffer de fotograma é agora controlado através da API de câmara. Os scripts RPC legados para o desktop que dependiam dela foram também removidos.

Commits: 84c3db58a, 6fe99051c

csi é novo — a sua API ainda não está estabilizada (minor)

O módulo csi é introduzido na v4.8.0 e a sua API evoluiu durante a versão: csi.fb() foi removido e csi.CSI.snapshot() (image=...) requer agora uma imagem mutável e desenha/escala o fotograma capturado para ela, em vez de fazer uma cópia profunda direta. Os utilizadores iniciais do novo módulo devem retestar; a API legada sensor não é afetada.

Commits: 0bc0385eb, 8cd7a309f

Modo stream e close() de image.ImageIO (minor)

image.ImageIO — o argumento mode aceita agora apenas 'r' / 'w' em minúsculas (maiúsculas são rejeitadas com uma mensagem de erro atualizada), e a abertura com 'w' trunca/recria sempre o ficheiro em vez de preservar um stream existente. ImageIO.close() é agora idempotente (fechar um stream já fechado já não lança exceção) e devolve None em vez do objeto stream.

Commits: 715c4cbba, 21ceec422

Valor de retorno de BlazeFace / BlazePalm (minor)

Os pós-processadores BlazeFace e BlazePalm (novos nesta versão) devolvem agora uma única lista de caixas delimitadoras em vez da lista completa por classe — os chamadores indexam o resultado diretamente em vez de usar [0].

Commit: 75e16b573

Callback de pós-processamento ML recebe tensores em bruto (behavior)

Um callback de pós-processamento em predict() de ml.Model recebe agora as referências de tensores de saída em bruto (quantizados) em vez de ndarrays float pré-convertidos — isto evita o esgotamento de memória em modelos grandes. Se não for fornecido callback, o ndarray float continua a ser devolvido. Os callbacks personalizados têm de dequantizar os tensores por si próprios (os pós-processadores integrados já o fazem).

Commit: 84e6ee650

Relógio de câmara desacoplado do estado CSI (behavior)

O relógio do sensor é agora independente do estado CSI. set_clock / set_frequency só reconfigura o relógio quando a frequência pedida difere mais do que uma tolerância, e get_clk_frequency aceita um booleano para devolver a frequência exata (em vez da nominal). O relógio padrão é 24 MHz no OpenMV N6 e AE3, pelo que não é necessário um set_clock() explícito no arranque. Os scripts que manipulavam o relógio para capturas sensíveis ao tempo devem rever os seus pressupostos.

Commits: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

Protocolo de depuração USB e alvos de firmware (tooling)

Nada disto afeta scripts MicroPython. Os comandos USBDBG obsoletos (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) foram removidos e os comandos não suportados de IDEs mais antigos são agora descartados em vez de causar falhas nas placas TinyUSB na ligação; o alvo de firmware STM32 UVC legado foi removido. As ferramentas do anfitrião antigas devem ser atualizadas; consulte o histórico do repositório de firmware para mais detalhes.

Commits: 90bd11e93, 657c9a632, 35182f035

Lista de verificação de migração

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

  1. Se utilizava o FLIR Lepton através do fir, mude para a sua captura como sensor de câmara (a alteração fir/Lepton).

  2. Substitua qualquer uso de buzzer por machine.PWM (a remoção do buzzer).

  3. Remova chamadas a omv.disable_fb() (a remoção de omv.disable_fb()).

  4. Para image.ImageIO: use minúsculas 'r'/'w' e espere que 'w' trunque (a alteração do ImageIO).

  5. Para callbacks personalizados de pós-processamento ML: dequantize as referências de tensores em bruto por si próprio, ou use o caminho float padrão (a alteração do callback).

  6. Reveja qualquer script que manipulasse o relógio do sensor para capturas sensíveis ao tempo (a alteração do relógio).