v3.0.0

A v3.0.0 é a grande versão v2 → v3. Ela introduz a OpenMV Cam M7 (STM32F7) e o novo módulo de rede neural CMSIS-NN nn (substituindo os antigos métodos fixos find_number() / classify_object()), adiciona o suporte aos sensores de obturador global MT9V034 e FLIR Lepton, os framesizes sensor.WVGA e atualiza o núcleo para o MicroPython 1.9.4. Vários comportamentos de image / sensor / WiFi mudaram — leia as mudanças incompatíveis abaixo.

Destaques

  • OpenMV Cam M7 — nova placa STM32F7.

  • Módulo nn — inferência CMSIS-NN: nn.load(), Net.forward(), Net.search(), com um conversor de modelos e exemplos.

  • Novos sensores — MT9V034 de obturador global (acionado por FSIN) e FLIR Lepton.

  • Atualização do núcleo para o MicroPython 1.9.4.

  • Incompatível: os métodos fixos image.find_number() / image.classify_object() foram removidos, sensor.sleep() agora lança uma exceção, os sockets do WINC retornam contagens reais de bytes, image.binary() retorna uma nova imagem e find_apriltags() é limitado a 64K pixels — veja as mudanças incompatíveis.

Novos recursos

  • nn — um novo módulo de rede neural CMSIS-NN: nn.load(path), Net.forward(img, roi=, softmax=, dry_run=) (retorna floats de 0.0 a 1.0), Net.search() para detecção em múltiplas escalas/posições e Net.test(), além de um conversor de modelos CMSIS-NN (nn_convert.py / nn_quantizer.py), modelos CIFAR-10 / LeNet / smile inclusos e scripts de exemplo de NN / NN-search.

  • Sensores — suporte ao MT9V034 de obturador global (snapshot acionado por FSIN) na OpenMV 4, um driver FLIR Lepton atualizado com snapshot do Lepton e os novos framesizes sensor.WVGA (720x480) / sensor.WVGA2 (752x480).

  • Processamento de imagemimage.find_circles() ganhou as palavras-chave r_min / r_max / r_step (Hough mais rápido), find_keypoints() e o find_features() Haar agora aceitam imagens RGB, e image.compress() / a codificação JPEG agora suporta imagens binárias (bitmap).

  • Bootboot.py agora roda antes da inicialização do USB para que possa sobrescrever o modo USB (por exemplo, HID).

  • Exemplos — adicionados exemplos de AprilTag pequenos/de alta resolução, um exemplo de I2C LIDAR-Lite V3 e ferramentas para conjuntos de dados (augment_images.py / make_patches.py).

Outras mudanças e melhorias

  • Atualizou o MicroPython incluso para a 1.9.4 (com uma reversão de parse/compile/exec do pyexec e uma correção de PendSV); mensagens de erro de falta de memória mais claras para fb_alloc / xalloc; suprimiu o ruído de printf do nn durante o carregamento da rede; reorganizou o repositório (exemplos → scripts/, ferramentas → tools/, cascatas Haar → ml/). O módulo nn não está disponível na OpenMV 2 (flash insuficiente).

Correções de bugs

Processamento de imagem:

  • Corrigidos fast_atan2f para x≤0 (antes sempre 0 — reverifique os ângulos de blob / linha / keypoint), o gerenciamento de memória de find_apriltags() (conteúdo descartado e um realloc incorreto em caso de OOM), os ponteiros de linha por bpp de binário/bitmap (resultados binários corrompidos), find_edges(EDGE_CANNY) com uma ROI, a macro TO_GS_PIXEL (integral / morph), o streaming de bitmap/JPEG para quadros em escala de cinza (bpp==0), o pop_front da lista de keypoints/blobs e os resultados de match_descriptor.

Sistema e câmera:

  • Corrigidos os números de interface/endpoint do USB HID, a alteração dinâmica da frequência do XCLK em tempo de execução, o retorno do número correto de saídas por Net.forward() e um hardfault ao interromper o parsing do script.

Hardware e suporte a placas

  • OpenMV Cam M7 (STM32F7) — nova placa.

  • Sensor de obturador global MT9V034 (OpenMV 4, acionado por FSIN).

  • FLIR Lepton — driver atualizado com suporte a snapshot.

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v2.9.0 e a v3.0.0. Escopo: módulos C do Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada mudança é marcada com o seu impacto:

  • major — afeta a maioria dos scripts que usavam o recurso; você precisará adaptar o código.

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

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

As mudanças estão agrupadas por impacto nessa ordem. Se você só quer adaptar o seu código, pule para a lista de verificação para migração no final. Cada hash de commit tem um link para o seu diff no GitHub.

image.find_number() / image.classify_object() removidos (major)

Os métodos fixos image.find_number() (LeNet) e image.classify_object() (CMSIS CNN) foram removidos em favor do novo módulo nn. Substitua-os por net = nn.load('/model.network'); out = net.forward(img).

Commits: d151f7e38

sensor.sleep() / sensor.reset() lançam exceção em caso de falha (minor)

sensor.sleep() e sensor.reset() agora lançam uma exceção em caso de falha em vez de retornar True / False. O código que verificava o retorno booleano de sensor.sleep() deve, em vez disso, envolver a chamada em try / except.

Commits: 7d16d008f

Os sockets do WINC retornam a contagem real de bytes (behavior)

Os métodos send / recv / sendto / recvfrom do socket do WINC1500 antes sempre retornavam 0; agora eles retornam o número real de bytes transferidos. O código que assumia um retorno 0 (ou que entrava em laço/bloqueava com base nele) deve tratar as contagens reais.

Commits: a07fb2f60

image.binary() retorna uma nova imagem (behavior)

image.binary() ganhou as palavras-chave to_bitmap / copy e agora retorna um novo objeto de imagem em vez de retornar/modificar a imagem de origem no local. O código que dependia de binary() modificar a imagem original deve usar o objeto retornado (e passar copy=True para o comportamento que não é no local).

Commits: 8a44f0cd9

find_apriltags() limitado a 64K pixels (behavior)

image.find_apriltags() agora lança uma exceção se a imagem (ou ROI) exceder 64K pixels e retorna uma lista vazia para imagens menores que 4x4. Reduza imagens grandes (use um framesize menor ou passe uma roi explícita) antes de chamar find_apriltags().

Commits: bd77afbc0

Lista de verificação para migração

Para uma adaptação limpa para a v3.0.0, o trabalho típico é:

  1. Substitua image.find_number() / image.classify_object() pelo módulo nn (a migração para o nn).

  2. Envolva sensor.sleep() / sensor.reset() em try / except em vez de verificar um retorno booleano (a mudança em sensor.sleep).

  3. Trate as contagens reais de bytes de send / recv do socket do WINC (a mudança no socket do WINC).

  4. Use a imagem retornada por image.binary() em vez de esperar uma modificação no local (a mudança em binary).

  5. Reduza as imagens antes de find_apriltags() para ficar abaixo de 64K pixels (o limite de find_apriltags).

Todos os demais scripts funcionam sem alterações.