类脑传感器:动态视觉相机(Dynamic Vision Sensor)和动态音频传感器(Dynamic Audio Sensor)

动态视觉相机

一点点发展史

动态视觉相机 Dynamic Vision Sensor(DVS),有时候也称作事件相机(Event camera)或者硅视网膜(Silicon Retina)。 提到DVS的起源就要追溯到它的发明者Misha Mahowald。 Misha师从类脑工程领域的提出者Caver mead大神(Carver mead 同时还是是VLSI电路设计的大牛级别人物, 同时还被认为是摩尔定律的命名者), 在博士期间她和Tobi Delbruck创举性的结合生物学计算机科学和电气工程领域创建了第一个硅视网膜系统。这也是最早的动态视觉相机的原型。之后她和Tobi Delbruck还有几位现在的类脑技术大牛们一起将技术带到了在苏黎世并和苏黎世联邦理工大学、苏黎世大学联合创办了INI神经信息研究所(Institute of Neuroinformatics), 专注于研究神经科学, 神经形态相关的技术, 其中硅视网膜就是其中重要的一项技术, 并于1996年Misha因为这一非凡的工程案例成为国际科技女性(WITI)名人堂成员, 遗憾的是Misha在33岁结束了自己年轻的生命。
在这里插入图片描述
但是硅电子视网膜的技术的发展并没有因为Misha的离开而停滞, 反而经过10几年的发展到现在变得更加成熟。 从INI出来的初创公司inivation已经将DVS变成成熟的产品,不仅整个传感器集成了仿生的事件像素阵列, 还在外围同步集成了如RGB相机, IMU传感器,帮助其实现更强大的信息同步和收集能力。 另一个具有强劲实力的初创公司Prophesee提供高分辨率的动态视觉传感器, 并和sony合作将最先进的光学电子工艺和dvs结合, 大大的减小了芯片面积和光学性能。此外, 还有一系列的高科技初创公司正在蓄力待发, 同时在应用算法层面, 也有越来越多的科研学者和工程师专家已经把事件相机信号应用在各行各业中。
在这里插入图片描述
图: Inivation生产的动态视觉相机

在这里插入图片描述
图: Sony即将投产的事件相机传感器芯片

动态视觉传感

那么什么是DVS呢, 用通俗易懂的话来讲就是:“它只对运动的目标成像。”

从工作原理上来讲, DVS最大的特点是–异步感知。我们拿传统的数字相机来对比:

对于传统相机来说, 它的每个感光原件会根据一定的采样率对整个感光阵列进行同步的采样, 所以每次成像它需要依赖于一个时钟信号当作reference。 以这样的形式我们就得到了一个对光电流信号采样的真实值的阵列,假设说我们有100x100大小的一个像素阵列,RGB三个采样通道和1/30秒的采样率的话, 我们每秒就会得到 100x100x30x3这么大的数组, 其中100x100x3就是我们常说的一帧图片。

区别来了, 对于同样100x100的像素阵列来说, DVS里的每个像素的工作是相互独立、互不干涉的。也就是说每个感光像素都只对自己所负责的一部分区域进行独立感光。 同时, 每个感光像素都不再直接采样实值, 而是时时刻刻去比较光电流的相对变化值是否超过了一个阈值。相对应来说, 光照强度的变化其实对应着光电流的大小变化, 其实DVS上的每一个像素位置是在感受相对光照强度的变化是否明显。当在对应像素上感受到足够的光强变化时, 传感器就会发出一个“事件信号”, 通常来说这个信号是一个数据包包含着下面的信息

  • 像素的坐标地址 (x, y)
  • 光照强度变化的极性
  • 事件发生的时间戳

如下图所示, 假设我们同时用DVS(图下方)和传统相机(图上方)对这个转动的圆盘成像, 我们就可以清晰的看出区别。传统相机的成像基于采样率所以会丢失掉帧和帧之间的信息, 圆盘上黑点的运动是离散的体现在每一帧图像的不同位置上的, 而当圆盘停止转动的时候, 传统相机依旧会按照采样率对静态的圆盘成像。

而对DVS而言, 只有光照强度变化的像素区域才会发出事件信号, 同时又没有采样率的限制, 我们得到的数据输出在圆盘转动的情况下可以看到的是一串连续的事件流。而在圆盘停止转动的时候因为无光强明显变化, DVS相机是没有任何信号的生成的。所以对于DVS来说, 它的输出脱离了采样率对于不同的场景来说是完全不一样的。 对于大体积、高速运动物体的成像可能是很多的, 但是对于如静止的背景,可以说是完全不产生数据。
在这里插入图片描述
图:传统相机VS事件相机

