杨光耀
(北京维周智能科技有限公司,北京 102600)
深度学习算法是当前计算机领域中实现视觉感知、目标识别等目标的常用方法,借助CPU 和GPU 强大的运算能力,通过模拟人体视觉、听觉等复杂功能的物理作用机制来完成过去很多因受运算水平和认知深度限制而难以实现的任务。当一个运动的物体作用于人眼时,眼睛通过分析人体的关键特征点随时间的变化趋势,在动态标记特征点的基础上对运动状态进行识别,从而做出相应的判断。基于特征变化规律的姿态识别是眼睛的主要功能,同时也是一个信息采集与深度加工的过程。在对眼睛物理机理和目标识别过程进行研究的过程中,有学者结合神经网络运算方法提出了OpenPose 姿态识别算法。该文重点研究该姿态识别算法的实现过程。
OpenPose 是一个基于卷积神经网络和监督学习的开源项目,主要用于人体姿态识别。该项目最早由美国卡耐基梅隆大学提出,既可以用于单人姿态识别,也可以用于多人姿态识别。该算法在线辨识人体在运动过程中产生的肢体、表情等部位的变化状态,再通过卷积神经网络进行特征提取与识别,经过在线训练之后可以用于类似场景。OpenPose 可以对运动中的人体进行关键点自动辨识,在相同运动时间内采集多个关键点进行特征标记,之后对这些关键点进行持续跟踪。在跟踪过程中,对摄像机拍摄到的扭曲画面进行参数评估和实时补偿,最大限度地提升对人体姿态识别的精度。
一般来说,在姿态识别过程中,以下关键因素会影响识别的速度和精度:1) 在摄像机镜头内,由于目标处于时刻运动的状态,因此采集到的物体位置分布不一,且运动中的人体在摄像机镜头内成像时所占用的像素数目会变化,这些因素会对目标特征的捕捉与识别造成影响。2) 如果摄像机成像过程中出现某些因素(光线变化、突然出现遮挡物以及进入摄像机镜头内人数的变化等),那么这些偶发因素都会影响计算方法对目标识别的效率和采集目标特征的精度。3) 利用摄像机成像技术对进入视场内的运动目标进行姿态识别是串行运算的过程,也就是必须对一个运动物体进行识别之后才能对下一个物体进行识别,这对于小样本数据是有效的,但是当待识别的运动物体数量增加时,就会增加运算难度,同时实时性也会降低,这就会给实际应用带来困难。为了解决以上目标识别过程中的难题,OpenPose 采用基于深度神经网络的方法对关键特征点进行预测式估计,从而获得准确的识别结果。OpenPose的计算流程如图1 所示。
由图1 可知,当利用OpenPose 进行目标识别计算时,首先,需要对输入系统中的图像或视频进行预处理,采用归一化的方法对组成图像或视频的数据进行处理,从而便于后续运算。其次 ,采用从上到下的顺序对人体的特征点进行检测,将检测后采集的特征点数据进行矩阵化存储,按照行和列不同的含义进行编码。再次,基于特征点数据,利用神经网络强大的数据拟合能力对采集的特征点数据进行建模,对其中有规则的变化进行数学表征,同时对特征点后续发展趋势(也就是人体关键部位的运动状态)进行预测,以提升特征点在线识别的效率,缩短识别时间,便于在多种类型的设备上进行部署。最后,对建立的特征点数据模型和预测值进行修正,采用残差补全的方法对不准确的结果进行校正,最终确保输出的姿态识别结果符合实际情况和逻辑预期。
图1 OpenPose 计算流程
在大多数应用场景中,选择采用双层卷积神经网络就能完成姿态识别任务。首先,在双层卷积神经网络中,对摄像机中采集到的像素点进行骨架化拆分,也就是根据进入摄像机内人体的大小和姿态、四肢的走向以及头颅的位置,采用简单的线段集合进行模拟,并假设这些线段的集合可以用L(p)来表示。其次,对其中的关键点进行标记,假设这些关键点的集合可以用S(p)来表示。最后,分别对L(p)、S(p)进行回归运算,将回归后的结果输入神经网络中进行卷积运算,通过特征融合的方法采集特征点信息。对采集到的信息来说,需要利用其他值(另一层神经网络在对特征点变化趋势进行预测后得到的值)对其进行修正,这样就可以对特征点信息进行再次校正,有利于获得更高的输出精度。
为了利用摄像头和计算机达到人体姿态识别的目的,需要结合OpenPose 算法设计一整套算法实现流程。二维平面的人体姿态识别的步骤如图2 所示。
图2 人体姿态识别过程步骤
由图2 可知,当利用OpenPose 进行二维平面内的人体姿态识别时,首先,需要根据采集的姿态特征点建立数据集,按照一定的比例将数据集划分为训练集以及验证集,一般训练集的数据量比验证集多,这样才能最大限度地提升人体姿态数学模型的拟合精读,从而训练出泛化能力较强的神经网络。其次,利用OpenPose 算法遍历整个数据集,利用训练集拟合数据模型,利用验证集测试训练好的数据模型,测试结果符合误差指标表示模型准确,可以进行后续运算,否则重新对神经网络进行调参并进行再次训练,直至获得准确的数据模型为止。再次,利用OpenPose算法对新输入的人体姿态图像或者视频进行动作特征的提取,经过前期的训练和验证后,数据模型具有一定的泛化能力,能够识别输入系统的姿态特征点数据,从而进行特征计算,给出符合预期的结果。从次,对识别的特征点进行标签化处理,对重要特征点建立数据标签,替换特征较弱的数据点,从而完成对训练集的更新,在该基础上,再次对建立的数据模型进行训练,进一步完善模型的识别准确度,同时对OpenPose 算法进行改进,通过关键参数的优化提升泛化能力。最后,对人体姿态图像或者视频进行再次识别,将2 次识别的结果进行比较,利用第二次识别的结果校正第一次识别的结果,对2 次识别结果中重合的部分进行提取,将其作为最优识别结果输出,便于在线使用。
为了实现人体姿态识别过程,需要分别搭建系统开发环境对采集到的数据和特征进行处理,然后再基于OpenPose 进行算法改进与设计,最终获得理想的识别结果。
用于人体姿态识别目的的检测系统是以OpenPose 为核心算法进行设计和开发的,因此需要先搭建OpenPose基本运行环境。目前,机器视觉领域中的算法开发主要依靠Python 语言来实现。同时,OpenPose 是基于C++开发的算法,因此该文选择Python 语言作为代码编写、调试和运行工具,选择CUDA 作为调用显卡训练测试的必须软件,选择swig(一种深度学习软件开发工具)的目的在于给OpenPose 提供编译环境。根据OpenPose 官方提供的cmu 模型、mobilenet_thin 模型、mobilenet_v2_large 模型和mobilenet_v2_small 模型的评价,该文选择cmu 模型作为姿态识别的调用模型,主要原因是cmu 具有更高的识别精度。OpenPose 中集成了很多完整的、易于实现特定功能的函数,在使用过程中可以直接进行调用。
在利用神经网络进行大规模训练之前,需要选定并设定相应的标签,便于神经网络识别。该文结合常见的人类肢体动作,选择站立、行走、奔跑、跳跃、转体、坐下、下蹲以及挥手等动作作为标签。结合这些标签,选择进入摄像机镜头的人体骨架部位的鼻子、脖子、左右肩膀、左右手腕以及左右膝盖等部位作为关键识别点,通过采集这些点位的变化信息来进行特征识别。
当OpenPose 进行姿态识别时,是基于摄像机采集到的视频(图片)信息进行特征提取的。OpenPose 根据关键识别点的分布对进入摄像机内的人体进行骨架化抽象。
在对关键识别点进行骨架化抽象之后,OpenPose 对关键识别点的特征进行实时提取,提取的数据既包括关键识别点的位置分布,也包括临近识别点之间连线的变化情况。
OpenPose 提供了18 个身体部位的准确位置,包括鼻子、脖子、眼睛、耳朵、肩膀、肘部、手腕、臀部、膝盖以及脚踝等。对这18 个身体部位进行辨识就可以得到18条曲线,分别对应这些关节的运动轨迹。为了减少数据集的冗余度,根据身体的结构和运动特点将人体关节分为不同的组别,具体如下:1) 面部关节。面部关节包括头部内部的点。面部关节分布密集,在小范围内运动,很少表现出强烈的独立运动。因此,将这些关节从表示方案中删除。2) 躯干关节。躯干关节包括肩部和臀部。它们反映了身体的运动状态。此外,它们是连接身体和四肢的关节。因此,将它们加入表现方案中。3) 一级关节。一级关节包括肘关节和膝关节。肘关节和膝关节包括大量关于手势和运动的信息。尤其是当身体旋转和弯曲时,它们在视觉上发挥了比躯干关节更重要的作用。因此,将它们加入表示方案中。4) 二级关节。二级关节包括腕关节和踝关节。腕关节和踝关节比肘关节和膝关节更容易被拉伸,对人体姿态识别具有决定作用。因此,将它们加入表现方案中。
根据表现方案对进入摄像机中的人体重要部位进行识别。在识别过程中,由于身体的不同关节在人类视觉印象中的重要性是不相等的,因此,为了给这些关节分配适当的权重,使分数与人类的判断相吻合,该文制定了以下权重系数赋值规则:1) 二级关节与身体躯干的距离较长,但是一级关节与身体躯干相连,并受二级关节和身体躯干的影响。因此,在手势匹配中,一级关节的重要性比二级关节低,身体躯干关节的权重最小。2) 因为一级关节与二级关节之间的距离比一级关节与身体躯干之间的距离长,所以下肢更加灵活,也更难模仿。因此,以一级关节和二级关节为端点的运动轨迹在匹配时更重要,给其赋予最高级别的权重系数。
在给不同部位的运动轨迹赋予不同的权重系数之后,就开始对人体运动轨迹进行识别,并根据识别结果提取数据,分别按照点特征、线特征和面特征对提取的数据进行相应预处理,包括剔除无效数据、建立每一组数据的标签以及对标签化数据进行输入和输出分类等,从而便于后续利用算法进行训练和识别。
对摄像机采集到的视频(图像)来说,将其进行预处理后组成输入数据集,利用OpenPose 进行数据集遍历,提取关键识别点的特征信息,对提取到的特征点进行信息整合。将预处理后的输入信息和输出信息建立一一映射的关系,将其中70%的数据作为训练集、将30%的数据作为验证集进行训练,训练过程中选择不同的评估模型会得到不同的训练精度。经过现场试验,最终确定选择MLPClassifier分类器作为评估模型,该分类器模型的基本参数见表1。
表1 MLPClassifier 分类器基本参数
在选择分类器之后,就对输入数据进行训练,一方面利用OpenPose 自带的算法进行姿态识别,另一方面采用RNN 网络对输入数据进行预测,根据预测结果对现有的数据训练结果进行修正,从而提高姿态识别的准确度。RNN 网络选用LSTM 网络,也就是长短时记忆神经网络。这种网络最大的特点就是可以准确地对时间序列数据进行预测,根据当前数据特征对未来变化趋势进行预测,结合预测值对训练结果进行修正,从而获得理想输出。结合LSTM 网络后的OpenPose 算法主要由7 层主要结构组成,如图3 所示。
利用神经网络对人体姿态进行识别的重点在于神经网络的设计和训练。前文主要介绍了神经网络的设计方法,基于图3 可以设计一个符合使用要求、能够有效进行人体姿态识别的神经网络。在完成设计工作后,需要对神经网络进行训练。神经网络的训练过程就是参数调整的过程,该文采用在线训练的方式对神经网络进行训练。首先,指定多名不同体态、身高的工作人员在摄像机前做不同的动作,录制视频后将其传入神经网络进行识别,根据识别结果与标准结果的均方差来判断识别的效果,当识别效果不佳时,工作人员重新对神经网络参数进行调整,赋予其新的参数值,之后再进行反复识别、判断和调整,最终可以获得越来越接近实际情况的识别效果,这时就表示神经网络已完成训练。之后,另外组织其他工作人员依次通过摄像机做出不同的姿态供神经网络识别,以判断识别率。识别率是识别成功的次数与总识别次数之间的比值。当识别率很高(该文设置为95%)时,表示神经网路训练效果显著,能够用于识别任务。经过在线测试发现,训练后的网络能够达到预定的识别率,表示该神经网络符合使用要求,能够用于人体姿态的在线测试。
利用以上算法对输入数据进行训练,再利用训练好的网络进行人体姿态识别,就可以获得较好的识别结果,识别精度较高,准确度也较高。
该文结合OpenPose 算法研究了实现人体姿态识别系统的过程。通过分析与设计可以发现,OpenPose 是目前进行人体姿态识别的主流算法,其具有很高的识别精度和很快的识别速度,能够满足商业化开发的需求。另外,该文在实现算法的过程中,利用RNN 网络的预测值对辨识结果进行修正,从而进一步提高姿态识别的精度。研究人员在通过计算机实现算法的过程中发现,OpenPose 算法具有一定的延迟,当利用该文所提出的方法进行姿态识别时,存在大约0.1 s 的延迟,如何最大限度缩短延迟将是未来的重点研究方向。
图3 OpenPose 算法网络结构层次