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.CSIAPI,支持多个摄像头同时工作,与旧版sensor模块一同引入。OpenMV N6。 STM32N6 开发板,搭载 Neural-ART NPU、三重缓冲、Soft-CSI 和 ToF 模块。
NPU 推理。 用于硬件加速模型推理的 ST Neural-ART(STAI)后端。
GenX320 事件模式。 RAW 事件输出,加上用于事件摄像头渲染的
draw_event_histogram()。重新组织的 ML 后处理 —— 厂商子包(
ml.postprocessing.ultralytics、mediapipe、edgeimpulse、darknet),并新增 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_EVENT、csi.IOCTL_GENX320_READ_EVENTS、csi.IOCTL_GENX320_CALIBRATE、事件类型常量以及新的示例脚本。ML —— 新增 ST Neural-ART(STAI)NPU 推理后端;
ml.Model新增了postprocess=关键字参数(即使没有回调,后处理器现在也会在predict()内部自动运行);ml.postprocessing被重新组织为厂商子包 ——ml.postprocessing.ultralytics(YoloV5、YoloV8)、ml.postprocessing.darknet(YoloV2、YoloLC)、ml.postprocessing.edgeimpulse(Fomo)和ml.postprocessing.mediapipe(BlazeFace、BlazePalm、HandLandmarks、FaceLandmarks)—— 旧的 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在不带显式锚框构造时不再崩溃。
硬件与开发板支持¶
破坏性 API 变更¶
v4.7.0 与 v4.8.0 之间面向用户的 API 破坏性变更。范围:modules/ 中的 Python C 模块和 scripts/libraries/ 中的 Python 库。
每项变更都标注了其影响:
major —— 大多数使用它的脚本都需要修改。
minor —— 范围较窄的 API;仅影响使用它的脚本。
behavior —— API 相同但结果不同;请重新检查经过调优的脚本。
tooling —— 仅影响主机工具 / 从源码构建。
变更按影响程度依此顺序分组 —— 先是 major,然后是 minor、behavior 和 tooling。如果你只想移植代码,请直接跳到末尾的 迁移清单,那里有一份精简的待办列表。每个提交哈希都链接到其在 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)保持不变。
buzzer 模块已移除 (minor)¶
buzzer 模块已从 STM32 和 i.MX RT 端口中移除。请改用 machine.PWM 来驱动蜂鸣器;新增了一个使用 PWM 的 Pure Thermal 蜂鸣器示例。
omv.disable_fb() 已移除 (minor)¶
omv.disable_fb() 函数已被移除;帧缓冲区流传输现在通过摄像头 API 控制。依赖它的旧版 RPC 桌面脚本也已被移除。
csi 是新模块 —— 其 API 尚未冻结 (minor)¶
csi 模块在 v4.8.0 中引入,其 API 在本次发布过程中有所演进:csi.fb() 已被移除,csi.CSI.snapshot() 的 (image=...) 现在要求传入一个可变的图像,并将捕获的帧绘制/缩放到该图像中,而不再执行原始的深拷贝。新模块的早期使用者应重新测试;旧版 sensor API 不受影响。
image.ImageIO 流模式与 close() (minor)¶
image.ImageIO —— mode 参数现在仅接受小写的 'r' / 'w'(大写会被拒绝并给出更新后的错误消息),且以 'w' 打开总是截断/重建文件,而不再保留现有的流。ImageIO.close() 现在是幂等的(关闭一个已关闭的流不再引发异常),并返回 None 而非流对象。
BlazeFace / BlazePalm 的返回值 (minor)¶
BlazeFace 和 BlazePalm 后处理器(本版本新增)现在返回单个边界框列表,而非完整的按类列表 —— 调用者可直接索引结果,而无需使用 [0]。
提交: 75e16b573
ML 后处理器回调接收原始张量 (behavior)¶
ml.Model 的 predict() 后处理回调现在接收原始(量化的)输出张量引用,而非预先转换的浮点 ndarray —— 这避免了在大型模型上耗尽内存。如果未提供回调,仍会返回浮点 ndarray。自定义回调必须自行对张量进行反量化(内置的后处理器已经这样做了)。
提交: 84e6ee650
摄像头时钟已与 CSI 状态解耦 (behavior)¶
传感器时钟现在独立于 CSI 状态。set_clock / set_frequency 仅在请求的频率与当前频率相差超过容差时才重新配置时钟,而 get_clk_frequency 接受一个布尔值以返回精确(而非标称)频率。OpenMV N6 和 AE3 上的默认时钟为 24 MHz,因此启动时无需显式调用 set_clock()。为时序敏感的捕获而切换时钟的脚本应重新检查其假设。
USB 调试协议与固件目标 (tooling)¶
这些都不影响 MicroPython 脚本。移除了过时的 USBDBG 命令(SCRIPT_SAVE、TEMPLATE_SAVE、DESCRIPTOR_SAVE、ATTR_READ、ATTR_WRITE、TX_INPUT、SET_TIME),来自旧版 IDE 的不受支持命令现在会被刷新丢弃,而不再在连接时使 TinyUSB 开发板崩溃;移除了旧版 STM32 UVC 固件目标。旧的主机工具应当更新;详情请参阅 固件仓库 的历史记录。
迁移清单¶
要顺利移植到 v4.8.0,通常需要做的工作是:
如果你通过
fir使用 FLIR Lepton,请改为将其作为摄像头传感器来捕获(fir/Lepton 变更)。用
machine.PWM替换任何buzzer的使用(buzzer 移除)。移除
omv.disable_fb()调用(omv.disable_fb() 移除)。对于
image.ImageIO:使用小写的'r'/'w',并预期'w'会截断文件(ImageIO 变更)。对于自定义 ML 后处理回调:自行对原始张量引用进行反量化,或依赖默认的浮点路径(回调变更)。
重新检查任何为时序敏感的捕获而驱动传感器时钟的脚本(时钟变更)。