如下图所示,为简单的一个DVS像素的工作原理。 因为博主对IC电路并不精通所以就不强行分析了。 但是是可以看出整个pipeline里由几个功能模块组成, 前端的感光元件, log域计算, 差分放大, 和比较器。 其中当光强的log值在向较大方向变化时我们得到极性为ON的事件反之我们得到OFF事件。

在这里插入图片描述
图: DVS像素工作原理

那么DVS对于视觉传感来说能带来什么优势呢?

  • 高动态范围
    懂摄像的盆友应该知道, 当你拍摄的图像在光线上有巨大的差异时,更大的动态范围就能获得更大的影调空间——例如一个有明亮窗户和昏暗内部的地点。来自窗户的光线比墙壁内部的光线要亮得多,如果动态范围不够大,这时要么窗户的光线太亮,曝光过度(看起来是白色的),要么墙壁太暗,曝光不足(看起来是黑色的)。 DVS的成像因为取决于光强的相对变化值, 这使它在过曝光和欠曝光的状态下也能稳定清晰的成像。一个DVS的理论动态范围约为120dB。而人眼的动态范围大概只在30-40dB左右。
    在这里插入图片描述
    事件相机在暗光中的成像

  • 克服成像的运动模糊
    因为DVS突破了传统相机中的采样率, 那么对于运动的物体的成像也就不再有帧率的限制。 动态模糊本质的产生原因是相机成像帧率和物体运动的速度不匹配, DVS产生的连续的事件流在理论上可以等效为4000-5000FPS成像速度。目前大部分的DVS相机都可以做到us级的成像延迟, 而对于一个传统30FPS的相机来说他的延时约为33ms。
    在这里插入图片描述
    图:事件相机的高速成像

  • 超低功耗

因为DVS的异步感知和只感知光照的变化强度的关系, DVS在大部分典型视觉场景下产生的数据是极为稀疏的, 大多数事件相机的功耗都在10mW的级别, 有部分原型相机的功耗甚至可以做到小于10uW, 这个数字远远低于传统数字相机(百毫瓦级)。

在这里插入图片描述
图: 传感器间对比(摘自维基百科)

动态音频传感器(Dynamic Audio Sensor)

动态音频传感器DAS又称硅耳蜗(silcon cochlear),他的功能是把各种现实生活中的声音信号变成事件信号。和DVS一样, DAS的本身原理也是通过电路设计将信号转换为异步的事件信号。 它的发明者Shih-Chii Liu也出自上文提到的大明鼎鼎的神经信息研究所INI,这个发明也带领着事件驱动传感迈向了更广阔的音频信号处理领域。Shih-Chii也因此研究获得了 Misha Mahowald Prizes(没错, 就是为了纪念Misha在类脑领域的贡献设置的奖项)。

在这里插入图片描述
图: DAS的功能模块

DAS实现的是在电路层面上模仿生物听觉系统的功能, 也就是从真实视觉声音激励变成电脉冲信号的过程。按博主的理解: 听觉电信号的产生是因为分布在耳蜗中的内绒毛器官可以对不同强度和频率的震动产生规则的电信号,这一现象称为频率拓扑。 这就很像现代数字信号处理里对声音的时频谱分析。而在DAS里, 这一过程被工程化为符合频带范围的若干个带通滤波器组和半波整流器, 加上一系列电路设计和信号处理必要的模块, 我们就可以实现声音信号到脉冲信号的转换。

和DVS一样, DAS的输出数据也是事件流信号的,其反应的应是一个通道内的信号能量变化强度是否超过了阈值,一个事件数据包会包含:

  • 发出事件的通道
  • 极性
  • 时间戳

以Shih-Chii的工作为例, DAS有双声道输入, 64个通道(每个声道apply32个band pass filter), 两个声道的信号相互在事件上匹配, 片上有数控偏置和片上麦克风, 并且可以直接提供AER接口到类脑芯片上。而整体功耗只有18-26mW。

在这里插入图片描述
图: DAS的响应-- 语句”The quick red fox jumped over the lazy dog“

类脑传感器的应用

其实除了视觉和声音这两类信号,事件驱动传感也在各个其他信号的领域被证实其可行性和高效, 例如IMU,EEG, ECG信号等。 那么对于这些新型传感器有哪些应用呢?

