v4.8.0

A v4.8.0 é uma versão de lançamento com recursos importantes. Em destaque: um novíssimo módulo de câmera csi baseado em classes com suporte a múltiplas câmeras, a placa OpenMV N6 (STM32N6) com uma NPU Neural-ART, um backend de inferência via NPU, o modo de eventos RAW da câmera de eventos GenX320, um novo módulo crc, uma biblioteca de pós-processamento de ML reorganizada e o MicroPython 1.26. Ela também remove algumas APIs legadas — o módulo buzzer e o controle da FLIR Lepton do módulo fir — então leia as mudanças incompatíveis abaixo.

Destaques

  • Novo módulo de câmera csi. Uma API csi.CSI baseada em classes com suporte a múltiplas câmeras simultâneas, apresentada ao lado do módulo legado sensor.

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

  • Inferência via NPU. Um backend ST Neural-ART (STAI) para inferência de modelos acelerada por hardware.

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

  • Pós-processamento de ML reorganizado — subpacotes por fornecedor (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) com novos detectores BlazeFace / BlazePalm / de pontos de referência de mãos e rostos.

  • Novo módulo crc — CRC-16 / CRC-32 acelerado por hardware.

  • MicroPython atualizado para 1.26.0.

  • Incompatível: o módulo buzzer e o controle da Lepton do módulo fir foram removidos (a Lepton agora é uma câmera comum). Veja a mudança do fir/Lepton e a remoção do buzzer.

Novos recursos

  • O novo módulo de câmera csi — um objeto csi.CSI baseado em classes com múltiplas câmeras simultâneas (até três na N6), snapshot não bloqueante, tamanhos de quadro (w, h) personalizados e um print() / repr informativo. Ele é apresentado ao lado do módulo legado sensor (não é um substituto direto).

  • crccrc.crc16() e crc.crc32(), acelerados por hardware com um fallback em software, na OpenMV N6 e AE3.

  • image.Image.draw_image() ganhou uma palavra-chave transform= (uma matriz ndarray de floats 2-D para transformações afins/de perspectiva, acelerada 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âmera de eventos.

  • Modo de eventos RAW da 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 via NPU ST Neural-ART (STAI); ml.Model ganhou uma palavra-chave postprocess= (o pós-processador agora roda automaticamente dentro de predict() mesmo sem um callback); ml.postprocessing foi reorganizado em subpacotes por fornecedor — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo) e ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — os antigos nomes em snake_case permanecem como aliases; ml.utils.draw_keypoints() e ml.utils.draw_skeleton() foram adicionados; os modelos ROMFS empacotados cresceram (BlazeFace, YOLO-LC, YOLOv8n, pontos de referência de palma/mão/rosto).

  • audio — entrada de microfone digital MDF na STM32N6.

  • Display — um driver OLED SSD1351 e exemplo; controladores SPIDisplay podem sobrescrever seus comandos de init; o construtor do display SPI ganhou as palavras-chave hmirror / vflip.

  • Profiler no dispositivo — contadores de ciclos/eventos SysTick + PMU Armv8.1-M com instrumentação em nível de função, legíveis pelo link de depuração (pyopenmv ganhou suporte a profiling e a símbolos ELF).

  • Suporte a novos sensores — PixArt PS5520; FLIR BOSON na OpenMV H7 Plus; detecção automática da GenX320.

Outras mudanças e melhorias

  • MicroPython atualizado para 1.26.0.

  • Inicialização da câmera — o clock do sensor foi desacoplado do estado da CSI, a detecção da câmera na inicialização é mais rápida (a configuração mais comum é testada primeiro) e o clock padrão da OV7725 da OpenMV 3 foi corrigido.

  • Qualidade de imagem — a correção de gama do ISP em software (Alif e STM32) e a correção de pixels defeituosos (STM32) estão ativadas por padrão; os sensores PAG7936 e PS5520 ganharam controles de balanço de branco automático.

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

  • Driver da FLIR Lepton reescrito para receber quadros de forma assíncrona em segundo plano — rotação/transpose agora funciona, o desenho faz upscale bilinear e o reset é mais rápido.

  • Throughput de captura — a CSI do i.MX RT1062 agora usa offload total via DMA, e a STM32 N6 tem um draw_image() por GPU em hardware.

Correções de bugs

Câmera e sensores:

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

  • O balanço de branco automático não deixa mais a imagem verde em taxas de quadros baixas ou variáveis (uma média móvel de 250 ms substitui a amostra a cada 100 quadros), e o flicker de luminância do PS5520 foi corrigido.

Processamento de imagem:

  • Corrigido um defeito de renderização de desenho de linha; image.Image.flush() agora libera o buffer JPEG da imagem em que foi chamado; Normalization agora aplica média/desvio padrão a entradas float; a alocação de imagem a partir de arquivo foi corrigida.

