Kinect中的系统依赖于一组原始的理想输出(也就是最初标记的数据)来生成识别器(机器生成的代码)。而生成的识别器可以在实际应用中识别目标手势。
同时,你很快就会发现要计算上一步中选定的特性会变成一个大数据问题。30帧每秒的测试视频每小时的帧数超过10万,而每帧的像素数大约是30万个(新版Kinect还要多)。
即使你只是关注手部周围128×128的目标区域,那么每只手上要分析的像素点也超过1.6万个——也就是每帧6.4万个(出现了4只手)。尔后你将提取出来的特性输入到机器学习系统(应该叫众多的开放系统的变体)中。
Sol没有跟我们纠结各种机器学习算法间的区别,只是简单说明只要有足够的数据不同算法也会得到相近的结果(这点很容易理解)。在他们的项目中,他们采用的是ID3算法来创建决策树。ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定集合的测试属性。
如果最初选定的特性足以完成一个动作识别的判断,那么系统生成的代码就会在更多的“底层事实”上跑过。反之,你就要撤回到特性选择的这一步。
许多关于机器学习的研究论文最后都以“手指朝上,手指场下”这样的测试方法草草收尾。但对于Kinect这样的消费级产品,Sol表示这远远不够。为了达到推向市场的高标准,微软采用了数千种测试条目并且开发了配套工具来分析不同类型的错误,从而回过头来改善算法。他用了手的速率举例:很显然当手部快速移动时,捕捉到的手的位置信息会有比较大的偏差——所以抓握动作的识别算法还需要将这一点考虑进去。
在测试中,因为要分析大量的帧数,所以即使是识别正确率达到99.9%,测试的结果还是会在每小时内大量出错。每次针对这些小故障的更新都需要对识别器(也就是用于动作识别的代码)进行几处改动。
Sol提到其中的一项更新就是区别左右手的图像识别,两者不能被当成镜像对应,因为左右手的光线和阴影是不对称的。