以DVS为例, 科研学者们已经展示出了其巨大的应用前景。

  • 比如使用DVS的信息和当前低帧率的RGB相机的信息融合, 我们可以重建出一个可以输出超高帧率的低成本相机系统(去模糊)。
    在这里插入图片描述
    图: DVS去模糊

  • 应用事件相机实现无人机的高速避障

在这里插入图片描述
图: 无人机高速躲避

  • 一些自动驾驶, 机器人应用场景下的复杂任务比如SLAM, 目标识别, 光流估计等。
    在这里插入图片描述
    图: DVS光流估计

  • 甚至搭配天文望远镜看看月球~
    在这里插入图片描述
    图: DVS在天文任务中的应用

对于DAS而言, 配合着相应的后端神经网络算法, 我们可以做到低功耗的各类语音任务例如:

  • 声源定位, 通过双声道直接产生的相位差估计声源的方向和位置
  • 声纹识别, 判断发出音频的个体
    在这里插入图片描述
    图: Speaker Verification

最后

这里不得不回到类脑技术这个大范畴的名词。 作为整个计算的最前沿:传感效率的高低和传感信号和后端计算模式的匹配程度必然影响着整个智能系统的表现。 类脑技术的完全体 = 事件驱动传感 + 异步类脑芯片计算配合着高效利用异步机制的算法。 而脉冲神经网络的异步运算机制和这些放生传感器天然契合, 我们已经可以看到一些初创公司使用类脑技术实现了mW级别的感算一体智能芯片, 相信在不远的将来, 我们就可以看到这些新兴的传感技术和计算技术在我们身边。

Reference:

[1] https://en.wikipedia.org/wiki/Event_camera
[2] https://spectrum.ieee.org/prophesees-eventbased-camera-reaches-high-resolution
[3] https://inilabs.com/products/dynamic-audio-sensor/
[4] https://www.youtube.com/watch?v=Ik0-1yjERCw
[5] https://inivation.com/buy/
[6] https://zhuanlan.zhihu.com/p/530995025

Misha Neuromorphic Award: https://www.mahowaldprize.org/
苏黎世神经信息研究所: http://www.ini.uzh.ch/

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
动态数组类(DynamicArray)是一种可以动态增加或减少长度的数组。它的长度可以根据需要进行自动扩展或收缩。动态数组类通常用于需要频繁插入、删除或者动态调整大小的场合。 动态数组类的实现基于静态数组,通过动态申请新的内存空间,将原有的数据复制到新的内存空间中来实现自动扩展或收缩。当数组长度不够时,动态数组类会自动申请更大的内存空间,将原有的数据复制到新的内存空间中,并释放原有的内存空间;当数组长度过长时,动态数组类会自动收缩内存空间,以节省内存使用。 动态数组类的常见操作包括随机访问、插入元素、删除元素、获取数组长度等。具体实现可以使用模板类,支持不同类型的数据。以下是一个简单的动态数组类的示例代码: ```cpp template<typename T> class DynamicArray { private: T* data; int capacity; // 当前内存容量 int size; // 实际元素个数 void resize(int new_capacity) { T* new_data = new T[new_capacity]; for (int i = 0; i < size; i++) { new_data[i] = data[i]; } delete[] data; data = new_data; capacity = new_capacity; } public: DynamicArray() { data = new T[1]; capacity = 1; size = 0; } ~DynamicArray() { delete[] data; } int getSize() { return size; } T& operator[](int index) { if (index < 0 || index >= size) { throw "Index out of range."; } return data[index]; } void add(T item) { if (size == capacity) { resize(capacity * 2); } data[size++] = item; } void insert(int index, T item) { if (index < 0 || index > size) { throw "Index out of range."; } if (size == capacity) { resize(capacity * 2); } for (int i = size - 1; i >= index; i--) { data[i + 1] = data[i]; } data[index] = item; size++; } void remove(int index) { if (index < 0 || index >= size) { throw "Index out of range."; } for (int i = index; i < size - 1; i++) { data[i] = data[i + 1]; } size--; if (size <= capacity / 4) { resize(capacity / 2); } } }; ``` 这是一个基于模板类实现的动态数组类,支持任意类型的数据。它包括了常见的数组操作,如随机访问、添加元素、插入元素、删除元素等。通过动态扩展和收缩内存空间,可以实现数组长度的动态调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值