Captura da câmera:

  • Corrigida a corrupção grave de imagem em transferências não-JPEG (a interrupção de quadro agora é habilitada apenas no modo JPEG), o suporte ao modo JPEG-3 e travamentos de tamanho de linha do DMA e de buffer pequeno no STM32; a sincronização VOSPI / Lepton é mais confiável, notadamente na N6.

Diversos:

  • omv.board_id() retorna o UID correto no RT1060; YoloV2 não trava mais quando construído sem âncoras explícitas.

Suporte a hardware e placas

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

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

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

  • OpenMV Pure Thermal — a FLIR Lepton agora é um sensor de câmera comum (secundário).

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

Mudanças incompatíveis de API

Quebras de API visíveis ao usuário entre a v4.7.0 e a v4.8.0. Escopo: C-modules do Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada mudança é marcada com seu impacto:

  • major — a maioria dos scripts que a usaram precisa de edições.

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

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

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

As mudanças são agrupadas por impacto nessa ordem — major primeiro, depois minor, behavior e tooling. Se você só quer portar seu código, vá direto para a checklist de migração no final para uma lista condensada de tarefas. Cada hash de commit leva ao seu diff no GitHub.

FLIR Lepton saiu do módulo fir (major)

A FLIR Lepton agora é controlada como um sensor de câmera comum em vez de pelo módulo fir. O controle da 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() não existem mais. Capture a Lepton como qualquer outra câmera (ela aparece como um sensor secundário na OpenMV Pure Thermal); o exemplo da Pure Thermal foi reescrito para a nova API. Os sensores fir que não são Lepton (Grid-EYE, MLX, AMG8833) permanecem inalterados.

Commits: bacfb7aeb, 117710566, 592a22902, 1a614202e

Módulo buzzer removido (minor)

O módulo buzzer foi removido das portas STM32 e i.MX RT. Acione o buzzer com machine.PWM em vez dele; foi adicionado um exemplo de buzzer da Pure Thermal usando PWM.

Commits: ccb947924, 444120f2d

omv.disable_fb() removido (minor)

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

Commits: 84c3db58a, 6fe99051c

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

O módulo csi é apresentado na v4.8.0 e sua API evoluiu durante o lançamento: csi.fb() foi removido, e csi.CSI.snapshot() (image=...) agora exige uma imagem mutável e desenha/escala o quadro capturado nela em vez de fazer uma cópia profunda bruta. Os primeiros adotantes do novo módulo devem retestar; a API legada sensor não é afetada.

Commits: 0bc0385eb, 8cd7a309f

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

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

Commits: 715c4cbba, 21ceec422

Valor de retorno de BlazeFace / BlazePalm (minor)

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

Commit: 75e16b573

O callback de pós-processamento de ML recebe tensores brutos (behavior)

Um callback de pós-processamento de predict() de ml.Model agora recebe as referências de tensor de saída brutas (quantizadas) em vez de ndarrays float já convertidos — isso evita o esgotamento de memória em modelos grandes. Se nenhum callback for fornecido, o ndarray float ainda é retornado. Callbacks personalizados devem desquantizar os tensores por conta própria (os pós-processadores embutidos já fazem isso).

Commit: 84e6ee650

Clock da câmera desacoplado do estado da CSI (behavior)

O clock do sensor agora é independente do estado da CSI. set_clock / set_frequency só reconfigura o clock quando a frequência solicitada difere por mais de uma tolerância, e get_clk_frequency recebe um booleano para retornar a frequência exata (em vez da nominal). O clock padrão é 24 MHz na OpenMV N6 e AE3, então nenhum set_clock() explícito é necessário na inicialização. Scripts que alternavam o clock para capturas sensíveis a tempo devem rever suas premissas.

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

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

Nada disso afeta os scripts MicroPython. Comandos USBDBG obsoletos (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) foram removidos e comandos não suportados de IDEs mais antigas agora são descartados em vez de travar placas TinyUSB na conexão; o alvo de firmware UVC legado do STM32 foi removido. Ferramentas de host antigas devem ser atualizadas; veja o histórico do repositório de firmware para detalhes.

Commits: 90bd11e93, 657c9a632, 35182f035

Checklist de migração

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

  1. Se você usou a FLIR Lepton pelo fir, mude para capturá-la como um sensor de câmera (a mudança do fir/Lepton).

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

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

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

  5. Para callbacks personalizados de pós-processamento de ML: desquantize você mesmo as referências de tensor bruto, ou confie no caminho float padrão (a mudança do callback).

  6. Revise qualquer script que acionava o clock do sensor para capturas sensíveis a tempo (a mudança do clock).