基于Kinect和ROS的骨骼轨迹人体姿态识别研究①

2020-03-31 12:17胡敦利柯浩然
高技术通讯 2020年2期
关键词:特征向量骨骼角度

胡敦利 柯浩然 张 维

(北方工业大学现场总线及自动化北京市重点实验室 北京 100144)

0 引 言

机器视觉广泛应用于智能监控、家居安全、医疗监护、智能机器人以及运动员辅助训练[1]等领域。但机器视觉的应用不应该只限于简单的视频监控,而应该以视频中的内容为切入点,分析其中的数据,为人们提供更加智能化的服务,例如通过捕捉人的表情、动作等来预测人的行为或者意图。

经过多年的发展,人体姿势识别的方法大体分为模板匹配法[2]和状态空间法[3]。另一方面,在过去几十年的机器视觉和机器智能领域中,通常选取空间特性或者时间特性作为表征人体特征的描述性信息,再对其进行编码分析。在第1代Kinect发布后,微软剑桥研究院的Shotton等人[3]发表了关于利用骨骼信息进行姿势识别方法的论文,由此引领了一大批学者开始研究基于骨骼信息的人体行为识别。2014年,微软发布了第2代Kinect,在原有的基础上提高了其性能,由此可以为人体姿态识别提供更加丰富和清晰的数据源。但在Linux系统和机器人操作系统(robot operating system,ROS)系统下,由于微软对于Linux系统下开发的支持并不好,所以需要使用第三方软件和一些中间件对Kinect V2进行开发。通过在Linux和ROS系统下开发,可以方便地在机器人上使用Kinect V2获取人体骨架信息,为之后的人体姿态识别提供坚实基础。目前已经有了很多人体动作识别的方法[4],它们大多数只对完整的动作做分类识别[5-7]。在日常生活中,摄像机捕捉到的人体动作往往是片段的,而非一个完整的行为动作,这就给人体动作识别带来了很大困难,片段的动作可能代表了与完整动作完全不同的含义。这就需要采用一种有效的特征提取方式。针对这个问题,本文设计了一种特殊的特征选取方法,利用人体的骨骼轨迹进行分析,最终形成有效的特征信息。

1 先期工作

1.1 获取骨骼信息

在Linux中使用Kinect V2需要使用第三方软件,libfreenect2支持RGB图像、IR和深度图像的获取。而在ROS中使用Kinect V2需要iai_kinect,它提供相机标定工具、深度数据配准工具,最重要的是它可作为libfreenect2和ROS的桥接工具。图1中给出了4种不同设备获取的人体骨架模型,OpenNI画出了15个骨骼节点。Kinect V1 SDK画出了20个骨骼节点,增加了对于手指、脚趾和髋关节中心的描述。Kinect V2 SDK在一代的基础上又增加了5个关节点。动作捕捉系统(motion capture system,MoCap)则可以选择不同数量的骨骼节点。虽然MoCap系统可以提供更加丰富的骨骼节点,对于人体的描述更加精确,但它不可以用于移动的机器人平台上,基于这个原因本文选用了OpenNI。

图1 人体骨骼节点

动作特征指的是从人体动作序列中提取的可以正确描述人体动作状态的参数[8]。视频图像中的颜色、纹理、时间和空间等信息都可以作为人体姿态特征参数。通常人体姿势识别选用位置坐标、速度、相对角度等。文献[9]提出了一种基于人体骨骼关节点坐标的特征表示方法来进行动作识别。文献[10]提出了基于词袋模型的可以捕捉局部时空信息的特征表示方法,一方面词袋法不能准确地处理视角变化的问题,并且词袋法的计算量不适合实时处理的应用。另一方面之前基于词袋法的特征表示没有利用Kinect V2提供的深度信息。

不同于之前提到的基于骨架的特征表示方法,本文的方法不仅能够识别姿态还具有预测的功能。正是因为这种预测的能力,可以对正在进行的动作做出正确的分类,而不用等到整个动作做完。能够对未完成的动作进行预测的关键在于对时间信息的处理,以往的方法通常会采取在线的方式对机器学习方法进行扩展。与以往方法不同的是本文直接将时间信息融合到特征中,使得机器学习方法可以直接使用。

2 骨骼特征表示

2.1 生物解剖学基础

人体解剖学规定,人体有3个互相垂直的基本轴和基本面[11],其在描述身体和关节运动时非常重要。图2中3个解剖平面分别称为矢状面、冠状面和横断面。

图2 人体解剖学平面

当描述一个人体的动作时,可以根据占主导作用的平面将动作进行分解。正是基于这种生物学解剖平面的理论基础,将Kinect V2捕捉到的骨架数据投影到3个解剖平面上,通过计算不同平面上的骨骼轨迹来使得特征表示方法具有时间和空间的特性,并且能够代表所有的人体运动姿态。

