张继凯,顾兰君
(内蒙古科技大学 信息工程学院,内蒙古 包头 014010)
动作识别是人机交互的重要方式,随着科技的发展,基于视觉的人体动作识别在人工智能领域占有重要地位.人体动作识别在人机交互[1]、异常行为检测[2]以及服务于机器人[3]等多领域得到广泛应用.在人机交互中,交互行为具有较强实时性以及高精度要求,是各类应用中难度较大的一类.
传统的动作识别方法容易受光照、遮挡等外界因素的影响.在动作识别中采取骨架特征的方法,并通过对比实验,发现采用的方法能有效提高动作识别准确率.在已有人体关键点检测方法的基础上,搭建网络模型,实现动作的分类与识别,并根据识别到的手部动作进行轨迹追踪,形成连续的动作,从而实现单手与双手的交互.
人体关键点检测与动作识别都是实现交互的前提.在自然人机交互中,强调以人为中心进行交互,如语音交互、体态语言交互和其他姿态语言交互.其中体感交互是通过获取人体的动作信息来进行交互,让用户摆脱设备的限制,可以更加自由地完成各种交互动作.
传统的动作识别方法具有运算复杂度高、运算时间长等问题,比如从视频中提取图像的尺度不变特征(SIFT)[4]、运动物体的边界直方图特征(MBH)[5].文献[6]提出了一种基于局部二进制描述符和HIK核函数的识别方法,解决了特征点和描述符检测时间长和计算复杂度高的问题.而文献提出支持向量机、K均值聚类和隐马尔可夫模型,被结合起来进行动作识别与分类,并取得了较好的结果.文献[7]提出了图卷积长短期记忆网络(Graph Convolution-LSTM)模型,该模型可以自动学习时空特征对动作进行建模.针对人体动作多样性、场景嘈杂对动作识别的影响,张瑞等[8]采用3D卷积神经网络以连续的16帧视频作为输入,经过多通道处理,卷积、池化的特征提取进行动作分类.
在上述的方法中,由于RGB数据以及深度图像信息存在遮挡,并且容易受到环境的影响.因此,学者们把更多的时间与经历投入到人体的骨架信息研究中来,并以此作为研究对象.针对骨架序列动作识别问题,裴晓敏等[9]提出了1种用于动作识别的时空融合深度学习网络,来学习骨架节点之间的关系.人类动作由关节位置序列表示,刘沿等[10]通过采用滑动窗口的方法将人体动作划分为3D骨架片段序列,并计算该片段所包含点的均值及协方差矩阵,最后将两者结合实现该时间段对人体动作的表示.而文献[11]提出了1种可训练特征提取器与基于字符串核相结合的方法用于动作识别,在3个基准数据集上取得了较好的成绩.SHI等人将骨骼数据表示为1个基于关节和骨骼之间运动依赖性的有向无环图(Directed Acyclic Graph)[12],设计了1种新的二重图神经网络,并且在数据集NTU-RGBD和骨架动力学上性能超过目前的先进水平.文献[13]提出了1种基于骨架的人类行为识别框架,采用VLAD算法和簇池方法进行聚合,并将特征向量结合提高KNN分类器的分类精度.丰艳等[14]提出的基于时空注意力的深度网络模型进行角度无关性骨架行为识别,解决了单视角数据包含噪声的问题,并且在NTU数据集上取得了较好的结果.
整体研究思路由以下3部分组成:人体关键点的检测、动作识别以及实时交互.
该算法首先进行人体关键点的检测,采用VGG与两分支的卷积神经网络检测人体中18个关键点,并得到关键点的坐标信息.然后进行动作识别,采集不同动作类型的数据制作数据集,并搭建堆叠模型进行训练.为了使得数据多样化,在采集数据集时,选取不同体型的人作为采集对象,并且大量的二维坐标训练时比较复杂且耗时,为了训练时加快网络的收敛,要对数据进行归一化处理.最后在动作识别过程中也对特定动作,比如手部运动轨迹进行了追踪.通过对动作运动轨迹估算,拟合出计算机能够适配的交互指令.达到实时交互的目的.图1所示的是算法的整个流程图.
图1中检测的18个关键点对应人体的18个部位,分别为Nose, Neck, Rshoulder, Relbow, Rwrist, Lshoulder, Lelbow, Lwrist, Rhip, Rknee, Rankle, Lhip, Lknee, Lankle, Reye, Leye, Rear, Lear,为了方便数据集的介绍,18个关键点分别用整数1~18表示.其中18个关键点的所在部位图如图2所示.
在人体姿态估计中,由于人体之间的相互接触,以及图片中人数、位置的变化会使得计算时间增加.因此,采用自下而上(down-top)的方法,先进行关键点的检测,然后根据关键点的分布确定每个人的姿态.人体关键点检测由VGG19的前10层和两分支的卷积神经网络构成,首先输入1张图片到VGG并提取该图片的特征图F,然后将F作为Stage1的输入,经过多个阶段的回归,获得图片中的所有关键点,最后通过贪心推理将关键点连接起来形成人体的整个骨架.整体网络结构如图3所示.
图3中S1至St表示身体部位的2D置信图,L1至Lt表示像素点在骨架中的走向.Stage1将F作为输入,得到S1,L1,Staget将F,St-1,Lt-1作为输入,最后得到St,Lt.在卷积神经网络的每个阶段都要采用L2范式进行loss计算.计算公式如式(1)所示:
(1)
(2)
(3)
式(1)~(3)计算了p点的置信值.在计算第k个人的肢体c上的亲和向量场L时,如公式(4)所示:
(4)
(5)
式中:代表肢体方向的单位向量xj,k表示第k个人的第j个关键点的位置.同时设定p点的范围来判断该点是不是在肢体c上,如公式(6)所示:
0≤v·(p-xj1,k)≤lc,kand|v⊥(p-xj1,k)|≤σl.
(6)
式中:σl代表肢体的宽度,lc,k=‖xj2,k-xj1,k‖2表示肢体的长度,点p的部分亲和力向量场的真实值为所有人在该点的平均值,计算公式如式(7):
(7)
式中:nc(p)表示非零向量的个数,在得到关键点位置之后,通过计算任意2关节连线上权重值来评估关键点之间的相关性,如公式(8)所示:
(8)
式中:p(u)=(1-u)dj1+udj2,在得到关节点与各点连线的权重之后,采用匈牙利算法对相邻节点进行最优匹配,从而得到人体的整个骨架姿态.
动作识别采用搭建网络层的方法来实现堆叠模型的构建,其中动作识别数据集是通过人体关键点检测获取到的.对不同体型的人进行数据集采集,每种动作类别采集20个人的数据,增加数据的多样性与复杂性,减少因数据集过小而产生的过拟合.
首先该模型的第一层作为输入层要读取训练数据,由于数据集中的每一条数据都是每个关键点的二维坐标(X,Y),一共18个关键点,所以输入维度为36.然后向模型中添加中间层和输出层,中间层是叠加的全连接层,激活函数是Relu,由于输出是6种动作类型,所以最后一层用多分类器softmax进行分类,并且输出维度为6.在隐藏层中加入了人batch normalization,用于减少特殊数据对训练过程的影响,该模型的结构如图4所示.
该模型选用合适的优化器(RMSprop)以及损失函数(binary_crossentropy),调用fit函数指定批次大小(batch_size)、迭代次数、验证数据集等等.经过不断地实验进行微调,选择最优的参数使得训练效果最佳.最后使用evaluate方法来评估模型,模型的每层的参数如下表1所示.
表1中,每层神经网络都包含一定数量的神经元,每层参数的计算公式如式(9)所示.
输出参数=(输入数据维度+1)*神经元个数.
(9)
如dense_1输入数据维度是36,有128个神经元,按照公式(8),输出参数为4 736.dense_2,dense_3,dense_4的参数分别为8 256,1 040,1 02.
表1 模型的各个参数表
动作识别为实现交互做准备.人体动作识别方法可以准确识别6种普通动作,当识别到了手部运动的2个动作(开始与准备)后,可以根据手部运动轨迹进行计算从而拟合出多种交互动作.其中实时交互的1个完整过程如下:
Step 1:先进行人体动作识别,如果识别到的是开始(Start),跳转Step 2,如果识别的是准备(Ready),则跳转Step 3.
Step 2:跟踪手部运动,当手部有蓝色圆点时表示追踪上了单手的运动,保持水平坐标相差不超过阈值(<5 cm)的情况下(其中,阈值是在代码中添加的并且设定为5 cm,如果追踪到单手的下一帧与上一帧坐标的水平距离大于5 cm,则会出现提示Error),当圆点上1秒的Y值大于下1秒的Y值时,交互指令为上滑(用向上的箭头表示).
Step 3:当双手之间有轨迹出现时,表示追踪到了双手的运动,当双手竖直距离不超阈值的情况下(如果是动作识别类型为Ready时,设定同一帧双手之间的垂直方向坐标的距离大于5 cm时,同样会出现提示Error),并且双手之间的水平距离逐渐变大,交互指令为放大,反之为缩小.计算双手之间的连线与水平线之间的夹角,当角度相对于上一帧有所变大,则认定为正向旋转,反之为反向旋转,从而拟合出的交互动作类别为旋转(用旋转箭头表示).
数据集是采集不同体型不同动作类型的真实二维坐标信息.包括站立(Stand)、踢腿(Kick)、蹲(Squat)、挥手(Wave)、开始(Start)、准备(Ready)等.为了训练时加快网络的收敛,要对数据进行归一化处理.例如鼻子的坐标为(X,Y),经过归一化处理得到的坐标为(X′,Y′),其中计算公式如(10)所示.
X′=X/W
Y′=Y/H.
(10)
式中:W,H分别为显示窗口的宽度和长度,窗口大小为W与H的乘积.其中每一条数据有37列,前36列为18个关键点的x,y坐标,最后一列为动作标签,按照采集的动作类别顺序进行编码,分别为0,1,2,3,4,5.如表2所示,为站立的部分原始数据(只列出了4个关键点的数据信息).
把表2中的原始数据按照式(10)处理后,得到处理后的数据如表3所示.
表2 站立的部分原始数据表
表3 站立的处理后的部分数据表
表2,3只给出了站立的部分原始数据与处理后的数据.其中,所有的数据集为3 393条,站立的数据为556条,踢腿为527条,挥手555条,开始565条,准备为600条.其中,将数据集划分为训练集与验证集,测试集为总数据集的十分之一,共339个,验证集为3 053个.
经过堆叠模型的训练,得到训练集与验证集的精确度与损失,如图5所示.由图5可知,随着Epoch的增大,训练集与验证集的Loss逐渐趋近于0,而精确度逐渐接近于1.说明采用的堆叠模型训练的效果比较好.
得到上述训练结果图的同时,为了清晰地看到每个动作的预测结果,采用混淆矩阵,该矩阵在分类模型预测时,会显示对某种动作产生错误预测的数量.从混淆矩阵中可以看到每个动作类别的正确预测数量和错误预测数量.如图6所示,是6种动作的混淆矩阵,其中横向表示预测标签,纵向表示真实标签.
在混淆矩阵中,精确度是针对预测结果而言,它表示的是预测为正的样本中有多少为真正的正样本,预测结果中一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),计算公式如(11)所示:
(11)
召回率是针对原来样本而言,它表示的是样本中的正例有多少被预测正确,也有两种可能,一种就是把原来的真实标签样本预测为正类(TP),另一种就是把原来的真实标签样本预测为负类(FN),计算公式如(12)所示:
(12)
根据混淆矩阵中的预测结果以及精确度、召回率的计算公式,得到每种动作的准确率以及召回率,如表4所示.
表4 人体动作识别准确度表
由表3可知,采用堆叠模型进行动作分类的结果中,准确率最高的是站立以及准备这2个动作.从整体来看,动作识别的准确率都在98%以上,平均召回率在97%以上,说明该方法可以精确地实现动作识别.为了清晰地看到动作识别的效果图,如图7中的(a),(b),(c),(d)所示,分别为站立、踢腿、下蹲以及挥手等4种动作类别.
动作识别采用堆叠模型,并且对每种动作类别进行准确率的计算,发现动作识别的准确率都在98%以上.为了证明文中方法对于动作识别的可行性以及实用性,在相同的环境与数据集中,与LSTM动作识别方法进行对比,如图8所示,为对比实验结果.
运动追踪是手势交互的前提.当识别到手部动作以后,会持续跟踪手部的运动轨迹,从而将追踪到的连续动作进行交互.文中根据追踪到的手部的运动轨迹进行动作估计,当识别到动作的一瞬间,表示交互命令的开始,随着不断追踪连续动作,实现简单交互过程.就如鼠标操控计算机一样,点击鼠标左键,表示交互过程的开始,然后连续地拖动鼠标,实现页面下滑.交互过程是针对手部的运动而言,为了体现该动作识别方法具有较高的识别精确度,在变化范围很小的情况下也能够以较高的准确率进行动作分类与识别,证明该方法具有很好的鲁棒性.
当动作为开始(start)时,右手手腕处有1个蓝色的圆圈进行追踪单手的运动,并且候选框以及动作类别变成绿色,表示交互过程的开始.当识别到的动作为准备(ready)时,2手之间会有1条估计追踪双手的运动轨迹的距离(距离为2手之间的欧式距离),效果图如图9所示.
根据单手的坐标变化以及双手之间的距离变化,拟合了几种交互动作,分别用带方向的箭头表示,并且给出了语义说明,如表5所示.
表5 手势交互的动作表示及其语义说明表
文中采用两分支的卷积神经网络实现人体关键点检测,并以此为基础利用堆叠模型进行了多种人体静态动作识别,且具有较好的识别精度.为实现实时的人机交互,在识别到特定的2个开始动作后,实时监测手部关键点在图像中的位置并形成运动轨迹,通过轨迹计算拟合出多种交互动作.为验证文中采用的方法具有一定的实用性以及推广性,与LSTM方法进行对比,发现在动作识别方面性能优于此方法.将文中所述动作均为基于平面的若干交互动作,虽在一定程度上可替代鼠标和触摸屏等交互设备,但更复杂的三维空间交互并未实现,这将作为接下来的工作继续展开研究.