房志远,石守东,郑佳罄,胡加钿
(宁波大学 信息科学与工程学院,浙江 宁波315211)
现代化办公主导模式使坐姿作业变得普及,许多人面临着与这种久坐的生活方式直接相关的各种疾病,如办公室工作人员不适当的姿势是与工作有关的肌肉骨骼疾病的最重要的危险因素之一,直接后果可能是背痛,间接后果则与颈椎病、近视、心血管疾病和过早死亡有关[1]。 因此,坐姿的研究在人机交互、医疗健康、交通安全等领域具有较高的应用价值。
人体坐姿识别作为人体姿态识别的一个重要分支,目前主要研究方法包括基于接触式传感器和基于计算机视觉两方面。 其中,基于接触式传感器方法[2-9]识别实时性较好,但成本较高且需要与人体相接触,一定程度上限制了工作活动中的行动自由。相反,基于计算机视觉的识别方法成本相对较低、易推广。 同时,深度学习姿态估计算法近些年取得了较好的成果,越来越受人关注。
目前基于计算机视觉的姿态识别方法主要是通过骨骼信息建立人体姿态特征,并利用分类器实现姿态识别。 其中一方面是利用具有骨骼关节信息检测功能的深度摄像机获取深度图像和骨骼信息(如微软Kinect 和英特尔Realsense),结合两者信息建立三维人体姿态。 文献[10]利用Kinect 摄像机获得的深度图像和人体轮廓图,提取前景进行三视图映射,并利用三视图数据集对网络进行训练,训练和推理过程都涉及到图片预处理并计算三视图,因此计算量较大,但利用了双输出分别预测左右和前后姿态,提高了坐姿分类精度。 文献[11]使用Kinect采集骨骼信息并分别训练支持向量机(SVM)和人工神经网络(ANN)实现姿态分类。 文献[12]提出一种基于RIPPER 规则学习算法,利用bagging 算法和随机子空间方法创建规则集成,允许训练100 个规则集组成一个规则集成,并通过多数投票进行最终分类。 文献[13]提出一种基于三维卷积神经网络的姿态识别方法,利用深度摄像机获得三维关节位置,并用高斯函数生成三维高斯体素特征,随后将其输入到三维姿态网络进行姿态分类。 文献[14]利用深度图像获得3D 骨骼模型,然后计算3D 关节距离特征和几何角度特征作为输入,送入SVM 分类器进行分类。 文献[15]提出一种基于MobileNetV2的深度循环层次网络(DRHN)模型,该模型通过接受RGB-D 帧序列并产生语义相关的姿态状态表示,减少了躯干遮挡情况下的姿态检测失败。 以上方法都获得了较好的精度和实时性,但由于算法仅面向PC 端,且依赖于具有骨骼关节检测功能的深度摄像头,价格高昂,在生产生活中无法大规模普及。
另一方面则是利用深度学习方法实现人体骨骼关节点检测(又称姿态估计),并利用骨骼关节点信息计算人体姿态特征。 文献[16]提出使用姿态估计OpenPose 模型构造表征人体姿态的骨骼特征数据集,并用此来训练卷积神经网络,对不良坐姿进行分类。 文献[17]通过使用OpenPose 模型获取人体骨骼关节坐标,并将其分别送入人工神经网络、支持向量机和决策树,并对分类的准确率进行比较,预测结果送入树莓派用来控制家用电器。 文献[18]提出一种基于OpenPose 模型的中国古典舞基本手位识别方法,并将其部署到人工智能开发板中。 文献[19]通过OpenPose 模型提取骨架信息,并利用18 个关节点计算肢体间的角度和距离特征,最后采用基于规则的决策方法对坐姿和站立姿势进行分类。 文献[20]提出了一种基于OpenPose 模型的跌倒检测模型,在骨骼关节点的基础上,结合SSD-MobileNet 对象检测框架消除非人类区域所识别到的关节点,减少算法的误检率,从目标中提取关节信息送入SVM 分类器进行分类。 此类方法随着深度学习算法检测性能的不断提升,同时因为利用摄像头采集二维图像的方法成本低,其应用范围越来广泛,但缺点是网络模型的参数量和计算复杂度也随之增大,使其很难在资源有限的嵌入式设备上获得较快的推理速度。
为了解决在有限资源上实现坐姿快速高精度识别的问题,本文提出了一种基于神经网络的骨骼特征融合下坐姿快速识别方法,针对关节点检测模型OpenPose[21]参数量和计算复杂度较大、推理速度较慢的问题,提出对骨干网络进行优化,并利用基于自适应批量归一化(BN)层的候选评估模块对预训练好的模型进行剪枝,从而减少模型所需要的设备资源,同时改进坐姿识别算法,在原始骨骼关节特征基础上融合骨骼图像,提升识别精度。
传统基于深度学习的坐姿识别方法总体结构如图1 所示, 主要由三部分组成: OpenPose 姿态估计(关节点检测)部分、特征提取部分和坐姿识别部分。 具体来说,算法首先利用OpenPose 姿态估计模型实现人体骨骼关节点检测,特征提取部分利用关节点信息计算人体坐姿特征,最后将特征输入神经网络实现坐姿分类。 坐姿分类网络由一个输入层、2个隐含层以及1 个输出层组成,每个隐含层包括300 个神经元。
图1 基于深度学习的坐姿识别方法总体结构
根据算法总体结构可知,影响最终坐姿识别精度的主要有两个方面:姿态估计算法检测关节点的可靠性以及提取特征的表征能力。 为了提高坐姿识别的精度,对特征提取部分进行改进,在骨骼关节特征向量基础上融合骨骼图片特征向量,特征提取示意图如图2 所示,一方面利用12 个骨骼关节点来计算表征人体坐姿的特征向量,分别包括:10 个角度特征、12 个骨骼关节点归一化坐标、66 个归一化距离特征、22 个向量特征。 另一方面通过训练好的卷积神经网络模型提取骨骼图像特征,将网络的输出与骨骼关节特征向量融合,形成新的坐姿特征向量,融合后的特征向量较大程度上表征了人体坐姿特征,利用其对神经网络进行训练可以提高分类精度。
图2 特征提取示意图
基于骨骼信息建立人体姿态特征是姿态识别的主要方法。 近些年,受益于深度学习姿态估计算法的高精度和泛化能力,可用其代替深度相机提取关节信息。
目前深度学习姿态估计算法可分为两类,一是自下而上的姿态估计方法,算法首先检测出图片中的所有关节点坐标,然后将这些关节点组合成每一个个体。 相反,自上而下的姿态估计方法先检测每一个个体再估计关节点。 在检测速度方面自下而上的方法更有优势。 其中,OpenPose 是目前使用较为广泛[16-20,22]的自下而上的姿态估计方法,可对坐姿图片进行骨骼关节点检测。 考虑到实际办公场景下摄像头一般位于人的正前方,原始算法可以检测到18 个人体关节点,这里只取用了上半身12 个骨骼关节点信息,包括左右眼、左右耳、鼻子、嘴巴、脖子、左右肩、左右手肘和左右手腕。
在实际摄像头采集的过程中,因摄像头摆放位置或坐姿偏移造成的坐标差异,会导致其骨骼关节点的绝对空间位置存在较大差异。 对于一个给予的特定姿态,它应该独立于关节的绝对空间位置,而依赖所有关节间的相对位置。 因此,在这种情况下需要将关节的坐标归一化到[0,1]范围内。 为了解决这一问题,本文采用基于边界框的归一化方法[13],其方法的主要思想是利用训练集中骨架的最大边界框边长对骨架进行归一化。 具体来说,对于训练集中给定的第i 个骨架(包含12 个骨骼关节点的2D 坐标信息),骨架两个维度的最大和最小坐标值分别定义为。 这个骨架的最大边界框边长为li=。 因此,拥有N个骨架信息的训练数据集,最大边界框边长L=max(li),i∈N,最后,每一个骨骼关节的坐标可用式(1)计算。
式中:xmax,xmin为当前骨架的最大和最小X轴坐标,x为原始X轴坐标,xnorm为归一化后的X轴坐标。 纵坐标的处理方法和橫坐标相同。 通过这种方式,每个骨架被常数L归一化,并且骨架的中心对齐到[0.5,0.5],由于L是不变的,骨架的结构特征也保持了一致性。 第二种特征为关节间的角度特征,对于一个给定的姿态,关节间的角度特征不会受用户的高度影响,另一方面关节角度缩放和旋转不会发生改变,因此它们不依赖于主体的高度或用户相对于相机的距离和方向,这里提取了11 对身体的10 个角度,其中11 对身体由手腕与肘、肘与肩、肩与脖子、脖子与鼻子、鼻子与眼睛以及眼睛与耳朵节点形成,角度特征则由各相邻肢体的夹角组成。 第三种特征为归一化身体距离信息。 最后还包括11 对身体的22 个向量特征,其中向量特征由X轴和Y轴方向组成。
获取更多有价值的姿态特征是提高姿态分类精度的关键。 这里首先使用Openpose 姿态估计模型对原始数据集进行关节点检测,根据关节信息制作骨骼图像数据集,并训练卷积神经网络。 训练后的卷积神经网络被用于提取骨骼图像特征,最后一层全连接输出被融合用作训练坐姿识别网络。 提出的卷积神经网络识别框架如图3 所示,其中,输入骨骼图像为224×224 RGB 图像,卷积操作为3×3,池化操作为2×2。
图3 提出的卷积神经网络识别框架
OpenPose 姿态估计模型虽有较好的检测性能。但是由于模型本身参数量和计算复杂度较大,导致程序运行过程中模型推理占具了极大部分的计算资源,在资源有限的嵌入式设备上应用困难。
由图1 上部分原始OpenPose 网络结构可知,其网络结构主要由三个部分组成:VGG 骨干网络、一个初始化阶段和多个细化阶段。 其中表1 为模型各阶段计算量和精度对比[23],AP 为平均精度,GFLOPs 为每秒浮点运算次数,图像输入大小368×368。 通过分析对比可知模型的主要计算复杂度集中在骨干网络和细化阶段上,计算复杂度分别占了28.14%和68.33%。
表1 OpenPose 模型各阶段计算量和精度对比
为了提高检测速度,对原始OpenPose 网络模型进行了结构替换和剪枝的优化工作,以减少模型参数量和计算复杂度,达到提高推理速度的目的。 最后优化后的模型需使用COCO 骨骼关节点数据集进行再训练,以恢复两个阶段优化后的精度损失。 详细优化过程如下两部分。
OpenPose 网络训练过程包括两部分,第一部分是骨干网络在ImageNet 数据集上进行训练,第二部分是使用MS COCO 骨骼关节点数据集对整个模型进行训练。 针对原始模型骨干网络VGG 参数量和计算复杂度较大的问题,第一部分的骨干网络可由其他性能较好且参数量和计算复杂度相对较低的模型替代。这里比较了三种网络模型,如表2 所示。
表2 网络性能比较
对比发现轻量化网络Mobilenet 可以获得和原始网络相当的精度,同时模型计算复杂度和参数量大幅度减少。 因此,这里使用Mobilenet 网络对原始VGG进行替换,同时删除了Conv4_3,Conv4_4,以及修改Block_12_add 层的输出特征图尺寸,最后将其与Block_5_add 层的输出特征图进行连接作为初始化阶段的输入特征图。 替换后的网络组成如图4 所示。
图4 替换后的网络
多个细化阶段(Refinement stage)网络提升了模型对关节点置信图和亲和度向量的预测能力,同时不可避免地增加了计算开销。 为了尽可能减少模型所需计算资源,利用基于自适应批量归一化(BN)的候选评估模块[27]对细化阶段进行剪枝操作,通过设置合适的全局剪枝率获得基于平台的最佳精度和模型大小间的平衡。
2.2.1 自适应批量归一化(BN)
BN 层具有加速网络收敛并提升准确率的作用,现已广泛应用到卷积神经网络中。 在实际网络模型中,BN 一般置于卷积层和线性层之后,对上层操作得到的特征图进行归一化,从而产生更加稳定的分布。 原始BN 操作如式(2)所示。
式中:γ和β是可训练的,分别代表BN 的特征缩放系数和偏移系数。ε为一个非常小的值,为了避免分母为零。μ和σ2为向量,分别用来记录每一个通道特征图的均值和方差,其元素值会在前向传播中得到更新。 对于一个尺寸为N的批量(batch)样本,μ和σ2统计值的计算如式(3)。
当进行训练时,μ和σ2通过移动均值和方差计算得到,如式(4):
式中:m为动量系数、下标t为训练迭代次数。 在一个训练过程中,如果需要总的训练次数为T,μT和σ2T则就是最终测试阶段的μ和σ2。
以上所述的两项BN 统计值是基于完整网络得到的,而对于一个剪枝后的子网络,其统计值均值μ和方差σ2已经过时,因此需要利用部分数据集进行几次推理,重新计算自适应值μ和σ2,其目的是为了BN 统计值适应于剪枝后的网络。 具体来说,在训练之前冻结所有反向传播可更新的网络参数W。 最后通过几次前向传播,使用式(4)对移动均值和方差进行更新,更新后的均值和方差定义为^μ和^σ2。
2.2.2 剪枝过程
由表1 模型各阶段计算量可知,通过增加细化网络3、4 和5 所带来的精度提升较小,但其复杂度却大幅增加,这里首先将其三阶段全部移除,其次通过基于自适应BN 的剪枝模块对其余阶段进行核剪枝,剪枝工作流程如图5 所示。
图5 基于自适应批量归一化评估模块的剪枝工作流程
剪枝过程主要由6 部分组分。 具体来说,首先对第一部分优化后的网络进行训练,然后提取模型中细化阶段参与剪枝的卷积层索引,通过随机生成多个剪枝策略,每一个策略为各索引层的剪枝率。第四部分使用L1 范数准则,根据剪枝策略进行剪枝,得到候选网络。
第五部分通过基于自适应BN 的候选评估模块对所有候选模型的BN 统计值μ和σ2进行更新,并利用小部分训练集评估每一个候选网络。 最后,挑选获得最优精度的候选模型作为最终剪枝模型并进行微调恢复精度。
实验所用的训练平台使用深度学习框架pytorch1.6,以及双Nvidia RTX30708G GPU 显卡。测试平台为Nvidia Jetson-nano 嵌入式开发板,搭载128 核Nvidia Maxwell 图形处理器。
OpenPose 骨骼关节点检测模型采用MS COCO人体骨骼数据集进行训练。 但对于坐姿模型的训练,现有坐姿识别工作对于坐姿分类未有可实验的公共数据集。 很多现有工作是根据各文章算法进行数据集制作,不同文献对于坐姿图像拍摄角度和摄像头摆放位置存在巨大差异。 对于本文方法,其主要研究坐姿检测方法在嵌入式平台实现快速应用,因此仅对日常办公学习中摄像头摆放在身体正前方场景下常见的几种坐姿进行图像采集。 采集坐姿图像数据集共包括8 种坐姿,包括趴着、头部左倾、头部右倾、正常、肩膀左低、肩膀右低、左撑头、右撑头,采集对象分别为10 个男性和10 个女性志愿者,总共包括图2500 张RGB 图像。 8 种坐姿以及利用OpenPose 检测到的对应骨骼如图6 所示。 本文在数据清洗上,包括对因Openpose 算法检测关节点失败的数据进行剔除,对类间重复信息进行剔除。
图6 各类坐姿以及检测到的人体骨骼
为了提高算法坐姿识别网络的精度,本文利用训练好的卷积神经网络模型对骨骼图像进行特征提取,并与骨骼向量特征进行融合。 特征融合前后的网络训练在测试集上损失变化曲线如图7 所示,融合前仅通过关节点信息计算得到的骨骼特征对网络进行训练,当训练迭代次数达到600 个epoch 时,损失逐渐收敛。 而融合骨骼图像特征后对网络进行训练,经过300 次迭代网络就已经收敛平稳,最终损失在0.31 左右。 可以得出,从骨骼图像中提取到的特征提高了网络的收敛速度。 另外,特征融合前后的坐姿分类精度如图8 所示,由结果可得出,特征融合前的网络仅获得了85%的验证精度,其特征融合后的网络获得了92%的验证精度,精度提升了7%,进一步说明了特征融合的有效性。
图8 特征融合前后坐姿分类精度
此外,为了进一步分析模型对于各类坐姿的分类性能,提供了所提出模型在训练集上的混淆矩阵,以及对模型在各类坐姿上的性能指标进行统计。 其中,特征融合前后训练集的混淆矩阵结果如图9 所示,对于融合前,模型对于坐姿趴着、正常和右撑头有较好的识别精度。 一部分原因是这几类坐姿之间具有较高的区分性,另一部分原因是现有坐姿数据集中各类坐姿数量不平衡,致使数据量较多的类拥有较高的分类精度。 除此之外,由于数据清洗不干净导致存在部分类中数据与其他类数据较为相似的情况,导致分类困难。 比如,对于左肩低类有28%被模型认为正常类。 然而,特征融合后,一定程度上提升了左肩低类与正常类之间的可区分性,原本左肩低类被误判为正常类的比例已经从28%降低到0.03%。 通过表3 特征融合前后模型在8 类坐姿上的性能指标对比同样可以得出,特征融合后相对于融合前精度分别提升了4%、17%、15%、14%、14%、12%、15%和15%,召回率分别提升3%、13%、18%、9%、33%、12%、22%和10%。
图9 特征融合前后模型在训练集的混淆矩阵
表3 特征融合前后模型在各类坐姿上的性能指标对比
OpenPose 姿态估计模型是本文实现坐姿识别的关键,其准确率在一定程度上影响了最终坐姿分类的精度。 因此,为了在保证检测精度的前提下,提高检测速度,本文对网络模型进行了优化,并部署到嵌入式开发板Jetson Nano 进行测试。 其中,模型优化前后的性能比较如表4 所示,其中方案1 由MobileNetV2 骨干网络、1 个初始化阶段和2 个细化阶段组成,方案2 在方案1 的基础上对3 个stage 设置0.4 的剪枝率。
表4 模型优化前后性能比较
从结果来看,原始关节点检测模型具备较高平均精度(AP)和坐姿识别精度,其中模型大小为68M,检测效果如图6,在嵌入式设备NANO 上的实际运行速度只有1.4 帧左右,无法满足随后的快速坐姿检测任务。 进一步地,方案1 对骨干网络进行替代,以及对最后3 个细化阶段进行移除,其模型平均精度和识别精度虽分别有7%和2%左右的降低,但其模型大小得到大幅度减少,实际检测速度提升3 倍左右。 而方案2 在此基础上对复杂的细化阶段网络进行剪枝操作,在精度下降2%的情况下,识别精度依然可以达到89%,模型大小只有15M,实际检测速度可达到5.5 帧,比原始模型速度提升4 倍左右。 方案2 模型的各类坐姿检测效果如图10 所示。 可以发现,对于正常类、右手撑头类坐姿,模型可以准确地获取到关节点位置,对于其他类坐姿,模型有检测到的个别关节点发生偏移或未检测到的情况,但依然保持了较好的检测效果。 实际应用中方案2 满足正常需求。
图10 方案2 模型的各类坐姿检测效果
对于模型推理,本文使用英伟达Jetson Nano 开发板进行实验,板内搭载一个拥有128 核的GPU,可实现加速模型推理。 最终的实际测试性能如图11所示。 算法推理一帧的总体时间消耗在286 ms,帧率可达到3.5,其中占比最多的是利用OpenPose 模型检测关节点,时间消耗182 ms,占比63%。 其次为坐姿特征的提取及特征融合,该阶段包括了骨骼关节特征向量计算和骨骼图像特征提取,时间消耗69 ms,占比24%。 坐姿分类模型只消耗了16ms,占比5%,对最终的检测速度影响较小。
图11 实际测试性能
为了验证提出方法的可信性,这里比较了其他工作的结果,结果如表5 所示,其中RGB-D 为深度相机。
表5 相关方法对比
本文的方法允许在嵌入式设备Jetson nano 上实现快速推理,具有较好的识别精度和分类数。 例如,文献[13]获得了较高的识别精度和分类数,但是该工作是面向PC 端,且需要Kinect 深度相机采集图像。 文献[15]利用深度相机和高性能Nvidia 1070 GPU 实现了实时识别坐姿,但只有3 种坐姿保持了较好的识别精度。 文献[18]利用单目相机获得较高的识别精度,但模型只能对3 类坐姿进行分类。相比深度相机获取骨骼三维信息的方法,若坐姿分类不涉及前倾后仰等相对于相机做前后运动的坐姿(文献[13]和[18]),本文方法同样可以获得较好的识别精度,并且利用计算能力较小的Nvidia Maxwell 图形处理器,在8 类坐姿总识别精度为89%的情况下,获得了4 帧左右的识别速度。
本文提出基于神经网络的骨骼特征融合下坐姿快速识别方法。 解决了深度学习人体坐姿识别任务因模型参数多、计算量大、复杂程度高,难以在资源有限的嵌入式设备上实现高精度和快速性的问题。本文方法利用了轻量化网络结构和模型剪枝技术对模型进行优化,并提出利用特征融合提升识别精度,在保证识别精度的同时获得了更快的检测速度。 在Jetson Nano 上的实际帧率可达4 帧,达到了快速识别坐姿的目的,满足生产生活的需要,具有较好的应用价值。 同时本文算法也存在不足之处,如缺少空间信息对姿态进行建模,对办公场景下前倾后仰等坐姿识别精度不佳,且由于设备显存不足等原因,导致特征提取部分没有得到加速,后续工作将考虑利用量化技术进一步加速推理速度。