手势识别系统设计方案

一、项目简介

       手势是一种符合人类日常习惯的交互手段,在日常生活中人们之间的交流通常会辅以手势来传达一些信息或表达某种特定的意图。随着人工智能和计算机视觉技术的迅猛发展,智能化设备逐渐融入到人们生活的方方面面,因此对各类人机交互的需求也在不断增加。键盘、鼠标、触摸屏等传统的人机交互设备,需要人们直接与终端设备进行接触,并且需要被迫学习各种终端设备的输入规则,具有较多的限制并严重影响了人机交互效率。人工智能技术的出现,为解决这一瓶颈带来了新的解决办法,智能化的人机交互方式逐渐得到了人们的重视。手势是人们常用的肢体语言之一,是一种自然直观、有效简洁的沟通方式,手势识别逐渐成为基于计算机视觉的智能人机交互的重要研究领域。

       本系统使用Kinect摄像头,获取关于手势的深度图像,通过利用DTW算法,将手势与提取的手势模板进行比较,从而获取手势的信息。在手势特征的提取算法上,经典的DTW算法会遍历满足边界约束、单调性约束和连续性约束的所有路径以找出最优规整路径,因此考虑用启发性的方法限制路径的范围,提前排除一些不可能最优的路径选择,减少算法的计算量。

 

二、软件结构特点

1.设计架构

 

 

       本系统通过对手势的识别来控制系统,是一种典型的人机交互的软件,用户界面随着手势的变更而发生变化,因此本系统使用MVC架构来实现。

       Model用来封装核心数据和功能,它独立于特定的输出表示和输入行为,是执行某些任务的代码,至于这些任务以什么形式显示给用户,并不是模型所关注的问题。模型只有纯粹的功能性接口,也就是一系列的公开方法,这些方法有的是取值方法,让系统其它部分可以得到模型的内部状态,有的则是写入更新数据的方法,允许系统的其它部分修改模型的内部状态。

       View用来向用户显示信息,它获得来自模型的数据,决定模型以什么样的方式展示给用户。同一个模型可以对应于多个视图,这样对于视图而言,模型就是可重用的代码。一般来说,模型内部必须保留所有对应视图的相关信息,以便在模型的状态发生改变时,可以通知所有的视图进行更新。

       Controller是和视图联合使用的,它捕捉鼠标移动、鼠标点击和键盘输入等事件,将其转化成服务请求,然后再传给模型或者视图。软件的用户是通过控制器来与系统交互的,它通过控制器来操纵模型,从而向模型传递数据,改变模型的状态,并最后导致视图的更新。

       在本系统中,模型中封装的是手势模板以及进行手势特征提取的算法——DTW算法,它通过提供手势识别的接口,来处理获取到的用户手势;视图可以获取模型对手势的处理结果,向用户显示出手势所代表的信息,用户手势发生变化时,视图会显示不同的信息;控制器通过捕捉用户的交互,来将获取的手势数据传输给模型和视图,实现手势识别系统。

 

2.设计模式

       外观模式:它能为手势识别系统提供一个简单的接口,与直接调用系统相比,外观提供的功能比较有限,但它却包含了客户端真正关心的功能。

       实现方式:首先,考虑能否在现有系统的基础上提供一个更简单的接口。判断实现的是否正确的方法就是看接口能否让客户端代码独立于系统类。接着,在一个新的外观类中声明并实现该接口。外观应将客户端代码的调用重定向到子系统中的相应对象处。如果客户端代码没有对子系统进行初始化,也没有对其后续生命周期进行管理,那么外观必须完成此类工作。然后,为了能充分发挥这一模式的优势,应该确保所有客户端代码仅通过外观来与子系统进行交互,此后客户端代码将不会受到任何由子系统代码修改而造成的影响。最后,如果外观变得臃肿,可以考虑将其部分行为抽取为一个新的外观类。

 

三、运行环境和技术选型说明

开发语言:C/C++

硬件设备:Kinect摄像头

开发工具:Visual Studio Code,tensorflow,Kinect for Windows SDK

手势匹配算法:DTW,图卷积神经网络

技术选型说明:

       (1)DTW算法是解决时间序列分类问题比较成熟的算法,基于动态规划的思想来度量不同长度时间序列的相似性,应用简单、训练成本低且精度高。针对两个时间长度不同的序列,利用动态规划原理找到训练样本序列和测试样本序列之间的映射关系,通过将其中一个序列的时间轴拉伸或规整使得两序列的时间轴最大限度重叠,以此消除两条序列在时间轴上的差异,降低它们之间的失真度。

       经典的DTW算法会遍历满足边界约束、单调性约束和连续性约束的所有路径以找出最优规整路径,可以考虑用启发性的方法限制路径的范围,提前排除一些不可能最优的路径选择,减少算法的计算量。

       (2)图卷积神经网络是主要针对以图(Graph)数据结构形式存储的数据集,现实世界中经常存在这种数据,但往往无法应用经典的卷积神经网络来处理,这就是图卷积神经网络的意义。

       图卷积神经网络通过图的节点特征和结构特征来提取图结构中我们需要的特征,每个节点的一系列特征可以储存在矩阵中,图结构特征则可以用邻接矩阵A。

考虑通过Kinect摄像头直接获取手部的关节信息存储在广义图中,应用图卷积神经网络进行手部特征的提取,训练各个手势对应的特征模型,进行手势识别。

 

四、系统架构的描述性视图

1.用例图

 

2.分解视图

       分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为清晰的分解结构特点。分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。

 

3.依赖视图

       依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接依赖软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。依赖视图能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序,也能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响范围。

 

4.执行视图

        执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件,都是不同于其他组件的执行实体。如果有相同或相似的执行实体那么就把他们合并成一个。

       执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。

 

 

5.工作分配

组员

分工

1

建立系统逻辑,轮廓特征提取

2

训练各个手势对应的特征模型,对匹配算法进行改进

3

实现可视化界面,检查测试已经完成的代码

 

 

 

 

 

 

 

 

6.实现视图

       实现视图是描述软件架构与源文件之间的映射关系。比如软件架构的静态结构以包图或设计类图的方式来描述,但是这些包和类都是在哪些目录的哪些源文件中具体实现的呢?一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现视图就可以由软件项目的源文件目录树来呈现。

 

五、数据结构设计

       本项目的核心是手势,因此需要合理的数据结构将手势进行保存,kinect摄像头获取的是三维图像,包括手势平面的横纵坐标以及手势距离摄像头的长度,因此需要三维向量来保存手势图像上像素点的位置信息。

 

1)用户表

序号 变量名 类型 描述
1 id string 用户名
2 gesture Gesture[] 手势

 

 

 

 

 

2)手势表

序号 变量名 类型 描述
1 gesturetype string 手势类型
2 gesture_id string 手势ID

 

 

 

 

 

六、核心工作模式

       在手势预处理阶段,根据人们做手势的习惯以及Kinect所提供的深度信息,迅速定位手所在的深度范围,利用改进的分块搜索方法,选择大小合适的块,快速找到手势轮廓上的一个点,利用方向搜索的方法获得深度图像中的手势及其轮廓信息。

       在动态手势识别中,将指尖点的运动轨迹用向量进行表示,再对其进行编码来描述动态手势,在手势识别时,对动态时间规整算法进行改进,在该算法寻找最优弯曲路径时,添加步数这一元素,计算不同步数下弯曲路径的成本,更全面的考虑不同情况,将待识别手势与模板手势进行对比识别,选取相似度最高的手势模板作为动态手势的识别结果。

 

posted @ 2020-12-29 19:20  渣渣渣er  阅读(2129)  评论(0编辑  收藏  举报