摘要:为了使聋哑人与更多不懂手语的人自然地交流,本作品将手语翻译成文字和语音,利用Microsoft Kinect记录手语手势的三维坐标,通过机器学习和优化算法,在Intel Atom平台上实现了手语翻译。
关键词:手语;识别;手势;英特尔;Kinect
DOI: 10.3969/j.issn.1005-5517.2012.9.019
简介
手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。
另一方面,聋哑小朋友由于很难表达自己,以及中国的聋哑教师数量有限,导致他们的学习出现困难,得不到和普通小朋友同等的学习机会。
为了解决这个问题,我们设计实现了一个从手语动作翻译成文字和声音的翻译器,令学习手语更有趣、更方便、更容易,以达到这个项目缩少聋哑人士与其他人的沟通障碍的目的。
工作原理和算法
特征提取
深度***像的分辨率是640x480,意味着每秒钟的数据有17.6MB,存储如此大量的数据是不可能的。同时许多没有用处的数据(例如背景)都包含在原始数据中。因此我们必须从原始数据中提取出有用的信息。骨架是一种可以用来表示手语的有用信息。
我们利用Kinect和OpenNI提取用户的骨架节点得到XYZ三点的坐标。我们一共提取了6个骨架节点,左手、左手肘、左肩、右手、右手肘、右肩。对于每一帧,我们从这些节点中计算出14个特征向量来表示这一帧的手语动作。经过标准化计算,我们用121帧来表示一个手语词语,因此每一个词语有1694个特征。
原始数据标准化
我们通过均匀分配和插值使原始数据标准化。通过二次插值法,利用最相近的三个原始数据计算出标准化的数据,使得每一个手语动作都统一用121帧来表示。
支持向量机
SVM(支持向量机)是统计学和计算机科学中的概念,简而言之,给定一组已经分好类别的数据,而且分类依据是未知的,支持向量机训练算法可以通过计算构建一个模型 ,一组新的数据到来时可以预测出新的数据属于哪一个类别。
SVM的模型将所有数据映像到一个高维空间里,并计算出不同类别数据之间的最大化几何边缘区,然后把新的数据映射到同一个空间,根据之前计算出的最大化几何边缘区来预测新的数据属于哪一个类别。
平台限制与解决方法
平台限制
使用Kinect的建议系统需求是CPU有双核2.66 GHz或以上,内存有2GB或以上,但Intel提供的平台只有分别1GHz CPU和1G 内存,明显与系统需求有差异。
即使我们使用Linux操作系统,处理器使用率依旧满载,并且帧率只有大约2到4左右,远少于正常的30帧。在这种条件下,再加上处理器资源已被提取资源的线程占据,所以不可能在处理器里进行资料分析的工作。
瓶颈
为了找出瓶颈,我们首先关闭了***像用户接口。虽然处理器使用率降至85%,但帧率跟之前的一样。我们观察得到其中一个OpenNI控制的线程依然是占领了整个线程。只是由于所提供的平台是双线程的关系,使用率分别被定在50%及35%。
其后我们关掉骨架提取的功能,使用率大幅降低到只有25%。经过进一步性能分析的工作,我们证实了瓶颈的来源就是骨骼提取。不幸地,骨骼提取的算法并不是开源的,而是被PrimeSence所保护。所以我们并不能通过修改原代码或是把算法放到 FPGA里以达致降低处理器使用率的效果。
解决方法
为了解决这个问题,我们尝试选择性地使用原始数据。原来数据传递方式是用户产生器(User Generator)直接从深度***像产生器(Depth Generator)得到原始数据。新的方法就是设立一个仿真深度***像产生器(Mock Depth Generator)。它会仿真成原来的产生器,而用户产生器则从它得到数据。
当Kinect得到新的数据,它会将数据传给深度产生器,然后后者会发给仿真深度***像产生器。而每隔一个帧,仿真深度***像产生器会将得到的数据传给用户产生器。换言之,两帧从Kinect上得到的数据,只有一帧会真正被用作提取骨架,而另一帧将会被忽略。
这个做法虽然令帧率降低到15,但处理器使用率却降至只有50%。而且经过我们的验证,几乎没有出现丢帧的情况,即使出现亦没有影响到提取骨架节点的质素。经过这个特殊处理,我们确定在这平台使用Kinect是可行的,甚至还可提取额外的处理器资源用以其他运算工作。
***1 数据处理流程
设计和实现
概述
系统通过Kinect获取深度影像,并使用应用程序OpenNI从深度影像中提取用户的骨架。在获取的骨架中,我们选取左右手、肘、肩六个关节点。总的来看,用户完成了一个手语,通过Kinect和OpenNI,系统将记录一系列的帧,每一帧由左右手、肘、肩六个关节点的三维空间向量组成。用户每一次完成同一个手语都会有差别,所以我们在特征提取之前需要对记录的帧进行常态化处理。我们使用支持向量机(SVM)对提取的特征向量进行分类。每一类表示一个手语。***2描述了整个手语识别的流程。
手语获取
双手交叉握于腹部前方。这一动作我们称之为“预备动作”,表示手语的开始和结束。为了避免潜在的识别错误,我们要求每相邻的两帧(0.13s),用户至少移动5厘米。如果用户做预备动作超过100帧(6.67s),系统将会停止获取手语数据。
数据处理
正如我们之前提到的常态化处理,我们将获取的一系列帧通过均分和插入的方法统一成121帧,即2178个三维空间向量。我们对常态化处理后的数据进行特征提取,产生1694个特征向量。最后我们将所有的特征向量放在一个矩阵里,用于SVM分类。
手语训练和分类
LIBSVM是一个用于支持向量机的集成软件,支持多类分类。用户使用LIBSVM提供的库,可以更容易地使用SVM。我们使用“svm-train”读取输入文件(Input File),生成模型文件(Model file)。我们的输入文件包含1694个特征向量。我们对每个手语单词训练20到30次。到目前为止,我们总共训练了48个手语。我们可以通过训练更多的手语扩展我们的数据库。
使用“svm-predict”可以预测用户所做的手语属于哪一类。
***2 识别流程