Skip to content

SpikeCV: Open a Continuous Computer Vision Era

Updated: at 14:57

摘要: 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),从而生成二进制脉冲流S S

Si,j,k={1,若存在 t((k1)τ,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的脉冲流S S

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的介绍也都是些很常见的工程做法。没有很多好说的东西。


Previous Post
Conv2Former: A Simple Transformer-Style ConvNet for Visual Recognition
Next Post
Neuromorphic computing at scale