跳到主要内容
起居室老虎
返回

SpikeCV: Open a Continuous Computer Vision Era

1,624 字约 6 分钟

原文:arXiv:2303.11684 · Zheng et al., Sci. China Inf. Sci. 2026

摘要: SpikeCV 是一个面向脉冲(Spike)相机的新开源计算机视觉平台。脉冲相机是一种近年来快速发展的神经形态视觉传感器,其工作方式是:每个像素点直接累积光强并异步触发脉冲(spike),输出的二值脉冲最高可达 40,000 Hz。作为一种新的视觉表达形式,脉冲序列具有高时空完整性,能够保留外界连续的视觉信息。借助脉冲相机低延迟和高动态范围的优势,基于脉冲数据的许多算法已在高质量成像、超高速目标检测等方面取得了显著进展。为了构建脉冲视觉的社区生态,并帮助更多用户更好地利用脉冲相机,SpikeCV 提供了多种超高速场景数据集、硬件接口和易于使用的模块库。SpikeCV 主要关注以下方面:对脉冲数据的封装、数据集接口的标准化、视觉任务的模块化以及在高挑战场景下的实时应用。随着开源 Python 生态系统的发展,SpikeCV 的各模块可以作为 Python 库使用,从而满足研究人员大部分的数值分析需求。我们在离线推理和实时应用中展示了 SpikeCV 的高效性。项目仓库地址分别为:https://openi.pcl.ac.cn/Cordium/SpikeCV, https://github.com/Zyj061/SpikeCV

1. Intro

Contributions:

2. Background

2.1. Mechanism of Spike Camera

image.png

脉冲相机的传感器由H×WH \times W个像素单元组成,这些单元会连续接收光子并触发脉冲。如图所示,在位置 (i,j)(i, j)处的瞬时光强 Li,j(t)L_{i,j}(t)会被转换为电信号,从而在时刻 tt增加电压 Vi,j(t)V_{i,j}(t)。当 Vi,j(t)V_{i,j}(t)达到阈值Θ\Theta 时,该像素点的电压会被复位为 0 并触发一次脉冲。其过程可被公式化为

Vi,j(t)=[∫ti,jlasttα⋅Li,j(ϕ)dϕ]modΘ,V_{i,j}(t)= \left[\int_{t_{i,j}^{\text{last}}}^t \alpha \cdot L_{i,j}(\phi)\, d\phi \right] \bmod \Theta,

其中ti,jlastt_{i,j}^{\text{last}}表示在(i,j)(i, j)位置上次触发脉冲的时刻。后端的同步电路会以非常小的时间间隔τ\tau(25 微秒)持续轮询V(t)V(t),从而生成二进制脉冲流SS:

Si,j,k={1,若存在 t∈((k−1)τ,kτ] 使得 Vi,j(t)=0,0,否则.S_{i,j,k}= \begin{cases} 1, & \text{若存在 } t \in ((k-1)\tau,\, k\tau] \text{ 使得 } V_{i,j}(t) = 0, \\ 0, & \text{否则}. \end{cases}

其中k=1,2,…k = 1, 2, \dots表示第kk次轮询。对于总共进行 TT次轮询的情况,则会输出大小为H×W×TH \times W \times T的脉冲流SS。

2.2. Spike-based Algorithms

3. Design Principles

3.1. Usability

class SpikeStream:
def __init__(self, offline=True, **kwargs):
self.SpikeMatrix = None
self.offline = offline
# 根据输入流的类型设置参数
if self.offline:
# 从文件读取离线数据
self.filename, self.height, self.width = ParseKwargs(...)
else:
# 来自脉冲相机的在线数据流参数
self.decode_width, self.height, self.width = ParseKwargs(...)
def get_device_matrix(self, input, framepool, block_len=500):
... # 从设备(脉冲相机)获取脉冲矩阵
def get_spikes(self, input, framepool):
... # 用于在线脉冲流的读取线程
def get_spike_matrix(self, flipud=True):
... # 从离线文件获取脉冲矩阵
def get_block_spikes(self, begin_idx, block_len=1, flipud=True):
... # 从文件中获取以 begin_idx 为起始的部分脉冲块
...
# 面向开发者的其他接口

统一 online or offline 读取接口然后做成长的像常见 CV 的接口;提供了一些 preprocess 等工具;

3.2. Real-time

多线程读数据的 pipeline 等;具体见 Section4;

3.3. Spike Ecosystem

OpenCV like Spike Camera Library。

4. Details of SpikeCV

4.1. Architecture

image.png

image.png

其他的处理没有很多好说的,感觉这块就是纯工程,之前从工业相机读 frame 要保证实时性的时候基本也是这么做的,一个 thread 读 raw data 然后加包头包尾 timestamp 之类的信息然后送入队列,定时丢掉超过延迟上限还没有被处理的 frame。

4.2. Workflow

image.png

就大概是讲他们的工作可以覆盖全流程。

4.3. Datasets

image.png

留档参考,之后跑实验可以用上的数据集。注意到里面写的 resolution 都很小,小于现在常见的 DVS 相机的分辨率,为什么?

5. Verification Application

image.png

image.png

在自己的工具上面测了一下全流程。

6. Conclusion and Future Work

本文详细介绍了面向超高速脉冲相机的开源平台 SpikeCV,从其设计原则、工作流程以及各模块的使用方式展开说明。目前,SpikeCV 已整合了丰富的规范化脉冲数据集、易用的硬件接口以及大量基于脉冲的算法模块。实验结果展示了 SpikeCV 在离线数据集和在线相机这两种数据来源下,对图像重构、光流估计、深度估计、检测、跟踪和识别等任务的全面支持,验证了该平台的有效性与易用性。

未来,我们将继续致力于打造更完善的脉冲视觉研究社区:

感觉总体就是做了这样一个东西,写一个介绍性的文档。里面关于 real-time 的介绍也都是些很常见的工程做法。没有很多好说的东西。