基于头部姿态与面部特征混合手势的设计与研究
2018-12-13殷继彬
于 鲲 殷继彬
(昆明理工大学信息工程与自动化学院 云南 昆明 650000)
0 引 言
人机交互是指计算机通过相关的设备实现人与计算机“对话”的技术[1]。多通道交互是一种混合交互系统,它遵守了“以人为中心”的自然交互法则,促进了人机交互的发展。它允许用户通过多个不同的人体交互通道方式,并自动提取语义,识别出最终的交互目的。主要包括眼动跟踪、姿势识别、三维输入、语音识别、人脸识别、自然语言理解等,目的在于提高人机交互的自然性和高效性。多通道研究成为人机交互领域的重要方向[2]。目前的人脸识别主要用于身份鉴别,而对于交互方面涉及较少。而面部手势正好解决了这一缺陷,使得人的面部动作特征得以充分利用。
目前在手势研究领域主要集中在笔手势、手势,而对于头部姿态和面部手势混合交互的研究较少。基于这种趋势,本文提出了“脸表情+头部姿态”的混合交互。混合手势依靠面部特征和头部姿态与计算机进行交互,从而解放双手负担。同时对于双手不便的残疾人与计算机交互具有重大的意义。随着人工智能在包括人脸识别、声纹识别、语音识别、手势识别、姿态识别、情感识别等方面的进步,智能算法与人机交互出现了相互融合的趋势。因为符合人的交互模式,基于人工智能的多通道智能人机交互被认为是未来自然的人机交互的主要方式之一[3]。在人工智能迅速发展的今天,人工智能与人机交互的结合已经成为必然的趋势,这将会给未来人机交互带来巨大的前景。同时将面部手势和头部姿态结合起来,能更好地探讨新的交互通道存在的应用价值。实现基于混合交互手势的人机交互,能够更好地帮助双手残疾的人士与计算机的沟通,减少他们使用计算机的身体负担,同时可以解放正常人的双手,对于多通道人机交互技术的探索与研究具有重大的意义。
在设计手势交互时候,需要着重考虑四大设计原则。1) 可靠性。由于手势交互与日常活动有相同的特征和模式,为了避免误操作应该考虑可靠性。2) 容错性。充分考虑用户的习惯,允许一定的差异。3) 连贯性。设计手势时候,应当考虑前后的衔接,前后流畅。4) 继承性。在对手势形势的选择和引导与反馈机制的设计上,应该考虑与日常交流的继承性[4],因此我们设计“脸表情+头部姿态”的混合手势交互应该更加尊重这四大原则。混合交互手势是通过摄像头获取静态面部手势和头部姿态的特征信息后,系统会把数据传给Face++的后台服务器,服务器会返回一些基本的面部信息数据和头部姿态数据。通过编写代码对我们所需要的数据进行解析,然后按照指定的面部手势和头部姿态的定义标准进行识别,让计算机执行相应的交互命令。
手势识别包含人工智能、心理学、模式识别、语言学、生理学范畴,从其出现开始一直是研究者关注的热点问题。在手势识别中,无论是数据获取还是模式分类方法都有许多种类[5]。手势在现实生活中起到了不可或缺的作用,对于推动人与计算机的交互,具有重大的意义。手势可以分为不同的种类,按照传感器分类,可以分为基于传感器和基于非传感器[6]。基于传感器的手势数据获取方式主要通过数据手套进行获取,通过数据手套获取和捕捉手指各个关节在操作过程中变化角度、各个手指之间的夹角以及倾斜角等有用信息,并把采集到的信息作为识别过程需要用到的信息[7]。基于非传感器的手势识别是通过设备的摄像头对手势操作过程的手势数据进行采集和记录的[8]。对于手势识别的研究可以分为两种:动态手势识别和静态手势识别。利用摄像头进行手势识别的技术分为两种:单目的图像识别和双目的图像识别[9]。本文就是基于静态图像的面部手势和头部姿态的手势识别。
目前国内外对于面部手势涉及较少,而对于人脸身份鉴别方面涉及较多。比如2017年发布的Iphone X的Face ID就采用了人脸识别技术进行解锁。国外有一项关于面部手势的研究就是FaceSwitch[10],它是基于眼动仪的凝视点检测和beyond reality face的人脸关键点跟踪技术实现的,是动态的人脸跟踪和眼部跟踪。而本文是利用Face++平台基于静态图像的人脸关键点检测技术和头部姿态检测技术,自定义出来一套基于“脸表情+头部姿态”的混合交互手势,同时加入了头部姿态的跟踪。FaceSwitch能够定义的面部手势只有4种,本文提出的基于“脸表情+头部姿态”的混合手势,可以定义的混合手势共有28种,大大增加了交互手势的多样性,同时对于探索多通道人机交互具有重大的意义。
1 “脸表情+头部姿态”混合手势
1.1 面部手势
在正常情况下,人的左眼和右眼分别有两种状态:睁开和闭上。嘴巴也有两种状态:张开嘴巴和闭上嘴巴。按照排列和组合原理,我们能定义的面部手势共有2×2×2=8种。这8种状态分别是:左眼睁开右眼睁开嘴巴张开、左眼睁开右眼睁开嘴巴闭上、左眼睁开右眼闭上嘴巴张开、左眼睁开右眼闭上嘴巴闭上、 左眼闭上右眼睁开嘴巴张开、左眼闭上右眼睁开嘴巴闭上、左眼闭上右眼闭上嘴巴张开、左眼闭上右眼闭上嘴巴闭上。然而在正常情况下,我们的脸部状态是左边的眼睛和右边的眼睛都睁开,嘴巴处于闭合状态,同时遵守手势设计原则的可靠性,因此我们将这种情况去除掉。因为我们能够定义并且识别的面部手势共有7种。
1.2 头部手势
在现实生活中,人的头部姿态可以分为6种状态:抬头、低头、向左歪头、向右歪头、向左扭头、向右扭头。因为我们的面部手势是基于摄像头的面部特征采集,当我们向左扭头和向右扭头的时候,会影响我们面部特征的采集,大大降低面部手势的识别准确率。因此我们能够和面部手势结合起来的头部姿态只有四种。
1.3 “脸+头部姿态”的混合手势
我们能够识别使用的面部手势共有7种,能跟面部手势结合起来的头部姿态共有4种,根据排列和组合原理,我们能够设计和识别的基于“脸表情+头部姿态”的混合手势共有28种。我们将它们分为四组,它们分别是:
第一组:左眼睁开右眼睁开嘴巴张开抬头、左眼睁开右眼闭上嘴巴张开抬头、左眼睁开右眼闭上嘴巴闭上抬头、 左眼闭上右眼睁开嘴巴张开抬头、左眼闭上右眼睁开嘴巴闭上抬头、左眼闭上右眼闭上嘴巴张开抬头、左眼闭上右眼闭上嘴巴闭上抬头。
第二组:左眼睁开右眼睁开嘴巴张开低头、左眼睁开右眼闭上嘴巴张开低头、左眼睁开右眼闭上嘴巴闭上低头、 左眼闭上右眼睁开嘴巴张开低头、左眼闭上右眼睁开嘴巴闭上低头、左眼闭上右眼闭上嘴巴张开低头、左眼闭上右眼闭上嘴巴闭上低头。
第三组:左眼睁开右眼睁开嘴巴张开向左歪头、左眼睁开右眼闭上嘴巴张开向左歪头、左眼睁开右眼闭上嘴巴闭上向左歪头、 左眼闭上右眼睁开嘴巴张开向左歪头、左眼闭上右眼睁开嘴巴闭上向左歪头、左眼闭上右眼闭上嘴巴张开向左歪头、左眼闭上右眼闭上嘴巴闭上向左歪头。
第四组:左眼睁开右眼睁开嘴巴张开向右歪头、左眼睁开右眼闭上嘴巴张开向右歪头、左眼睁开右眼闭上嘴巴闭上向右歪头、 左眼闭上右眼睁开嘴巴张开向右歪头、左眼闭上右眼睁开嘴巴闭上向右歪头、左眼闭上右眼闭上嘴巴张开向右歪头、左眼闭上右眼闭上嘴巴闭上向右歪头。
1.4 “脸表情+头部姿态”混合交互命令
由于我们定义的“脸+头部姿态”的混合手势共有28种,为了减少任务复杂度,提高实验的精确性,因此我们只定义7种命令分别为:选中、右击、重置、放大、缩小、移动、取消选中。然后我们将这28种混合手势每7个一组,分为4组分别进行验证。这7种命令与混合手势的对应关系如表1-表4所示。
表1 “脸+头部姿态”混合手势与交互命令(1)
表2 “脸+头部姿态”混合手势与交互命令(2)
续表2
表3 “脸+头部姿态”混合手势与交互命令(3)
表4 “脸+头部姿态”混合手势与交互命令(4)
1.5 面部手势识别算法
“脸+头部姿态”混合手势定义完之后需要进行混合手势识别,此时摄像头会处于一直工作状态,并且自动拍成一张静态图片存到本地,然后传给服务器进行检测。服务器会通过JSon的方式返回给我们人脸和头部姿态的检测信息,我们将这些信息融入到自己设计的混合手势识别算法,等待系统识别相应的面部手势之后,然后做出相应的反馈。本文用到服务器返回数据中的两个字段,它们分别是eyestatus、mouthstatus和headpose。eyestatus下又包括left_eye_status 和right_eye_status。headpose中包括pitch_angle、roll_angle、yaw_angle。这些属性并不是直接给出眼睛和嘴巴的张开、闭合状态和头部姿态的具体信息,而是返回了一些浮点数。我们根据这些浮点数,定义了一些阈值,来控制混合手势识别算法当中眼睛和嘴巴的张开和闭合状态以及头部的状态,从而根据这些状态设计出相应“脸+头部姿态”的混合交互手势。
1.6 头部姿态检测原理
本文是根据头部姿态角来获取头部姿态,头部姿态角与飞行器姿态角类。通常所说的飞行器姿态角是指机体坐标系与地面惯性坐标系之间的夹角,可以用横滚角—roll、俯仰角-pitch、偏航角-yaw三个角表示。头部姿态也是采用这三个参数来检测的。
Pitch-angle对应的抬头和低头,roll-angle对应的是左右歪头。坐标系采用的是地轴系。地轴系原点选择为地面上某一点,X0轴与地面平行指向正北方向,Z0轴与重力加速度的方向一致垂直地面向下,Y0轴指向正东并与X0-Z0构成右手坐标系[11]。本文中头部姿态的检测也是参照此坐标系进行定义的,如图1所示。
图1 头部姿态坐标原理图
2 总体框架设计
2.1 结构设计
本文提出的基于头部姿态与面部特征混合手势应用是以C/S(客户端/服务器端)体系结构为基础进行开发的。整个面部手势交互系统有人脸信息采集模块、面部手势和头部姿态分析模块及交互模块四部分组成(见图2)。人脸信息采集使用ANC酷睿摄像头(1080P高清版);人脸检测分析在Face++服务器端进行;服务器返回的信息根据我们混合手势的定义规则和算法然后做出相应的交互和反馈。
图2 “脸表情+头部姿态”流程图
2.2 环境配置
为了实现面部手势的采集,首先要对Java和JMF进行环境变量配置,使摄像头能够和Java环境正常的通信,我们才能够采集到混合交互手势识别所需要的人脸和头部信息。这是进行混合手势识别最关键的一步。同时登录Face++官方网站,注册一个新的账号并登录。点击“管理应用”项目下的API Key,点击添加,选择正式使用,输入应用名称、应用分类等信息,然后选择应用平台Java,点击创建之后,会自动生成相对应的“API Key”和“API Secret”,只有取得这两个参数,我们的应用才可以被调用。
2.3 “脸表情+头部姿态”核心算法
环境全部配置好以后,我们可以编写面部手势核心代码了,根据前边提到的面部手势的定义,我们将眼睛张开的最小值判定设为30,眼睛闭上的最小值判定为10。嘴巴闭上的状态判定值为0,嘴巴张开的判定值大于0。对于头部姿态的检测,我们可以根据姿态角原理获取头部角度的三个参数,根据不同参数的正负和大小,定义出头部姿态的判断算法。根据“脸+头部姿态”的定义规则和最小值的限制,编写出混合手势识别和定义的核心算法,部分代码如下所示:
//嘴巴
float open=mouthstatus.getLong(″open″);
String value=glass.getString(″value″);
System.out.println(value);
//pitch-angle 抬头低头
double UpDownHead=headpose.getDouble(″pitch_angle″);
System.out.println(UpDownHead);
//roll_angle 左右歪脖子
float SwingNeck=headpose.getLong(″roll_angle″);
//眼睛
Floatno_glass_eye_open=left_eye_status.getLong(″no_glass_eye_open″);
float normal_glass_eye_open=left_eye_status.getLong(″normal_glass_eye_open″);
float right_eye_open=right_eye_status.getLong(″no_glass_eye_open″);
float right_eye_glass_open=right_eye_status.getLong(″normal_glass_eye_open″);……
3 实验环境搭建和数据
3.1 硬件环境搭建
“脸表情+头部姿态”的混合面部手势是基于摄像头采集获取面部特征和头部姿态的,整体设备安装如图3 所示。其中摄像头设备位于显示器的上方,正对着人脸。
图3 设备安装示意图
3.2 界面展示
打开混合交互手势交互识别程序的主界面菜单如图4所示。演示程序主界面主要有一个摄像头实时采集窗口和一个测试目标组成。该系统实现了面部手势识别界面和面部手势反馈界面的分离,两者互不干扰。
图4 实验程序主界面
3.3 放大功能演示
由于混合手势种类繁多,这里只演示放大操作,当我们做出即右眼睁开左眼睁开嘴巴张开向左歪头手势时,此时混合手势识别系统识别手势,并执行放大功能,目标成功被放大。结果如图5所示。
图5 放大命令效果图
3.4 实验数据
本文中的测试工作以功能验证为主要测试目的,评估“脸+头部姿态”的混合手势系统是否达到预定的功能目标。根据操作的特点安排的测试主要有“脸+头部姿态”混合手势识别的成功率。针对不同的手势种类,进行成功率测试。实验前允许实验者进行练习并熟悉实验环境,针对不同的混合手势种类,每个混合手势设计测试用例20个,其中平均成功率为90.995%。具体测试结果如表5-表8所示。
表5 “脸表情+头部姿态”混合手势成功率测试(1)
表6 “脸表情+头部姿态”混合手势成功率测试(2)
表7 “脸表情+头部姿态”混合手势成功率测试(3)
表8 “脸表情+头部姿态”混合手势成功率测试(4)
3.5 实验数据分析
经过对系统的功能性测试和面部手势成功率分析,由数据可以看出,面部手势识别交互系统基本实现了我们所设计的功能,满足自然人机交互的需求。“脸+头部姿态”混合手势成功率可以达到90%,但是根据实验结果可以知道,面部手势识别率与光线、摄像头的远近有一定的影响,有待进一步改进。
4 结 语
本文的创新点基于Face++的人脸关键点检测技术,设计出了面部手势识别算法,定义出了28种基本的混合手势,能够流畅地进行人机交互。通过理论分析及实验研究人与设备之间的交互通道和交互过程,并结合面部手势的设计方法探讨新的交互通道,丰富了三维手势交互方式。同时本文设计的面部手势是基于摄像头的面部特征和头部姿态采集,因此光线、摄像头的方位、距离人脸的位置、头部位置对于面部手势识别
的准确性具有一定的影响,需要我们进一步改进。