2.2 特征向量

2.2.1 构建3个投影平面

2.2.2 骨骼空间位置模型

在所有的3维骨骼坐标都被投影到2维平面上之后,可以选择相邻时间上的运动矢量之间的夹角直方图来表示每个骨骼节点的运动轨迹。先构建骨骼静态位置模型,它表示在静止状态下,人体某一骨骼节点相对于另外节点的位置。如挥手时,人的下肢是相对静止的,而在踢腿时上肢则是相对静止的,可知挥手和踢腿时的手臂相对于躯干中心的位置是不一样的,所以可以明显地区别2个动作,这样以躯干中心为原点建立骨骼静态位置模型p={xi-x0|i=1,2,…,N},其中x0代表躯干中心,N表示共有多少个节点,实验中N=14。

2.2.3 计算骨骼角度

(1)

其中θ的取值范围是(-180 °,180 °)。在进行直方图编码时,需要对角度范围进行划分,将(-180 °,180 °)分为12份,即每30 °为一份。计算不同时刻相邻节点的角度,然后统计出直方图对时间特征进行编码。

图3中横坐标依次代表xy,zx,yz平面上左臂、右臂、左腿、右腿和躯干分为0~30 °、30~60 °,…,330~360 °的角度值,纵坐标为视频中角度值变化的次数,角度值的变化描述了人体不同关节点运动幅度的大小,代替了以往用骨骼坐标来描述人体动作的方法。而角度的计算方式不受人体身材尺寸大小的影响,即某一骨骼节点向量与另一骨骼节点向量间的夹角,与这两个向量的长短无关,即骨骼节点在同一方向移动的远近不影响角度变化,所以基于方向变化的特征表示方式适用于不同身材尺寸的人,也就是具有不变性。

图3 直方图

2.2.4 基于时间金字塔的特征提取

为了对长时间间隔的时间信息进行编码,使用基于图像金字塔的分维融合算法会是更好的选择。将整段时间内骨骼轨迹分解成3个不同等级的图像序列。第1等级,将整段时间内的骨骼节点角度变化全部记录下来,按式(1)选取相邻时间间隔的骨骼节点计算角度变化。第2等级,只选取一半时间的骨骼节点坐标,即t=1,3,5,…,n。第3等级,选择更大时间间隔的骨骼节点坐标,即t=1,5,9,…,n。图4中给出了一个直观的时间金字塔表示的实例[14]。

图4 时间金字塔分解图

在用直方图表示角度变化时,采取将3个等级计算出的角度变化累加的方式,即投影到3个解剖平面坐标,角度从0 °到360 °按每30 °划分,分为12份,还要分别计算15个骨骼节点。这种直方图统计角度的特征表示方法会带来很大的计算量,有可能会影响到系统的实时性。当人做某些动作时身体的某些关节并不会产生巨大变化,或者是产生的变化基本一致。举例来说,当人举起双手时,下半身并不会运动,并且手掌和手腕的运动轨迹非常相似。可以通过去除这些冗余的骨骼节点信息,达到减少特征向量维数的目的。根据Jiang等人[15]的分析结果,将人体划分为5大部分即可以清楚地表示出人体动作。第1部分是左臂,包括了左肘和左手掌2个

图5 180维特征向量

骨骼节点。第2部分是右臂,包括了右肘和右手掌。第3部分是左腿,包括了左膝和左脚。第4部分是右腿,包括了右膝和右脚。第5部分是躯干,包括了头、脖子、两肩和两胯。经过筛选具有有用信息的骨骼节点,我们最终得到了一个180维的特征表示向量,如图5所示。

2.2.5 特征向量改进

在前面的实验方法中,由于获取视频数据时,采取等时间连续存储5个子动作的方式,因此每个时间段内的子动作信息量不一致。可能会出现第1个时间段内做了2次动作,但第2个时间段内没有做动作,因此会造成视频数据的不准确。虽然这种方式获取简单,但实际效果不尽如人意。这里借鉴Yang[16]的自适应能量方法。

图6 自适应能量图

2.3 姿势识别

支持向量机(support vector machine,SVM)是目前最常用且效果最好的分类器之一,其具有优秀的泛化能力,对数据规模和分布的要求较低。而且能够解决小样本、非线性和高纬度的问题。并且SVM中使用核函数解决特征向量映射到高维后要进行内积的计算,降低了计算的复杂度。传统的SVM只针对2分类问题,而本文使用的libsvm提供的SVM库具有多分类的能力[17]。

2.4 骨骼节点预测

