v4.8.0

v4.8.0 是一个重大功能版本。其亮点包括:全新的基于类的 csi 摄像头模块(支持多摄像头)、搭载 Neural-ART NPU 的 OpenMV N6(STM32N6)开发板、NPU 推理后端、GenX320 事件摄像头 RAW 事件模式、新的 crc 模块、重新组织的 ML 后处理库以及 MicroPython 1.26。它还移除了一些旧版 API —— buzzer 模块和 fir 模块的 FLIR Lepton 控制功能 —— 因此请阅读下面的破坏性变更。

亮点

  • 全新的 csi 摄像头模块。 基于类的 csi.CSI API,支持多个摄像头同时工作,与旧版 sensor 模块一同引入。

  • OpenMV N6。 STM32N6 开发板,搭载 Neural-ART NPU、三重缓冲、Soft-CSI 和 ToF 模块。

  • NPU 推理。 用于硬件加速模型推理的 ST Neural-ART(STAI)后端。

  • GenX320 事件模式。 RAW 事件输出,加上用于事件摄像头渲染的 draw_event_histogram()

  • 重新组织的 ML 后处理 —— 厂商子包(ml.postprocessing.ultralyticsmediapipeedgeimpulsedarknet),并新增 BlazeFace / BlazePalm / 手部和面部关键点检测器。

  • 全新的 crc 模块 —— 硬件加速的 CRC-16 / CRC-32。

  • MicroPython 已更新至 1.26.0。

  • 破坏性变更: 移除了 buzzer 模块和 fir 模块的 Lepton 控制功能(Lepton 现在是一个普通摄像头)。请参阅 fir/Lepton 变更buzzer 移除

新功能

  • 全新的 csi 摄像头模块 —— 一个基于类的 csi.CSI 对象,支持多个摄像头同时工作(N6 上最多三个)、非阻塞快照、自定义 (w, h) 帧尺寸,以及信息丰富的 print() / repr。它与旧版 sensor 模块一同引入(并非直接替代品)。

  • crc —— crc.crc16()crc.crc32(),在 OpenMV N6 和 AE3 上硬件加速并提供软件回退。

  • image.Image.draw_image() 新增了 transform= 关键字参数(一个用于仿射/透视变形的二维浮点 ndarray 矩阵,在 STM32 和 Alif 上由 GPU 加速);同一变换也可用于图像转换。

  • draw_event_histogram() —— 渲染事件摄像头直方图。

  • GenX320 RAW 事件模式 —— csi.IOCTL_GENX320_SET_MODE,配合 csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENTcsi.IOCTL_GENX320_READ_EVENTScsi.IOCTL_GENX320_CALIBRATE、事件类型常量以及新的示例脚本。

  • ML —— 新增 ST Neural-ART(STAI)NPU 推理后端;ml.Model 新增了 postprocess= 关键字参数(即使没有回调,后处理器现在也会在 predict() 内部自动运行);ml.postprocessing 被重新组织为厂商子包 —— ml.postprocessing.ultralyticsYoloV5YoloV8)、ml.postprocessing.darknetYoloV2YoloLC)、ml.postprocessing.edgeimpulseFomo)和 ml.postprocessing.mediapipeBlazeFaceBlazePalmHandLandmarksFaceLandmarks)—— 旧的 snake_case 名称仍作为别名保留;新增了 ml.utils.draw_keypoints()ml.utils.draw_skeleton();内置的 ROMFS 模型也有所增加(BlazeFace、YOLO-LC、YOLOv8n、手掌/手部/面部关键点)。

  • audio —— STM32N6 上的 MDF 数字麦克风输入。

  • 显示 —— SSD1351 OLED 驱动及示例;SPIDisplay 控制器可以覆盖其初始化命令;SPI 显示构造函数新增了 hmirror / vflip 关键字参数。

  • 设备端性能分析器 —— SysTick + Armv8.1-M PMU 周期/事件计数器,带函数级插桩,可通过调试链路读取(pyopenmv 新增了性能分析和 ELF 符号支持)。

  • 新的传感器支持 —— PixArt PS5520;OpenMV H7 Plus 上的 FLIR BOSON;GenX320 自动检测。

