v4.7.0

v4.7.0 是一个重要的功能版本。重点内容包括:全新的 OpenMV AE3(Alif Ensemble,Cortex-M55 + Ethos-U55 NPU)开发板,配备双核 openamp 编程模型;一个只读的 ROMFS/rom)文件系统,内含捆绑的模型与级联分类器;VL53L8CX 8x8 飞行时间支持;全新的 YOLOv8 / YOLO-LC 后处理器;以及 MicroPython 1.25。本版本还更改了内置模型与 Haar 级联分类器的加载方式,请阅读下方的破坏性变更说明。

重点内容

  • OpenMV AE3 开发板 —— Alif Ensemble(Cortex-M55 + Ethos-U55 NPU)开发板,配备完整的移植、引导加载程序和 ROMFS。

  • 双核 openamp 模块 —— 通过 RPMsg 将工作卸载到第二个 Alif 核心(@async_remote 装饰器、Endpoint / EndpointIO)。

  • ROMFS —— 一个只读的 /rom 文件系统,内置 TFLite 模型与 Haar 级联分类器,并提供一个新的 tools/mkromfs.py 主机端构建工具。

  • VL53L8CX 8x8 多区域飞行时间传感器支持。

  • 全新 ML 后处理器 —— yolo_v8_postprocessyolo_lc_postprocess

  • MicroPython 已更新至 1.25.0。

  • 破坏性变更: 内置模型与 Haar 级联分类器现在按路径从 /rom 加载(参见 ml.Model 变更Haar 级联变更)。

新功能

  • OpenMV AE3 —— 全新的 Alif Ensemble 开发板(Cortex-M55 应用核心 + Ethos-U55 NPU),包含移植、引导加载程序、开发板配置、RGB LED 以及 ROMFS 支持。

  • openamp —— 一个用于 Alif 双核(Open-AMP / RPMsg)RPC 模型的新模块:EndpointEndpointIOnew_service_callback 以及 @async_remote 装饰器,用于将经过封送的函数卸载到第二个核心。HE/HP 核心默认搭载一个基于 asyncio 的 _boot.py 任务运行器。

  • audio —— Alif 移植在 AE3 上新增了音频模块(PDM 麦克风),提供基于回调的流式 API(audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=))。

  • ROMFS —— 一个只读的 /rom 文件系统,按开发板打包内置资源(TFLite 模型、Haar 级联分类器等),新增一个 tools/mkromfs.py 主机工具(支持 tflite、tflite+vela、Haar 级联、文本、二进制),以及一个暴露 ls_romfs()scripts/libraries/romfs.py 辅助脚本。

  • ML 后处理 —— 新增 yolo_v8_postprocess(YOLOv8)和 yolo_lc_postprocess(轻量级 tiny-YOLOv2 变体,带针对嵌入式优化的默认锚框)类,每个类都接受 thresholdnms_thresholdnms_sigma

  • GenX320 抗闪烁 —— 新增一个 IOCTL_GENX320_SET_AFK ioctl,用于启用并配置事件传感器的抗闪烁滤波器(最小/最大闪烁频率,单位 Hz),并附带一个 genx320_grayscale_set_afk.py 示例。

  • VL53L8CX —— 通过 tof 模块支持 8x8 多区域飞行时间传感器(自动检测,8x8,15 Hz)。

其他变更与改进

  • MicroPython 已更新至 1.25.0(STM32 和 i.MX RT 移植),新增了上游 Alif 移植,并从 STM32 / i.MX RT 移植中移除了旧版 BT-HCI 驱动。

  • GenX320 —— 一个新的 ISSD 序列将内部像素时钟翻倍(24 → 48 MHz),以获得更高的帧率。

  • STM32N6 / ST Edge AI —— 为 STM32N6 Neural-ART 模型部署打下基础(ST Edge AI 工具与 ROMFS 支持)。

  • PAG7936 —— 现在会设置 CSI PHY 比特率,从而改善该传感器的运行。

错误修复

