从Kinect和Leap Motion谈体感的开发

雷锋网  •  扫码分享

kinect cover head
【编者按】本文作者David Cardinal,David具有20余年的科技行业技术从业经验。他是DigitalPro for Windows的合作开发者,后者是Windows上首个专业的图像管理解决方案。本文是其结合今年Build大会上微软的开发经验,对 Kinect 和 Leap Motion 的体感开发所做的综述。

当年Leap Motion的CTO David Holz第一次告诉我不要将太多的精力放在他们的硬件上,理由是大部分的诀窍都在软件——我半信半疑。而后来在微软的Build大会上,Kinect开发的负责人Alisson Sol详细描述了第一代Kinect是如何演变到今天时,我终于信服了。

体感开发的重点在于软件。硬件当然要够用,但不需要拔尖。从拆解的Leap来看,它带有的仅仅是3个现成的LED以及2个普通价格的摄像头。开发团队大部分的辛苦工作都在于如何让算法精确地识别出用户的动作。微软在Kinect上的抓握动作识别是研究体感开发很好的案例。

机器学习

在过去多年里,码农们花了大量的精力用预先架构的精妙算法来节省计算资源。而机器学习在一定程度上把这事揽了过去。通过机器学习,现在我们可以将大量的数据丢给电脑让它自行计算,同时只占用很低的CPU和GPU。当然,真正做起来比这复杂很多,并且做好了不容易。但其结果将适用于一大类的识别——包括体感。

在开始机器学习之前,你首先要做的是收集大量的高质量数据。放在Kinect的例子就是数GB的深度标记的视频,视频中会有多名测试人员做出各种各样的手势、动作。然后这些视频片段需要进行人工标记来说明哪个节点上测试人员做了什么动作,这个过程其实类似传统的科研数据收集过程。最后这些人肉标记的数据被称为“底层事实”——也就是识别过程所依照的标准。

同时你还要注意的一个问题是明确方向。微软的团队过去在做抓握动作识别时采用的是判断手掌的形状是开放的还是闭合的,但很长时间没有什么进展;而Sol的团队采用的方式是直接判断抓握和松手的动作——这才是他们改善抓握动作界面的关键。

leap motion

把数据变成特性

一旦你有了足够多的标记数据,那下一步该是决定用数据的那些属性(或者特性)来判断一个手势。这点做起来不仅是技术,而且是艺术——确实不容易把握。你用来做判断的这些特性还要易于计算,比如Windows的Kinect团队只有2毫秒的时间用于识别抓握的动作。

在这个动作的识别上,团队最先采用的是计算距离掌心的像素数量(由骨架检测子系统采集)作为机器学习算法的主要特性。但后来他们发现了比较麻烦的一点,手的位置不够稳定所以这一特性很难准确地捕捉到。为此他们不得不为此开发了辅助算法——考虑了多种手的位置以及识别过程中的位移。可惜这个方法收效平平。

最后,Sol改用深度标志数据中,抓握或松手时图像帧与帧之间的像素差异来判断这一动作,也就是每个像素点较前一帧的变化都会参与共同决定动作的发生。

grip

让你的输出自己来完成代码

跟常见的面向结果的编程方式不同,机器学习系统——比如Kinect中的系统依赖于一组原始的理想输出(也就是最初标记的数据)来生成识别器(机器生成的代码)。而生成的识别器可以在实际应用中识别目标手势。

同时,你很快就会发现要计算上一步中选定的特性会变成一个大数据问题。30帧每秒的测试视频每小时的帧数超过10万,而每帧的像素数大约是30万个(新版Kinect还要多)。

即使你只是关注手部周围128×128的目标区域,那么每只手上要分析的像素点也超过1.6万个——也就是每帧6.4万个(出现了4只手)。尔后你将提取出来的特性输入到机器学习系统(应该叫众多的开放系统的变体)中。

Sol没有跟我们纠结各种机器学习算法间的区别,只是简单说明只要有足够的数据不同算法也会得到相近的结果(这点很容易理解)。在他们的项目中,他们采用的是ID3算法来创建决策树。ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定集合的测试属性。

如果最初选定的特性足以完成一个动作识别的判断,那么系统生成的代码就会在更多的“底层事实”上跑过。反之,你就要撤回到特性选择的这一步。

不要急于测试,先分析

许多关于机器学习的研究论文最后都以“手指朝上,手指场下”这样的测试方法草草收尾。但对于Kinect这样的消费级产品,Sol表示这远远不够。为了达到推向市场的高标准,微软采用了数千种测试条目并且开发了配套工具来分析不同类型的错误,从而回过头来改善算法。他用了手的速率举例:很显然当手部快速移动时,捕捉到的手的位置信息会有比较大的偏差——所以抓握动作的识别算法还需要将这一点考虑进去。

在测试中,因为要分析大量的帧数,所以即使是识别正确率达到99.9%,测试的结果还是会在每小时内大量出错。每次针对这些小故障的更新都需要对识别器(也就是用于动作识别的代码)进行几处改动。

Sol提到其中的一项更新就是区别左右手的图像识别,两者不能被当成镜像对应,因为左右手的光线和阴影是不对称的。

release

tests

你可以想象得到运行这些测试计算需要很长的时间,Sol表示即使用80核的设备测试一个抓握识别器每次也需要一周的时间。

最后,Kinect团队还罗列了Microsoft Research在提升识别器速度上的帮助。其最终的结果是Kinect在Windows SDK 1.7中能提供抓握动作的控制;对开发者来说,这是非常有用并且有借鉴意义的功能。相类似的,虽然Leap在其开发流程上并没有像Kinect一样直白,但很显然其软件实现同样将一堆现成的元件变成了当前市面上最强大的体感设备之一。

Via: extremetech
相关:
WiFi实现手势识别 挥挥手就能控制家电

随意打赏

提交建议
微信扫一扫,分享给好友吧。