其他变更与改进

  • MicroPython 已更新至 1.26.0。

  • 摄像头启动 —— 传感器时钟已与 CSI 状态解耦,启动时的摄像头检测更快(最常见的配置会首先尝试),并修正了 OpenMV 3 OV7725 的默认时钟。

  • 图像质量 —— 软件 ISP 伽马校正(Alif 和 STM32)和坏点校正(STM32)默认开启;PAG7936 和 PS5520 传感器新增了自动白平衡控制。

  • 性能 —— image.Image.to_ndarray() 使用 Helium SIMD 加速,FOMO 后处理器使用 ulab 进行了向量化。

  • 重写了 FLIR Lepton 驱动 以在后台异步接收帧 —— 旋转/transpose 现在可以工作,绘制时进行双线性上采样,且复位更快。

  • 捕获吞吐量 —— i.MX RT1062 CSI 现在使用完整的 DMA 卸载,STM32 N6 拥有硬件 GPU 加速的 draw_image()

错误修复

摄像头与传感器:

  • 修复了 STM32 各传感器、OpenMV H7 / H7 Plus 上的 PAJ6100、OpenMV 2 QVGA RGB565 以及 N6 CSI 单色 / RGB-YUV 配置中的 RGB565 / GRAYSCALE / BAYER / YUV422 模式;软件测试摄像头现在可以确定性地复位。

  • 自动白平衡在低帧率或可变帧率下不再使图像偏绿(250 毫秒移动平均替代了每 100 帧采样一次的方式),并修复了 PS5520 的亮度闪烁。

图像处理:

  • 修复了画线渲染故障;image.Image.flush() 现在会刷新被调用图像的 JPEG 缓冲区;Normalization 现在会对浮点输入应用均值/标准差;修复了从文件加载图像的内存分配问题。

摄像头捕获:

  • 修复了非 JPEG 传输时严重的图像损坏问题(帧中断现在仅在 JPEG 模式下启用)、JPEG mode-3 支持,以及 STM32 上的 DMA 行尺寸和小缓冲区死锁;VOSPI / Lepton 同步更加可靠,尤其是在 N6 上。

杂项:

  • omv.board_id() 在 RT1060 上返回正确的 UID;YoloV2 在不带显式锚框构造时不再崩溃。

硬件与开发板支持

  • OpenMV N6 —— STM32N6,搭载 Neural-ART NPU、三重缓冲、SPI LCD/TV 输出、Soft-CSI、tof 模块以及内置的 ROMFS 模型。

  • Arduino GIGA —— MIPI DSI 显示输出。

  • 新传感器 —— PixArt PS5520;OpenMV H7 Plus 上的 FLIR BOSON;GenX320 自动检测。

  • OpenMV Pure Thermal —— FLIR Lepton 现在是一个普通的(辅助)摄像头传感器。

  • Alif AE3 —— 软件 ISP 伽马校正、crc 模块以及 SPI 修复。

破坏性 API 变更

v4.7.0 与 v4.8.0 之间面向用户的 API 破坏性变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。

每项变更都标注了其影响:

  • major —— 大多数使用它的脚本都需要修改。

  • minor —— 范围较窄的 API;仅影响使用它的脚本。

  • behavior —— API 相同但结果不同;请重新检查经过调优的脚本。

  • tooling —— 仅影响主机工具 / 从源码构建。

变更按影响程度依此顺序分组 —— 先是 major,然后是 minorbehaviortooling。如果你只想移植代码,请直接跳到末尾的 迁移清单,那里有一份精简的待办列表。每个提交哈希都链接到其在 GitHub 上的 diff。

FLIR Lepton 移出 fir 模块 (major)

FLIR Lepton 现在作为一个普通的摄像头传感器来驱动,而不再通过 fir 模块。Lepton 控制功能已从 fir 中移除:FIR_LEPTON 类型以及 radiometric()register_vsync_cb()register_frame_cb()get_frame_available()trigger_ffc() 方法都已不存在。请像捕获其他任何摄像头一样捕获 Lepton(它在 OpenMV Pure Thermal 上显示为辅助传感器);Pure Thermal 示例已重写为新 API。非 Lepton 的 fir 传感器(Grid-EYE、MLX、AMG8833)保持不变。

