摘要: 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:
- 我们提供了首个面向脉冲相机的开源平台,封装了数据集、设备接口、脉冲加载器以及基于脉冲的算法,使得构建脉冲视觉应用更加方便。
- 我们对多种视觉任务的数据集进行了标准化,并为不同视觉任务、离线文件和实时脉冲流提供了统一的数据接口。
- 通过提供硬件友好的 C++ 接口和用户友好的 Python 接口,我们实现了多种脉冲相机的硬件实时管线,使得脉冲数据的读取和处理能够同步执行。
2. Background
2.1. Mechanism of Spike Camera
脉冲相机的传感器由个像素单元组成,这些单元会连续接收光子并触发脉冲。如图所示,在位置 处的瞬时光强 会被转换为电信号,从而在时刻 增加电压 。当 达到阈值 时,该像素点的电压会被复位为 0 并触发一次脉冲。其过程可被公式化为
其中表示在位置上次触发脉冲的时刻。后端的同步电路会以非常小的时间间隔(25 微秒)持续轮询,从而生成二进制脉冲流:
其中表示第次轮询。对于总共进行 次轮询的情况,则会输出大小为的脉冲流。
2.2. Spike-based Algorithms
- Coding and simulation of spikes: 利用统计特性压缩Spike Stream,类似传统视频的编码;相关工作很多是做类似SpikeSIM一样的工具的;
- High-quality imaging based on spikes:reconstruction类,因为DVS基本没有motion blur和高动态;
- Vision tasks based on spikes:直接在Spike Stream上推CV任务;
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
- Realtime Pipeline:
- Thread 1 :接收原始脉冲流,并将其打包为若干数据块(block),然后放入队列 LibBlockQueue 。这些数据块除脉冲信息外,还包含帧头等附加信息。
- Thread 2 :解析上述脉冲数据块,将其组装为按时空顺序排列的字节流。当用户请求摄像机数据时,这些字节流会被持续地获取并放入队列 Lib-FramePool 。
- Thread 3 :负责在 C++ 库与用户的 Python 程序(APP)之间传输脉冲帧。该线程会将字节流转换为更易于用户使用的帧数据,其尺寸为 ,其中表示相机传感器的空间分辨率,是用户自定义的单帧脉冲长度。APP 中也维护了一个队列 App-FramePool ,线程 3 会持续将来自 Lib-FramePool 的数据地址传递给 App-FramePool 。APP 使用完数据后,会将地址释放回 Lib-FramePool 。
其他的处理没有很多好说的,感觉这块就是纯工程,之前从工业相机读frame要保证实时性的时候基本也是这么做的,一个thread读raw data然后加包头包尾timestamp之类的信息然后送入队列,定时丢掉超过延迟上限还没有被处理的frame。
4.2. Workflow
就大概是讲他们的工作可以覆盖全流程。
4.3. Datasets
留档参考,之后跑实验可以用上的数据集。注意到里面写的resolution都很小,小于现在常见的DVS相机的分辨率,为什么?
5. Verification Application
在自己的工具上面测了一下全流程。
6. Conclusion and Future Work
本文详细介绍了面向超高速脉冲相机的开源平台 SpikeCV ,从其设计原则、工作流程以及各模块的使用方式展开说明。目前,SpikeCV 已整合了丰富的规范化脉冲数据集、易用的硬件接口以及大量基于脉冲的算法模块。实验结果展示了 SpikeCV 在离线数据集和在线相机这两种数据来源下,对图像重构、光流估计、深度估计、检测、跟踪和识别等任务的全面支持,验证了该平台的有效性与易用性。
未来,我们将继续致力于打造更完善的脉冲视觉研究社区:
- 数据集方面 :持续提供可应用于多种算法的大规模脉冲数据集,并不断补充与完善基于脉冲的算法和处理工具。
- 硬件接口方面 :计划扩展更多相机接口,便于脉冲相机与其他数据源的融合。
- 神经形态计算 :我们将针对 neuromorphic 芯片提供接口,充分利用类脑视觉算法在低功耗和超高速处理上的优势,将脉冲视觉应用到无人机、自动驾驶等更多超高速场景。
感觉总体就是做了这样一个东西,写一个介绍性的文档。里面关于real-time的介绍也都是些很常见的工程做法。没有很多好说的东西。