因为从Kinect中获取的骨骼节点坐标可能出现误差,如图7中,当人体出现遮挡情况时,Kinect不能正确判断骨骼节点的位置,会使得骨骼节点出现漂移,如图中方框圈出的骨骼节点。

图7 骨骼节点预测

要从已经获得的数据中估计出出错的骨骼节点的坐标,使用扩展卡尔曼滤波(EKF)来估计骨骼坐标。EKF有2个主要优点。一是它符合具有预测能力的要求,EKF通过迭代前一时刻的状态值和当前时刻的状态值来预测未来时刻的状态值。第二点是由于其迭代的特性,仅需要前一时刻和当前时刻的数据,保证了在获取骨骼数据的帧之间的时间间隔时期也可以正常运行,即用于选取第2、第3等级骨骼节点坐标。这意味着EKF可以应用于实际的机器人系统,对于骨骼节点出现漂移的情况,将此时的骨骼节点坐标视为缺失值,通过EKF估计出的值来填补该时间点的值,再计算修正后的特征向量,提升了特征向量描述动作的准确性。

3 测试结果

骨骼特征的提取方法使用Python实现,而获取彩色视频和骨骼图像使用C++编写,在ROS中可以将这2部分作为2个节点,建立一个话题进行连接。

为了测试特征向量在人体姿态识别中的效果,实验室用多名实验者录制了多组实验视频。录制视频要求每段视频的时间长度为3 s,共包括4种动作:站立、下蹲、挥动双臂和跳。现有的公开人体运动数据集内的动作通常只做一次,例如MSR Daily Activity 3D dataset等。而本实验的实验者在3 s内做动作的次数可以是一次或多次。这就意味着整段视频内可能包含着不完整的动作,因此带来了动作识别的困难,以往的模板匹配法用在此视频中就达不到很好的效果。图8中是累计柱状图,可以看出相同动作间的整体趋势是呈类似的,而不同动作间如挥动双臂和跳的趋势就可以明显看出不同,这证明了次方法提取的特征向量是有效的。根据累计柱状图中不同身体部分的占比,可以确定出哪些部分对动作识别的效果影响更大,从而可以通过设置不同权值的方式,减小带来误判断的身体动作的权值。例如“挥动双臂”动作中身体躯干部份的占比明显小于其他部分,但实际动作中“站”和“挥动双臂”的躯干部分变化应该基本相同,因此减小这部分的权值,不仅不会影响动作识别的准确性,相反还可以避免类似动作间的误判段。

图8 累计柱状图

最终在调试好SVM的参数后,使用了一共500组的数据作为训练数据,然后用10组数据做验证,得到的交叉验证正确率是86.25%。通过交叉验证,得到了使得SVM分类器效果最好的惩罚系数log2(C)=-5和log2(gamma)=-7,保证了良好的拟合和泛化能力,以及较快的训练和预测速度。在后面的训练和测试中可以指定惩罚系数和gamma值以达到更好的预测效果。

在验证集实验后,得到了如图9的混淆矩阵,相比交叉验证的正确率下降了少许,正确率为85.25%。从图中可以看出出现误判率较高的动作为跳,尤其是将跳误判为站。

在采用了自适应能量的方法后再次进行验证,通过等能量划分子动作,可以获得更好的分类效果,图10中的正确率提升到了92.25%。4类动作相比之前的识别率都有提高,其中站、蹲、挥动双臂的正确率均达到了90%以上。

图9 混淆矩阵

图10 修改后的混淆矩阵

4 结 论

根据人体解剖学建立的3个坐标平面,利用OpenNI2提供的骨骼节点坐标建立空间位置模型,计算得到骨骼向量变化的角度。为了对不同时间间隔的骨骼数据进行编码,采取时间金字塔的多级融合算法,将骨骼向量角度分级计算并累加,得到180维的具有旋转、平移不变性的特征向量。在此基础上又改进了特征向量,以自适应能量的方法,将一段视频内骨骼角度变化的多少作为衡量能量的标准,按照能量相等划分视频中的人体动作。为了解决人体被遮挡时出现骨骼节点漂移的现象,利用EKF预测真实骨骼节点坐标,有效提高了特征向量描述人体动作的准确性。针对身体不同部分骨骼角度变化大小在动作识别中占比不同的情况,设置了不同的权值,减少了冗余骨骼节点带来的误判,同时降低了计算的复杂度。经过实验仿真验证了本文提出方法的有效性。

猜你喜欢
特征向量骨骼角度
二年制职教本科线性代数课程的几何化教学设计——以特征值和特征向量为例
神奇的角度
克罗内克积的特征向量
做家务的女性骨骼更强壮
三减三健全民行动——健康骨骼
一个涉及角度和的几何不等式链的改进
一类特殊矩阵特征向量的求法
角度不同
人啊
骨骼和肌肉