提交: bacfb7aeb117710566592a229021a614202e

buzzer 模块已移除 (minor)

buzzer 模块已从 STM32 和 i.MX RT 端口中移除。请改用 machine.PWM 来驱动蜂鸣器;新增了一个使用 PWM 的 Pure Thermal 蜂鸣器示例。

提交: ccb947924444120f2d

omv.disable_fb() 已移除 (minor)

omv.disable_fb() 函数已被移除;帧缓冲区流传输现在通过摄像头 API 控制。依赖它的旧版 RPC 桌面脚本也已被移除。

提交: 84c3db58a6fe99051c

csi 是新模块 —— 其 API 尚未冻结 (minor)

csi 模块在 v4.8.0 中引入,其 API 在本次发布过程中有所演进:csi.fb() 已被移除,csi.CSI.snapshot()(image=...) 现在要求传入一个可变的图像,并将捕获的帧绘制/缩放到该图像中,而不再执行原始的深拷贝。新模块的早期使用者应重新测试;旧版 sensor API 不受影响。

提交: 0bc0385eb8cd7a309f

image.ImageIO 流模式与 close() (minor)

image.ImageIO —— mode 参数现在仅接受小写的 'r' / 'w'(大写会被拒绝并给出更新后的错误消息),且以 'w' 打开总是截断/重建文件,而不再保留现有的流。ImageIO.close() 现在是幂等的(关闭一个已关闭的流不再引发异常),并返回 None 而非流对象。

提交: 715c4cbba21ceec422

BlazeFace / BlazePalm 的返回值 (minor)

BlazeFaceBlazePalm 后处理器(本版本新增)现在返回单个边界框列表,而非完整的按类列表 —— 调用者可直接索引结果,而无需使用 [0]

提交: 75e16b573

ML 后处理器回调接收原始张量 (behavior)

ml.Modelpredict() 后处理回调现在接收原始(量化的)输出张量引用,而非预先转换的浮点 ndarray —— 这避免了在大型模型上耗尽内存。如果未提供回调,仍会返回浮点 ndarray。自定义回调必须自行对张量进行反量化(内置的后处理器已经这样做了)。

提交: 84e6ee650

摄像头时钟已与 CSI 状态解耦 (behavior)

传感器时钟现在独立于 CSI 状态。set_clock / set_frequency 仅在请求的频率与当前频率相差超过容差时才重新配置时钟,而 get_clk_frequency 接受一个布尔值以返回精确(而非标称)频率。OpenMV N6 和 AE3 上的默认时钟为 24 MHz,因此启动时无需显式调用 set_clock()。为时序敏感的捕获而切换时钟的脚本应重新检查其假设。

提交: 2040a0a0009c0052df66ade9aea7e0a251bce6f43f3ca

USB 调试协议与固件目标 (tooling)

这些都不影响 MicroPython 脚本。移除了过时的 USBDBG 命令(SCRIPT_SAVETEMPLATE_SAVEDESCRIPTOR_SAVEATTR_READATTR_WRITETX_INPUTSET_TIME),来自旧版 IDE 的不受支持命令现在会被刷新丢弃,而不再在连接时使 TinyUSB 开发板崩溃;移除了旧版 STM32 UVC 固件目标。旧的主机工具应当更新;详情请参阅 固件仓库 的历史记录。

提交: 90bd11e93657c9a63235182f035

迁移清单

要顺利移植到 v4.8.0,通常需要做的工作是:

  1. 如果你通过 fir 使用 FLIR Lepton,请改为将其作为摄像头传感器来捕获(fir/Lepton 变更)。

  2. machine.PWM 替换任何 buzzer 的使用(buzzer 移除)。

  3. 移除 omv.disable_fb() 调用(omv.disable_fb() 移除)。

  4. 对于 image.ImageIO:使用小写的 'r'/'w',并预期 'w' 会截断文件(ImageIO 变更)。

  5. 对于自定义 ML 后处理回调:自行对原始张量引用进行反量化,或依赖默认的浮点路径(回调变更)。

  6. 重新检查任何为时序敏感的捕获而驱动传感器时钟的脚本(时钟变更)。