基于Leap Motion手势识别方法在树木交互的应用
2018-10-24王红全淮永建
王红全 淮永建
(北京林业大学信息学院 北京 100083)
0 引 言
近年来,随着科技的发展,虚拟现实技术和人工智能技术成为了当前研究领域的热门问题。虚拟现实技术利用计算机技术和三维建模技术,使得用户可以通过各种传感设备从参与者的角度感受更加真实的虚拟世界,并且可以对虚拟环境中的物体进行多种方式交互。一些新型的3D体感设备推出后,比如Kinect和Leap Motion等,使人机交互技术有新的发展。手势可以为人机交互提供高效和自然的方式,手势识别对于实现更精确的人机交互效果来说是至关重要的。其中Leap Motion是一款小型手部运动追踪设备,具有高精度和快速响应能力,可以在手语识别、虚拟现实交互、医疗和娱乐等不同领域产生许多实时应用。
在国内,李浩等[1]使用Leap Motion设备,实时捕捉手部动作,研发小鼠卵巢切割可视化模拟算法,较为真实地实现了对小鼠卵巢的切割模拟。宁亚楠等[2]使用Leap Motion跟踪手部运动并根据自定义的沙画手势语义在Unity平台设计实现了虚拟沙画创作。钱露等[3]用通过Leap Motion获得的数据模拟手的运动信息,实时地反映到浏览器上,实现草图的绘制和模型的检索。吴福理等[4]通过Leap Motion体感控制器采集用户手部信息数据,通过本地计算机对数据进行处理,识别出多种的手势,再与浏览器上WebGL绘制成的虚拟植物进行实时交互,从而实现更便捷的植物三维模型的变化、更新等操作。严利民等[5]提出了一种基于Leap Motion的三维空间内的手指姿势关键特征点轨迹识别的方法,利用Leap Motion获取手部骨架的信息并经过手部骨架算法提取手指姿势关键特征点及运动轨迹。通过使用该方法能够在复杂的三维空间内实现对动态手指姿势的具有较高准确率的识别。Wei等[6]利用Leap Motion和Unity游戏引擎开发了虚拟钢琴系统,该系统可以让用户通过Leap Motion跟踪手的运动来实时地弹奏钢琴。对于手势识别来说,一种高效的方法是使用可记录每个手指运动的数据手套,吕蕾等[7]通过利用数据手套来采集手部运动的数据,运用模版匹配的方法实现对静态手势的识别。通过该方法在手势类别数目较大的情况下,识别正确率能够达到98.9%。但是,数据手套成本相对较高,缺乏追踪手部位置的跟踪能力,不适用于动态手势识别。
在国外,Manawadu等[8]使用Leap Motion作为手势识别平台,开发了一种基于手势的驾驶员车辆界面,通过利用手势对汽车发送指令以实现自动驾驶。文献[9]利用Leap Motion开发了一款应用软件,使得在不接触手的情况下测量帕金森氏病病人的震颤,有助于病人的康复治疗。文献[10]提出使用朴素贝叶斯对印尼手语系统中Leap Motion捕获的手势进行分类,理想环境的训练数据的准确率为80.5%,对未经训练的数据的准确率为70.7%。文献[11]提出了一种使用Leap Motion的阿拉伯语的手语识别模型,并将其应用到动态和静态手势中,利用KNN模型对和DTW模型分别对静态手势和动态手势进行识别,具有较好的识别效果。
本文提出利用Leap Motion设计和实现树木交互系统,重点是利用Leap Motion对手势识别进行研究,首先采用Leap Motion采集静态手势和动态手势序列帧,提取手指和掌心的位置,手势运动轨迹的位置、方位等特征。然后利用长短期记忆循环神经网络(LSTM)和SVM分别对动态手势和静态手势进行训练和分类,以实现手势识别。最终将手势识别结果应用到树木交互虚拟现实场景中,使用户能够高效、准确地对树木进行交互。
1 Leap Motion手势识别
本文中应用到手势有两种:静态手势和动态手势。静态手势是指固定的手势,没有考虑到时间的变化。动态手势在执行期间包含动作和运动轨迹。手势识别的机器学习主要包括四个步骤:(1) 选择合适的传感器采集手势;(2) 从数据中分析和提取特征,即与描述手势相关的值;(3) 使用一种或多种算法识别和解释手势,对数据进行分类;(4) 输出识别的手势名称。
1.1 Leap Motion数据采集
在本系统中,为了获取手势的数据,相比较其他设备我们选择的是Leap Motion。Leap Motion(图1(a))使用红外相机和LED测量手掌和手指的各种参数,包括它们的位置、速度、方向和几何形状(图1(b))[12]。操作范围从控制器上方25毫米到650毫米不等。Leap Motion传感器软件能够独立识别手掌手势,而无需使用外部算法,识别的手势包括圆形、轻扫和按键[13]。然而由于缺乏定制能力和相对较高的计算成本,我们决定不使用此功能而采用定制的识别算法。
(a) Leap Motion (b) 手掌骨架图1 数据采集描述
在本模块中,数据采集是通过Leap Motion设备的应用程序编程接口(API)完成的。Leap Motion的API为开发者的程序开发提供了一系列追踪手部运动的快照数据,Leap Motion官方文档中称这些快照数据为帧。追踪数据的每一帧中都包含了在快照中采集到的手势位置信息。我们可以提取三维坐标中的指尖位置和掌心位置。获取到指尖位置坐标后,就可以跟踪手势轨迹了。采集的过程中Leap Motion可能会出现数据丢失或者采样数据异常的情况,为了避免无效数据对采样结果造成的干扰,在采集过程中只采集显示正确帧的手指的信息。
1.2 特征提取
根据上面步骤从Leap Motion获得的数据,进行分析提取可用于识别手势的鲁棒特性。首先得到每个手指指尖的三维坐标位置向量,由此在单手手势中可以得到5个特征(f1,f2,…,f5)如图2(a)所示,特征中的每个点由三维空间中的〈xi,yi,zi〉向量组成。一个正常的手掌(位于它的中心)的掌心坐标位置向量设定为〈xc,yc,zc〉,可以将其作为特征f6。因此,对于一个帧中的每个手势,我们可以从设备读取到6个三维点。图2(b)给出了一个手势例子,其中没有伸出的两个手指的指尖位置与手掌中心位置近似。
(a) 指尖与掌心3D坐标 (b) 指尖坐标与掌心近似图2 特征提取描述
除了指尖位置外还需要指尖的方向,可以根据手的方向来计算三维坐标中的指尖方向。图3给出了从右向左进行一个手势的指尖运动,序列中同一个指尖的两个相邻点即P1(x1,y1,z1)和P2(x2,y2,z2)形成向量P1P2并且得到其与X、Y、Z坐标轴的夹角为α、β、γ。这些角度可以使用公式来计算,如下所示:
v=OR=〈vx,vy,vz〉
(1)
(2)
(3)
计算由f7到f11表示的五个指尖的方向特征后,中点P(x,y,z)的方向可以由一个序列的两个相邻点P1、P2来估算出来。
故在单手手势中提取了11个动态特征,即(f1,…,f5,f6,f7,…,f11)。
图3 手势序列中的两个相邻点的指尖方向计算
2 手势识别模型
2.1 支持向量机
本文使用支持向量机SVM[14]作为静态手势分类模型。之所以选择这个方法,是因为它是当今最常用的机器学习分类器之一,已经广泛应用于目标检测和识别、文本识别、生物识别和语音识别等领域。最重要的是用SVM分类器完全能满足该系统的需求。SVM中常用的核函数主要有线性核函数、多项式核函数、径向基函数、sigmoid,分类之前我们需要选择适当的核函数。本文中选用RBF核函数,公式如下:
K(xi,xj)=exp(-γ‖xi-xj‖2)γ>0
(4)
2.2 长短期记忆网络
通过Leap Motion采集获取到一个动态手势的帧数和时间序列以及每帧的手指位置,可以计算出每一部分手位置和速度。三维位置和速度的时间序列可以作为输入直接提供给一个长短期记忆网络(LSTM),使用长短期记忆网络(LSTM)来对动态手势进行训练和分类。
LSTM是一种循环神经网络(RNN)的特殊类型,该模型可以有效地避免梯度消失的问题[15]。LSTM的网络如图4所示。
图4 LSTM神经网络结构图
LSTM在手势识别模块中保存若干状态向量来保存序列中的每个时刻信息。这些状态向量包含:输入门it、遗忘门ft输出门ot记忆状态ct以及隐藏状态ht。LSTM单元中的状态向量转换如下[16]:
it=σ(xtWxi+ht-1Whi+ct-1Wci+bi)
(5)
ft=σ(xtWxf+ht-1Whf+ct-1Wcf+bf)
(6)
ot=σ(xtWxo+ht-1Who+ctWco+bo)
(7)
ct=ft∘ct-1+it∘ tanh(xtWxc+ht-1Whc+bc)
(8)
ht=ot∘ tanh(ct)
(9)
式中:xt是时刻t的输入;Wxi、Wxf、Wxo分别是输入层与输入门、遗忘门和输出门之间的权重;Whf、Whi、Who分别是隐藏的重复层与遗忘门、输入门和内存块的输出门之间的权重;Wci,Wcf,Wco分别是单元状态和输入门、遗忘门和输出门之间的权重;bi、bf、bo分别是输入门、遗忘门和输出门的附加偏差;σ是sigmoid函数。该模型通过使用各种门限改变每个向量的状态来处理各种时间尺度的问题。
由于利用LSTM对动态手势数据进行建模可以对手势数据进行端到端的训练,相比较使用人工制作特征的传统轨迹方法和使用隐马尔可夫模型(HMM)模型,不需要在训练过程中人为地定制规则,可以有效规避人工特征选取等问题。由于每个动态手势的数据时间长短并不一致,但LSTM的输入并不需要限定在固定的长度,因此可以利用LSTM对手势数据在时间域上很好地建模。
本文使用LSTM对手势进行分类的结构图如图5所示,第一层为输入层,传送的是一个动态手势的帧序列;第二层是LSTM层,包含50个神经元;然后设置了一个平均值池化层和一个Softmax层[17];最后是分类输出层。
图5 LSTM手势分类结构图
3 手势交互系统设计及实验评价
3.1 系统设计
本文提出的系统结构如图6所示,主要分为三大模块:数据采集模块、离线模型训练与识别模块、树木场景应用模块。
图6 系统框架图
数据采集过程首先是利用Leap Motion 获取静态手势和动态手势的数据,然后对手势数据进行预处理。训练与识别过程首先对采集的数据进行特征提取,然后训练分类进行手势识别。场景应用过程首先建立场景,然后设计与手势识别的正确性交互。实验主要包括两个模块:手势识别以及场景中树木交互。
3.2 手势识别实验
首先,本文设计了5种静态手势,如图7所示,每个手势采集200组,总共1 000个不同的数据样本。每个手势的语义表示Leap Motion捕获的帧的描述符。
图7 五种静态手势
本文中静态手势识别实验SVM分类器。其中经过多次调试,SVM选取默认参数C=3,γ=0.038 461 54。识别结果如表1所示。
表1 静态手势识别结果
通过实验结果可以得出,用于SVM分类器对以上5种静态手势的平均识别正确率为96.3%。
本文设计了5种动态手势:圆、对号、三角形、左滑和右滑,如图8所示。然后利用Leap Motion录制动态手势序列数据,保存到数据库中。
图8 五种动态手势
本文创建了一个动态手势的数据集,表示为一个Leap Motion记录的帧数时间序列。针对这5种不同动态手势各采集400个动态数据,在每个动态数据中提取200帧数据信息,总共采集2 000组样本。然后通过LSTM模型进行训练,样本集随机分为训练和交叉测试数据。每种动态数据训练和测试数据集的分配比例是一样的,训练样本个数为200,测试样本个数为200。实验得到的动态手势识别结果如表2所示,动态手势识别的平均正确率为92.6%,由实验结果可以得知LSTM模型的性能达到了较高的识别率。
表2 动态手势识别结果
3.3 树木交互实验
本文使用Unity3D游戏开发引擎创建的树木交互场景,场景目前是利用3dmax创建的一个玉兰花树的三维模型作为树木三维模型的实例,如图9所示。
图9 树木交互场景
从本文手势识别实验中定义的静态手势和动态手势中分别选取三种,对场景中树木进行交互,使树木产生不同的变化。手势语义见表3。
表3 手势语义
树木场景交互的过程是:首先用户将手放在Leap motion的工作区做出相应的手势,可以是静态的,也可以是动态的。然后树木场景交互系统会调用Leap Motion的API及时地采集用户的静态或者动态手势相关信息,然后将这些数据发送到训练好的手势模块库中进行匹配手势,并获得手势匹配的结果。最后场景中的树木根据表中的手势语义(表3)做出旋转、缩小、放大等变化。静态手势交互效果和动态手势交互效果分别如图10和图11所示,当伸出五指的时候,树木模型恢复到初始状态。
图10 静态手势树木交互效果
图11 动态手势树木交互效果
为了方便用户体验场景中与树木交互,本文设计交互的手势不是太复杂,并且体检交互准确性比较高,用时比较短。
4 结 语
本文实现了利用Leap Motion手势识别方法对树木系统进行交互。首先利用Leap Motion采集静态手势和动态手势数据,并对其每帧数据的特征进行了探讨。针对静态手势识别本文提出利用支持向量机(SVM)分类模型,实验证明该模型对静态手势识别具有很好的分类效果。针对动态手势识别提出一种基于长短期记忆神经网络(LSTM)手势识别模型,该模型通过LSTM自动地学习动态手势的时序信息,从而避免需要人工来设计特征。从实验结果可以看到该方法使得动态手势识别具有较高的准确率。最后将手势识别结果应用到树木交互场景中,该场景中的树木以玉兰花为例,实现了用户通过在Leap Motion工作区做出相应的静态手势或者动态手势,对玉兰花进行高效直观自然地交互。
本文需要完善和改进的地方具体表现在以下两个方面:第一,自定义的手势识别样本训练数量需要增加,手势种类需要增多,能识别出更多的手势,目前系统只能识别单手手势,可以增加双手的手势。第二,树木交互场景需要完善,增加更多的植物模型,增加更多的交互方式,使用户获得更美、更自然的体验。