摄像头与传感器:

  • 修复了通过 I2C 连接的 IMU —— 将 LSM6DSx IMU 接在 I2C 上的开发板现在能正确初始化和读取(此前 I2C 路径使用了错误的读取路径和错误的常量)。

  • FLIR Boson 初始化现在会针对启动耗时约 10 秒的较旧(< IDD 4.x)传感器重试至多 10 次,并在复位时恢复出厂默认设置,使外部加载的设置无法破坏视频输出。

  • 修复了 GenX320 psee_ehc_activate_override 写入错误(为零)累积时间的问题。

  • 在不具备 FastMode+ 硬件的 STM32 开发板上,请求 I2C 快速模式现在会被正确防护,而不再静默地错误配置总线。

机器学习:

  • 修复了 YOLOv2 / YOLOv5 后处理器中边界框收集和 np.nonzero 处理的问题,提升了检测可靠性。

硬件与开发板支持

  • OpenMV AE3 —— 全新的 Alif Ensemble(Cortex-M55 + Ethos-U55 NPU)开发板。

  • VL53L8CX —— 8x8 多区域飞行时间传感器;AE3 的 ToF 传感器已从 VL53L5CX 切换为 VL53L8CX。

  • STM32N6 —— ST Edge AI(Neural-ART)模型部署基础工作。

破坏性 API 变更

v4.6.20 与 v4.7.0 之间对用户可见的 API 破坏性变更。范围:modules/ 中的 Python C 模块以及 scripts/libraries/ 中的 Python 库。

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

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

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

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

各项变更按影响顺序分组。如果你只是想移植代码,可直接跳到文末的 迁移检查清单,那里有一份精简的待办清单。每个提交哈希都链接到其在 GitHub 上的 diff。

内置模型按路径加载,而非按名称 (major)

ml.Model 不再从一个纯名称字符串加载内置模型。模型现在按路径从文件系统 / ROMFS 加载:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

C 端的 model.labels 属性已被移除;标签现在由 Python 的 ml.Model 包装器从一个旁路 <model>.txt 文件加载(若不存在则为 None)。所有随附示例以及 ml/apps.py 都已更新为 /rom/*.tflite 路径。

提交: 978fa436c3f55d956c416bc4613

Haar 级联分类器从 ROMFS 加载 (minor)

image.HaarCascade() 现在通过 VFS / ROMFS 加载内置级联分类器。默认的正面人脸级联文件已从 haarcascade_frontalface_default.xml 重命名为 haarcascade_frontalface.xml,且加载失败现在会引发 RuntimeError("Failed to load Haar cascade")而非 OSError

提交: 9de1220d8

tof.reset() / tof.deinit() 语义 (behavior)

tof 模块中,reset() 此前是 init() 的别名,并且没有真正的 deinit。tof.reset() 现在会执行真正的传感器复位,tof.deinit() 会正确关闭传感器(支持 VL53L5CX 关机)。依赖 reset() 重新初始化传感器的代码应重新检查。

提交: 20d6b53f8c743cab6a

GenX320 时序与事件模式约束 (behavior)

新的 GenX320 ISSD 序列改变了传感器的时基:帧率和曝光参数现在以 1 MHz 为单位表示,而不再按时钟缩放,且 HSYNC 消隐会根据请求的帧率动态调整。硬编码了 GenX320 时序值的脚本必须重新调优。事件模式采集现在在启用图像 transpose 时会引发错误(该配置下不支持)。

提交: 660a783d67a718c6af

迁移检查清单

要顺利移植到 v4.7.0,通常需要完成以下工作:

  1. 将内置模型的加载方式从名称字符串改为 /rom/<name>.tflite 路径,并通过旁路 <name>.txt 文件提供标签(ml.Model 变更)。

  2. haarcascade_frontalface_default.xml 更新为 haarcascade_frontalface.xml,并在级联加载失败时捕获 RuntimeError(而非 OSError)(Haar 级联变更)。

  3. 移除依赖 tof.reset() 重新初始化传感器的代码(tof 变更)。

  4. 将所有硬编码的 GenX320 帧率 / 曝光值重新调优为以 1 MHz 为单位,并且不要在事件模式下启用 transpose(GenX320 变更)。