昨天下单pre-order了Kinect,同时打消了长久以来买一个Wii的念头。和Wii类似但更先进,Kinect不需要任何控制器,就能追踪你的身体的3D动作并识别。简单来说,就是全身上下都参与游戏。我对Kinect为什么能做到这点很感兴趣,但找不到相关的正式论文以及技术白皮书,所以去网上查了一些对应的资料。从百度百科上看到,以色列公司PrimeSense是Kinect的主要测量技术提供商,所以去它们的台湾公司主页闲逛了一圈,收获不少。 总的来说Kinect的强大,主要还是体现在多重传感器的使用上,这是一个trend,不管是医疗电子化,还是虚拟现实,还是人机交互革命,新涌现的各种各样的传感器都将扮演重要的角色。比如Kinect,它的具体构造如图 小小一个设备,就包括了用于面部表情和动作识别的摄像头,深度传感器,和用于语音识别的多点阵列麦克风。他的工作原理大概是这样的,首先,正中间那个就是普通摄像头,顾及是用来识别和追踪身体的相应部位,追踪是靠底部的马达随着对焦物体的移动而转动实现的,这个技术倒是不新,麻烦的是图像处理的算法要有比较高的精度,所以需要用到的辅助信息来自于摄像头两边的深度传感器。这两个传感器分别由红外线发射器和红外线摄像机构成。个人猜测工作流程大概是,Kinect通过摄像头里面获得的视频流来判断面前的用户是否有动作,如果有,就通过发射器发射红外线,再用摄像机(一个CMOS image传感器)来收集反射回来的红外线,并计算出景深。这里,景深是关键,因为对于摄像头来说,可以通过可视范围内的像素做物体的识别,但这些物体哪些是人哪些是背景呢?景深就是一个很重要的信息了。有了景深,加上可能实现就有的人体识别的training数据(我估计Kinect事先已经内置了不少较为常见的人体形状与姿态数据),就可能达到很高的识别精度。 但景深的精准测量并不是很容易做到。一开始微软宣布Natal项目的时候,有人最早猜测判断人体位置是红外线测温度,但这个方面拿来成像还行,测距的话在实用中差了十万八千里,所以一开始我就觉得不靠谱。我最早听到Natal项目信息的时候,也猜了几种方法,比如两个摄像头分别扮演左眼和右眼的角色,拍摄3D影像,然后一个红外线传感器来检测深度,这是网上流传最广的方法。或者就是直接搞多个红外线测距器,扩大测距范围,这种方法简单粗暴,但我当时比较怀疑精度。 后来谜底揭晓,微软采用PrimeSense公司提供的光编码(light coding)技术,网上关于这个技术的描述如下: Light coding,顾名思义就是用光源照明给需要测量的空间编上码,与传统的结构光方法不同的是,他的光源打出去的并不是一副周期性变化的二维的图像编码,而是一个具有三维纵深的“体编码”。这种光源叫做激光散斑(laser speckle),是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。这些散斑具有高度的随机性,而且会随着距离的不同变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源的标定。在PrimeSense的专利上,标定的方法是这样的:每隔一段距离,取一个参考平面,把参考平面上的散斑图案记录下来。假设Natal规定的用户活动空间是距离电视机1米到4米的范围,每隔10cm取一个参考平面,那么标定下来我们就已经保存了30幅散斑图像。需要进行测量的时候,拍摄一副待测场景的散斑图像,将这幅图像和我们保存下来的30幅参考图像依次做互相关运算,这样我们会得到30幅相关度图像,而空间中有物体存在的位置,在相关度图像上就会显示出峰值。把这些峰值一层层叠在一起,再经过一些插值,就会得到整个场景的三维形状了。 我唯一不清楚的地方,就是该激光散斑是通过所有粗糙物体都会形成同样高随机性的衍射图案,还是说任何一个特定的粗糙物体对应一个unique的高随机性衍射图案。如果是前者,那么参考平面的截取和计算就会非常方便,如果通过数据共享甚至可以引入分布式的概念提高计算速度。如果是后者,那么每一台Kinect的参考空间都是不一样的,不仅出场时需要针对每一台设备进行校正,而且计算也必须都在本地进行,可能会带给Kinect潜在的运算性能隐患。 阵列麦克风这个技术好像也是PrimeSense提供的的,就是多组麦克风一起工作,方便噪音的消除,这个技术是很简单的,而且因为是阵列,几乎可以肯定这玩意用了Beamforming技术,因为这个模型能提供给你声源的大体位置。但对于商业产品来讲,要找到最合适的阵列排布比较困难,而且针对各个国家和口音的语料库也比较难做。当然以微软之力,这些应该都不是问题。因为没有拿到机器,我也不知道具体的效果会如何,要是不能分辨我这种Chingnish,就悲剧了。 上述技术结合起来,就形成了PrimeSense勾勒的这个场景 在没拿到设备之前,我对Kinect最大的担忧就是两点:延迟和精度。特别是深度检测和运动追踪的所有计算都在本地进行,到时候响应时间能否跟上剧烈运动类型的游戏,还需观察。当然,这些游戏可以针对Kinect做优化,这就是另外一方面了。至于精度,瓶颈很大程度上可能在于运动追踪,这个如果资料库足够大,我估计微软还是能handle的。 从Kinect的推出我们可以看到,未来的世界,是传感器的世界。各种各样的传感器会逐渐渗入人们的生活,和当年的手表一样普遍。而对于移动平台开发者来讲, 如何有效利用平台上的传感器 如何有效和别的互补平台上的传感器沟通 这两个课题深入研究下去,会很有意思,也会有很大的商业价值。