草庐IT

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

Yannan_Strath 2023-04-20 原文

动态视觉相机

一点点发展史

动态视觉相机 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/

有关类脑传感器:动态视觉相机(Dynamic Vision Sensor)和动态音频传感器(Dynamic Audio Sensor)的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  3. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  4. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  5. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  6. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

  7. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  8. ruby - 动态方法链? - 2

    如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210

  9. ruby - 如何使用 method_missing 动态声明方法? - 2

    我有一个ruby​​程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method

  10. ruby - 动态扩展现有方法或覆盖 ruby​​ 中的发送方法 - 2

    假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入

随机推荐