v5.0.0¶
A v5.0.0 é uma versão principal. Em destaque: a reconstruída ligação host OpenMV Protocol V2, uma API de câmara csi baseada em classes que escala para placas com múltiplas câmaras, um alvo simulador executável, estimação de pose individual com MoveNet, MicroPython 1.28, e um grande conjunto de correções para câmara, ML e ToF. Inclui também várias alterações incompatíveis de API — todas as alterações visíveis ao utilizador desde a v4.8.1 estão listadas abaixo, juntamente com as instruções de migração.
Destaques¶
OpenMV Protocol V2. A ligação host/IDE foi reconstruída de raiz: com frames, sequenciamento, verificação CRC, e canais multiplexados para stdio, pré-visualização de stream e dados do utilizador. Um novo módulo
protocolpermite que os scripts criem os seus próprios transportes e canais de dados. Consulte as alterações do módulo protocol.API de câmara
csibaseada em classes.import sensorpassa a serimport csi/csi.CSI, com suporte nativo a múltiplas câmaras. Consulte a migração csi.Alvo simulador. O firmware agora compila e executa sob o simulador Arm FVP / QEMU (MPS2/MPS3), incluindo emulação de NPU, ROMFS e PSRAM — scripts de visão e ML podem correr sem hardware ligado.
Estimação de pose MoveNet. Um novo pós-processador
MoveNetmais um modelomovenet_singlepose_192.tfliteincluído no OpenMV AE3 e N6.MicroPython 1.28 e ulab 6.12.0, ferramentas ST Edge AI 4.0, e o OpenMV SDK externalizado (consulte as alterações de compilação/ferramentas).
Novas funcionalidades¶
O módulo
protocol— crie transportes e canais de dados personalizados a partir de Python:protocol.init(),protocol.register(),protocol.is_active(), e uma classeprotocol.ProtocolChannelcomsend_event(), além de constantesCHANNEL_FLAG_*eCHANNEL_ID_*. A assinatura final deprotocol.init()está documentada em as alterações do módulo protocol.protocol.CBORChannel— um pacoteprotocolcongelado que serializa campos nomeados para CBOR com widgets de visualização (etiqueta, profundidade) e controlos interativos (alternar, deslizador, seleção).Memória do host e introspeção de stream — um novo comando de protocolo
SYS_MEMORYexpõe estatísticas de memória em tempo de execução por pool ao IDE, e um novo ioctl de streamSTREAM_SOURCEpermite que o host escolha qual câmara alimenta a pré-visualização em placas com múltiplas câmaras (versão de protocolo 1.0.1).Streaming multi-câmara —
csi.CSIaceita um argumentostream=que seleciona qual sensor alimenta a pré-visualização do IDE; o cabeçalho do frame de stream agora inclui um FPS suavizado por EMA para que o IDE mostre a taxa de fotogramas sem o código padrãoclock.fps(). Consulte a migração csi e os seguimentos csi.Sensor de eventos GenX320 — um novo filtro de Contraste Espácio-Temporal (
csi.IOCTL_GENX320_SET_STCcom os modoscsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLYecsi.GENX320_STC_TRAIL) e leitura de eventos em bruto (csi.IOCTL_GENX320_READ_EVENTS_RAW), com novos scripts de exemplo.MoveNet— um novo pós-processador MediaPipe de pose individual (kwargsthreshold,nms_threshold,nms_sigma) que devolve((x, y, w, h), score, keypoints)com um array de 17 pontos-chave COCO; um modelomovenet_singlepose_192.tflitee exemplo estão incluídos no AE3 e N6.ml.utils.draw_predictions()— um novo argumento opcionalscores=acrescenta confiança por etiqueta, o traço de fonte e caixa agora escala automaticamente com a largura da imagem, e um novo modoformat="point"desenha um marcador central para detetores de ponto central/pico.A nova classe
display.TVDisplay(com umioctl()genérico) substitui o módulotvautónomo. Consulte as alterações do módulo display.Um novo detetor
find_line_segments()(ED-Lines) — agora disponível em todas as compilações, com um novo argumentothreshold=. Consulte as alterações do módulo image.
Outras alterações e melhorias¶
MicroPython atualizado para 1.28.0 a partir da base v4.8.1. Adiciona modo de cartão SD de alta velocidade em H5/H7/N6, clock AHB5 em modo de baixo consumo, e pinos JTAG controláveis como GPIOs no OPENMV_AE3.
ulab atualizado para 6.12.0 — operador
%nativo em ndarrays (o auxiliarml.utils.mod()é removido; consulte as alterações da biblioteca ML).Ferramentas ST Edge AI atualizadas para 4.0 — afeta a compilação e implementação de modelos ST no dispositivo.
ml.Model— o argumento de palavra-chaveload_to_fbfoi removido; a memória do modelo é gerida automaticamente pelo alocador unificado.image.Image.scale()em-lugar — escalar uma imagem para cima em-lugar (por exemploimg.scale(x_scale=2.0, y_scale=2.0)) agora aumenta o buffer de fotograma para caber em vez de falhar.Buffer stdio maior — o buffer de texto padrão para o IDE cresceu de 512 para 1024 bytes no OpenMV 2/3/4, Nicla Vision, AE3 e N6, pelo que rajadas maiores de
print()não são truncadas.Fluxo de eventos do host mais suave — eventos stdout NOTIFY para o host são limitados a no máximo um por leitura do host em vez de um por
print()que ultrapasse o limiar do buffer circular.Operações longas interrompíveis — ciclos de espera longos de desenho de imagem, GPU (Nema/Dave2D) e NPU agora processam eventos num intervalo determinístico, para que os scripts permaneçam responsivos ao botão Stop do IDE durante trabalho intensivo.
Correções de erros¶
Câmara e sensores:
find_apriltags()já não corrompe resultados em placas com D-cache/GPU (N6, AE3), e agora funciona no AE3.Corrigida a saída de imagem Bayer do ISP STM32 N6 após mudança de formatos de pixel.
Corrigido o problema de sobrexposição do balanço de branco automático com tons de verde em cenas brilhantes e um caso de estatísticas AWB do primeiro fotograma não inicializado; aumentado o limite de gamma do ISP STM32 (32 para 63) para um intervalo mais amplo de gamma/contraste/brilho.
A exposição automática PS5520 já não oscila em luz intensa; o comportamento AEC/AGC do PAG7936 foi reformulado (controlo combinado, teto de ganho corrigido).
Restaurado o upload do firmware de autofoco OV5640 no Portenta/Nicla (correção MIMXRT I2C SUSPEND).
Corrigido um impasse na captura da câmara quando um limite de taxa de fotogramas é combinado com captura JPEG (STM32).
As leituras
csi.IOCTL_GENX320_READ_EVENTS_RAWdo GenX320 já não perturbam a pré-visualização do IDE.FLIR Lepton
csi.IOCTL_LEPTON_SET_MODEviacsi.CSI.ioctl()agora funciona quando chamado com um único argumento.
Processamento de imagem:
Corrigido o alpha blending de
draw_image()/blend()quando é fornecida uma máscara.Corrigida a ordenação de bits na codificação/descodificação de PNG de 1 bit (BINARY) e a descodificação de escala de cinzentos a partir de 1 bit.
Corrigidos os metadados de duração/FPS de gravação
mjpeg.Mjpeg.Corrigido um stack overflow de descodificação de JPEG por software em placas com pilha reduzida (OpenMV M7).
Corrigida a deteção automática de formato de ficheiro JPEG/PNG em hosts não-ARM (simulador).
Time-of-Flight:
tof.read_depth()já não levanta exceção em erros de medição transitórios e recupera automaticamente de falhas de bus; o tempo limite padrão detof.read_depth()/tof.snapshot()é agora 100 ms (consulte as alterações tof).Corrigida a corrupção de dados de profundidade em múltiplas zonas do VL53L5CX / VL53L8CX.
ML e sistema:
O NPU é limpo corretamente quando a inferência é interrompida no N6.
Restaurado o wakeup de sono profundo/standby no N6; corrigido o bloqueio de salto para bootloader no AE3.
Corrigidas fugas de memória no soft-reset (STM32 Nema GPU) e um buffer de fotograma auxiliar recolhido prematuramente.
Os canais de protocolo Python personalizados agora sobrevivem a um soft-reboot, o transporte USB recupera de reset de bus/endpoints bloqueados, e as interrupções USB SOF em excesso estão corrigidas.
Hardware e suporte a placas¶
OpenMV N6 — Ethernet ativada (rede com fio); AXI SRAM do NPU (1,75 MB) integrada num pool transitório partilhado para mais RAM entre inferências; wakeup de sono profundo/standby; modelos TFLite incluídos e cascatas Haar na ROMFS.
OpenMV AE3 — modelos e cascatas incluídos na ROMFS;
cbor2congelado no firmware.Alif (AE3, N6) — wakeup de baixo consumo com
machine.RTC.AprilTags de alta resolução —
find_apriltags()com resolução total do sensor no AE3, Arduino Giga e Arduino Portenta H7.Alvos simulador — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), com emulação de NPU, ROMFS e PSRAM.
Alterações incompatíveis de API¶
Alterações de API visíveis ao utilizador entre a v4.8.1 e a v5.0.0. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.
Cada alteração está marcada com o seu impacto:
principal — a maioria dos scripts precisa de edições.
menor — API restrita; afeta apenas scripts que a usaram.
comportamento — mesma API, resultados diferentes; verifique novamente os scripts ajustados.
ferramentas — afeta apenas a compilação a partir da fonte/forks derivados.
As alterações estão agrupadas por impacto nessa ordem — principal primeiro, depois menor, comportamento e ferramentas. Se apenas pretende portar o seu código, salte para o checklist de migração no final para uma lista de tarefas condensada. Cada hash de commit liga ao respetivo diff no GitHub.
sensor substituído por csi (principal)¶
Todos os exemplos oficiais foram reescritos para abandonar import sensor em favor de import csi. A API funcional ao nível do módulo legada (sensor.reset(), sensor.set_pixformat(), …) é substituída pela API csi.CSI baseada em classes, que escala naturalmente para placas com múltiplas câmaras (csi0, csi1, …) e é necessária para todas as novas funcionalidades (o kwarg stream=, streaming multi-sensor, …).
O qstr sensor ainda está ligado em modules/py_csi.c para compilações de firmware retrocompatíveis, mas não receberá novas funcionalidades, e todos os exemplos, documentação e código de biblioteca assumem agora csi.
Módulo para classe
Antes (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
Depois (csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
Pares setter/getter simplificados em acessores combinados
Na nova API, um método chamado sem argumentos devolve o valor atual; chamado com um valor, define-o. Os prefixos set_*/get_* foram removidos. Os nomes dos métodos também perderam o sufixo ing onde era redundante (windowing → window). A coluna da nova API liga para a documentação de referência.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Funções sem equivalente direto
|
O que usar em alternativa |
|---|---|
|
|
|
|
|
Movido para o construtor |
|
|
|
Removido. A imagem devolvida por |
|
|
Novidades em csi.CSI
csi.CSI(stream=True|False)— um seletor em tempo de construção que escolhe qual CSI alimenta o buffer de fotograma de pré-visualização (substitui o kwargupdate=por captura, consulte os seguimentos csi).csi.CSI(cid=N)/csi.devices()— suporte multi-CSI para placas com mais de um sensor de imagem.
Módulo image — reformulação da assinatura (principal)¶
O módulo image viu a alteração de API mais ampla após csi — assinaturas de desenho, objetos de resultado e vários detetores foram alterados.
Os argumentos de coordenadas devem ser tuplos
modules/py_image.c foi reescrito sobre mp_arg_parse_all. Todos os métodos de desenho/pixel que anteriormente aceitavam argumentos posicionais separados x, y, ... agora exigem que essas coordenadas sejam agrupadas num único tuplo.
Commits: d18bbc472, 0c60c94b9 (PR #3061)
Antes |
Depois |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Todos são métodos de image.Image.
Objetos de resultado convertidos para attrtuple
Estes tipos são agora objetos attrtuple do MicroPython: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. O acesso a atributos sem parênteses é agora a forma canónica.
Commit: 3399d302e
Antes (estilo com método):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
Depois (estilo com atributo):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob e histogram permanecem inalterados — mantêm os seus tipos existentes e acessores () (um attrtuple não consegue exprimir os valores calculados de forma preguiçosa de um blob ou os acessores que aceitam argumentos de um histograma).
Renomeação do parâmetro haar de find_features
image.Image.find_features() — scale_factor= foi renomeado para scale=.
Commit: be4c5cd73
get_regression — agora sempre robusto, target_size adicionado
image.Image.get_regression() usa agora sempre a regressão robusta (Theil-Sen). O antigo caminho rápido de mínimos quadrados foi removido, pelo que o argumento de palavra-chave robust= desaparece — o que antes exigia robust=True é agora o único comportamento. Um novo kwarg target_size=(w, h) (predefinição (80, 60)) escala a ROI por área antes do ajuste Theil-Sen O(N^2) para que este corra sempre num tamanho de imagem razoável; os extremos da linha ajustada são mapeados de volta para as coordenadas de origem. O exemplo linear_regression_robust.py foi eliminado e linear_regression_fast.py foi renomeado para linear_regression.py.
find_line_segments — novo algoritmo
image.Image.find_line_segments() — o antigo detetor LSD foi substituído pelo ED-Lines, e ganhou um novo kwarg threshold=50. Os resultados de scripts previamente ajustados serão diferentes.
Biblioteca AprilTag substituída
image.Image.find_apriltags() — o detetor AprilTag foi substituído por uma nova implementação. O conjunto de famílias alterou-se:
Removido |
Adicionado |
|---|---|
|
|
Commit: e813bada7
Seguimento do módulo csi (menor)¶
Seguimentos menores do csi sobre a migração csi.
snapshot(update=…) removido
O kwarg update em csi.CSI.snapshot() foi removido. Para impedir que um dispositivo CSI alimente o buffer de fotograma de pré-visualização, opte por não o fazer em tempo de construção:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
Argumento expand de framebuffers() removido
csi.CSI.framebuffers() — o terceiro argumento posicional (expand) foi removido; a assinatura é agora framebuffers([count]).
Commit: 86cb3a5de
Módulo protocol (menor)¶
Afeta apenas scripts que controlavam diretamente a ligação host. Consulte protocol.
timer_ms renomeado para poll_ms
protocol.init() — o argumento timer_ms foi renomeado para poll_ms.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() removido
A tarefa de protocolo é agora agendada internamente. As chamadas a protocol.poll() irão lançar AttributeError.
Commit: 8a0635e8c
Argumento de configuração soft_reboot removido
protocol.init() — o argumento soft_reboot foi removido. Todos os transportes atuais toleram soft-reboots, pelo que o comportamento é agora incondicional.
Commit: 0bf766aa2
Módulos display (menor)¶
A saída TV passa agora por um objeto display.TVDisplay em vez do módulo tv autónomo. O display também ganhou um ioctl() genérico.
Módulo tof (comportamento)¶
Mesma API de antes; os valores predefinidos e o tratamento de erros alteraram-se. Consulte tof.
Tempo limite predefinido alterado
tof.read_depth() e tof.snapshot() (chamados com timeout=-1) têm agora como predefinição 100 ms em vez de esperar indefinidamente. Passe um valor maior explícito se precisar do comportamento antigo.
Commit: b6772b80d
Recuperação automática
O driver agora reinicia por hardware o bus I2C e o sensor em erros de medição/timeout. Os exemplos já não chamam tof.reset() nos seus tratadores de exceção — o código do utilizador que fazia recuperação manual deve removê-la (entrará em conflito com a nova recuperação automática).
Biblioteca ML (comportamento)¶
Mesma API, números diferentes — verifique novamente qualquer pipeline de ML ajustado.
O pré-processamento agora estica em vez de usar letterbox
Normalization usa agora image.SCALE_ASPECT_IGNORE (esticar) em vez de image.SCALE_ASPECT_EXPAND (letterbox). O pós-processamento NMS também mudou para escala independente em x/y.
Nota
Impacto. Detetores estilo YOLO e regressores de pontos-chave melhoram geralmente. Os exemplos BlazeFace, BlazePalm, FaceLandmarks e HandLandmarks requerem agora um recorte quadrado manual na ROI de entrada — os scripts de exemplo foram atualizados; o código personalizado do utilizador deve fazer o mesmo.
Commit: 68dc29a33
Auxiliar ml.utils.mod() removido
O ulab 6.12.0 suporta % em ndarrays de forma nativa. O código que importava mod de ml.utils deve usar a % b.
Compilação / ferramentas (ferramentas)¶
Nada disto afeta os scripts MicroPython. Compilar firmware a partir da fonte requer agora o OpenMV SDK externo (1.6.0, anteriormente integrado na árvore). Várias ferramentas de compilação integradas foram removidas e o N6 migrou para a pilha TinyUSB; os forks derivados devem rever o histórico do repositório de firmware — nomeadamente a assinatura file_open() que eliminou o argumento buffered.
Checklist de migração¶
Para uma portabilização limpa para a v5.0.0, o trabalho típico é:
Substituir
import sensorporimport csi; csi0 = csi.CSI()e traduzir cada chamadaset_*/get_*para o acessorcsi.CSIcorrespondente (a migração csi).Envolver os argumentos de coordenadas de
img.draw_*,get_pixel()eset_pixel()em tuplos (as alterações do módulo image).Remover
()dos acessores de resultado attrtuple se quiser a nova forma idiomática, ou deixar o estilo antigo como está, pois os attrtuples ainda suportam acessores chamáveis (as alterações do módulo image).Auditar
find_line_segments(),get_regression()e qualquer escolha de famíliafind_apriltags()(as alterações do módulo image).Renomear
timer_ms→poll_msnas chamadas aprotocol.init(); removerprotocol.poll()esoft_reboot=(as alterações do módulo protocol).Para fluxos de trabalho de ML: rever qualquer modelo que necessitava de entrada com letterbox (as alterações da biblioteca ML).