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 后处理回调:自行对原始张量引用进行反量化,或依赖默认的浮点路径(回调变更)。
重新检查任何为时序敏感的捕获而驱动传感器时钟的脚本(时钟变更)。