QUT 开源 EventCV,事件表示构建最高快 3.7 倍

The EventCV Library for Event-Based Robotic Vision

Adam D. Hines, Michael Milford, Tobias Fischer

cs.RO

2026-09-18

昆士兰科技大学开源 EventCV,用 Rust 核和 OpenCV 风格接口统一事件相机读写、滤波、表示和推理;在 Jetson 上构建表示比现有次快库最高快 3.7 倍。

这篇在解决什么

买普通摄像头,插上 USB,OpenCV 一句 cv2.VideoCapture 就能进 NumPy 和 PyTorch。事件相机不是这样。每个像素独立报告对数亮度变化,输出是 (x, y, t, p) 的异步流:微秒时间戳、超过 120 dB 动态范围、数据率跟着场景活动走。高速运动和强光差里,它比固定帧率的 RGB 相机合适。

工程侧一直散。iniVation 和 Prophesee 两家 SDK 互不兼容,USB 不会自动装驱动。录下来的文件散落在 AEDAT、EVT3 RAW、HDF5、ROS bag 之间,多数开源库只读其中几种。几何变换、角点、运动估计、特征跟踪要东拼西凑;离线脚本和实机直播还常常对不上同一套接口。功能最全的 jAER 是 Java 栈,进不了现在的 Python 工作流。

这是工具链缺口。算法侧已经有十年的里程计、光流、识别和定位论文。

方法

昆士兰科技大学(QUT)机器人中心把重活放进 Rust 核 eventcv-core:切片索引、解码、相机线程、表示构建、滤波和估计器。Python 前端学 OpenCV,函数和绑定方法等价,stream.voxel(bins=5) 和 ecv.voxel(stream, bins=5) 一样。

现场相机走 Neuromorphic Drivers,覆盖 Prophesee EVK3 HD / EVK4、iniVation DVXplorer / DAVIS346、SilkyEvCam HD、IDS uEye XCP-E。九种格式同一入口:HDF5、dvsmsgs 的 ROS bag、AEDAT 2.0/4.0、Prophesee DAT 和 EVT2/EVT3 RAW、NumPy、分隔文本。ecv.load 整文件进内存,ecv.open 按切片懒读,多 GB 录制用后者。读写对称。

处理链按事件坐标直接操作,不先栅格化:

部署侧,ONNX Runtime 直接吃相机窗口。ROS 2 走纯 Rust 的 hiroz(Zenoh 原生),好让 wheel 不链 ROS C 库。Linux x86-64 / aarch64、Apple silicon、Windows x86-64 有预编译包,Jetson 不用从源码编。

结果

评测在 Jetson Orin AGX 上,9 次取中位数(2 次预热),文件已在 page cache。输入一份 3.0 s、1280×720 的 EVT3(1.163 亿事件),以及一份 651 s、346×260 的 HDF5(7.076 亿事件)。基线是 Tonic 1.6.0、evlib 0.13.2、dv-processing 2.0.4、Expelliarmus 1.1.7。全是 CPU。

从 122 万事件切片建表示:

表示EventCVTonicevlib相对次快
极性帧(2 通道)23.78 ms136.3667.222.8×
体素网格(5 bins)26.50 ms124.4497.233.7×
时间面21.33 ms59.1680.762.8×

几何平均比 evlib 快 3.4×、比 Tonic 快 4.2×。Tonic 和 evlib 没有的其余表示落在 8.56–74.85 ms。

单线程解码:EVT3 53.8 Mev/s(Expelliarmus 33.5,1.6×);AEDAT 4.0 85.4(dv-processing 在自己 LZ4 文件上 77.0,1.1×);HDF5 16.3(evlib 5.1,3.2×)。AEDAT 4.0 十二核到 631.6 Mev/s。摘要里写的 1.1× 到 3.7×,覆盖的就是解码下限和表示上限。

懒读的内存差更明显。7.076 亿事件的 HDF5,eager 峰值 8.87 GB(每事件 13.5 字节);lazy 打开 0.11 s,切成 19737 个 33 ms 窗,随机取 200 窗峰值 273 MB,差 33 倍,单窗 8.6 ms(P99 16.0 ms)。

三个案例把现有管线换进来。Prophesee 的 ev-ultralytics YOLO26 检测,OpenEB 换成 EventCV 之后,到网络 tensor 都约 10.5 ms,整窗约 28 ms,其中 YOLO26 推理约 17.5 ms,速度打平。差别在工程:EventCV 七行用户代码;OpenEB 的 Python 绑定来自第三方 apt 仓库 44 个包,绑系统 Python,没有预编译 ARM 包。SuperEvent 关键点接 Prophesee EVK4 直播,50 ms 窗,端到端 44.9–71.7 ms,合 14–22 Hz,最多 170 个点。自家 Event-LAB 定位评测原先两千七百多行自定义格式化(含 CUDA 表示构建);EventCV 的 CPU 吞吐量在室内/室外 DAVIS346 和室外 DVXplorer 三段上与那套 CUDA 相当,这一步不再需要 GPU。

热像素过滤在 3.9 GB 的 DAVIS346 录制上找到 22 个热像素,占全部事件 15.4%;33 ms 切片从 26677 降到 24584。

为什么重要

给要在机器人上用事件相机的人:pip / conda / pixi 装上就能对流,离线和实机同一套 API,aarch64 wheel 对 Jetson 是真需求。表示和解码的加速是增量,把九种格式、滤波、特征、运动、仿真、ONNX、ROS 2 收进一个包,省的是拼库时间。

这不是新算法论文。eFAST、FEAST、对比度最大化、v2e 都是既有方法的 Rust 重写。价值和 OpenCV 同类:接口密度,不是精度纪录。厂商 SDK 在自家传感器上仍然更完整。已经有稳定 Metavision 或 dv-processing 管线的话,换过来的收益主要是跨厂商和跨格式。

局限与存疑

论文自己写了三条。事件处理本身仍是 CPU,GPU 路径只是把表示交给 PyTorch 或 ONNX Runtime。ROS 2 走 Zenoh,标准 DDS 部署还要 zenoh-bridge-ros2dds。特征学习和运动估计没有跟参考实现对过精度。

还有几处没被强调。能力对照表给 EventCV 全部打满三勾,评分是作者自评。jAER 在硬件偏置、设备控制和实时跟踪上更成熟,正文也承认。YOLO 案例明确打平,速度故事主要发生在离线表示和文件解码上。Event-LAB 的 CUDA 对照没有给出精确 Mev/s,只说相当。仿真没有跟 ESIM 或 v2e 原版做事件质量对照。

术语

原文与代码

社区讨论

相关论文

全部论文解读